List:Commits« Previous MessageNext Message »
From:Alexander Nozdrin Date:November 27 2008 5:37pm
Subject:bzr commit into mysql-6.0-runtime branch (alik:2778)
View as plain text  
#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 Nozdrin27 Nov