From: Martin Zaun Date: February 2 2011 7:17am Subject: bzr commit into mysql-5.1-telco-7.0 branch (martin.zaun:4162) List-Archive: http://lists.mysql.com/commits/130170 Message-Id: <201102020719.p127JVP8005828@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0256786022487932017==" --===============0256786022487932017== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mz/mysql/ndb-7.0/ based on revid:magnus.blaudd@stripped 4162 Martin Zaun 2011-02-01 [merge] merge from ndb-6.3 to ndb-7.0 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 2011-01-17 13:17:32 +0000 +++ b/storage/ndb/tools/restore/consumer_restore.cpp 2011-02-02 07:16:41 +0000 @@ -22,6 +22,7 @@ #include #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 @@ -267,6 +270,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) @@ -348,29 +385,31 @@ 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(); + const char * const tab_name = idx->getTable(); Uint64 start = NdbTick_CurrentMillisecond(); - info << "Rebuilding index " << idx->getName() << " on table " - << tab->getName() << " ..." << flush; - if (dict->createIndex(* idx, 1) != 0) + 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; @@ -1217,19 +1256,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; } @@ -1428,18 +1467,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); @@ -1464,22 +1503,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)) { @@ -1598,9 +1636,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) @@ -1609,9 +1647,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); @@ -1642,7 +1680,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); @@ -1667,23 +1705,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) @@ -1706,7 +1740,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()); @@ -1716,13 +1750,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) { @@ -1730,7 +1764,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:36:45 +0000 +++ b/storage/ndb/tools/restore/restore_main.cpp 2011-02-02 07:16:41 +0000 @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,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; @@ -77,6 +79,8 @@ public: Vector g_include_exclude; static void save_include_exclude(int optid, char * argument); +static inline void parse_rewrite_database(char * argument); + /** * print and restore flags */ @@ -106,7 +110,8 @@ enum ndb_restore_options { OPT_INCLUDE_TABLES, OPT_EXCLUDE_TABLES, OPT_INCLUDE_DATABASES, - OPT_EXCLUDE_DATABASES + OPT_EXCLUDE_DATABASES, + OPT_REWRITE_DATABASE }; static const char *opt_fields_enclosed_by= NULL; static const char *opt_fields_terminated_by= NULL; @@ -119,6 +124,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[] = { @@ -247,6 +253,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, @@ -449,6 +460,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; } @@ -710,6 +724,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); @@ -840,6 +868,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; --===============0256786022487932017== 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-7.0/ # testament_sha1: 3f3158ff0a25640accf1457a5334fe692739df14 # timestamp: 2011-02-01 23:17:45 -0800 # source_branch: file:///Users/mz/mysql/ndb-6.3/ # base_revision_id: magnus.blaudd@stripped\ # p71typ0fhvh7z2fe # # Begin bundle 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 XckU4UJAABukmA== --===============0256786022487932017==--