summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <ram@gw.mysql.r18.ru>2004-03-30 16:04:08 +0500
committerunknown <ram@gw.mysql.r18.ru>2004-03-30 16:04:08 +0500
commitb26165d3a2eeb748b9bd5573f9bac7b73d5f9a37 (patch)
treecf443dc3eac52560811d190ab47d14c108fcae62
parentceeaa24d187b228fd6e8b1ac1e667d341155640f (diff)
parent3004dc7ef27ee96f7b1ccf2868009e035f7cff06 (diff)
downloadmariadb-git-b26165d3a2eeb748b9bd5573f9bac7b73d5f9a37.tar.gz
resolving conflicts
-rw-r--r--mysql-test/r/join.result6
-rw-r--r--mysql-test/r/join_outer.result12
-rw-r--r--mysql-test/r/select.result8
-rw-r--r--sql/sql_base.cc61
4 files changed, 48 insertions, 39 deletions
diff --git a/mysql-test/r/join.result b/mysql-test/r/join.result
index 7dbc09f9cc0..f9e49c40dc1 100644
--- a/mysql-test/r/join.result
+++ b/mysql-test/r/join.result
@@ -277,11 +277,11 @@ CREATE TABLE t2 (ID INTEGER NOT NULL PRIMARY KEY, Value2 VARCHAR(255));
INSERT INTO t1 VALUES (1, 'A');
INSERT INTO t2 VALUES (1, 'B');
SELECT * FROM t1 NATURAL JOIN t2 WHERE 1 AND (Value1 = 'A' AND Value2 <> 'B');
-ID Value1 ID Value2
+ID Value1 Value2
SELECT * FROM t1 NATURAL JOIN t2 WHERE 1 AND Value1 = 'A' AND Value2 <> 'B';
-ID Value1 ID Value2
+ID Value1 Value2
SELECT * FROM t1 NATURAL JOIN t2 WHERE (Value1 = 'A' AND Value2 <> 'B') AND 1;
-ID Value1 ID Value2
+ID Value1 Value2
drop table t1,t2;
create table t1 (i int);
create table t2 (i int);
diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result
index c40f86827f8..9d7c3d98952 100644
--- a/mysql-test/r/join_outer.result
+++ b/mysql-test/r/join_outer.result
@@ -124,8 +124,8 @@ grp a c id a c d
3 5 C 3 5 B 5
3 6 D 3 6 C 6
select t1.*,t2.* from t1 natural join t2;
-grp a c id a c d
-1 1 a 1 1 a 1
+grp a c id d
+1 1 a 1 1
drop table t1,t2;
CREATE TABLE t1 (
usr_id INT unsigned NOT NULL,
@@ -467,10 +467,10 @@ count color
15 white
7 green
select * from t2 natural join t1;
-count color color name
-10 green green lime
-7 green green lime
-5 black black grape
+count color name
+10 green lime
+7 green lime
+5 black grape
select t2.count, t1.name from t2 natural join t1;
count name
10 lime
diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result
index a940e0f2e95..43c41378f30 100644
--- a/mysql-test/r/select.result
+++ b/mysql-test/r/select.result
@@ -2279,10 +2279,10 @@ a a a
2 2 2
3 3 3
select * from t1 natural join (t1 as t2 left join t1 as t3 using (a));
-a a a
-1 1 1
-2 2 2
-3 3 3
+a a
+1 1
+2 2
+3 3
select * from (t1 as t2 left join t1 as t3 using (a)) natural join t1;
a a a
1 1 1
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index e8bb3187fb1..c5cd124bf43 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -2293,14 +2293,27 @@ insert_fields(THD *thd,TABLE_LIST *tables, const char *db_name,
DBUG_RETURN(-1);
#endif
Field **ptr=table->field,*field;
+ TABLE *natural_join_table;
thd->used_tables|=table->map;
+ if (table->outer_join ||
+ !tables->natural_join ||
+ tables->natural_join->table->outer_join)
+ natural_join_table= NULL;
+ else
+ natural_join_table= tables->natural_join->table;
while ((field = *ptr++))
{
- Item_field *item= new Item_field(field);
- if (!found++)
- (void) it->replace(item); // Replace '*'
- else
- it->after(item);
+ /* Skip duplicate field names if NATURAL JOIN is used */
+ if (!natural_join_table ||
+ !find_field_in_table(thd, natural_join_table, field->field_name,
+ strlen(field->field_name), 0, 0))
+ {
+ Item_field *item= new Item_field(field);
+ if (!found++)
+ (void) it->replace(item); // Replace '*'
+ else
+ it->after(item);
+ }
/*
Mark if field used before in this select.
Used by 'insert' to verify if a field name is used twice
@@ -2383,28 +2396,24 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
DBUG_RETURN(1);
cond_and->top_level_item();
- uint i,j;
- for (i=0 ; i < t1->fields ; i++)
+ Field **t1_field, *t2_field;
+ for (t1_field= t1->field; (*t1_field); t1_field++)
{
- // TODO: This could be optimized to use hashed names if t2 had a hash
- for (j=0 ; j < t2->fields ; j++)
- {
- if (!my_strcasecmp(system_charset_info,
- t1->field[i]->field_name,
- t2->field[j]->field_name))
- {
- Item_func_eq *tmp= new Item_func_eq(new Item_field(t1->field[i]),
- new Item_field(t2->field[j]));
- if (!tmp)
- DBUG_RETURN(1);
- /* Mark field used for table cache */
- t1->field[i]->query_id=t2->field[j]->query_id=thd->query_id;
- cond_and->list.push_back(tmp);
- t1->used_keys.intersect(t1->field[i]->part_of_key);
- t2->used_keys.intersect(t2->field[j]->part_of_key);
- break;
- }
- }
+ const char *t1_field_name= (*t1_field)->field_name;
+
+ if ((t2_field= find_field_in_table(thd, t2, t1_field_name,
+ strlen(t1_field_name), 0, 0)))
+ {
+ Item_func_eq *tmp=new Item_func_eq(new Item_field(*t1_field),
+ new Item_field(t2_field));
+ if (!tmp)
+ DBUG_RETURN(1);
+ /* Mark field used for table cache */
+ (*t1_field)->query_id= t2_field->query_id= thd->query_id;
+ cond_and->list.push_back(tmp);
+ t1->used_keys.intersect((*t1_field)->part_of_key);
+ t2->used_keys.intersect(t2_field->part_of_key);
+ }
}
thd->lex->current_select->cond_count+= cond_and->list.elements;