From: Date: September 4 2006 5:40pm Subject: bk commit into 4.1 tree (gkodinov:1.2534) BUG#21392 List-Archive: http://lists.mysql.com/commits/11362 X-Bug: 21392 Message-Id: <20060904154044.947FB4523FF@macbook.gmz> Below is the list of changes that have just been committed into a local 4.1 repository of kgeorge. When kgeorge 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-09-04 18:40:30+03:00, gkodinov@stripped +5 -0 Bug #21392: multi-table delete with alias table name fails with 1003: Incorrect table name in multi-table DELETE the set of tables to delete from actually references then tables in the other list, e.g: DELETE alias_of_t1 FROM t1 alias_of_t1 WHERE .... is a valid statement. So we must turn off table name syntactical validity check for alias_of_t1 because it's not a table name (even if it looks like one). In order to do that we add a special flag (TL_OPTION_ALIAS) to disable the name checking for the aliases in multi-table DELETE. mysql-test/r/delete.result@stripped, 2006-09-04 18:40:20+03:00, gkodinov@stripped +4 -0 Bug #21392: multi-table delete with alias table name fails with 1003: Incorrect table name - test case mysql-test/t/delete.test@stripped, 2006-09-04 18:40:20+03:00, gkodinov@stripped +10 -0 Bug #21392: multi-table delete with alias table name fails with 1003: Incorrect table name - test case sql/mysql_priv.h@stripped, 2006-09-04 18:40:21+03:00, gkodinov@stripped +1 -0 Bug #21392: multi-table delete with alias table name fails with 1003: Incorrect table name - add a special flag to disable the name checking for the aliases in multi-table DELETE sql/sql_parse.cc@stripped, 2006-09-04 18:40:22+03:00, gkodinov@stripped +3 -1 Bug #21392: multi-table delete with alias table name fails with 1003: Incorrect table name - add a special flag to disable the name checking for the aliases in multi-table DELETE sql/sql_yacc.yy@stripped, 2006-09-04 18:40:23+03:00, gkodinov@stripped +5 -2 Bug #21392: multi-table delete with alias table name fails with 1003: Incorrect table name - add a special flag to disable the name checking for the aliases in multi-table DELETE # 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: gkodinov # Host: macbook.gmz # Root: /Users/kgeorge/mysql/work/B21392-4.1-opt --- 1.380/sql/mysql_priv.h 2006-09-04 18:40:43 +03:00 +++ 1.381/sql/mysql_priv.h 2006-09-04 18:40:43 +03:00 @@ -305,6 +305,7 @@ void debug_sync_point(const char* lock_n #define TL_OPTION_UPDATING 1 #define TL_OPTION_FORCE_INDEX 2 #define TL_OPTION_IGNORE_LEAVES 4 +#define TL_OPTION_ALIAS 8 /* Some portable defines */ --- 1.485/sql/sql_parse.cc 2006-09-04 18:40:43 +03:00 +++ 1.486/sql/sql_parse.cc 2006-09-04 18:40:43 +03:00 @@ -4863,6 +4863,7 @@ bool add_to_list(THD *thd, SQL_LIST &lis table_options A set of the following bits: TL_OPTION_UPDATING Table will be updated TL_OPTION_FORCE_INDEX Force usage of index + TL_OPTION_ALIAS an alias in multi table DELETE lock_type How table should be locked use_index List of indexed used in USE INDEX ignore_index List of indexed used in IGNORE INDEX @@ -4888,7 +4889,8 @@ 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) || + if (!test(table_options & TL_OPTION_ALIAS) && + check_table_name(table->table.str,table->table.length) || table->db.str && check_db_name(table->db.str)) { net_printf(thd, ER_WRONG_TABLE_NAME, table->table.str); --- 1.398/sql/sql_yacc.yy 2006-09-04 18:40:43 +03:00 +++ 1.399/sql/sql_yacc.yy 2006-09-04 18:40:43 +03:00 @@ -4345,14 +4345,17 @@ table_wild_one: ident opt_wild opt_table_alias { if (!Select->add_table_to_list(YYTHD, new Table_ident($1), $3, - TL_OPTION_UPDATING, Lex->lock_option)) + TL_OPTION_UPDATING | + TL_OPTION_ALIAS, Lex->lock_option)) YYABORT; } | ident '.' ident opt_wild opt_table_alias { if (!Select->add_table_to_list(YYTHD, new Table_ident(YYTHD, $1, $3, 0), - $5, TL_OPTION_UPDATING, + $5, + TL_OPTION_UPDATING | + TL_OPTION_ALIAS, Lex->lock_option)) YYABORT; } --- 1.20/mysql-test/t/delete.test 2006-09-04 18:40:43 +03:00 +++ 1.21/mysql-test/t/delete.test 2006-09-04 18:40:43 +03:00 @@ -153,4 +153,14 @@ DELETE FROM t1 WHERE t1.a > 0 ORDER BY t SELECT * FROM t1; DROP TABLE t1; +# +# Bug #21392: multi-table delete with alias table name fails with +# 1003: Incorrect table name +# + +create table t1 (a int); +delete `4.t1` from t1 as `4.t1` where `4.t1`.a = 5; +delete FROM `4.t1` USING t1 as `4.t1` where `4.t1`.a = 5; +drop table t1; + # End of 4.1 tests --- 1.21/mysql-test/r/delete.result 2006-09-04 18:40:44 +03:00 +++ 1.22/mysql-test/r/delete.result 2006-09-04 18:40:44 +03:00 @@ -172,3 +172,7 @@ a 0 2 DROP TABLE t1; +create table t1 (a int); +delete `4.t1` from t1 as `4.t1` where `4.t1`.a = 5; +delete FROM `4.t1` USING t1 as `4.t1` where `4.t1`.a = 5; +drop table t1;