mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 21:42:35 +01:00
Merge mysql.com:/home/timka/mysql/src/5.0-virgin
into mysql.com:/home/timka/mysql/src/5.0-2486
This commit is contained in:
commit
818e2a3e89
3 changed files with 58 additions and 7 deletions
|
@ -2897,3 +2897,18 @@ select * from t1 natural join t2 where a = 'b';
|
||||||
a
|
a
|
||||||
b
|
b
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
CREATE TABLE t1 (`id` TINYINT);
|
||||||
|
CREATE TABLE t2 (`id` TINYINT);
|
||||||
|
CREATE TABLE t3 (`id` TINYINT);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
INSERT INTO t2 VALUES (2);
|
||||||
|
INSERT INTO t3 VALUES (3);
|
||||||
|
SELECT t1.id,t3.id FROM t1 JOIN t2 ON (t2.id=t1.id) LEFT JOIN t3 USING (id);
|
||||||
|
ERROR 23000: Column 'id' in from clause is ambiguous
|
||||||
|
SELECT t1.id,t3.id FROM t1 JOIN t2 ON (t2.notacolumn=t1.id) LEFT JOIN t3 USING (id);
|
||||||
|
ERROR 23000: Column 'id' in from clause is ambiguous
|
||||||
|
SELECT id,t3.id FROM t1 JOIN t2 ON (t2.id=t1.id) LEFT JOIN t3 USING (id);
|
||||||
|
ERROR 23000: Column 'id' in from clause is ambiguous
|
||||||
|
SELECT id,t3.id FROM (t1 JOIN t2 ON (t2.id=t1.id)) LEFT JOIN t3 USING (id);
|
||||||
|
ERROR 23000: Column 'id' in from clause is ambiguous
|
||||||
|
drop table t1, t2, t3;
|
||||||
|
|
|
@ -2465,3 +2465,25 @@ insert into t2 values ('b'),('c'),('d');
|
||||||
select a from t1 natural join t2;
|
select a from t1 natural join t2;
|
||||||
select * from t1 natural join t2 where a = 'b';
|
select * from t1 natural join t2 where a = 'b';
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #12977 Compare table names with qualifying field tables only
|
||||||
|
# for base tables, search all nested join operands of natural joins.
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (`id` TINYINT);
|
||||||
|
CREATE TABLE t2 (`id` TINYINT);
|
||||||
|
CREATE TABLE t3 (`id` TINYINT);
|
||||||
|
INSERT INTO t1 VALUES (1),(2),(3);
|
||||||
|
INSERT INTO t2 VALUES (2);
|
||||||
|
INSERT INTO t3 VALUES (3);
|
||||||
|
-- error 1052
|
||||||
|
SELECT t1.id,t3.id FROM t1 JOIN t2 ON (t2.id=t1.id) LEFT JOIN t3 USING (id);
|
||||||
|
-- error 1052
|
||||||
|
SELECT t1.id,t3.id FROM t1 JOIN t2 ON (t2.notacolumn=t1.id) LEFT JOIN t3 USING (id);
|
||||||
|
-- error 1052
|
||||||
|
SELECT id,t3.id FROM t1 JOIN t2 ON (t2.id=t1.id) LEFT JOIN t3 USING (id);
|
||||||
|
-- error 1052
|
||||||
|
SELECT id,t3.id FROM (t1 JOIN t2 ON (t2.id=t1.id)) LEFT JOIN t3 USING (id);
|
||||||
|
|
||||||
|
drop table t1, t2, t3;
|
||||||
|
|
|
@ -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
|
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.
|
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
|
This is done differently for NATURAL/USING joins or nested joins that
|
||||||
simply compare the qualifying table and database names with the ones of
|
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
|
'table_list' because each field in such a join may originate from a
|
||||||
different table.
|
different table.
|
||||||
TODO: Ensure that table_name, db_name and tables->db always points to
|
TODO: Ensure that table_name, db_name and tables->db always points to
|
||||||
something !
|
something !
|
||||||
*/
|
*/
|
||||||
if (!table_list->is_natural_join &&
|
if (!(table_list->nested_join && table_list->join_columns) &&
|
||||||
table_name && table_name[0] &&
|
table_name && table_name[0] &&
|
||||||
(my_strcasecmp(table_alias_charset, table_list->alias, table_name) ||
|
(my_strcasecmp(table_alias_charset, table_list->alias, table_name) ||
|
||||||
(db_name && db_name[0] && table_list->db && table_list->db[0] &&
|
(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)))
|
register_tree_change)))
|
||||||
*actual_table= table_list;
|
*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])
|
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
|
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,
|
fld= find_field_in_natural_join(thd, table_list, name, length, ref,
|
||||||
/* TIMOUR_TODO: check this with Sanja */
|
/* 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)
|
if (add_columns && is_created_2)
|
||||||
table_ref_2->join_columns->push_back(cur_nj_col_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 (!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);
|
my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1, thd->where);
|
||||||
goto err;
|
goto err;
|
||||||
|
|
Loading…
Reference in a new issue