175 lines
4.5 KiB
PHP
175 lines
4.5 KiB
PHP
# Check that binlogging are turned on for these tests
|
|
--source include/have_log_bin.inc
|
|
|
|
#
|
|
# Run variations of ALTER RENAME based on template query
|
|
# on the form ALTER RENAME tx ... ty
|
|
#
|
|
|
|
if (!$query)
|
|
{
|
|
die Need the query to test with provided in $query;
|
|
}
|
|
|
|
let $num_tables = `select count(*) from information_schema.tables
|
|
where TABLE_SCHEMA = 'ndb_ddl_test'`;
|
|
if (!$num_tables)
|
|
{
|
|
die Could not figure out number of tables in ndb_ddl_test database;
|
|
}
|
|
|
|
|
|
let $counter = 1;
|
|
while ($counter <= $num_tables)
|
|
{
|
|
# Default table name is t$counter, ie. t1, t2, etc
|
|
let $tx=t$counter;
|
|
let $suffix=_new_name; # Small mysqltest trick to facilatate string concat
|
|
let $ty=t$counter$suffix;
|
|
#echo tx: $tx;
|
|
#echo ty: $ty;
|
|
|
|
# By default we don't expect any error
|
|
let $expected_error = 0;
|
|
|
|
if ($counter == 2)
|
|
{
|
|
# Rename to same name
|
|
# i.e t2 -> t2
|
|
let $ty = $tx;
|
|
if ($expect_rename_to_same_name_to_fail == 1)
|
|
{
|
|
let $expected_error = ER_TABLE_EXISTS_ERROR;
|
|
}
|
|
}
|
|
|
|
if ($counter == 3)
|
|
{
|
|
|
|
##
|
|
# Rename to same name but different db
|
|
# i.e t3 -> ndb_ddl_test2.t3
|
|
#
|
|
let $ty = ndb_ddl_test2.t3;
|
|
}
|
|
|
|
if ($counter == 4)
|
|
{
|
|
##
|
|
# Rename to different name and different db
|
|
# ie. t4 -> ndb_ddl_test2.t4
|
|
#
|
|
let $ty = ndb_ddl_test2.t4_new_name;
|
|
}
|
|
|
|
if ($counter == 5)
|
|
{
|
|
##
|
|
# Rename to a existing table name
|
|
# ie. t5 -> t2
|
|
let $ty = t2;
|
|
# This should fail
|
|
let $expected_error = ER_TABLE_EXISTS_ERROR;
|
|
}
|
|
|
|
# Replace ty and tx in the query and run it
|
|
let $replaced_query =
|
|
`select REPLACE(REPLACE('$query', 'tx', '$tx'), 'ty', '$ty')`;
|
|
if ($expected_error != 0)
|
|
{
|
|
# expect the query to fail
|
|
--error $expected_error
|
|
}
|
|
eval $replaced_query;
|
|
|
|
# Check that old name table does not exist
|
|
# (if the rename was not expected to fail
|
|
# and the rename is not to the same name)
|
|
# Note : using multiple ifs as MTR has a weird bug processing
|
|
# `if ($expected_error == 0 && $tx != $ty)`
|
|
if ($expected_error == 0) {
|
|
if ($tx != $ty) {
|
|
--disable_query_log
|
|
--disable_result_log
|
|
--error ER_NO_SUCH_TABLE
|
|
eval SELECT count(*) FROM $tx;
|
|
--enable_query_log
|
|
--enable_result_log
|
|
}
|
|
}
|
|
|
|
if ($expected_error != 0){
|
|
# The rename was expected to fail. Due to this, we can't
|
|
# verify the new table. Rather, check if the rollback was
|
|
# proper by verifying that the old table is still intact.
|
|
# We do this by assigning the old name to $ty and let the
|
|
# verification continue.
|
|
let $ty = $tx;
|
|
}
|
|
|
|
# Check that new name table exists
|
|
--disable_query_log
|
|
--disable_result_log
|
|
eval SELECT * FROM $ty;
|
|
--enable_query_log
|
|
--enable_result_log
|
|
|
|
# Check that new table contains expected number of rows
|
|
let $ty_count = `SELECT count(*) from $ty`;
|
|
if ($ty_count != 5)
|
|
{
|
|
echo Wrong number of rows, ecpected 5 got $ty_count;
|
|
die Wrong number of rows in renamed table;
|
|
}
|
|
|
|
# List all NDB objects for the renamed table and store them
|
|
# in temporary table in the test database
|
|
let $create_table_name = test.post_$tx;
|
|
let $list_table_name = $ty;
|
|
--source list_objects.inc
|
|
#eval select * from test.pre_$tx;
|
|
#eval select * from test.post_$tx;
|
|
|
|
# Compare the objects(indexes, blob tables etc.) on the renamed table whith
|
|
# what was there before. Ignore id and version since those are not expected
|
|
# to be the same
|
|
--disable_query_log
|
|
eval CREATE TEMPORARY TABLE test.diff_objects
|
|
SELECT * FROM (
|
|
SELECT type, state, parent_obj_type,
|
|
REPLACE(fq_name, parent_obj_id, 'X') AS masked_fq_name
|
|
FROM test.pre_$tx
|
|
UNION ALL
|
|
SELECT type, state, parent_obj_type,
|
|
REPLACE(fq_name, parent_obj_id, 'X') AS masked_fq_name
|
|
FROM test.post_$tx
|
|
) t
|
|
/* group by columns to compare */
|
|
GROUP BY type, state, parent_obj_type, masked_fq_name
|
|
/* return only those without match */
|
|
HAVING COUNT(*) = 1;
|
|
--enable_query_log
|
|
|
|
let $diff_rows = `SELECT count(*) FROM test.diff_objects`;
|
|
if ($diff_rows)
|
|
{
|
|
echo Detected diff in objects on renamed table;
|
|
eval SELECT * FROM test.pre_$tx ORDER BY ID;
|
|
eval SELECT * FROM test.post_$tx ORDER BY ID;
|
|
SELECT * FROM test.diff_objects ORDER BY ID;
|
|
die The objects created on the renamed table differed!;
|
|
}
|
|
--disable_query_log
|
|
DROP TABLE test.diff_objects;
|
|
--enable_query_log
|
|
|
|
inc $counter;
|
|
}
|
|
|
|
--source verify_mysql_dd.inc
|
|
|
|
|
|
# Reset parameters which should change between each invocation
|
|
let $sql =;
|
|
let $expect_rename_to_same_name_to_fail =;
|