From: Martin Zaun Date: February 2 2011 7:26am Subject: bzr push into mysql-5.1-telco-6.3 branch (martin.zaun:3385 to 3386) List-Archive: http://lists.mysql.com/commits/130174 Message-Id: <201102020728.p124pwtS015475@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8200689094977734009==" --===============8200689094977734009== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 3386 Martin Zaun 2011-02-01 [merge] merge from ndb-6.3-bug54327 to ndb-6.3 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 3385 Jonas Oreland 2011-02-01 ndb - remove empty line casuing 0 tests to be run... modified: storage/ndb/test/run-test/daily-basic-tests.txt storage/ndb/test/run-test/daily-devel-tests.txt === 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; --===============8200689094977734009== 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/ # testament_sha1: 0e19cc58ae5e4c72f226e18cc1e7bd2849ae8f4e # timestamp: 2011-02-01 23:26:51 -0800 # source_branch: file:///Users/mz/mysql/ndb-6.3-int64constants/ # base_revision_id: jonas@stripped # # Begin bundle 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 3aP/F3JFOFCQc/GLXg== --===============8200689094977734009==--