mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix for BUG#12977.
mysql-test/r/select.result: Test for BUG#12977. mysql-test/t/select.test: Test for BUG#12977. sql/sql_base.cc: - Compare table qualifier of qualified fields only with tables that are not natural joins or their operands. - For qualified fields perform recursive search in all operands of natural joins that are nested joins. - Symmetrically detect ambiguous columns for both operands of NATURAL/USING joins.
This commit is contained in:
@ -2877,14 +2877,15 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list,
|
||||
/*
|
||||
Check that the table and database that qualify the current field name
|
||||
are the same as the table we are going to search for the field.
|
||||
This is done differently for NATURAL/USING joins because there we can't
|
||||
simply compare the qualifying table and database names with the ones of
|
||||
This is done differently for NATURAL/USING joins or nested joins that
|
||||
are operands of NATURAL/USING joins because there we can't simply
|
||||
compare the qualifying table and database names with the ones of
|
||||
'table_list' because each field in such a join may originate from a
|
||||
different table.
|
||||
TODO: Ensure that table_name, db_name and tables->db always points to
|
||||
something !
|
||||
*/
|
||||
if (!table_list->is_natural_join &&
|
||||
if (!(table_list->nested_join && table_list->join_columns) &&
|
||||
table_name && table_name[0] &&
|
||||
(my_strcasecmp(table_alias_charset, table_list->alias, table_name) ||
|
||||
(db_name && db_name[0] && table_list->db && table_list->db[0] &&
|
||||
@ -2899,8 +2900,13 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list,
|
||||
register_tree_change)))
|
||||
*actual_table= table_list;
|
||||
}
|
||||
else if (table_list->is_natural_join)
|
||||
else if (table_list->nested_join && table_list->join_columns)
|
||||
{
|
||||
/*
|
||||
If this is a NATURAL/USING join, or an operand of such join which is a
|
||||
join itself, and the field name is qualified, then search for the field
|
||||
in the operands of the join.
|
||||
*/
|
||||
if (table_name && table_name[0])
|
||||
{
|
||||
/*
|
||||
@ -2922,7 +2928,9 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list,
|
||||
}
|
||||
/*
|
||||
Non-qualified field, search directly in the result columns of the
|
||||
natural join.
|
||||
natural join. The condition of the outer IF is true for the top-most
|
||||
natural join, thus if the field is not qualified, we will search
|
||||
directly the top-most NATURAL/USING join.
|
||||
*/
|
||||
fld= find_field_in_natural_join(thd, table_list, name, length, ref,
|
||||
/* TIMOUR_TODO: check this with Sanja */
|
||||
@ -3528,10 +3536,16 @@ mark_common_columns(THD *thd, TABLE_LIST *table_ref_1, TABLE_LIST *table_ref_2,
|
||||
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. */
|
||||
/*
|
||||
Compare the two columns and check for duplicate common fields.
|
||||
A common field is duplicate either if it was already found in
|
||||
table_ref_2 (then found == TRUE), or if a field in table_ref_2
|
||||
was already matched by some previous field in table_ref_1
|
||||
(then cur_nj_col_2->is_common == TRUE).
|
||||
*/
|
||||
if (!my_strcasecmp(system_charset_info, field_name_1, cur_field_name_2))
|
||||
{
|
||||
if (found)
|
||||
if (found || cur_nj_col_2->is_common)
|
||||
{
|
||||
my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1, thd->where);
|
||||
goto err;
|
||||
|
Reference in New Issue
Block a user