From: Martin Zaun Date: February 2 2011 6:52am Subject: bzr commit into mysql-5.1-telco-6.3 branch (martin.zaun:3381) Bug#54327 List-Archive: http://lists.mysql.com/commits/130168 X-Bug: 54327 Message-Id: <201102020652.p124nwri026959@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4798800826749259359==" --===============4798800826749259359== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mz/mysql/ndb-6.3-bug54327/ based on revid:jonas@stripped 3381 Martin Zaun 2011-02-01 bug#54327 ndb_restore: added new option --rewrite-database=oldDb,newDb added: mysql-test/suite/ndb/r/ndb_restore_rewrite_db.result mysql-test/suite/ndb/t/ndb_restore_rewrite_db.test modified: storage/ndb/tools/restore/consumer_restore.cpp storage/ndb/tools/restore/restore_main.cpp === added file 'mysql-test/suite/ndb/r/ndb_restore_rewrite_db.result' --- a/mysql-test/suite/ndb/r/ndb_restore_rewrite_db.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/ndb/r/ndb_restore_rewrite_db.result 2011-02-02 06:52:12 +0000 @@ -0,0 +1,328 @@ +************************************************************ +* Creating multiple databases with identical tables +* (have blobs and indexes to cover the hidden tables) +************************************************************ +CREATE DATABASE db0; +CREATE DATABASE db1; +CREATE DATABASE db2; +USE db0; +CREATE TABLE t0 ( +id INT PRIMARY KEY, +cint INT, +cvarchar VARCHAR(5), +cblob BLOB(1000004), +UNIQUE INDEX UNIQUE_t0_0 USING BTREE (cint ASC), +UNIQUE INDEX UNIQUE_t0_2 USING BTREE (cvarchar ASC) +) ENGINE=NDB; +USE db1; +CREATE TABLE t0 ( +id INT PRIMARY KEY, +cint INT, +cvarchar VARCHAR(5), +cblob BLOB(1000004), +UNIQUE INDEX UNIQUE_t0_0 USING BTREE (cint ASC), +UNIQUE INDEX UNIQUE_t0_2 USING BTREE (cvarchar ASC) +) ENGINE=NDB; +USE db2; +CREATE TABLE t0 ( +id INT PRIMARY KEY, +cint INT, +cvarchar VARCHAR(5), +cblob BLOB(1000004), +UNIQUE INDEX UNIQUE_t0_0 USING BTREE (cint ASC), +UNIQUE INDEX UNIQUE_t0_2 USING BTREE (cvarchar ASC) +) ENGINE=NDB; +************************************************************ +* Inserting data +* (create disjunct sets of rows to merge without conflicts; +* at this time, ndb_restore does not offer any detection +* of data conflicts between databases in the backup or in +* memory; databases are restored in an unspecified order) +* (make blob data long enough to be held in extra table) +************************************************************ +USE db0; +INSERT INTO t0 VALUES (0, 0, '00000', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (1, 1, '11111', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (2, 2, '22222', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +USE db1; +INSERT INTO t0 VALUES (3, 3, '33333', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (4, 4, '44444', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (5, 5, '55555', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +USE db2; +INSERT INTO t0 VALUES (6, 6, '66666', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (7, 7, '77777', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (8, 8, '88888', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +************************************************************ +* Creating in-memory copies of the NDB tables +************************************************************ +CREATE TABLE db0.t0_data ENGINE=MYISAM AS SELECT * FROM db0.t0; +CREATE TABLE db1.t0_data ENGINE=MYISAM AS SELECT * FROM db1.t0; +CREATE TABLE db2.t0_data ENGINE=MYISAM AS SELECT * FROM db2.t0; +************************************************************ +* Backing up databases +************************************************************ +************************************************************ +* Restoring databases with no rewrite (sanity check) +************************************************************ +CREATE TABLE db0.t0_temp ENGINE=MYISAM AS SELECT * FROM db0.t0_data; +CREATE TABLE db1.t0_temp ENGINE=MYISAM AS SELECT * FROM db1.t0_data; +CREATE TABLE db2.t0_temp ENGINE=MYISAM AS SELECT * FROM db2.t0_data; +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +SELECT COUNT(*) FROM db0.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; +COUNT(*) +3 +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; +************************************************************ +* Negative testing: check wrong usage of command-line option +* (expected exit code for usage errors: NDBT_WRONGARGS = 2) +************************************************************ +************************************************************ +* Restoring databases with redundant/self-rewrite options +************************************************************ +CREATE TABLE db0.t0_temp ENGINE=MYISAM AS SELECT * FROM db0.t0_data; +CREATE TABLE db1.t0_temp ENGINE=MYISAM AS SELECT * FROM db1.t0_data; +CREATE TABLE db2.t0_temp ENGINE=MYISAM AS SELECT * FROM db2.t0_data; +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +SELECT COUNT(*) FROM db0.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; +COUNT(*) +3 +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; +************************************************************ +* Restoring databases with overriding rewrite options +************************************************************ +CREATE TABLE db0.t0_temp ENGINE=MYISAM AS SELECT * FROM db0.t0_data; +CREATE TABLE db1.t0_temp ENGINE=MYISAM AS SELECT * FROM db1.t0_data; +CREATE TABLE db2.t0_temp ENGINE=MYISAM AS SELECT * FROM db2.t0_data; +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +SELECT COUNT(*) FROM db0.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; +COUNT(*) +3 +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; +************************************************************ +* Restoring databases with a single rewrite +************************************************************ +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +SELECT COUNT(*) FROM db0.t0; +COUNT(*) +0 +SELECT COUNT(*) FROM db1.t0; +COUNT(*) +6 +SELECT COUNT(*) FROM db2.t0; +COUNT(*) +3 +INSERT db1.t0_temp SELECT * FROM db0.t0_data; +INSERT db1.t0_temp SELECT * FROM db1.t0_data; +INSERT db2.t0_temp SELECT * FROM db2.t0_data; +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +COUNT(*) +0 +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +COUNT(*) +6 +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; +COUNT(*) +3 +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; +************************************************************ +* Restoring databases with multiple rewrites +************************************************************ +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +SELECT COUNT(*) FROM db0.t0; +COUNT(*) +0 +SELECT COUNT(*) FROM db1.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0; +COUNT(*) +6 +INSERT db1.t0_temp SELECT * FROM db0.t0_data; +INSERT db2.t0_temp SELECT * FROM db1.t0_data; +INSERT db2.t0_temp SELECT * FROM db2.t0_data; +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +COUNT(*) +0 +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; +COUNT(*) +6 +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; +************************************************************ +* Restoring databases with multiple rewrites into same target +************************************************************ +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +SELECT COUNT(*) FROM db0.t0; +COUNT(*) +0 +SELECT COUNT(*) FROM db1.t0; +COUNT(*) +0 +SELECT COUNT(*) FROM db2.t0; +COUNT(*) +9 +INSERT db2.t0_temp SELECT * FROM db0.t0_data; +INSERT db2.t0_temp SELECT * FROM db1.t0_data; +INSERT db2.t0_temp SELECT * FROM db2.t0_data; +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +COUNT(*) +0 +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +COUNT(*) +0 +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; +COUNT(*) +9 +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; +************************************************************ +* Restoring databases with swapping rewrites +************************************************************ +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +SELECT COUNT(*) FROM db0.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0; +COUNT(*) +3 +INSERT db1.t0_temp SELECT * FROM db0.t0_data; +INSERT db0.t0_temp SELECT * FROM db1.t0_data; +INSERT db2.t0_temp SELECT * FROM db2.t0_data; +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; +COUNT(*) +3 +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; +************************************************************ +* Restoring databases with permutating rewrites +************************************************************ +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +SELECT COUNT(*) FROM db0.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0; +COUNT(*) +3 +INSERT db1.t0_temp SELECT * FROM db0.t0_data; +INSERT db2.t0_temp SELECT * FROM db1.t0_data; +INSERT db0.t0_temp SELECT * FROM db2.t0_data; +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +COUNT(*) +3 +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; +COUNT(*) +3 +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; +************************************************************ +* Deleting tables and databases +************************************************************ +DROP DATABASE db0; +DROP DATABASE db1; +DROP DATABASE db2; === added file 'mysql-test/suite/ndb/t/ndb_restore_rewrite_db.test' --- a/mysql-test/suite/ndb/t/ndb_restore_rewrite_db.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/ndb/t/ndb_restore_rewrite_db.test 2011-02-02 06:52:12 +0000 @@ -0,0 +1,420 @@ +###################################################################### +# Author: Martin Zaun +# Date: 2011-01 +# Purpose: test of rewrite-database feature +###################################################################### + +-- source include/have_ndb.inc + +# mysqld's configuration is not relevant to this test +-- source include/not_embedded.inc + +--echo ************************************************************ +--echo * Creating multiple databases with identical tables +--echo * (have blobs and indexes to cover the hidden tables) +--echo ************************************************************ + +CREATE DATABASE db0; +CREATE DATABASE db1; +CREATE DATABASE db2; + +USE db0; +CREATE TABLE t0 ( + id INT PRIMARY KEY, + cint INT, + cvarchar VARCHAR(5), + cblob BLOB(1000004), + UNIQUE INDEX UNIQUE_t0_0 USING BTREE (cint ASC), + UNIQUE INDEX UNIQUE_t0_2 USING BTREE (cvarchar ASC) +) ENGINE=NDB; + +USE db1; +CREATE TABLE t0 ( + id INT PRIMARY KEY, + cint INT, + cvarchar VARCHAR(5), + cblob BLOB(1000004), + UNIQUE INDEX UNIQUE_t0_0 USING BTREE (cint ASC), + UNIQUE INDEX UNIQUE_t0_2 USING BTREE (cvarchar ASC) +) ENGINE=NDB; + +USE db2; +CREATE TABLE t0 ( + id INT PRIMARY KEY, + cint INT, + cvarchar VARCHAR(5), + cblob BLOB(1000004), + UNIQUE INDEX UNIQUE_t0_0 USING BTREE (cint ASC), + UNIQUE INDEX UNIQUE_t0_2 USING BTREE (cvarchar ASC) +) ENGINE=NDB; + + +--echo ************************************************************ +--echo * Inserting data +--echo * (create disjunct sets of rows to merge without conflicts; +--echo * at this time, ndb_restore does not offer any detection +--echo * of data conflicts between databases in the backup or in +--echo * memory; databases are restored in an unspecified order) +--echo * (make blob data long enough to be held in extra table) +--echo ************************************************************ + +USE db0; +INSERT INTO t0 VALUES (0, 0, '00000', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (1, 1, '11111', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (2, 2, '22222', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); + +USE db1; +INSERT INTO t0 VALUES (3, 3, '33333', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (4, 4, '44444', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (5, 5, '55555', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); + +USE db2; +INSERT INTO t0 VALUES (6, 6, '66666', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (7, 7, '77777', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); +INSERT INTO t0 VALUES (8, 8, '88888', '123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'); + +--echo ************************************************************ +--echo * Creating in-memory copies of the NDB tables +--echo ************************************************************ + +CREATE TABLE db0.t0_data ENGINE=MYISAM AS SELECT * FROM db0.t0; +CREATE TABLE db1.t0_data ENGINE=MYISAM AS SELECT * FROM db1.t0; +CREATE TABLE db2.t0_data ENGINE=MYISAM AS SELECT * FROM db2.t0; + +--echo ************************************************************ +--echo * Backing up databases +--echo ************************************************************ + +--source include/ndb_backup.inc + +# command shortcuts, cover rebuilding of indexes +#--let $restore_cmd=$NDB_RESTORE --no-defaults +#--let $restore_cmd=$restore_cmd --disable-indexes --rebuild-indexes +#--let $restore_cmd=$restore_cmd -b $the_backup_id -r +#--let $restore_cmd=$restore_cmd --backup_path=$NDB_BACKUPS-$the_backup_id +# for ndb 6.3: +--let $restore_cmd=$NDB_TOOLS_DIR/ndb_restore --no-defaults +--let $restore_cmd=$restore_cmd --disable-indexes --rebuild-indexes +--let $restore_cmd=$restore_cmd -b $the_backup_id -r +--let $restore_cmd=$restore_cmd --backup_path=$NDB_BACKUP_DIR/BACKUP/BACKUP-$the_backup_id + +--echo ************************************************************ +--echo * Restoring databases with no rewrite (sanity check) +--echo ************************************************************ + +# create temporary tables against which to compare data +CREATE TABLE db0.t0_temp ENGINE=MYISAM AS SELECT * FROM db0.t0_data; +CREATE TABLE db1.t0_temp ENGINE=MYISAM AS SELECT * FROM db1.t0_data; +CREATE TABLE db2.t0_temp ENGINE=MYISAM AS SELECT * FROM db2.t0_data; + +# restore NDB tables +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +--let $restore_opt= +--exec $restore_cmd -n 1 $restore_opt --print > /dev/null +--exec $restore_cmd -n 2 $restore_opt --print > /dev/null + +# summary-check ndb tables +SELECT COUNT(*) FROM db0.t0; +SELECT COUNT(*) FROM db1.t0; +SELECT COUNT(*) FROM db2.t0; + +# verify ndb tables +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; + +# delete temporary tables +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; + +--echo ************************************************************ +--echo * Negative testing: check wrong usage of command-line option +--echo * (expected exit code for usage errors: NDBT_WRONGARGS = 2) +--echo ************************************************************ + +# empty argument +--let $restore_opt=--rewrite-database= +--error 2 +--exec $restore_cmd -n 1 $restore_opt > /dev/null + +# missing separator +--let $restore_opt=--rewrite-database=aaaa +--error 2 +--exec $restore_cmd -n 1 $restore_opt > /dev/null + +# missing source and target +--let $restore_opt=--rewrite-database=, +--error 2 +--exec $restore_cmd -n 1 $restore_opt > /dev/null + +# missing source +--let $restore_opt=--rewrite-database=,a +--error 2 +--exec $restore_cmd -n 1 $restore_opt > /dev/null + +# missing target +--let $restore_opt=--rewrite-database=a, +--error 2 +--exec $restore_cmd -n 1 $restore_opt > /dev/null + +--echo ************************************************************ +--echo * Restoring databases with redundant/self-rewrite options +--echo ************************************************************ + +# create temporary tables against which to compare data +CREATE TABLE db0.t0_temp ENGINE=MYISAM AS SELECT * FROM db0.t0_data; +CREATE TABLE db1.t0_temp ENGINE=MYISAM AS SELECT * FROM db1.t0_data; +CREATE TABLE db2.t0_temp ENGINE=MYISAM AS SELECT * FROM db2.t0_data; + +# restore NDB tables +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +--let $restore_opt=--rewrite-database=db0,db0 --rewrite-database=db1,db1 +--exec $restore_cmd -n 1 $restore_opt --print > /dev/null +--exec $restore_cmd -n 2 $restore_opt --print > /dev/null + +# summary-check ndb tables +SELECT COUNT(*) FROM db0.t0; +SELECT COUNT(*) FROM db1.t0; +SELECT COUNT(*) FROM db2.t0; + +# verify ndb tables +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; + +# delete temporary tables +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; + +--echo ************************************************************ +--echo * Restoring databases with overriding rewrite options +--echo ************************************************************ + +# create temporary tables against which to compare data +CREATE TABLE db0.t0_temp ENGINE=MYISAM AS SELECT * FROM db0.t0_data; +CREATE TABLE db1.t0_temp ENGINE=MYISAM AS SELECT * FROM db1.t0_data; +CREATE TABLE db2.t0_temp ENGINE=MYISAM AS SELECT * FROM db2.t0_data; + +# restore NDB tables +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +# no rewrite, since the later option overrides the former +--let $restore_opt=--rewrite-database=db0,db1 --rewrite-database=db0,db0 +--exec $restore_cmd -n 1 $restore_opt --print > /dev/null +--exec $restore_cmd -n 2 $restore_opt --print > /dev/null + +# summary-check ndb tables +SELECT COUNT(*) FROM db0.t0; +SELECT COUNT(*) FROM db1.t0; +SELECT COUNT(*) FROM db2.t0; + +# verify ndb tables +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; + +# delete temporary tables +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; + +--echo ************************************************************ +--echo * Restoring databases with a single rewrite +--echo ************************************************************ + +# create temporary tables against which to compare data +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; + +# restore NDB tables +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +--let $restore_opt=--rewrite-database=db0,db1 +--exec $restore_cmd -n 1 $restore_opt --print > /dev/null +--exec $restore_cmd -n 2 $restore_opt --print > /dev/null + +# summary-check ndb tables +SELECT COUNT(*) FROM db0.t0; +SELECT COUNT(*) FROM db1.t0; +SELECT COUNT(*) FROM db2.t0; + +# fill temporary tables +INSERT db1.t0_temp SELECT * FROM db0.t0_data; +INSERT db1.t0_temp SELECT * FROM db1.t0_data; +INSERT db2.t0_temp SELECT * FROM db2.t0_data; + +# verify ndb tables +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; + +# delete temporary tables +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; + +--echo ************************************************************ +--echo * Restoring databases with multiple rewrites +--echo ************************************************************ + +# create temporary tables against which to compare data +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; + +# restore NDB tables +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +--let $restore_opt=--rewrite-database=db0,db1 --rewrite-database=db1,db2 +--exec $restore_cmd -n 1 $restore_opt --print > /dev/null +--exec $restore_cmd -n 2 $restore_opt --print > /dev/null + +# summary-check ndb tables +SELECT COUNT(*) FROM db0.t0; +SELECT COUNT(*) FROM db1.t0; +SELECT COUNT(*) FROM db2.t0; + +# fill temporary tables +INSERT db1.t0_temp SELECT * FROM db0.t0_data; +INSERT db2.t0_temp SELECT * FROM db1.t0_data; +INSERT db2.t0_temp SELECT * FROM db2.t0_data; + +# verify ndb tables +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; + +# delete temporary tables +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; + +--echo ************************************************************ +--echo * Restoring databases with multiple rewrites into same target +--echo ************************************************************ + +# create temporary tables against which to compare data +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; + +# restore NDB tables +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +--let $restore_opt=--rewrite-database=db0,db2 --rewrite-database=db1,db2 +--exec $restore_cmd -n 1 $restore_opt --print > /dev/null +--exec $restore_cmd -n 2 $restore_opt --print > /dev/null + +# summary-check ndb tables +SELECT COUNT(*) FROM db0.t0; +SELECT COUNT(*) FROM db1.t0; +SELECT COUNT(*) FROM db2.t0; + +# fill temporary tables +INSERT db2.t0_temp SELECT * FROM db0.t0_data; +INSERT db2.t0_temp SELECT * FROM db1.t0_data; +INSERT db2.t0_temp SELECT * FROM db2.t0_data; + +# verify ndb tables +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; + +# delete temporary tables +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; + +--echo ************************************************************ +--echo * Restoring databases with swapping rewrites +--echo ************************************************************ + +# create temporary tables against which to compare data +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; + +# restore NDB tables +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +--let $restore_opt=--rewrite-database=db0,db1 --rewrite-database=db1,db0 +--exec $restore_cmd -n 1 $restore_opt --print > /dev/null +--exec $restore_cmd -n 2 $restore_opt --print > /dev/null + +# summary-check ndb tables +SELECT COUNT(*) FROM db0.t0; +SELECT COUNT(*) FROM db1.t0; +SELECT COUNT(*) FROM db2.t0; + +# fill temporary tables +INSERT db1.t0_temp SELECT * FROM db0.t0_data; +INSERT db0.t0_temp SELECT * FROM db1.t0_data; +INSERT db2.t0_temp SELECT * FROM db2.t0_data; + +# verify ndb tables +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; + +# delete temporary tables +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; + +--echo ************************************************************ +--echo * Restoring databases with permutating rewrites +--echo ************************************************************ + +# create temporary tables against which to compare data +CREATE TABLE db0.t0_temp LIKE db0.t0_data; +CREATE TABLE db1.t0_temp LIKE db1.t0_data; +CREATE TABLE db2.t0_temp LIKE db2.t0_data; + +# restore NDB tables +DELETE FROM db0.t0; +DELETE FROM db1.t0; +DELETE FROM db2.t0; +--let $restore_opt=--rewrite-database=db0,db1 --rewrite-database=db1,db2 +--let $restore_opt=$restore_opt --rewrite-database=db2,db0 +--exec $restore_cmd -n 1 $restore_opt --print > /dev/null +--exec $restore_cmd -n 2 $restore_opt --print > /dev/null + +# summary-check ndb tables +SELECT COUNT(*) FROM db0.t0; +SELECT COUNT(*) FROM db1.t0; +SELECT COUNT(*) FROM db2.t0; + +# fill temporary tables +INSERT db1.t0_temp SELECT * FROM db0.t0_data; +INSERT db2.t0_temp SELECT * FROM db1.t0_data; +INSERT db0.t0_temp SELECT * FROM db2.t0_data; + +# verify ndb tables +SELECT COUNT(*) FROM db0.t0 NATURAL JOIN db0.t0_temp; +SELECT COUNT(*) FROM db1.t0 NATURAL JOIN db1.t0_temp; +SELECT COUNT(*) FROM db2.t0 NATURAL JOIN db2.t0_temp; + +# delete temporary tables +DROP TABLE db0.t0_temp; +DROP TABLE db1.t0_temp; +DROP TABLE db2.t0_temp; + +--echo ************************************************************ +--echo * Deleting tables and databases +--echo ************************************************************ + +DROP DATABASE db0; +DROP DATABASE db1; +DROP DATABASE db2; === modified file 'storage/ndb/tools/restore/consumer_restore.cpp' --- a/storage/ndb/tools/restore/consumer_restore.cpp 2010-12-03 09:29:44 +0000 +++ b/storage/ndb/tools/restore/consumer_restore.cpp 2011-02-02 06:52:12 +0000 @@ -20,6 +20,7 @@ #include "consumer_restore.hpp" #include #include +#include #include #include @@ -41,6 +42,8 @@ extern BaseString g_options; extern unsigned int opt_no_binlog; extern bool ga_skip_broken_objects; +extern Properties g_rewrite_databases; + bool BackupRestore::m_preserve_trailing_spaces = false; const PromotionRules @@ -261,6 +264,40 @@ match_blob(const char * name){ return -1; } +/** + * Extracts the database, schema, and table name from an internal table name; + * prints an error message and returns false in case of a format violation. + */ +static +bool +dissect_table_name(const char * qualified_table_name, + BaseString & db_name, + BaseString & schema_name, + BaseString & table_name) { + Vector split; + BaseString tmp(qualified_table_name); + if (tmp.split(split, "/") != 3) { + err << "Invalid table name format `" << qualified_table_name + << "`" << endl; + return false; + } + db_name = split[0]; + schema_name = split[1]; + table_name = split[2]; + return true; +} + +/** + * Assigns the new name for a database, if and only if to be rewritten. + */ +static +void +check_rewrite_database(BaseString & db_name) { + const char * new_db_name; + if (g_rewrite_databases.get(db_name.c_str(), &new_db_name)) + db_name.assign(new_db_name); +} + const NdbDictionary::Table* BackupRestore::get_table(const NdbDictionary::Table* tab){ if(m_cache.m_old_table == tab) @@ -342,28 +379,30 @@ BackupRestore::rebuild_indexes(const Tab if (m_index_per_table.size() <= id) return true; - BaseString tmp(tablename); - Vector split; - if (tmp.split(split, "/") != 3) - { - err << "Invalid table name format " << tablename << endl; + BaseString db_name, schema_name, table_name; + if (!dissect_table_name(tablename, db_name, schema_name, table_name)) { return false; } - m_ndb->setDatabaseName(split[0].c_str()); - m_ndb->setSchemaName(split[1].c_str()); + check_rewrite_database(db_name); + + m_ndb->setDatabaseName(db_name.c_str()); + m_ndb->setSchemaName(schema_name.c_str()); NdbDictionary::Dictionary* dict = m_ndb->getDictionary(); Vector & indexes = m_index_per_table[id]; for(size_t i = 0; igetName() << " on table " - << tab->getName() << " ..." << flush; - if (dict->createIndex(* idx, 1) != 0) + const NdbDictionary::Index * const idx = indexes[i]; + const char * const idx_name = idx->getName(); + const char * const tab_name = idx->getTable(); + info << "Rebuilding index `" << idx_name << "` on table `" + << tab_name << "` ..." << flush; + if ((dict->getIndex(idx_name, tab_name) == NULL) + && (dict->createIndex(* idx, 1) != 0)) { info << "FAIL!" << endl; - err << "Rebuilding index " << idx->getName() << " on table " - << tab->getName() <<" failed: "; + err << "Rebuilding index `" << idx_name << "` on table `" + << tab_name <<"` failed: "; err << dict->getNdbError() << endl; return false; @@ -1151,19 +1190,19 @@ BackupRestore::table_compatible_check(co return true; } - BaseString tmp(tablename); - Vector split; - if(tmp.split(split, "/") != 3){ - err << "Invalid table name format " << tablename << endl; + BaseString db_name, schema_name, table_name; + if (!dissect_table_name(tablename, db_name, schema_name, table_name)) { return false; } - m_ndb->setDatabaseName(split[0].c_str()); - m_ndb->setSchemaName(split[1].c_str()); + check_rewrite_database(db_name); + + m_ndb->setDatabaseName(db_name.c_str()); + m_ndb->setSchemaName(schema_name.c_str()); NdbDictionary::Dictionary* dict = m_ndb->getDictionary(); - const NdbDictionary::Table* tab = dict->getTable(split[2].c_str()); + const NdbDictionary::Table* tab = dict->getTable(table_name.c_str()); if(tab == 0){ - err << "Unable to find table: " << split[2].c_str() << endl; + err << "Unable to find table: " << table_name << endl; return false; } @@ -1360,18 +1399,18 @@ BackupRestore::createSystable(const Tabl return true; } - BaseString tmp(tablename); - Vector split; - if(tmp.split(split, "/") != 3){ - err << "Invalid table name format " << tablename << endl; + BaseString db_name, schema_name, table_name; + if (!dissect_table_name(tablename, db_name, schema_name, table_name)) { return false; } + // do not rewrite database for system tables: + // check_rewrite_database(db_name); - m_ndb->setDatabaseName(split[0].c_str()); - m_ndb->setSchemaName(split[1].c_str()); + m_ndb->setDatabaseName(db_name.c_str()); + m_ndb->setSchemaName(schema_name.c_str()); NdbDictionary::Dictionary* dict = m_ndb->getDictionary(); - if( dict->getTable(split[2].c_str()) != NULL ){ + if( dict->getTable(table_name.c_str()) != NULL ){ return true; } return table(tables); @@ -1396,22 +1435,21 @@ BackupRestore::table(const TableS & tabl return true; } - BaseString tmp(name); - Vector split; - if(tmp.split(split, "/") != 3){ - err << "Invalid table name format `" << name << "`" << endl; + BaseString db_name, schema_name, table_name; + if (!dissect_table_name(name, db_name, schema_name, table_name)) { return false; } + check_rewrite_database(db_name); - m_ndb->setDatabaseName(split[0].c_str()); - m_ndb->setSchemaName(split[1].c_str()); + m_ndb->setDatabaseName(db_name.c_str()); + m_ndb->setSchemaName(schema_name.c_str()); NdbDictionary::Dictionary* dict = m_ndb->getDictionary(); if(m_restore_meta) { NdbDictionary::Table copy(*table.m_dictTable); - copy.setName(split[2].c_str()); + copy.setName(table_name.c_str()); Uint32 id; if (copy.getTablespace(&id)) { @@ -1520,9 +1558,9 @@ BackupRestore::table(const TableS & tabl << table.getTableName() << "`" << endl; } - const NdbDictionary::Table* tab = dict->getTable(split[2].c_str()); + const NdbDictionary::Table* tab = dict->getTable(table_name.c_str()); if(tab == 0){ - err << "Unable to find table: `" << split[2].c_str() << "`" << endl; + err << "Unable to find table: `" << table_name << "`" << endl; return false; } if(m_restore_meta) @@ -1531,9 +1569,9 @@ BackupRestore::table(const TableS & tabl { // a MySQL Server table is restored, thus an event should be created BaseString event_name("REPL$"); - event_name.append(split[0].c_str()); + event_name.append(db_name.c_str()); event_name.append("/"); - event_name.append(split[2].c_str()); + event_name.append(table_name.c_str()); NdbDictionary::Event my_event(event_name.c_str()); my_event.setTable(*tab); @@ -1564,7 +1602,7 @@ BackupRestore::table(const TableS & tabl } err << "Create table event for " << table.getTableName() << " failed: " << dict->getNdbError() << endl; - dict->dropTable(split[2].c_str()); + dict->dropTable(table_name.c_str()); return false; } info.setLevel(254); @@ -1589,23 +1627,19 @@ BackupRestore::endOfTables(){ for(size_t i = 0; i split; - { - BaseString tmp(indtab.m_primaryTable.c_str()); - if (tmp.split(split, "/") != 3) - { - err << "Invalid table name format `" << indtab.m_primaryTable.c_str() - << "`" << endl; - return false; - } + BaseString db_name, schema_name, table_name; + if (!dissect_table_name(indtab.m_primaryTable.c_str(), + db_name, schema_name, table_name)) { + return false; } - - m_ndb->setDatabaseName(split[0].c_str()); - m_ndb->setSchemaName(split[1].c_str()); - - const NdbDictionary::Table * prim = dict->getTable(split[2].c_str()); + check_rewrite_database(db_name); + + m_ndb->setDatabaseName(db_name.c_str()); + m_ndb->setSchemaName(schema_name.c_str()); + + const NdbDictionary::Table * prim = dict->getTable(table_name.c_str()); if(prim == 0){ - err << "Unable to find base table `" << split[2].c_str() + err << "Unable to find base table `" << table_name << "` for index `" << indtab.getName() << "`" << endl; if (ga_skip_broken_objects) @@ -1628,7 +1662,7 @@ BackupRestore::endOfTables(){ if(NdbDictInterface::create_index_obj_from_table(&idx, &indtab, &base)) { err << "Failed to create index `" << split_idx[3] - << "` on " << split[2].c_str() << endl; + << "` on " << table_name << endl; return false; } idx->setName(split_idx[3].c_str()); @@ -1638,13 +1672,13 @@ BackupRestore::endOfTables(){ { delete idx; err << "Failed to create index `" << split_idx[3].c_str() - << "` on `" << split[2].c_str() << "`" << endl + << "` on `" << table_name << "`" << endl << dict->getNdbError() << endl; return false; } info << "Successfully created index `" << split_idx[3].c_str() - << "` on `" << split[2].c_str() << "`" << endl; + << "` on `" << table_name << "`" << endl; } else if (m_disable_indexes) { @@ -1652,7 +1686,7 @@ BackupRestore::endOfTables(){ if (res == 0) { info << "Dropped index `" << split_idx[3].c_str() - << "` on `" << split[2].c_str() << "`" << endl; + << "` on `" << table_name << "`" << endl; } } Uint32 id = prim->getObjectId(); === modified file 'storage/ndb/tools/restore/restore_main.cpp' --- a/storage/ndb/tools/restore/restore_main.cpp 2010-12-03 09:29:44 +0000 +++ b/storage/ndb/tools/restore/restore_main.cpp 2011-02-02 06:52:12 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -62,6 +63,7 @@ Vector g_databases; Vector g_tables; Vector g_include_tables, g_exclude_tables; Vector g_include_databases, g_exclude_databases; +Properties g_rewrite_databases; NdbRecordPrintFormat g_ndbrecord_print_format; unsigned int opt_no_binlog; @@ -76,6 +78,8 @@ public: Vector g_include_exclude; static void save_include_exclude(int optid, char * argument); +static inline void parse_rewrite_database(char * argument); + NDB_STD_OPTS_VARS; /** @@ -121,6 +125,7 @@ enum ndb_restore_options { OPT_EXCLUDE_TABLES, OPT_INCLUDE_DATABASES, OPT_EXCLUDE_DATABASES, + OPT_REWRITE_DATABASE, OPT_EXCLUDE_MISSING_COLUMNS, OPT_DISABLE_INDEXES, OPT_REBUILD_INDEXES @@ -136,6 +141,7 @@ static const char *opt_exclude_tables= N static const char *opt_include_tables= NULL; static const char *opt_exclude_databases= NULL; static const char *opt_include_databases= NULL; +static const char *opt_rewrite_database= NULL; static struct my_option my_long_options[] = { @@ -264,6 +270,11 @@ static struct my_option my_long_options[ "Comma separated list of databases to not restore. Example: db1,db3", (uchar**) &opt_exclude_databases, (uchar**) &opt_exclude_databases, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + { "rewrite-database", OPT_REWRITE_DATABASE, + "A pair 'source,dest' of database names from/into which to restore. " + "Example: --rewrite-database=oldDb,newDb", + (uchar**) &opt_rewrite_database, (uchar**) &opt_rewrite_database, 0, + GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, { "include-tables", OPT_INCLUDE_TABLES, "Comma separated list of tables to " "restore. Table name should include database name. Example: db1.t1,db3.t1", (uchar**) &opt_include_tables, (uchar**) &opt_include_tables, 0, @@ -470,6 +481,9 @@ get_one_option(int optid, const struct m case OPT_EXCLUDE_TABLES: save_include_exclude(optid, argument); break; + case OPT_REWRITE_DATABASE: + parse_rewrite_database(argument); + break; } return 0; } @@ -727,6 +741,20 @@ o verify nodegroup mapping info << endl; } + if (opt_rewrite_database) + { + info << "Rewriting databases:"; + Properties::Iterator it(&g_rewrite_databases); + const char * src; + for (src = it.first(); src != NULL; src = it.next()) { + const char * dst = NULL; + bool r = g_rewrite_databases.get(src, &dst); + assert(r && (dst != NULL)); + info << " (" << src << "->" << dst << ")"; + } + info << endl; + } + if (opt_include_tables) { processTableList(opt_include_tables, g_include_tables); @@ -857,6 +885,27 @@ getTableName(const TableS* table) return table_name; } +static void parse_rewrite_database(char * argument) +{ + const BaseString arg(argument); + Vector args; + unsigned int n = arg.split(args, ","); + if ((n == 2) + && (args[0].length() > 0) + && (args[1].length() > 0)) { + const BaseString src = args[0]; + const BaseString dst = args[1]; + const bool replace = true; + bool r = g_rewrite_databases.put(src.c_str(), dst.c_str(), replace); + assert(r); + return; // ok + } + + info << "argument `" << arg.c_str() + << "` is not a pair 'a,b' of non-empty names." << endl; + exit(NDBT_ProgramExit(NDBT_WRONGARGS)); +} + static void save_include_exclude(int optid, char * argument) { BaseString arg = argument; --===============4798800826749259359== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/martin.zaun@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: martin.zaun@stripped # target_branch: file:///Users/mz/mysql/ndb-6.3-bug54327/ # testament_sha1: 00933e30a37e2791e2d15b118deb4ddc1d06f6e5 # timestamp: 2011-02-01 22:52:24 -0800 # base_revision_id: jonas@stripped # # Begin bundle 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 --===============4798800826749259359==--