#At file:///mnt/raid/alik/MySQL/bzr/wl4264/6.0-alik-wl4264.1/
2778 Alexander Nozdrin 2008-11-27
1. Expose warnings to the backup
2. Eliminate I_S.USER_PRIVILEGES
3. Refactor to eliminate copy & paste in Abstract_obj::create(),
Abstract_obj::drop() and run_service_interface_sql().
modified:
mysql-test/suite/backup/r/backup.result
mysql-test/suite/backup/r/backup_backupdir.result
mysql-test/suite/backup/r/backup_blob.result
mysql-test/suite/backup/r/backup_charsets.result
mysql-test/suite/backup/r/backup_commit_backup.result
mysql-test/suite/backup/r/backup_commit_blocker.result
mysql-test/suite/backup/r/backup_commit_restore.result
mysql-test/suite/backup/r/backup_compression.result
mysql-test/suite/backup/r/backup_concurrent.result
mysql-test/suite/backup/r/backup_db_grants.result
mysql-test/suite/backup/r/backup_default.result
mysql-test/suite/backup/r/backup_fkey.result
mysql-test/suite/backup/r/backup_lock_myisam.result
mysql-test/suite/backup/r/backup_logs.result
mysql-test/suite/backup/r/backup_many_dbs.result
mysql-test/suite/backup/r/backup_multi_blocks.result
mysql-test/suite/backup/r/backup_myisam2.result
mysql-test/suite/backup/r/backup_objects.result
mysql-test/suite/backup/r/backup_procedures.result
mysql-test/suite/backup/r/backup_security.result
mysql-test/suite/backup/r/backup_snapshot.result
mysql-test/suite/backup/r/backup_tablespace.result
mysql-test/suite/backup/r/backup_view_on_view.result
mysql-test/suite/backup/r/backup_views.result
sql/si_objects.cc
sql/si_objects.h
=== modified file 'mysql-test/suite/backup/r/backup.result'
--- a/mysql-test/suite/backup/r/backup.result 2008-11-19 16:32:01 +0000
+++ b/mysql-test/suite/backup/r/backup.result 2008-11-27 16:36:57 +0000
@@ -68,6 +68,13 @@ USE mysql;
RESTORE FROM 'test.ba';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'db1'; database doesn't exist
+# 1008 Can't drop database 'db2'; database doesn't exist
+# 1051 Unknown table 'building'
+# 1051 Unknown table 'directorate'
+# 1051 Unknown table 'staff'
+# 1051 Unknown table 'tasking'
SELECT MAX(backup_id) FROM mysql.backup_history INTO @bid;
SHOW CREATE DATABASE db1;
Database Create Database
@@ -352,6 +359,22 @@ backup_id
DROP DATABASE bup_default;
RESTORE FROM "bup_default.bak";
backup_id #
+Warnings:
+Level #
+Code 1008
+Message Can't drop database 'bup_default'; database doesn't exist
+Level #
+Code 1046
+Message No database selected
+Level #
+Code 1051
+Message Unknown table 't1_blob'
+Level #
+Code 1051
+Message Unknown table 't2'
+Level #
+Code 1051
+Message Unknown table 'wide'
SELECT * FROM bup_default.t1;
a
1
@@ -455,6 +478,12 @@ DROP DATABASE bup_default;
RESTORE FROM 'bup_default.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'bup_default'; database doesn't exist
+# 1046 No database selected
+# 1051 Unknown table 't1_blob'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 'wide'
SHOW VARIABLES LIKE 'sql_mode';
Variable_name Value
sql_mode REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI
@@ -501,6 +530,12 @@ DROP DATABASE bup_default;
RESTORE FROM 'bup_default.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'bup_default'; database doesn't exist
+# 1046 No database selected
+# 1051 Unknown table 't1_blob'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 'wide'
SHOW VARIABLES LIKE 'sql_mode';
Variable_name Value
sql_mode
@@ -561,6 +596,8 @@ do restore
RESTORE FROM 'bup_delete.bak';
backup_id
#
+Warnings:
+# 1051 Unknown table 'me'
show the data
SELECT * FROM bup_delete.me;
id ccode
@@ -596,6 +633,8 @@ Restore the database.
RESTORE FROM 'bup_default_timestamp.bak';
backup_id
#
+Warnings:
+# 1051 Unknown table 'time_t1'
Show data after restore (timestamp should be same as above).
SELECT * FROM bup_default.time_t1;
a b
=== modified file 'mysql-test/suite/backup/r/backup_backupdir.result'
--- a/mysql-test/suite/backup/r/backup_backupdir.result 2008-10-24 15:37:11 +0000
+++ b/mysql-test/suite/backup/r/backup_backupdir.result 2008-11-27 16:36:57 +0000
@@ -18,6 +18,8 @@ Perform restore
RESTORE FROM 'bup_backupdir1.bak';
backup_id
#
+Warnings:
+# 1051 Unknown table 't1'
Now do the backup and restore by specifying a path.
Perform backup
BACKUP DATABASE bup_backupdir TO '../bup_backupdir2.bak';
@@ -28,6 +30,8 @@ Perform restore
RESTORE FROM '../bup_backupdir2.bak';
backup_id
#
+Warnings:
+# 1046 No database selected
Perform backup
BACKUP DATABASE bup_backupdir TO '../../bup_backupdir3.bak';
backup_id
=== modified file 'mysql-test/suite/backup/r/backup_blob.result'
--- a/mysql-test/suite/backup/r/backup_blob.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_blob.result 2008-11-27 16:36:57 +0000
@@ -34,6 +34,11 @@ DROP DATABASE mysqltest;
RESTORE FROM 'blob.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'mysqltest'; database doesn't exist
+# 1046 No database selected
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
Check tables after restore
SELECT * FROM t1 ORDER BY id;
=== modified file 'mysql-test/suite/backup/r/backup_charsets.result'
--- a/mysql-test/suite/backup/r/backup_charsets.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_charsets.result 2008-11-27 16:36:57 +0000
@@ -21,6 +21,9 @@ DROP DATABASE backup_cs;
RESTORE FROM "backup_cs.bak";
backup_id
#
+Warnings:
+# 1008 Can't drop database 'backup_cs'; database doesn't exist
+# 1046 No database selected
USE backup_cs;
SHOW CREATE TABLE `アアア`;
Table Create Table
@@ -35,6 +38,9 @@ DROP DATABASE backup_cs;
RESTORE FROM "backup_cs.bak";
backup_id
#
+Warnings:
+# 1008 Can't drop database 'backup_cs'; database doesn't exist
+# 1046 No database selected
SHOW TABLES IN backup_cs;
Tables_in_backup_cs
???
=== modified file 'mysql-test/suite/backup/r/backup_commit_backup.result'
--- a/mysql-test/suite/backup/r/backup_commit_backup.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_commit_backup.result 2008-11-27 16:36:57 +0000
@@ -302,6 +302,11 @@ Checking contents of the backup image
RESTORE FROM 'db1.bak';
backup_id
#
+Warnings:
+# 1051 Unknown table 't1'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't4'
SELECT * FROM db1.t1;
s1
b1
=== modified file 'mysql-test/suite/backup/r/backup_commit_blocker.result'
--- a/mysql-test/suite/backup/r/backup_commit_blocker.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_commit_blocker.result 2008-11-27 16:36:57 +0000
@@ -132,6 +132,10 @@ con1: Restoring the database
RESTORE FROM "bup_commit_blocker.bak";
backup_id
#
+Warnings:
+# 1051 Unknown table 't1'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
con1: Showing the data (no new data should be here).
SELECT * FROM bup_commit_blocker.t1;
col_a
@@ -232,6 +236,8 @@ con1: Restoring the database
RESTORE FROM "bup_commit_blocker.bak";
backup_id
#
+Warnings:
+# 1046 No database selected
con1: Showing the data (no new data should be here).
SELECT * FROM bup_commit_blocker.t5;
col_a
@@ -414,6 +420,11 @@ con1: Restoring the database
RESTORE FROM "bup_commit_blocker.bak";
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't5'
con1: Showing the data (no new data should be here).
SELECT * FROM bup_commit_blocker.t1;
col_a
=== modified file 'mysql-test/suite/backup/r/backup_commit_restore.result'
--- a/mysql-test/suite/backup/r/backup_commit_restore.result 2008-10-23 08:13:54 +0000
+++ b/mysql-test/suite/backup/r/backup_commit_restore.result 2008-11-27 16:36:57 +0000
@@ -9,6 +9,8 @@ backup_id
RESTORE FROM '81';
backup_id
#
+Warnings:
+# 1046 No database selected
SELECT * FROM t1;
s1
a1
@@ -27,6 +29,9 @@ backup_id
RESTORE FROM '82';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
SELECT * FROM t1;
s1
a1
@@ -54,6 +59,10 @@ backup_id
RESTORE FROM '83';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
SELECT * FROM t1;
s1
a1
@@ -92,6 +101,11 @@ backup_id
RESTORE FROM '84';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't4'
SELECT * FROM t1;
s1
a1
@@ -141,6 +155,11 @@ backup_id
RESTORE FROM '85';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't4'
SELECT * FROM t1;
s1
a1
@@ -201,6 +220,12 @@ SET @@autocommit=0;
RESTORE FROM '86';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't4'
+# 1051 Unknown table 't5'
DROP TABLE t5;
SELECT * FROM t1;
s1
@@ -268,6 +293,11 @@ SET @@autocommit=1;
RESTORE FROM '87';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't4'
SELECT * FROM t1;
s1
a1
=== modified file 'mysql-test/suite/backup/r/backup_compression.result'
--- a/mysql-test/suite/backup/r/backup_compression.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_compression.result 2008-11-27 16:36:57 +0000
@@ -10,12 +10,17 @@ backup_id
RESTORE FROM 'db1.bak.gz';
backup_id
#
+Warnings:
+# 1051 Unknown table 't1'
SHOW TABLES FROM db1;
Tables_in_db1
t1
RESTORE FROM 'db2.bak.gz';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
SHOW TABLES FROM db1;
Tables_in_db1
t1
=== modified file 'mysql-test/suite/backup/r/backup_concurrent.result'
--- a/mysql-test/suite/backup/r/backup_concurrent.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_concurrent.result 2008-11-27 16:36:57 +0000
@@ -68,6 +68,8 @@ Wait for backup to complete
SET DEBUG_SYNC= 'now SIGNAL restore';
backup_id
#
+Warnings:
+# 1051 Unknown table 't'
Test completed. Cleaning up.
=== modified file 'mysql-test/suite/backup/r/backup_db_grants.result'
--- a/mysql-test/suite/backup/r/backup_db_grants.result 2008-11-19 16:32:01 +0000
+++ b/mysql-test/suite/backup/r/backup_db_grants.result 2008-11-27 16:36:57 +0000
@@ -70,6 +70,8 @@ RESTORE FROM 'bup_db_grants.bak';
backup_id
#
Warnings:
+# 1051 Unknown table 's1'
+# 1051 Unknown table 't1'
# 1737 The grant 'ALTER ON bup_db_grants.*' for the user 'no_user'@'%' was skipped because the user does not exist.
# 1737 The grant 'ALTER ROUTINE ON bup_db_grants.*' for the user 'no_user'@'%' was skipped because the user does not exist.
# 1737 The grant 'CREATE ON bup_db_grants.*' for the user 'no_user'@'%' was skipped because the user does not exist.
@@ -121,6 +123,8 @@ RESTORE FROM 'bup_db_grants.bak';
backup_id
#
Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't1'
# 1737 The grant 'INSERT ON bup_db_grants.*' for the user 'bup_user2'@'%' was skipped because the user does not exist.
# 1737 The grant 'INSERT(b) ON bup_db_grants.s1' for the user 'bup_user2'@'%' was skipped because the user does not exist.
# 1737 The grant 'SELECT(b) ON bup_db_grants.s1' for the user 'bup_user2'@'%' was skipped because the user does not exist.
@@ -212,6 +216,9 @@ Run restore.
RESTORE FROM 'bup_db_grants.bak';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't1'
FLUSH PRIVILEGES;
Ensure grants have been restored.
EXECUTE stmt3;
=== modified file 'mysql-test/suite/backup/r/backup_default.result'
--- a/mysql-test/suite/backup/r/backup_default.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_default.result 2008-11-27 16:36:57 +0000
@@ -20,6 +20,9 @@ restore on csv only
RESTORE FROM 'bup_csv.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'db1'; database doesn't exist
+# 1046 No database selected
testing content in restored tables
SELECT * FROM csv_table ORDER BY id;
id name city
=== modified file 'mysql-test/suite/backup/r/backup_fkey.result'
--- a/mysql-test/suite/backup/r/backup_fkey.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_fkey.result 2008-11-27 16:36:57 +0000
@@ -46,9 +46,14 @@ Now restore the database.
RESTORE FROM 'backup_fkey.bak';
backup_id
#
+Warnings:
+# 1051 Unknown table 'child'
RESTORE FROM 'backup_fkey_orig.bak';
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 'parent'
Show data
SELECT * FROM backup_fkey.parent;
id
@@ -87,6 +92,8 @@ Restoring data
RESTORE FROM 'backup_fkey.bak';
backup_id
#
+Warnings:
+# 1046 No database selected
Verify foreign_key_checks = ON
SHOW VARIABLES LIKE 'foreign_key_checks%';
Variable_name Value
@@ -100,6 +107,8 @@ Restoring data
RESTORE FROM 'backup_fkey.bak';
backup_id
#
+Warnings:
+# 1046 No database selected
Verify foreign_key_checks = OFF
SHOW VARIABLES LIKE 'foreign_key_checks%';
Variable_name Value
=== modified file 'mysql-test/suite/backup/r/backup_lock_myisam.result'
--- a/mysql-test/suite/backup/r/backup_lock_myisam.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_lock_myisam.result 2008-11-27 16:36:57 +0000
@@ -71,6 +71,11 @@ Reattach to connection 2 and finish.
Reattach to connection 1 and finish.
backup_id
#
+Warnings:
+# 1008 Can't drop database 'db1'; database doesn't exist
+# 1051 Unknown table 't1'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
Show the count for t1. It should be 1 more than before restore.
SELECT COUNT(*) FROM db1.t1;
COUNT(*)
@@ -120,6 +125,10 @@ a
Reattach to connection 1 and finish.
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
Show the count for t1. It should be the same as before restore.
SELECT COUNT(*) FROM db1.t1;
COUNT(*)
@@ -164,6 +173,9 @@ DROP DATABASE db3;
RESTORE FROM 'db3.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'db3'; database doesn't exist
+# 1051 Unknown table 'db3.v1'
Show the table and view.
SHOW FULL TABLES FROM db3;
Tables_in_db3 Table_type
=== modified file 'mysql-test/suite/backup/r/backup_logs.result'
--- a/mysql-test/suite/backup/r/backup_logs.result 2008-10-15 20:00:48 +0000
+++ b/mysql-test/suite/backup/r/backup_logs.result 2008-11-27 16:36:57 +0000
@@ -156,6 +156,11 @@ SET DEBUG_SYNC= 'now SIGNAL finish';
con2: Finish restore command
backup_id
#
+Warnings:
+# 1051 Unknown table 't1'
+# 1051 Unknown table 't1_res'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 't3'
SET DEBUG_SYNC= 'now SIGNAL complete';
SET DEBUG_SYNC= 'now WAIT_FOR complete';
DELETE FROM backup_logs.t1_res;
=== modified file 'mysql-test/suite/backup/r/backup_many_dbs.result'
--- a/mysql-test/suite/backup/r/backup_many_dbs.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_many_dbs.result 2008-11-27 16:36:57 +0000
@@ -64,6 +64,25 @@ Restoring databases
RESTORE FROM 'bup_manydbs.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'db1'; database doesn't exist
+# 1008 Can't drop database 'db2'; database doesn't exist
+# 1008 Can't drop database 'db3'; database doesn't exist
+# 1008 Can't drop database 'db4'; database doesn't exist
+# 1008 Can't drop database 'db5'; database doesn't exist
+# 1008 Can't drop database 'db6'; database doesn't exist
+# 1008 Can't drop database 'db7'; database doesn't exist
+# 1008 Can't drop database 'db8'; database doesn't exist
+# 1008 Can't drop database 'db9'; database doesn't exist
+# 1008 Can't drop database 'db10'; database doesn't exist
+# 1008 Can't drop database 'db11'; database doesn't exist
+# 1008 Can't drop database 'db12'; database doesn't exist
+# 1008 Can't drop database 'db13'; database doesn't exist
+# 1008 Can't drop database 'db14'; database doesn't exist
+# 1008 Can't drop database 'db15'; database doesn't exist
+# 1008 Can't drop database 'db16'; database doesn't exist
+# 1008 Can't drop database 'db17'; database doesn't exist
+# 1008 Can't drop database 'db18'; database doesn't exist
Checking that all dbs are there
SHOW DATABASES LIKE 'db%';
Database (db%)
=== modified file 'mysql-test/suite/backup/r/backup_multi_blocks.result'
--- a/mysql-test/suite/backup/r/backup_multi_blocks.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_multi_blocks.result 2008-11-27 16:36:57 +0000
@@ -31,6 +31,9 @@ Performing restore ...
RESTORE FROM 'test.ba';
backup_id
#;
+Warnings:
+#; 1008 Can't drop database 'mysqltest'; database doesn't exist
+#; 1046 No database selected
Checking contents of restore ...
SELECT LENGTH(a) FROM t1;
LENGTH(a)
=== modified file 'mysql-test/suite/backup/r/backup_myisam2.result'
--- a/mysql-test/suite/backup/r/backup_myisam2.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_myisam2.result 2008-11-27 16:36:57 +0000
@@ -48,6 +48,9 @@ DROP DATABASE mysqltest;
RESTORE FROM 'test.ba';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'mysqltest'; database doesn't exist
+# 1046 No database selected
SELECT LENGTH(c1) FROM t1;
LENGTH(c1)
262144
=== modified file 'mysql-test/suite/backup/r/backup_objects.result'
--- a/mysql-test/suite/backup/r/backup_objects.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_objects.result 2008-11-27 16:36:57 +0000
@@ -90,6 +90,24 @@ SET character_set_client = 'latin1';
RESTORE FROM 'bup_objects.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'db1'; database doesn't exist
+# 1008 Can't drop database 'db2'; database doesn't exist
+# 1051 Unknown table 't11'
+# 1051 Unknown table 't12'
+# 1051 Unknown table 't13'
+# 1051 Unknown table 't21'
+# 1305 PROCEDURE db2.p11 does not exist
+# 1305 PROCEDURE db1.p21 does not exist
+# 1305 FUNCTION db2.f21 does not exist
+# 1051 Unknown table 'db2.v22'
+# 1051 Unknown table 'db2.v11'
+# 1051 Unknown table 'db1.v12'
+# 1051 Unknown table 'db1.v21'
+# 1360 Trigger does not exist
+# 1360 Trigger does not exist
+# 1305 Event e11 does not exist
+# 1305 Event e21 does not exist
SHOW TABLES IN db1;
Tables_in_db1
t11
=== modified file 'mysql-test/suite/backup/r/backup_procedures.result'
--- a/mysql-test/suite/backup/r/backup_procedures.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_procedures.result 2008-11-27 16:36:57 +0000
@@ -26,6 +26,10 @@ DROP DATABASE bup_proc;
RESTORE FROM 'bup_proc.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'bup_proc'; database doesn't exist
+# 1046 No database selected
+# 1305 PROCEDURE bup_proc.p2 does not exist
Check that procedures are there after the restore
CALL p1();
=== modified file 'mysql-test/suite/backup/r/backup_security.result'
--- a/mysql-test/suite/backup/r/backup_security.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_security.result 2008-11-27 16:36:57 +0000
@@ -52,6 +52,8 @@ no_rights: Attempting restore. Should su
RESTORE FROM 'bup_with_rights.bak';
backup_id
#
+Warnings:
+# 1046 No database selected
SELECT * FROM backup_test.t1;
a
01 Test #1 - super privilege
@@ -65,6 +67,8 @@ default: Do restore to ensure it still w
RESTORE FROM 'backup_test_orig.bak';
backup_id
#
+Warnings:
+# 1051 Unknown table 't1'
SELECT * FROM backup_test.t1;
a
01 Test #1 - super privilege
=== modified file 'mysql-test/suite/backup/r/backup_snapshot.result'
--- a/mysql-test/suite/backup/r/backup_snapshot.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_snapshot.result 2008-11-27 16:36:57 +0000
@@ -63,6 +63,9 @@ con1: Restoring the database
RESTORE FROM "bup_snapshot.bak";
backup_id
#
+Warnings:
+# 1051 Unknown table 't1'
+# 1051 Unknown table 't2'
con1: Showing the data (no new data should be here).
SELECT * FROM bup_snapshot.t1 WHERE word LIKE '-%';
word
@@ -109,6 +112,9 @@ con1: Restoring the database
RESTORE FROM "bup_snapshot.bak";
backup_id
#
+Warnings:
+# 1046 No database selected
+# 1051 Unknown table 't2'
con1: Showing the data (no new data should be here).
SELECT * FROM bup_snapshot.t1 WHERE word LIKE '-%';
word
=== modified file 'mysql-test/suite/backup/r/backup_tablespace.result'
--- a/mysql-test/suite/backup/r/backup_tablespace.result 2008-10-13 12:37:10 +0000
+++ b/mysql-test/suite/backup/r/backup_tablespace.result 2008-11-27 16:36:57 +0000
@@ -28,6 +28,10 @@ Now restore the database.
RESTORE FROM 'backup_ts.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'backup_ts'; database doesn't exist
+# 1051 Unknown table 'has_ts'
+# 1051 Unknown table 'not_ts'
Show data
SELECT * FROM backup_ts.not_ts;
id comment
=== modified file 'mysql-test/suite/backup/r/backup_view_on_view.result'
--- a/mysql-test/suite/backup/r/backup_view_on_view.result 2008-10-07 17:15:44 +0000
+++ b/mysql-test/suite/backup/r/backup_view_on_view.result 2008-11-27 16:36:57 +0000
@@ -11,6 +11,10 @@ backup_id
RESTORE FROM 'test.bak';
backup_id
#
+Warnings:
+# 1051 Unknown table 't1'
+# 1051 Unknown table 'db1.v1'
+# 1051 Unknown table 'db1.v2'
SELECT * FROM db1.v2;
a
1
=== modified file 'mysql-test/suite/backup/r/backup_views.result'
--- a/mysql-test/suite/backup/r/backup_views.result 2008-11-26 13:46:42 +0000
+++ b/mysql-test/suite/backup/r/backup_views.result 2008-11-27 16:36:57 +0000
@@ -285,6 +285,21 @@ DROP DATABASE bup_db2;
RESTORE FROM 'bup_objectview.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'bup_db1'; database doesn't exist
+# 1008 Can't drop database 'bup_db2'; database doesn't exist
+# 1046 No database selected
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't5'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 'bup_db2.v1'
+# 1051 Unknown table 'bup_db1.v5'
+# 1051 Unknown table 'bup_db1.v2'
+# 1051 Unknown table 'bup_db2.v6'
+# 1051 Unknown table 'bup_db1.vcomb'
+# 1051 Unknown table 'bup_db1.student_details'
+# 1051 Unknown table 'bup_db2.v3'
+# 1051 Unknown table 'bup_db2.vv'
showing objects and create statements
SHOW CREATE DATABASE bup_db1;;
Database bup_db1
@@ -490,6 +505,21 @@ DROP DATABASE bup_db2;
RESTORE FROM 'bup_objectview3.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'bup_db1'; database doesn't exist
+# 1008 Can't drop database 'bup_db2'; database doesn't exist
+# 1046 No database selected
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't5'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 'bup_db2.v1'
+# 1051 Unknown table 'bup_db1.v5'
+# 1051 Unknown table 'bup_db1.v2'
+# 1051 Unknown table 'bup_db2.v6'
+# 1051 Unknown table 'bup_db1.vcomb'
+# 1051 Unknown table 'bup_db1.student_details'
+# 1051 Unknown table 'bup_db2.v3'
+# 1051 Unknown table 'bup_db2.vv'
SELECT * FROM bup_db2.v3 ORDER BY age;
name age education
aa3 19 School
@@ -523,6 +553,21 @@ DROP DATABASE bup_db2;
RESTORE FROM 'bup_objectview.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'bup_db1'; database doesn't exist
+# 1008 Can't drop database 'bup_db2'; database doesn't exist
+# 1046 No database selected
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't5'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 'bup_db2.v1'
+# 1051 Unknown table 'bup_db1.v5'
+# 1051 Unknown table 'bup_db1.v2'
+# 1051 Unknown table 'bup_db2.v6'
+# 1051 Unknown table 'bup_db1.vcomb'
+# 1051 Unknown table 'bup_db1.student_details'
+# 1051 Unknown table 'bup_db2.v3'
+# 1051 Unknown table 'bup_db2.vv'
SELECT * FROM bup_db1.t1;
id name city
1 aa1 RR1
@@ -574,6 +619,21 @@ DROP DATABASE bup_db2;
RESTORE FROM 'bup_objectview.bak';
backup_id
#
+Warnings:
+# 1008 Can't drop database 'bup_db1'; database doesn't exist
+# 1008 Can't drop database 'bup_db2'; database doesn't exist
+# 1046 No database selected
+# 1051 Unknown table 't3'
+# 1051 Unknown table 't5'
+# 1051 Unknown table 't2'
+# 1051 Unknown table 'bup_db2.v1'
+# 1051 Unknown table 'bup_db1.v5'
+# 1051 Unknown table 'bup_db1.v2'
+# 1051 Unknown table 'bup_db2.v6'
+# 1051 Unknown table 'bup_db1.vcomb'
+# 1051 Unknown table 'bup_db1.student_details'
+# 1051 Unknown table 'bup_db2.v3'
+# 1051 Unknown table 'bup_db2.vv'
USE bup_db1;
CREATE VIEW alter1 AS SELECT 5;
CREATE VIEW alter2 AS SELECT * FROM alter1;
=== modified file 'sql/si_objects.cc'
--- a/sql/si_objects.cc 2008-11-26 14:43:03 +0000
+++ b/sql/si_objects.cc 2008-11-27 16:36:57 +0000
@@ -46,51 +46,169 @@ namespace {
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
+/**
+ Si_session_context defines a way to save/reset/restore session context
+ for SI-operations.
+*/
+
+class Si_session_context
+{
+public:
+ inline Si_session_context()
+ { }
+
+public:
+ void save(THD *thd);
+ void reset(THD *thd);
+ void restore(THD *thd);
+
+private:
+ ulong m_sql_mode_saved;
+ CHARSET_INFO *m_client_cs_saved;
+ CHARSET_INFO *m_results_cs_saved;
+ CHARSET_INFO *m_connection_cl_saved;
+ Time_zone *m_tz_saved;
+ TABLE *m_tmp_tables_saved;
+
+private:
+ Si_session_context(const Si_session_context &);
+ Si_session_context &operator =(const Si_session_context &);
+};
+
+///////////////////////////////////////////////////////////////////////////
+
+/**
+ Preserve the following session attributes:
+ - sql_mode;
+ - character_set_client;
+ - character_set_results;
+ - collation_connection;
+ - time_zone;
+
+ Remember also session temporary tables.
+*/
+
+void Si_session_context::save(THD *thd)
+{
+ DBUG_ENTER("Si_session_context::save");
+ m_sql_mode_saved= thd->variables.sql_mode;
+ m_client_cs_saved= thd->variables.character_set_client;
+ m_results_cs_saved= thd->variables.character_set_results;
+ m_connection_cl_saved= thd->variables.collation_connection;
+ m_tz_saved= thd->variables.time_zone;
+ m_tmp_tables_saved= thd->temporary_tables;
+
+ DBUG_VOID_RETURN;
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+/**
+ Reset session state to the following:
+ - sql_mode: 0
+ - character_set_client: utf8
+ - character_set_results: binary (to fetch results w/o conversion)
+ - collation_connection: utf8
+
+ Temporary tables should be ignored while looking for table structures.
+ We want to deal with real tables, not temporary ones.
+*/
+
+void Si_session_context::reset(THD *thd)
+{
+ DBUG_ENTER("Si_session_context::reset");
+
+ thd->variables.sql_mode= 0;
+
+ thd->variables.character_set_client= system_charset_info;
+ thd->variables.character_set_results= &my_charset_bin;
+ thd->variables.collation_connection= system_charset_info;
+ thd->update_charset();
+
+ thd->temporary_tables= NULL;
+
+ DBUG_VOID_RETURN;
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+/**
+ Restore session state.
+*/
+
+void Si_session_context::restore(THD *thd)
+{
+ DBUG_ENTER("Si_session_context::restore");
+
+ thd->variables.sql_mode= m_sql_mode_saved;
+ thd->variables.time_zone= m_tz_saved;
+
+ thd->variables.collation_connection= m_connection_cl_saved;
+ thd->variables.character_set_results= m_results_cs_saved;
+ thd->variables.character_set_client= m_client_cs_saved;
+ thd->update_charset();
+
+ thd->temporary_tables= m_tmp_tables_saved;
+
+ DBUG_VOID_RETURN;
+}
+
+///////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////
+
+/**
+ Execute one DML statement in a backup-specific context. Result set and
+ warning information are stored in the output parameter. Some session
+ attributes are preserved and reset to predefined values before query
+ execution (@see Si_session_context).
+
+ @param[in] thd Thread context.
+ @param[in] query SQL query to be executed.
+ @param[out] ed_result A place to store result and warnings.
+
+ @return Error status.
+ @retval TRUE on error.
+ @retval FALSE on success.
+*/
+
bool
run_service_interface_sql(THD *thd, const LEX_STRING *query,
Ed_result *ed_result)
{
- ulong sql_mode_saved= thd->variables.sql_mode;
- CHARSET_INFO *client_cs_saved= thd->variables.character_set_client;
- CHARSET_INFO *results_cs_saved= thd->variables.character_set_results;
- CHARSET_INFO *connection_cl_saved= thd->variables.collation_connection;
- TABLE *tmp_tables_saved= thd->temporary_tables;
+ Si_session_context session_context;
DBUG_ENTER("run_service_interface_sql");
DBUG_PRINT("run_service_interface_sql",
("query: %.*s",
(int) query->length, (const char *) query->str));
- thd->variables.sql_mode= 0;
+ session_context.save(thd);
+ session_context.reset(thd);
- /*
- Temporary tables should be ignored while looking for table structures.
- Backup wants to backup ordinary tables, not temporary ones.
- */
- thd->temporary_tables= NULL;
+ bool rc= mysql_execute_direct(thd, *query, ed_result);
- /* A query is in UTF8 (internal character set). */
- thd->variables.character_set_client= system_charset_info;
+ session_context.restore(thd);
- /*
- Ed_results should be fetched without any conversion (in the original
- character set) in order to preserve object definition query intact.
- */
- thd->variables.character_set_results= &my_charset_bin;
- thd->variables.collation_connection= system_charset_info;
- thd->update_charset();
+ DBUG_RETURN(rc);
+}
- bool rc= mysql_execute_direct(thd, *query, ed_result);
+///////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////
- thd->variables.sql_mode= sql_mode_saved;
- thd->variables.collation_connection= connection_cl_saved;
- thd->variables.character_set_results= results_cs_saved;
- thd->variables.character_set_client= client_cs_saved;
- thd->update_charset();
+/**
+ Update THD with the warnings from the given list.
- thd->temporary_tables= tmp_tables_saved;
+ @param[in] thd Thread context.
+ @parampin] src Warning list.
+*/
- DBUG_RETURN(rc);
+void copy_warnings(THD *thd, List<MYSQL_ERROR> *src)
+{
+ List_iterator_fast<MYSQL_ERROR> err_it(*src);
+ MYSQL_ERROR *err;
+
+ while ((err= err_it++))
+ thd->warning_info->push_warning(thd, err->level, err->code, err->msg);
}
///////////////////////////////////////////////////////////////////////////
@@ -106,10 +224,10 @@ public:
static void delete_key(void *data);
public:
- Table_name_key(const char *db_name_str,
- uint db_name_length,
- const char *table_name_str,
- uint table_name_length)
+ inline Table_name_key(const char *db_name_str,
+ uint db_name_length,
+ const char *table_name_str,
+ uint table_name_length)
{
db_name.copy(db_name_str, db_name_length, system_charset_info);
table_name.copy(table_name_str, table_name_length, system_charset_info);
@@ -158,47 +276,69 @@ struct Int_value
{ }
};
+///////////////////////////////////////////////////////////////////////////
struct C_str
{
LEX_STRING lex_string;
- C_str(const char *str, size_t length)
+ inline C_str(const char *str, size_t length)
{
lex_string.str= (char *) str;
lex_string.length= length;
}
};
+///////////////////////////////////////////////////////////////////////////
class String_stream
{
public:
- String_stream()
+ inline String_stream()
: m_buffer(&m_container)
{ }
- String_stream(String *dst)
+ inline String_stream(String *dst)
: m_buffer(dst)
{ }
public:
- String *str() { return m_buffer; }
+ inline String *str() { return m_buffer; }
- const LEX_STRING *lex_string()
+ inline const LEX_STRING *lex_string()
{
m_lex_string= m_buffer->lex_string();
return &m_lex_string;
}
- void reset() { m_buffer->length(0); }
+ inline void reset() { m_buffer->length(0); }
public:
String_stream &operator <<(const Int_value &v);
- String_stream &operator <<(const C_str &v);
- String_stream &operator <<(const LEX_STRING *query);
- String_stream &operator <<(const String *query);
- String_stream &operator <<(const char *str);
+
+ inline String_stream &operator <<(const C_str &v)
+ {
+ m_buffer->append(v.lex_string.str, v.lex_string.length);
+ return *this;
+ }
+
+ inline String_stream &operator <<(const LEX_STRING *v)
+ {
+ m_buffer->append(v->str, v->length);
+ return *this;
+ }
+
+ inline String_stream &operator <<(const String *v)
+ {
+ m_buffer->append(v->ptr(), v->length());
+ return *this;
+ }
+
+ String_stream &operator <<(const char *v)
+ {
+ m_buffer->append(v);
+ return *this;
+ }
private:
String m_container;
@@ -217,49 +357,35 @@ String_stream &String_stream::operator <
return *this;
}
-
-String_stream &String_stream::operator <<(const C_str &v)
-{
- m_buffer->append(v.lex_string.str, v.lex_string.length);
- return *this;
-}
-
-
-String_stream &String_stream::operator <<(const LEX_STRING *str)
-{
- m_buffer->append(str->str, str->length);
- return *this;
-}
-
-
-String_stream &String_stream::operator <<(const String *str)
-{
- m_buffer->append(str->ptr(), str->length());
- return *this;
-}
-
-
-String_stream &String_stream::operator <<(const char *str)
-{
- m_buffer->append(str);
- return *this;
-}
-
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
class Out_stream
{
public:
- Out_stream(String *image) :
+ inline Out_stream(String *image) :
m_image(image)
{ }
public:
- Out_stream &operator <<(const char *query);
Out_stream &operator <<(const LEX_STRING *query);
- Out_stream &operator <<(const String *query);
- Out_stream &operator <<(String_stream &s_stream);
+
+ inline Out_stream &operator <<(const char *query)
+ {
+ LEX_STRING str= { (char *) query, strlen(query) };
+ return Out_stream::operator <<(&str);
+ }
+
+ inline Out_stream &operator <<(const String *query)
+ {
+ LEX_STRING str= { (char *) query->ptr(), query->length() };
+ return Out_stream::operator <<(&str);
+ }
+
+ inline Out_stream &operator <<(String_stream &s_stream)
+ {
+ return Out_stream::operator <<(s_stream.str());
+ }
private:
String *m_image;
@@ -267,14 +393,6 @@ private:
///////////////////////////////////////////////////////////////////////////
-Out_stream &Out_stream::operator <<(const char *query)
-{
- LEX_STRING str= { (char *) query, strlen(query) };
- return Out_stream::operator <<(&str);
-}
-
-///////////////////////////////////////////////////////////////////////////
-
Out_stream &Out_stream::operator <<(const LEX_STRING *query)
{
String_stream s_stream(m_image);
@@ -286,37 +404,19 @@ Out_stream &Out_stream::operator <<(cons
}
///////////////////////////////////////////////////////////////////////////
-
-Out_stream &Out_stream::operator <<(const String *query)
-{
- LEX_STRING str= { (char *) query->ptr(), query->length() };
- return Out_stream::operator <<(&str);
-}
-
-///////////////////////////////////////////////////////////////////////////
-
-Out_stream &Out_stream::operator <<(String_stream &s_stream)
-{
- return Out_stream::operator <<(s_stream.str());
-}
-
-///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
class In_stream
{
public:
- In_stream(uint image_version,
- const String *image)
- : m_image_version(image_version),
- m_image(image),
- m_read_ptr(m_image->ptr()),
- m_end_ptr(m_image->ptr() + m_image->length())
+ inline In_stream(uint image_version, const String *image)
+ : m_image_version(image_version),
+ m_image(image),
+ m_read_ptr(m_image->ptr()),
+ m_end_ptr(m_image->ptr() + m_image->length())
{ }
public:
- uint image_version() const { return m_image_version; }
-public:
bool next(LEX_STRING *chunk);
private:
@@ -351,10 +451,10 @@ bool In_stream::next(LEX_STRING *chunk)
chunk->str= (char *) delimiter_ptr + 1;
chunk->length= atoi(buffer);
- m_read_ptr+= n /* chunk length */
- + 1 /* delimiter (a space) */
+ m_read_ptr+= n /* chunk length */
+ + 1 /* delimiter (a space) */
+ chunk->length /* chunk */
- + 1; /* chunk delimiter (\n) */
+ + 1; /* chunk delimiter (\n) */
return FALSE;
}
@@ -371,6 +471,12 @@ namespace obs {
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
+/**
+ @class Abstract_obj
+
+ This class is a base class for all other Obj implementations.
+*/
+
class Abstract_obj : public Obj
{
public:
@@ -444,9 +550,9 @@ protected:
String m_id; //< identify object
protected:
- Abstract_obj(LEX_STRING id);
+ inline Abstract_obj(LEX_STRING id);
- virtual ~Abstract_obj();
+ virtual inline ~Abstract_obj();
private:
Abstract_obj(const Abstract_obj &);
@@ -455,7 +561,7 @@ private:
///////////////////////////////////////////////////////////////////////////
-Abstract_obj::Abstract_obj(LEX_STRING id)
+inline Abstract_obj::Abstract_obj(LEX_STRING id)
{
init_sql_alloc(&m_mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
@@ -467,7 +573,7 @@ Abstract_obj::Abstract_obj(LEX_STRING id
///////////////////////////////////////////////////////////////////////////
-Abstract_obj::~Abstract_obj()
+inline Abstract_obj::~Abstract_obj()
{
free_root(&m_mem_root, MYF(0));
}
@@ -530,6 +636,9 @@ bool Abstract_obj::create(THD *thd)
bool rc= FALSE;
List_iterator_fast<LEX_STRING> it(m_stmt_list);
LEX_STRING *sql_text;
+ Si_session_context session_context;
+
+ DBUG_ENTER("Abstract_obj::create");
/*
Drop the object if it exists first of all.
@@ -540,44 +649,13 @@ bool Abstract_obj::create(THD *thd)
drop(thd);
/*
- Preserve the following session attributes:
- - sql_mode;
- - character_set_client;
- - character_set_results;
- - collation_connection;
- - time_zone;
-
- @note other session variables are not preserved, so serialization image
- must take care to clean up the environment after itself.
- */
- ulong sql_mode_saved= thd->variables.sql_mode;
- Time_zone *tz_saved= thd->variables.time_zone;
- CHARSET_INFO *client_cs_saved= thd->variables.character_set_client;
- CHARSET_INFO *results_cs_saved= thd->variables.character_set_results;
- CHARSET_INFO *connection_cl_saved= thd->variables.collation_connection;
- TABLE *tmp_tables_saved= thd->temporary_tables;
-
- /*
- Reset session state to the following:
- - sql_mode: 0
- - character_set_client: utf8
- - character_set_results: binary
- - collation_connection: utf8
- */
- thd->variables.sql_mode= 0;
- thd->variables.character_set_client= system_charset_info;
- thd->variables.character_set_results= &my_charset_bin;
- thd->variables.collation_connection= system_charset_info;
- thd->update_charset();
-
- /*
- Temporary tables should be ignored while looking for table structures.
- Backup wants to deal with ordinary tables, not temporary ones.
+ Now, proceed with creating the object.
*/
- thd->temporary_tables= NULL;
+ session_context.save(thd);
+ session_context.reset(thd);
/* Allow to execute DDL operations. */
- ddl_blocker_exception_on(thd);
+ ::obs::ddl_blocker_exception_on(thd);
/* Run queries from the serialization image. */
while ((sql_text= it++))
@@ -586,29 +664,25 @@ bool Abstract_obj::create(THD *thd)
rc= mysql_execute_direct(thd, *sql_text, &ed_result);
- /* Ignore warnings from materialization for now. */
+ /* Push warnings on the THD error stack. */
+ copy_warnings(thd, &ed_result.get_warnings());
+
if (rc)
break;
}
- ddl_blocker_exception_off(thd);
-
- thd->variables.sql_mode= sql_mode_saved;
- thd->variables.time_zone= tz_saved;
- thd->variables.collation_connection= connection_cl_saved;
- thd->variables.character_set_results= results_cs_saved;
- thd->variables.character_set_client= client_cs_saved;
- thd->update_charset();
+ /* Disable further DDL execution. */
+ ::obs::ddl_blocker_exception_off(thd);
- thd->temporary_tables= tmp_tables_saved;
+ session_context.restore(thd);
- return rc;
+ DBUG_RETURN(rc);
}
///////////////////////////////////////////////////////////////////////////
/**
- Create the object in the database.
+ Drop the object in the database.
@param[in] thd Server thread context.
@@ -619,71 +693,39 @@ bool Abstract_obj::create(THD *thd)
bool Abstract_obj::drop(THD *thd)
{
- bool rc= FALSE;
+ String_stream s_stream;
+ const LEX_STRING *sql_text;
- /*
- Preserve the following session attributes:
- - sql_mode;
- - character_set_client;
- - character_set_results;
- - collation_connection;
+ DBUG_ENTER("Abstract_obj::drop");
- Remember also session temporary tables.
- */
- ulong sql_mode_saved= thd->variables.sql_mode;
- CHARSET_INFO *client_cs_saved= thd->variables.character_set_client;
- CHARSET_INFO *results_cs_saved= thd->variables.character_set_results;
- CHARSET_INFO *connection_cl_saved= thd->variables.collation_connection;
- TABLE *tmp_tables_saved= thd->temporary_tables;
+ build_drop_statement(s_stream);
+ sql_text= s_stream.lex_string();
- /*
- Reset session state to the following:
- - sql_mode: 0
- - character_set_client: utf8
- - character_set_results: binary
- - collation_connection: utf8
- */
- thd->variables.sql_mode= 0;
- thd->variables.character_set_client= system_charset_info;
- thd->variables.character_set_results= &my_charset_bin;
- thd->variables.collation_connection= system_charset_info;
- thd->update_charset();
-
- /*
- Temporary tables should be ignored while looking for table structures.
- Backup wants to deal with ordinary tables, not temporary ones.
- */
- thd->temporary_tables= NULL;
+ if (!sql_text->str || !sql_text->length)
+ DBUG_RETURN(FALSE);
- /* Allow to execute DDL operations. */
- ddl_blocker_exception_on(thd);
+ Si_session_context session_context;
- /* Run queries from the serialization image. */
- {
- Ed_result ed_result;
- String_stream s_stream;
- const LEX_STRING *sql_text;
+ session_context.save(thd);
+ session_context.reset(thd);
- build_drop_statement(s_stream);
- sql_text= s_stream.lex_string();
+ /* Allow to execute DDL operations. */
+ ::obs::ddl_blocker_exception_on(thd);
- if (sql_text->str && sql_text->length)
- rc= mysql_execute_direct(thd, *sql_text, &ed_result);
+ Ed_result ed_result;
- /* Ignore warnings. */
- }
+ /* Execute DDL operation. */
+ bool rc= mysql_execute_direct(thd, *sql_text, &ed_result);
- ddl_blocker_exception_off(thd);
+ /* Push warnings on the THD error stack. */
+ copy_warnings(thd, &ed_result.get_warnings());
- thd->variables.sql_mode= sql_mode_saved;
- thd->variables.collation_connection= connection_cl_saved;
- thd->variables.character_set_results= results_cs_saved;
- thd->variables.character_set_client= client_cs_saved;
- thd->update_charset();
+ /* Disable further DDL execution. */
+ ::obs::ddl_blocker_exception_off(thd);
- thd->temporary_tables= tmp_tables_saved;
+ session_context.restore(thd);
- return rc;
+ DBUG_RETURN(rc);
}
///////////////////////////////////////////////////////////////////////////
@@ -705,15 +747,15 @@ bool Abstract_obj::do_init_from_image(In
LEX_STRING *sql_text_root= (LEX_STRING *) alloc_root(&m_mem_root,
sizeof (LEX_STRING));
+ if (!sql_text_root)
+ return TRUE;
+
sql_text_root->str= strmake_root(&m_mem_root,
sql_text.str, sql_text.length);
sql_text_root->length= sql_text.length;
- if (!sql_text_root || !sql_text_root->str ||
- m_stmt_list.push_back(sql_text_root))
- {
+ if (!sql_text_root->str || m_stmt_list.push_back(sql_text_root))
return TRUE;
- }
}
return FALSE;
@@ -732,11 +774,11 @@ bool Abstract_obj::do_init_from_image(In
class Database_obj : public Abstract_obj
{
public:
- Database_obj(const Ed_row &ed_row)
+ inline Database_obj(const Ed_row &ed_row)
: Abstract_obj(ed_row[0] /* database name */)
{ }
- Database_obj(LEX_STRING db_name)
+ inline Database_obj(LEX_STRING db_name)
: Abstract_obj(db_name)
{ }
@@ -761,7 +803,7 @@ private:
class Database_item_obj : public Abstract_obj
{
public:
- Database_item_obj(LEX_STRING db_name, LEX_STRING object_name)
+ inline Database_item_obj(LEX_STRING db_name, LEX_STRING object_name)
: Abstract_obj(object_name)
{
if (db_name.str && db_name.length)
@@ -805,19 +847,19 @@ private:
static const LEX_STRING TYPE_NAME;
public:
- Table_obj(const Ed_row &ed_row)
+ inline Table_obj(const Ed_row &ed_row)
: Database_item_obj(ed_row[0], /* database name */
ed_row[1]) /* table name */
{ }
- Table_obj(LEX_STRING db_name, LEX_STRING table_name)
+ inline Table_obj(LEX_STRING db_name, LEX_STRING table_name)
: Database_item_obj(db_name, table_name)
{ }
private:
virtual bool do_serialize(THD *thd, Out_stream &out_stream);
- virtual const LEX_STRING *get_type_name() const
+ virtual inline const LEX_STRING *get_type_name() const
{ return &Table_obj::TYPE_NAME; }
};
@@ -841,19 +883,19 @@ private:
static const LEX_STRING TYPE_NAME;
public:
- View_obj(const Ed_row &ed_row)
+ inline View_obj(const Ed_row &ed_row)
: Database_item_obj(ed_row[0], /* schema name */
ed_row[1]) /* view name */
{ }
- View_obj(LEX_STRING db_name, LEX_STRING view_name)
+ inline View_obj(LEX_STRING db_name, LEX_STRING view_name)
: Database_item_obj(db_name, view_name)
{ }
private:
virtual bool do_serialize(THD *thd, Out_stream &out_stream);
- virtual const LEX_STRING *get_type_name() const
+ virtual inline const LEX_STRING *get_type_name() const
{ return &View_obj::TYPE_NAME; }
};
@@ -864,10 +906,17 @@ const LEX_STRING View_obj::TYPE_NAME= LX
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
+/**
+ @class Stored_program_obj
+
+ This is a base class for stored program objects: stored procedures,
+ stored functions, triggers, events.
+*/
+
class Stored_program_obj : public Database_item_obj
{
public:
- Stored_program_obj(LEX_STRING db_name, LEX_STRING sp_name)
+ inline Stored_program_obj(LEX_STRING db_name, LEX_STRING sp_name)
: Database_item_obj(db_name, sp_name)
{ }
@@ -882,10 +931,17 @@ private:
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
+/**
+ @class Stored_routine_obj
+
+ This is a base class for stored routine objects: stored procedures,
+ stored functions, triggers.
+*/
+
class Stored_routine_obj : public Stored_program_obj
{
public:
- Stored_routine_obj(LEX_STRING db_name, LEX_STRING sr_name)
+ inline Stored_routine_obj(LEX_STRING db_name, LEX_STRING sr_name)
: Stored_program_obj(db_name, sr_name)
{ }
@@ -910,16 +966,16 @@ private:
static const LEX_STRING TYPE_NAME;
public:
- Trigger_obj(const Ed_row &ed_row)
+ inline Trigger_obj(const Ed_row &ed_row)
: Stored_routine_obj(ed_row[0], ed_row[1])
{ }
- Trigger_obj(LEX_STRING db_name, LEX_STRING trigger_name)
+ inline Trigger_obj(LEX_STRING db_name, LEX_STRING trigger_name)
: Stored_routine_obj(db_name, trigger_name)
{ }
private:
- virtual const LEX_STRING *get_type_name() const
+ virtual inline const LEX_STRING *get_type_name() const
{ return &Trigger_obj::TYPE_NAME; }
};
@@ -943,16 +999,16 @@ private:
static const LEX_STRING TYPE_NAME;
public:
- Stored_proc_obj(const Ed_row &ed_row)
+ inline Stored_proc_obj(const Ed_row &ed_row)
: Stored_routine_obj(ed_row[0], ed_row[1])
{ }
- Stored_proc_obj(LEX_STRING db_name, LEX_STRING sp_name)
+ inline Stored_proc_obj(LEX_STRING db_name, LEX_STRING sp_name)
: Stored_routine_obj(db_name, sp_name)
{ }
private:
- virtual const LEX_STRING *get_type_name() const
+ virtual inline const LEX_STRING *get_type_name() const
{ return &Stored_proc_obj::TYPE_NAME; }
};
@@ -976,16 +1032,16 @@ private:
static const LEX_STRING TYPE_NAME;
public:
- Stored_func_obj(const Ed_row &ed_row)
+ inline Stored_func_obj(const Ed_row &ed_row)
: Stored_routine_obj(ed_row[0], ed_row[1])
{ }
- Stored_func_obj(LEX_STRING db_name, LEX_STRING sf_name)
+ inline Stored_func_obj(LEX_STRING db_name, LEX_STRING sf_name)
: Stored_routine_obj(db_name, sf_name)
{ }
private:
- virtual const LEX_STRING *get_type_name() const
+ virtual inline const LEX_STRING *get_type_name() const
{ return &Stored_func_obj::TYPE_NAME; }
};
@@ -1011,19 +1067,21 @@ private:
static const LEX_STRING TYPE_NAME;
public:
- Event_obj(const Ed_row &ed_row)
+ inline Event_obj(const Ed_row &ed_row)
: Stored_program_obj(ed_row[0], ed_row[1])
{ }
- Event_obj(LEX_STRING db_name, LEX_STRING event_name)
+ inline Event_obj(LEX_STRING db_name, LEX_STRING event_name)
: Stored_program_obj(db_name, event_name)
{ }
private:
- virtual const LEX_STRING *get_type_name() const
+ virtual inline const LEX_STRING *get_type_name() const
{ return &Event_obj::TYPE_NAME; }
- virtual const LEX_STRING *get_create_stmt(Ed_row *row);
+ virtual inline const LEX_STRING *get_create_stmt(Ed_row *row)
+ { return row->get_column(3); }
+
virtual void dump_header(Ed_row *row, Out_stream &out_stream);
};
@@ -1031,13 +1089,6 @@ private:
const LEX_STRING Event_obj::TYPE_NAME= LXS_INIT("EVENT");
-///////////////////////////////////////////////////////////////////////////
-
-const LEX_STRING *Event_obj::get_create_stmt(Ed_row *row)
-{
- return row->get_column(3);
-}
-
#endif // HAVE_EVENT_SCHEDULER
///////////////////////////////////////////////////////////////////////////
@@ -1142,13 +1193,23 @@ Iterator *create_row_set_iterator(THD *t
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
+/**
+ @class Ed_result_set_iterator
+
+ This is an implementation of Obj_iterator, which creates objects from a
+ result set (represented by an instance of Ed_result).
+*/
+
template <typename Obj_type>
class Ed_result_set_iterator : public Obj_iterator
{
public:
inline Ed_result_set_iterator(Ed_result *ed_result);
inline ~Ed_result_set_iterator();
+
+public:
virtual Obj *next();
+
private:
Ed_result *m_ed_result;
List_iterator_fast<Ed_row> m_row_it;
@@ -1253,11 +1314,18 @@ create_row_set_iterator<Grant_iterator>(
///////////////////////////////////////////////////////////////////////////
+/**
+ @class View_base_iterator
+
+ This is a base implementation of Obj_iterator for the
+ view-dependency-object iterators.
+*/
+
class View_base_obj_iterator : public Obj_iterator
{
public:
- View_base_obj_iterator();
- virtual ~View_base_obj_iterator();
+ inline View_base_obj_iterator();
+ virtual inline ~View_base_obj_iterator();
public:
virtual Obj *next();
@@ -1298,15 +1366,15 @@ Iterator *View_base_obj_iterator::create
///////////////////////////////////////////////////////////////////////////
-View_base_obj_iterator::View_base_obj_iterator() :
- m_table_names(NULL),
- m_cur_idx(0)
+inline View_base_obj_iterator::View_base_obj_iterator()
+ : m_table_names(NULL),
+ m_cur_idx(0)
{
}
///////////////////////////////////////////////////////////////////////////
-View_base_obj_iterator::~View_base_obj_iterator()
+inline View_base_obj_iterator::~View_base_obj_iterator()
{
if (!m_table_names)
return;
@@ -1406,10 +1474,16 @@ Obj *View_base_obj_iterator::next()
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
+/**
+ @class View_base_table_iterator
+
+ This is an iterator over base tables for a view.
+*/
+
class View_base_table_iterator : public View_base_obj_iterator
{
public:
- static View_base_obj_iterator *
+ static inline View_base_obj_iterator *
create(THD *thd, const String *db_name, const String *view_name)
{
return View_base_obj_iterator::create<View_base_table_iterator>
@@ -1417,13 +1491,11 @@ public:
}
protected:
- virtual bool is_obj_accepted(TABLE_LIST *obj)
+ virtual inline bool is_obj_accepted(TABLE_LIST *obj)
{ return !obj->view; }
- virtual Obj *create_obj(const String *db_name, const String *obj_name)
- {
- return new Table_obj(db_name->lex_string(), obj_name->lex_string());
- }
+ virtual inline Obj *create_obj(const String *db_name, const String *obj_name)
+ { return new Table_obj(db_name->lex_string(), obj_name->lex_string()); }
};
///////////////////////////////////////////////////////////////////////////
@@ -1437,10 +1509,16 @@ create<View_base_table_iterator>(THD *th
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
+/**
+ @class View_base_view_iterator
+
+ This is an iterator over base views for a view.
+*/
+
class View_base_view_iterator : public View_base_obj_iterator
{
public:
- static View_base_obj_iterator *
+ static inline View_base_obj_iterator *
create(THD *thd, const String *db_name, const String *view_name)
{
return View_base_obj_iterator::create<View_base_view_iterator>
@@ -1448,13 +1526,11 @@ public:
}
protected:
- virtual bool is_obj_accepted(TABLE_LIST *obj)
+ virtual inline bool is_obj_accepted(TABLE_LIST *obj)
{ return obj->view; }
- virtual Obj *create_obj(const String *db_name, const String *obj_name)
- {
- return new View_obj(db_name->lex_string(), obj_name->lex_string());
- }
+ virtual inline Obj *create_obj(const String *db_name, const String *obj_name)
+ { return new View_obj(db_name->lex_string(), obj_name->lex_string()); }
};
///////////////////////////////////////////////////////////////////////////
@@ -1720,9 +1796,9 @@ bool View_obj::do_serialize(THD *thd, Ou
String_stream s_stream;
- LEX_STRING create_stmt;
- LEX_STRING client_cs_name;
- LEX_STRING connection_cl_name;
+ LEX_STRING create_stmt= null_lex_str;
+ LEX_STRING client_cs_name= null_lex_str;
+ LEX_STRING connection_cl_name= null_lex_str;
if (get_view_create_stmt(thd, this, &create_stmt,
&client_cs_name, &connection_cl_name))
@@ -2144,6 +2220,8 @@ Obj_iterator *get_databases(THD *thd)
return create_row_set_iterator<Database_iterator>(thd, &query);
}
+///////////////////////////////////////////////////////////////////////////
+
Obj_iterator *get_db_tables(THD *thd, const String *db_name)
{
String_stream s_stream;
@@ -2157,6 +2235,7 @@ Obj_iterator *get_db_tables(THD *thd, co
return create_row_set_iterator<Db_tables_iterator>(thd, s_stream.lex_string());
}
+///////////////////////////////////////////////////////////////////////////
Obj_iterator *get_db_views(THD *thd, const String *db_name)
{
@@ -2169,6 +2248,7 @@ Obj_iterator *get_db_views(THD *thd, con
return create_row_set_iterator<Db_views_iterator>(thd, s_stream.lex_string());
}
+///////////////////////////////////////////////////////////////////////////
Obj_iterator *get_db_triggers(THD *thd, const String *db_name)
{
@@ -2181,6 +2261,7 @@ Obj_iterator *get_db_triggers(THD *thd,
return create_row_set_iterator<Db_trigger_iterator>(thd, s_stream.lex_string());
}
+///////////////////////////////////////////////////////////////////////////
Obj_iterator *get_db_stored_procedures(THD *thd, const String *db_name)
{
@@ -2194,6 +2275,7 @@ Obj_iterator *get_db_stored_procedures(T
return create_row_set_iterator<Db_stored_proc_iterator>(thd, s_stream.lex_string());
}
+///////////////////////////////////////////////////////////////////////////
Obj_iterator *get_db_stored_functions(THD *thd, const String *db_name)
{
@@ -2207,6 +2289,7 @@ Obj_iterator *get_db_stored_functions(TH
return create_row_set_iterator<Db_stored_func_iterator>(thd, s_stream.lex_string());
}
+///////////////////////////////////////////////////////////////////////////
Obj_iterator *get_db_events(THD *thd, const String *db_name)
{
@@ -2223,46 +2306,40 @@ Obj_iterator *get_db_events(THD *thd, co
#endif
}
+///////////////////////////////////////////////////////////////////////////
Obj_iterator *get_all_db_grants(THD *thd, const String *db_name)
{
String_stream s_stream;
s_stream <<
- "(SELECT t1.grantee AS c1, "
- "t1.privilege_type AS c2, "
- "t1.table_schema AS c3, "
+ "(SELECT grantee AS c1, "
+ "privilege_type AS c2, "
+ "table_schema AS c3, "
"NULL AS c4, "
"NULL AS c5 "
- "FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES AS t1, "
- "INFORMATION_SCHEMA.USER_PRIVILEGES AS t2 "
- "WHERE t1.table_schema = '" << db_name << "' AND "
- "t1.grantee = t2.grantee) "
+ "FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES "
+ "WHERE table_schema = '" << db_name << "') "
"UNION "
- "(SELECT t1.grantee, "
- "t1.privilege_type, "
- "t1.table_schema, "
- "t1.table_name, "
+ "(SELECT grantee, "
+ "privilege_type, "
+ "table_schema, "
+ "table_name, "
"NULL "
- "FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES AS t1, "
- "INFORMATION_SCHEMA.USER_PRIVILEGES AS t2 "
- "WHERE t1.table_schema = '" << db_name << "' AND "
- "t1.grantee = t2.grantee) "
+ "FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES "
+ "WHERE table_schema = '" << db_name << "') "
"UNION "
- "(SELECT t1.grantee, "
- "t1.privilege_type, "
- "t1.table_schema, "
- "t1.table_name, "
- "t1.column_name "
- "FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES AS t1, "
- "INFORMATION_SCHEMA.USER_PRIVILEGES AS t2 "
- "WHERE t1.table_schema = '" << db_name << "' AND "
- "t1.grantee = t2.grantee) "
+ "(SELECT grantee, "
+ "privilege_type, "
+ "table_schema, "
+ "table_name, "
+ "column_name "
+ "FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES "
+ "WHERE table_schema = '" << db_name << "') "
"ORDER BY c1 ASC, c2 ASC, c3 ASC, c4 ASC, c5 ASC";
return create_row_set_iterator<Grant_iterator>(thd, s_stream.lex_string());
}
-
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
@@ -2273,6 +2350,7 @@ Obj_iterator* get_view_base_tables(THD *
return View_base_table_iterator::create(thd, db_name, view_name);
}
+///////////////////////////////////////////////////////////////////////////
Obj_iterator* get_view_base_views(THD *thd,
const String *db_name,
@@ -2294,6 +2372,8 @@ Obj *get_database(const String *db_name,
return obj;
}
+///////////////////////////////////////////////////////////////////////////
+
Obj *get_table(const String *db_name,
const String *table_name,
uint image_version,
@@ -2306,6 +2386,8 @@ Obj *get_table(const String *db_name,
return obj;
}
+///////////////////////////////////////////////////////////////////////////
+
Obj *get_view(const String *db_name,
const String *view_name,
uint image_version,
@@ -2317,6 +2399,8 @@ Obj *get_view(const String *db_name,
return obj;
}
+///////////////////////////////////////////////////////////////////////////
+
Obj *get_trigger(const String *db_name,
const String *trigger_name,
uint image_version,
@@ -2333,6 +2417,8 @@ Obj *get_trigger(const String *db_name,
return obj;
}
+///////////////////////////////////////////////////////////////////////////
+
Obj *get_stored_procedure(const String *db_name,
const String *sp_name,
uint image_version,
@@ -2349,6 +2435,8 @@ Obj *get_stored_procedure(const String *
return obj;
}
+///////////////////////////////////////////////////////////////////////////
+
Obj *get_stored_function(const String *db_name,
const String *sf_name,
uint image_version,
@@ -2365,6 +2453,8 @@ Obj *get_stored_function(const String *d
return obj;
}
+///////////////////////////////////////////////////////////////////////////
+
#ifdef HAVE_EVENT_SCHEDULER
Obj *get_event(const String *db_name,
@@ -2385,6 +2475,8 @@ Obj *get_event(const String *db_name,
#endif
+///////////////////////////////////////////////////////////////////////////
+
Obj *get_tablespace(const String *ts_name,
uint image_version,
const String *image)
@@ -2398,6 +2490,8 @@ Obj *get_tablespace(const String *ts_nam
return obj;
}
+
+///////////////////////////////////////////////////////////////////////////
Obj *get_db_grant(const String *db_name,
const String *name,
=== modified file 'sql/si_objects.h'
--- a/sql/si_objects.h 2008-11-26 14:43:03 +0000
+++ b/sql/si_objects.h 2008-11-27 16:36:57 +0000
@@ -40,8 +40,11 @@ namespace obs {
///////////////////////////////////////////////////////////////////////////
/**
- Obj defines the basic set of operations for each database object.
+ @class Obj
+
+ This interface defines the basic set of operations for each database object.
*/
+
class Obj
{
public:
@@ -98,8 +101,11 @@ public:
///////////////////////////////////////////////////////////////////////////
/**
- Obj_iterator is a basic interface to enumerate objects.
+ @class Obj_iterator
+
+ This is a basic interface to enumerate objects.
*/
+
class Obj_iterator
{
public:
| Thread |
|---|
| • bzr commit into mysql-6.0-runtime branch (alik:2778) | Alexander Nozdrin | 27 Nov |