summaryrefslogtreecommitdiff
path: root/sql/sql_union.cc
diff options
context:
space:
mode:
authorkonstantin@mysql.com <>2004-10-22 14:47:35 +0400
committerkonstantin@mysql.com <>2004-10-22 14:47:35 +0400
commita7c52d755bab03d134637947d29d5c1b0531660e (patch)
treec91f35d8dafca87c0b5c62689189e4641443c49f /sql/sql_union.cc
parentb686f98f50564d8562f3370f3b58d0fbb59c6da5 (diff)
downloadmariadb-git-a7c52d755bab03d134637947d29d5c1b0531660e.tar.gz
A fix and test case for Bug#6050 "EXECUTE stmt reports ambiguous field
names with ident. tables fr. diff. schemata": revise all uses of Item_field and make them prepared-statements friendly when necessary.
Diffstat (limited to 'sql/sql_union.cc')
-rw-r--r--sql/sql_union.cc24
1 files changed, 21 insertions, 3 deletions
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index fc2d2a3a5e4..cd1127f9683 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -266,14 +266,14 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
if (first_select->next_select())
{
-
- // it is not single select
+ /* This is not a single select */
/*
Check that it was possible to aggregate
all collations together for UNION.
*/
List_iterator_fast<Item> tp(types);
+ Item_arena *arena= thd->current_arena;
Item *type;
while ((type= tp++))
{
@@ -305,7 +305,11 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
thd_arg->lex->current_select= lex_select_save;
if (!item_list.elements)
{
- Item_arena *arena= thd->current_arena, backup;
+ /*
+ We're in statement prepare or in execution
+ of a conventional statement.
+ */
+ Item_arena backup;
if (arena->is_stmt_prepare())
thd->set_n_backup_item_arena(arena, &backup);
Field **field;
@@ -345,6 +349,20 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
fake_select_lex->table_list.empty();
}
}
+ else if (arena->is_stmt_execute())
+ {
+ /*
+ We're in execution of a prepared statement: reset field items
+ to point at fields from the created temporary table.
+ */
+ List_iterator_fast<Item> it(item_list);
+ for (Field **field= table->field; *field; field++)
+ {
+ Item_field *item_field= (Item_field*) it++;
+ DBUG_ASSERT(item_field);
+ item_field->set_field(*field);
+ }
+ }
}
else
first_select->braces= 0; // remove our changes