diff options
author | unknown <ram@gw.mysql.r18.ru> | 2004-03-30 16:04:08 +0500 |
---|---|---|
committer | unknown <ram@gw.mysql.r18.ru> | 2004-03-30 16:04:08 +0500 |
commit | b26165d3a2eeb748b9bd5573f9bac7b73d5f9a37 (patch) | |
tree | cf443dc3eac52560811d190ab47d14c108fcae62 | |
parent | ceeaa24d187b228fd6e8b1ac1e667d341155640f (diff) | |
parent | 3004dc7ef27ee96f7b1ccf2868009e035f7cff06 (diff) | |
download | mariadb-git-b26165d3a2eeb748b9bd5573f9bac7b73d5f9a37.tar.gz |
resolving conflicts
-rw-r--r-- | mysql-test/r/join.result | 6 | ||||
-rw-r--r-- | mysql-test/r/join_outer.result | 12 | ||||
-rw-r--r-- | mysql-test/r/select.result | 8 | ||||
-rw-r--r-- | sql/sql_base.cc | 61 |
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; |