From: Martin Zaun Date: February 2 2011 7:25am Subject: bzr push into mysql-5.1-telco-7.1 branch (martin.zaun:4073 to 4074) List-Archive: http://lists.mysql.com/commits/130172 Message-Id: <201102020726.p127Q1Jg032206@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8103364384743382850==" --===============8103364384743382850== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 4074 Martin Zaun 2011-02-01 [merge] merge from ndb-7.0 to ndb-7.1 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 4073 Craig L Russell 2011-02-01 Fix copyright in schema.sql modified: storage/ndb/clusterj/clusterj-test/src/main/resources/schema.sql === 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; --===============8103364384743382850== 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.1/ # testament_sha1: c305abc4310788eaea1ccdef9d4c11f3f583d553 # timestamp: 2011-02-01 23:25:26 -0800 # source_branch: file:///Users/mz/mysql/ndb-7.1-opt1/ # base_revision_id: craig.russell@stripped\ # awcbn68swwjubi4q # # Begin bundle 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 OZ1+R2Ha//UPGhVfTo/8XckU4UJBGYQ3eA== --===============8103364384743382850==--