summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsergefp@mysql.com <>2005-09-07 12:13:12 +0400
committersergefp@mysql.com <>2005-09-07 12:13:12 +0400
commit83b5f1a3382f88b897d3d31820dceac3d45f3935 (patch)
tree57aae11be8ab47004d9245b002950536182d09ad
parente6bb90d6188f192134f9a349e6e0452884d157bb (diff)
parent99870f616d0ae30b59f3f172217efc2095bf9d62 (diff)
downloadmariadb-git-83b5f1a3382f88b897d3d31820dceac3d45f3935.tar.gz
Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/psergey/mysql-5.0-bug12941
-rw-r--r--mysql-test/r/view.result26
-rw-r--r--mysql-test/t/view.test33
-rw-r--r--sql/sql_select.cc30
3 files changed, 79 insertions, 10 deletions
diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result
index a544fb4b020..e141393176c 100644
--- a/mysql-test/r/view.result
+++ b/mysql-test/r/view.result
@@ -2151,3 +2151,29 @@ select * from v1;
strcmp(f1,'a')
drop view v1;
drop table t1;
+create table t1 (
+r_object_id char(16) NOT NULL,
+group_name varchar(32) NOT NULL
+) engine = InnoDB;
+create table t2 (
+r_object_id char(16) NOT NULL,
+i_position int(11) NOT NULL,
+users_names varchar(32) default NULL
+) Engine = InnoDB;
+create view v1 as select r_object_id, group_name from t1;
+create view v2 as select r_object_id, i_position, users_names from t2;
+create unique index r_object_id on t1(r_object_id);
+create index group_name on t1(group_name);
+create unique index r_object_id_i_position on t2(r_object_id,i_position);
+create index users_names on t2(users_names);
+insert into t1 values('120001a080000542','tstgroup1');
+insert into t2 values('120001a080000542',-1, 'guser01');
+insert into t2 values('120001a080000542',-2, 'guser02');
+select v1.r_object_id, v2.users_names from v1, v2
+where (v1.group_name='tstgroup1') and v2.r_object_id=v1.r_object_id
+order by users_names;
+r_object_id users_names
+120001a080000542 guser01
+120001a080000542 guser02
+drop view v1, v2;
+drop table t1, t2;
diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test
index 97625632618..c5984f726f4 100644
--- a/mysql-test/t/view.test
+++ b/mysql-test/t/view.test
@@ -2018,3 +2018,36 @@ create view v1 as select strcmp(f1,'a') from t1;
select * from v1;
drop view v1;
drop table t1;
+
+#
+# BUG#12941
+#
+create table t1 (
+ r_object_id char(16) NOT NULL,
+ group_name varchar(32) NOT NULL
+) engine = InnoDB;
+
+create table t2 (
+ r_object_id char(16) NOT NULL,
+ i_position int(11) NOT NULL,
+ users_names varchar(32) default NULL
+) Engine = InnoDB;
+
+create view v1 as select r_object_id, group_name from t1;
+create view v2 as select r_object_id, i_position, users_names from t2;
+
+create unique index r_object_id on t1(r_object_id);
+create index group_name on t1(group_name);
+create unique index r_object_id_i_position on t2(r_object_id,i_position);
+create index users_names on t2(users_names);
+
+insert into t1 values('120001a080000542','tstgroup1');
+insert into t2 values('120001a080000542',-1, 'guser01');
+insert into t2 values('120001a080000542',-2, 'guser02');
+
+select v1.r_object_id, v2.users_names from v1, v2
+where (v1.group_name='tstgroup1') and v2.r_object_id=v1.r_object_id
+order by users_names;
+
+drop view v1, v2;
+drop table t1, t2;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 0de06ea395a..e86af23d5fa 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -8054,12 +8054,17 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
bool table_cant_handle_bit_fields,
uint convert_blob_length)
{
+ Item::Type orig_type;
+ Item *orig_item;
+
if (type != Item::FIELD_ITEM &&
item->real_item()->type() == Item::FIELD_ITEM &&
(item->type() != Item::REF_ITEM ||
!((Item_ref *) item)->depended_from))
{
+ orig_item= item;
item= item->real_item();
+ orig_type= type;
type= Item::FIELD_ITEM;
}
switch (type) {
@@ -8075,29 +8080,34 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
case Item::DEFAULT_VALUE_ITEM:
{
Item_field *field= (Item_field*) item;
+ bool orig_modify= modify_item;
+ Field *result;
+ if (orig_type == Item::REF_ITEM)
+ modify_item= 0;
/*
If item have to be able to store NULLs but underlaid field can't do it,
create_tmp_field_from_field() can't be used for tmp field creation.
*/
if (field->maybe_null && !field->field->maybe_null())
{
- Field *res= create_tmp_field_from_item(thd, item, table, NULL,
+ result= create_tmp_field_from_item(thd, item, table, NULL,
modify_item, convert_blob_length);
*from_field= field->field;
- if (res && modify_item)
- ((Item_field*)item)->result_field= res;
- return res;
- }
-
- if (table_cant_handle_bit_fields &&
- field->field->type() == FIELD_TYPE_BIT)
- return create_tmp_field_from_item(thd, item, table, copy_func,
+ if (result && modify_item)
+ ((Item_field*)item)->result_field= result;
+ }
+ else if (table_cant_handle_bit_fields && field->field->type() == FIELD_TYPE_BIT)
+ result= create_tmp_field_from_item(thd, item, table, copy_func,
modify_item, convert_blob_length);
- return create_tmp_field_from_field(thd, (*from_field= field->field),
+ else
+ result= create_tmp_field_from_field(thd, (*from_field= field->field),
item->name, table,
modify_item ? (Item_field*) item :
NULL,
convert_blob_length);
+ if (orig_type == Item::REF_ITEM && orig_modify)
+ ((Item_ref*)orig_item)->set_result_field(result);
+ return result;
}
/* Fall through */
case Item::FUNC_ITEM: