summaryrefslogtreecommitdiff
path: root/sql/sql_base.cc
diff options
context:
space:
mode:
authorunknown <pem@mysql.com>2006-03-06 19:46:17 +0100
committerunknown <pem@mysql.com>2006-03-06 19:46:17 +0100
commit6b81326c5361a74893f53a241ce335e868a80fbd (patch)
treee07556a50cb904da00289a70fb51ea4e765e4c97 /sql/sql_base.cc
parent29c66eea2729b0c7e8786940695967e6920aa392 (diff)
parent89378fe8f6d7e0a689cd917833dc7db04f85aca7 (diff)
downloadmariadb-git-6b81326c5361a74893f53a241ce335e868a80fbd.tar.gz
Merge mysql.com:/extern/mysql/5.0/generic/mysql-5.0
into mysql.com:/extern/mysql/5.1/generic/mysql-5.1-new libmysql/libmysql.c: Auto merged mysql-test/r/binary.result: Auto merged mysql-test/r/federated.result: Auto merged mysql-test/r/func_math.result: Auto merged mysql-test/r/grant.result: Auto merged mysql-test/r/heap.result: Auto merged mysql-test/r/sp.result: Auto merged mysql-test/r/trigger.result: Auto merged mysql-test/r/type_decimal.result: Auto merged mysql-test/t/binary.test: Auto merged mysql-test/t/federated.test: Auto merged mysql-test/t/mysql.test: Auto merged mysql-test/t/sp.test: Auto merged mysql-test/t/trigger.test: Auto merged sql/field_conv.cc: Auto merged sql/ha_federated.cc: Auto merged sql/ha_federated.h: Auto merged sql/item_cmpfunc.cc: Auto merged sql/item_strfunc.h: Auto merged sql/sql_acl.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_trigger.cc: Auto merged sql/sql_yacc.yy: Auto merged sql/table.cc: Auto merged sql/table.h: Auto merged tests/mysql_client_test.c: Auto merged support-files/mysql.spec.sh: Manual merge. (use local)
Diffstat (limited to 'sql/sql_base.cc')
-rw-r--r--sql/sql_base.cc63
1 files changed, 26 insertions, 37 deletions
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 26d81eccce6..54cc2eae1e6 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -4431,8 +4431,18 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
Field_iterator_table_ref it_1, it_2;
Natural_join_column *nj_col_1, *nj_col_2;
Query_arena *arena, backup;
- bool add_columns= TRUE;
bool result= TRUE;
+ bool first_outer_loop= TRUE;
+ /*
+ Leaf table references to which new natural join columns are added
+ if the leaves are != NULL.
+ */
+ TABLE_LIST *leaf_1= (table_ref_1->nested_join &&
+ !table_ref_1->is_natural_join) ?
+ NULL : table_ref_1;
+ TABLE_LIST *leaf_2= (table_ref_2->nested_join &&
+ !table_ref_2->is_natural_join) ?
+ NULL : table_ref_2;
DBUG_ENTER("mark_common_columns");
DBUG_PRINT("info", ("operand_1: %s operand_2: %s",
@@ -4441,36 +4451,14 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
*found_using_fields= 0;
arena= thd->activate_stmt_arena_if_needed(&backup);
- /*
- TABLE_LIST::join_columns could be allocated by the previous call to
- store_natural_using_join_columns() for the lower level of nested tables.
- */
- if (!table_ref_1->join_columns)
- {
- if (!(table_ref_1->join_columns= new List<Natural_join_column>))
- goto err;
- table_ref_1->is_join_columns_complete= FALSE;
- }
- if (!table_ref_2->join_columns)
- {
- if (!(table_ref_2->join_columns= new List<Natural_join_column>))
- goto err;
- table_ref_2->is_join_columns_complete= FALSE;
- }
-
for (it_1.set(table_ref_1); !it_1.end_of_fields(); it_1.next())
{
- bool is_created_1;
bool found= FALSE;
const char *field_name_1;
- if (!(nj_col_1= it_1.get_or_create_column_ref(&is_created_1)))
+ if (!(nj_col_1= it_1.get_or_create_column_ref(leaf_1)))
goto err;
field_name_1= nj_col_1->name();
- /* If nj_col_1 was just created add it to the list of join columns. */
- if (is_created_1)
- table_ref_1->join_columns->push_back(nj_col_1);
-
/*
Find a field with the same name in table_ref_2.
@@ -4481,17 +4469,12 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
nj_col_2= NULL;
for (it_2.set(table_ref_2); !it_2.end_of_fields(); it_2.next())
{
- bool is_created_2;
Natural_join_column *cur_nj_col_2;
const char *cur_field_name_2;
- if (!(cur_nj_col_2= it_2.get_or_create_column_ref(&is_created_2)))
+ if (!(cur_nj_col_2= it_2.get_or_create_column_ref(leaf_2)))
goto err;
cur_field_name_2= cur_nj_col_2->name();
- /* If nj_col_1 was just created add it to the list of join columns. */
- if (add_columns && is_created_2)
- table_ref_2->join_columns->push_back(cur_nj_col_2);
-
/*
Compare the two columns and check for duplicate common fields.
A common field is duplicate either if it was already found in
@@ -4510,9 +4493,15 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
found= TRUE;
}
}
- /* Force it_2.set() to use table_ref_2->join_columns. */
- table_ref_2->is_join_columns_complete= TRUE;
- add_columns= FALSE;
+ if (first_outer_loop && leaf_2)
+ {
+ /*
+ Make sure that the next inner loop "knows" that all columns
+ are materialized already.
+ */
+ leaf_2->is_join_columns_complete= TRUE;
+ first_outer_loop= FALSE;
+ }
if (!found)
continue; // No matching field
@@ -4600,7 +4589,8 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
++(*found_using_fields);
}
}
- table_ref_1->is_join_columns_complete= TRUE;
+ if (leaf_1)
+ leaf_1->is_join_columns_complete= TRUE;
/*
Everything is OK.
@@ -5460,16 +5450,15 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
if (tables->is_natural_join)
{
- bool is_created;
TABLE *field_table;
/*
In this case we are sure that the column ref will not be created
because it was already created and stored with the natural join.
*/
Natural_join_column *nj_col;
- if (!(nj_col= field_iterator.get_or_create_column_ref(&is_created)))
+ if (!(nj_col= field_iterator.get_natural_column_ref()))
DBUG_RETURN(TRUE);
- DBUG_ASSERT(nj_col->table_field && !is_created);
+ DBUG_ASSERT(nj_col->table_field);
field_table= nj_col->table_ref->table;
if (field_table)
{