From: Date: July 15 2006 12:48am Subject: bk commit into 5.0 tree (kostja:1.2226) BUG#21002 List-Archive: http://lists.mysql.com/commits/9185 X-Bug: 21002 Message-Id: <20060714224842.25A681049@bodhi.local> Below is the list of changes that have just been committed into a local 5.0 repository of kostja. When kostja does a push these changes will be propagated to the main repository and, within 24 hours after the push, to the public repository. For information on how to access the public repository see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html ChangeSet@stripped, 2006-07-15 02:48:33+04:00, kostja@stripped +7 -0 A fix and a test case for Bug#21002 "Derived table not selecting from a "real" table fails in JOINs". This is a regression caused by the fix for Bug 18444. This fix removed the assignment of empty_c_string to table->db performed in add_table_to_list, as neither me nor anyone else knew what it was there for. Now we know it and it's covered with tests: the only case when a table database name can be empty is when the table is a derived table. The fix puts the assignment back but makes it a bit more explicit. Additionally, finally drop sp.result.orig which was checked in by mistake. BitKeeper/deleted/.del-sp.result.orig@stripped, 2006-07-15 02:33:17+04:00, kostja@stripped +0 -0 Delete: mysql-test/r/sp.result.orig mysql-test/r/sp.result@stripped, 2006-07-15 02:48:27+04:00, kostja@stripped +15 -0 Test results fixed (Bug#21002) mysql-test/t/sp.test@stripped, 2006-07-15 02:48:27+04:00, kostja@stripped +25 -0 Add a test case for Bug#21002 "Derived table not selecting from a "real" table fails in JOINs" sql/sp.cc@stripped, 2006-07-15 02:48:28+04:00, kostja@stripped +0 -1 Make empty_c_string globally accessible. sql/sql_class.cc@stripped, 2006-07-15 02:48:28+04:00, kostja@stripped +1 -0 Add empty_c_string definition. sql/sql_class.h@stripped, 2006-07-15 02:48:28+04:00, kostja@stripped +11 -1 Add a comment for the constructor of Table_ident which is used for derived tables. Make sure this constructor also initializes the database name, not only the table name. sql/sql_parse.cc@stripped, 2006-07-15 02:48:28+04:00, kostja@stripped +6 -2 Don't call check_db_name for empty database. Currently the only case when a table database name can be empty is when the table is a derived table. Report the right error if the database name is wrong (ER_WRONG_DB_NAME, not ER_WRONG_TABLE_NAME). # This is a BitKeeper patch. What follows are the unified diffs for the # set of deltas contained in the patch. The rest of the patch, the part # that BitKeeper cares about, is below these diffs. # User: kostja # Host: bodhi.local # Root: /opt/local/work/mysql-5.0-21002 --- 1.236/sql/sql_class.cc 2006-07-15 02:48:41 +04:00 +++ 1.237/sql/sql_class.cc 2006-07-15 02:48:41 +04:00 @@ -43,6 +43,7 @@ table name */ char internal_table_name[2]= "*"; +char empty_c_string[1]= {0}; /* used for not defined db */ const char * const THD::DEFAULT_WHERE= "field list"; --- 1.292/sql/sql_class.h 2006-07-15 02:48:41 +04:00 +++ 1.293/sql/sql_class.h 2006-07-15 02:48:41 +04:00 @@ -41,6 +41,7 @@ enum enum_check_fields { CHECK_FIELD_IGN CHECK_FIELD_ERROR_FOR_NULL }; extern char internal_table_name[2]; +extern char empty_c_string[1]; extern const char **errmesg; #define TC_LOG_PAGE_SIZE 8192 @@ -1977,10 +1978,19 @@ public: { db.str=0; } + /* + This constructor is used only for the case when we create a derived + table. A derived table has no name and doesn't belong to any database. + Later, if there was an alias specified for the table, it will be set + by add_table_to_list. + */ inline Table_ident(SELECT_LEX_UNIT *s) : sel(s) { /* We must have a table name here as this is used with add_table_to_list */ - db.str=0; table.str= internal_table_name; table.length=1; + db.str= empty_c_string; /* a subject to casedn_str */ + db.length= 0; + table.str= internal_table_name; + table.length=1; } inline void change_db(char *db_name) { --- 1.556/sql/sql_parse.cc 2006-07-15 02:48:41 +04:00 +++ 1.557/sql/sql_parse.cc 2006-07-15 02:48:41 +04:00 @@ -6088,8 +6088,7 @@ TABLE_LIST *st_select_lex::add_table_to_ if (!table) DBUG_RETURN(0); // End of memory alias_str= alias ? alias->str : table->table.str; - if (check_table_name(table->table.str,table->table.length) || - table->db.str && check_db_name(table->db.str)) + if (check_table_name(table->table.str, table->table.length)) { my_error(ER_WRONG_TABLE_NAME, MYF(0), table->table.str); DBUG_RETURN(0); @@ -6110,6 +6109,11 @@ TABLE_LIST *st_select_lex::add_table_to_ DBUG_RETURN(0); /* purecov: inspected */ if (table->db.str) { + if (table->db.str != empty_c_string && check_db_name(table->db.str)) + { + my_error(ER_WRONG_DB_NAME, MYF(0), table->db.str); + DBUG_RETURN(0); + } ptr->db= table->db.str; ptr->db_length= table->db.length; } --- 1.202/mysql-test/r/sp.result 2006-07-15 02:48:41 +04:00 +++ 1.203/mysql-test/r/sp.result 2006-07-15 02:48:41 +04:00 @@ -5057,4 +5057,19 @@ concat('data was: /', var1, '/') data was: /1/ drop table t3| drop procedure bug15217| +drop table if exists t3| +drop database if exists mysqltest1| +create table t3 (a int)| +insert into t3 (a) values (1), (2)| +create database mysqltest1| +use mysqltest1| +drop database mysqltest1| +select database()| +database() +NULL +select * from (select 1 as a) as t1 natural join (select * from test.t3) as t2| +a +1 +use test| +drop table t3| drop table t1,t2; --- 1.190/mysql-test/t/sp.test 2006-07-15 02:48:41 +04:00 +++ 1.191/mysql-test/t/sp.test 2006-07-15 02:48:42 +04:00 @@ -5963,6 +5963,31 @@ drop table t3| drop procedure bug15217| # +# Bug#21002 "Derived table not selecting from a "real" table fails in JOINs" +# +# A regression caused by the fix for Bug#18444: for derived tables we should +# set an empty string as the current database. They do not belong to any +# database and must be usable even if there is no database +# selected. +--disable_warnings +drop table if exists t3| +drop database if exists mysqltest1| +--enable_warnings +create table t3 (a int)| +insert into t3 (a) values (1), (2)| + +create database mysqltest1| +use mysqltest1| +drop database mysqltest1| + +# No current database +select database()| + +select * from (select 1 as a) as t1 natural join (select * from test.t3) as t2| +use test| +drop table t3| + +# # BUG#NNNN: New bug synopsis # #--disable_warnings --- 1.113/sql/sp.cc 2006-07-15 02:48:42 +04:00 +++ 1.114/sql/sp.cc 2006-07-15 02:48:42 +04:00 @@ -1846,7 +1846,6 @@ sp_use_new_db(THD *thd, LEX_STRING new_d bool no_access_check, bool *dbchangedp) { int ret; - static char empty_c_string[1]= {0}; /* used for not defined db */ DBUG_ENTER("sp_use_new_db"); DBUG_PRINT("enter", ("newdb: %s", new_db.str));