summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorbell@sanja.is.com.ua <>2004-06-13 22:39:09 +0300
committerbell@sanja.is.com.ua <>2004-06-13 22:39:09 +0300
commitd2c585df31a01c35aadc1232f4d0cdff5899a113 (patch)
treea8804db7b0cc789dddf1056bbd8e610382812bfa /sql
parent2f76413e5a457741e33ca023a860da8fc1dcf297 (diff)
downloadmariadb-git-d2c585df31a01c35aadc1232f4d0cdff5899a113.tar.gz
fixed field resolving mode fo INSERT/REPLACE and CRETE with SELECT (BUG#4090)
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_parse.cc14
-rw-r--r--sql/sql_prepare.cc13
2 files changed, 24 insertions, 3 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 28e833b8421..215d90f3881 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2334,7 +2334,15 @@ mysql_execute_command(THD *thd)
lex->create_list,
lex->key_list,
select_lex->item_list,lex->duplicates)))
+ {
+ /*
+ CREATE from SELECT give its SELECT_LEX for SELECT,
+ and item_list belong to SELECT
+ */
+ select_lex->resolve_mode= SELECT_LEX::SELECT_MODE;
res=handle_select(thd, lex, result);
+ select_lex->resolve_mode= SELECT_LEX::NOMATTER_MODE;
+ }
//reset for PS
lex->create_list.empty();
lex->key_list.empty();
@@ -2685,7 +2693,11 @@ unsent_create_error:
lex->duplicates)))
/* Skip first table, which is the table we are inserting in */
lex->select_lex.table_list.first= (byte*) first_local_table->next;
- lex->select_lex.resolve_mode= SELECT_LEX::NOMATTER_MODE;
+ /*
+ insert/replace from SELECT give its SELECT_LEX for SELECT,
+ and item_list belong to SELECT
+ */
+ lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE;
res=handle_select(thd,lex,result);
/* revert changes for SP */
lex->select_lex.table_list.first= (byte*) first_local_table;
diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc
index 40107ebc637..7a3ff4c7613 100644
--- a/sql/sql_prepare.cc
+++ b/sql/sql_prepare.cc
@@ -1308,6 +1308,7 @@ static int mysql_test_create_table(Prepared_statement *stmt,
DBUG_ENTER("mysql_test_create_table");
THD *thd= stmt->thd;
LEX *lex= stmt->lex;
+ SELECT_LEX *select_lex= &lex->select_lex;
int res= 0;
/* Skip first table, which is the table we are creating */
@@ -1316,8 +1317,12 @@ static int mysql_test_create_table(Prepared_statement *stmt,
&create_table_local);
if (!(res= create_table_precheck(thd, tables, create_table)) &&
- lex->select_lex.item_list.elements)
+ select_lex->item_list.elements)
+ {
+ select_lex->resolve_mode= SELECT_LEX::SELECT_MODE;
res= select_like_statement_test(stmt, tables);
+ select_lex->resolve_mode= SELECT_LEX::NOMATTER_MODE;
+ }
/* put tables back for PS rexecuting */
tables= lex->link_first_table_back(tables, create_table,
@@ -1401,7 +1406,11 @@ static int mysql_test_insert_select(Prepared_statement *stmt,
(TABLE_LIST *)lex->select_lex.table_list.first;
/* Skip first table, which is the table we are inserting in */
lex->select_lex.table_list.first= (byte*) first_local_table->next;
- lex->select_lex.resolve_mode= SELECT_LEX::NOMATTER_MODE;
+ /*
+ insert/replace from SELECT give its SELECT_LEX for SELECT,
+ and item_list belong to SELECT
+ */
+ lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE;
res= select_like_statement_test(stmt, tables);
/* revert changes*/
lex->select_lex.table_list.first= (byte*) first_local_table;