Loading mysql-test/r/view.result +42 −0 Original line number Diff line number Diff line Loading @@ -2694,3 +2694,45 @@ Age 38 DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a char(6) DEFAULT 'xxx'); INSERT INTO t1(id) VALUES (1), (2), (3), (4); INSERT INTO t1 VALUES (5,'yyy'), (6,'yyy'); SELECT * FROM t1; id a 1 xxx 2 xxx 3 xxx 4 xxx 5 yyy 6 yyy CREATE VIEW v1(a, m) AS SELECT a, MIN(id) FROM t1 GROUP BY a; SELECT * FROM v1; a m xxx 1 yyy 5 CREATE TABLE t2 SELECT * FROM v1; INSERT INTO t2(m) VALUES (0); SELECT * FROM t2; a m xxx 1 yyy 5 NULL 0 DROP VIEW v1; DROP TABLE t1,t2; CREATE TABLE t1 (id int PRIMARY KEY, e ENUM('a','b') NOT NULL DEFAULT 'b'); INSERT INTO t1(id) VALUES (1), (2), (3); INSERT INTO t1 VALUES (4,'a'); SELECT * FROM t1; id e 1 b 2 b 3 b 4 a CREATE VIEW v1(m, e) AS SELECT MIN(id), e FROM t1 GROUP BY e; CREATE TABLE t2 SELECT * FROM v1; SELECT * FROM t2; m e 4 a 1 b DROP VIEW v1; DROP TABLE IF EXISTS t1,t2; mysql-test/t/view.test +29 −0 Original line number Diff line number Diff line Loading @@ -2566,4 +2566,33 @@ SELECT * FROM v1; DROP VIEW v1; DROP TABLE t1; # # Bug #19089: wrong inherited dafault values in temp table views # CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a char(6) DEFAULT 'xxx'); INSERT INTO t1(id) VALUES (1), (2), (3), (4); INSERT INTO t1 VALUES (5,'yyy'), (6,'yyy'); SELECT * FROM t1; CREATE VIEW v1(a, m) AS SELECT a, MIN(id) FROM t1 GROUP BY a; SELECT * FROM v1; CREATE TABLE t2 SELECT * FROM v1; INSERT INTO t2(m) VALUES (0); SELECT * FROM t2; DROP VIEW v1; DROP TABLE t1,t2; CREATE TABLE t1 (id int PRIMARY KEY, e ENUM('a','b') NOT NULL DEFAULT 'b'); INSERT INTO t1(id) VALUES (1), (2), (3); INSERT INTO t1 VALUES (4,'a'); SELECT * FROM t1; CREATE VIEW v1(m, e) AS SELECT MIN(id), e FROM t1 GROUP BY e; CREATE TABLE t2 SELECT * FROM v1; SELECT * FROM t2; DROP VIEW v1; DROP TABLE IF EXISTS t1,t2; sql/field.cc +1 −0 Original line number Diff line number Diff line Loading @@ -1233,6 +1233,7 @@ Field::Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg, flags=null_ptr ? 0: NOT_NULL_FLAG; comment.str= (char*) ""; comment.length=0; dflt_field= 0; } uint Field::offset() Loading sql/field.h +1 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ class Field char *ptr; // Position to field in record uchar *null_ptr; // Byte where null_bit is Field *dflt_field; // Field to copy default value from /* Note that you can use table->in_use as replacement for current_thd member only inside of val_*() and store() members (e.g. you can't use it in cons) Loading sql/sql_select.cc +32 −6 Original line number Diff line number Diff line Loading @@ -8138,6 +8138,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, bool make_copy_field, uint convert_blob_length) { Field *result; Item::Type orig_type= type; Item *orig_item= 0; Loading @@ -8154,7 +8155,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case Item::SUM_FUNC_ITEM: { Item_sum *item_sum=(Item_sum*) item; Field *result= item_sum->create_tmp_field(group, table, convert_blob_length); result= item_sum->create_tmp_field(group, table, convert_blob_length); if (!result) thd->fatal_error(); return result; Loading @@ -8164,7 +8165,6 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, { Item_field *field= (Item_field*) item; bool orig_modify= modify_item; Field *result; if (orig_type == Item::REF_ITEM) modify_item= 0; /* Loading Loading @@ -8198,6 +8198,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, convert_blob_length); if (orig_type == Item::REF_ITEM && orig_modify) ((Item_ref*)orig_item)->set_result_field(result); if (field->field->eq_def(result)) result->dflt_field= field->field; return result; } /* Fall through */ Loading @@ -8220,9 +8222,9 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, DBUG_ASSERT(((Item_result_field*)item)->result_field); *from_field= ((Item_result_field*)item)->result_field; } return create_tmp_field_from_item(thd, item, table, (make_copy_field ? 0 : copy_func), modify_item, convert_blob_length); return create_tmp_field_from_item(thd, item, table, (make_copy_field ? 0 : copy_func), modify_item, convert_blob_length); case Item::TYPE_HOLDER: return ((Item_type_holder *)item)->make_field_by_type(table); default: // Dosen't have to be stored Loading Loading @@ -8674,6 +8676,30 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, null_count+= (field->field_length & 7); } field->reset(); if (field->dflt_field && field->dflt_field->ptr) { /* field->dflt_field is set only in the cases when 'field' can inherit the default value that is defined for the field referred by the Item_field object from which 'field' has been created. For a field created not from a Item_field item dflt_field == 0. */ my_ptrdiff_t diff; Field *orig_field= field->dflt_field; /* Get the value from default_values */ diff= (my_ptrdiff_t) (orig_field->table->s->default_values- orig_field->table->record[0]); orig_field->move_field(diff); // Points now at default_values bool is_null= orig_field->is_real_null(); char *from= orig_field->ptr; orig_field->move_field(-diff); // Back to record[0] if (is_null) field->set_null(); else memcpy(field->ptr, from, field->pack_length()); } if (from_field[i]) { /* Not a table Item */ copy->set(field,from_field[i],save_sum_fields); Loading Loading
mysql-test/r/view.result +42 −0 Original line number Diff line number Diff line Loading @@ -2694,3 +2694,45 @@ Age 38 DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a char(6) DEFAULT 'xxx'); INSERT INTO t1(id) VALUES (1), (2), (3), (4); INSERT INTO t1 VALUES (5,'yyy'), (6,'yyy'); SELECT * FROM t1; id a 1 xxx 2 xxx 3 xxx 4 xxx 5 yyy 6 yyy CREATE VIEW v1(a, m) AS SELECT a, MIN(id) FROM t1 GROUP BY a; SELECT * FROM v1; a m xxx 1 yyy 5 CREATE TABLE t2 SELECT * FROM v1; INSERT INTO t2(m) VALUES (0); SELECT * FROM t2; a m xxx 1 yyy 5 NULL 0 DROP VIEW v1; DROP TABLE t1,t2; CREATE TABLE t1 (id int PRIMARY KEY, e ENUM('a','b') NOT NULL DEFAULT 'b'); INSERT INTO t1(id) VALUES (1), (2), (3); INSERT INTO t1 VALUES (4,'a'); SELECT * FROM t1; id e 1 b 2 b 3 b 4 a CREATE VIEW v1(m, e) AS SELECT MIN(id), e FROM t1 GROUP BY e; CREATE TABLE t2 SELECT * FROM v1; SELECT * FROM t2; m e 4 a 1 b DROP VIEW v1; DROP TABLE IF EXISTS t1,t2;
mysql-test/t/view.test +29 −0 Original line number Diff line number Diff line Loading @@ -2566,4 +2566,33 @@ SELECT * FROM v1; DROP VIEW v1; DROP TABLE t1; # # Bug #19089: wrong inherited dafault values in temp table views # CREATE TABLE t1 (id int NOT NULL PRIMARY KEY, a char(6) DEFAULT 'xxx'); INSERT INTO t1(id) VALUES (1), (2), (3), (4); INSERT INTO t1 VALUES (5,'yyy'), (6,'yyy'); SELECT * FROM t1; CREATE VIEW v1(a, m) AS SELECT a, MIN(id) FROM t1 GROUP BY a; SELECT * FROM v1; CREATE TABLE t2 SELECT * FROM v1; INSERT INTO t2(m) VALUES (0); SELECT * FROM t2; DROP VIEW v1; DROP TABLE t1,t2; CREATE TABLE t1 (id int PRIMARY KEY, e ENUM('a','b') NOT NULL DEFAULT 'b'); INSERT INTO t1(id) VALUES (1), (2), (3); INSERT INTO t1 VALUES (4,'a'); SELECT * FROM t1; CREATE VIEW v1(m, e) AS SELECT MIN(id), e FROM t1 GROUP BY e; CREATE TABLE t2 SELECT * FROM v1; SELECT * FROM t2; DROP VIEW v1; DROP TABLE IF EXISTS t1,t2;
sql/field.cc +1 −0 Original line number Diff line number Diff line Loading @@ -1233,6 +1233,7 @@ Field::Field(char *ptr_arg,uint32 length_arg,uchar *null_ptr_arg, flags=null_ptr ? 0: NOT_NULL_FLAG; comment.str= (char*) ""; comment.length=0; dflt_field= 0; } uint Field::offset() Loading
sql/field.h +1 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ class Field char *ptr; // Position to field in record uchar *null_ptr; // Byte where null_bit is Field *dflt_field; // Field to copy default value from /* Note that you can use table->in_use as replacement for current_thd member only inside of val_*() and store() members (e.g. you can't use it in cons) Loading
sql/sql_select.cc +32 −6 Original line number Diff line number Diff line Loading @@ -8138,6 +8138,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, bool make_copy_field, uint convert_blob_length) { Field *result; Item::Type orig_type= type; Item *orig_item= 0; Loading @@ -8154,7 +8155,7 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, case Item::SUM_FUNC_ITEM: { Item_sum *item_sum=(Item_sum*) item; Field *result= item_sum->create_tmp_field(group, table, convert_blob_length); result= item_sum->create_tmp_field(group, table, convert_blob_length); if (!result) thd->fatal_error(); return result; Loading @@ -8164,7 +8165,6 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, { Item_field *field= (Item_field*) item; bool orig_modify= modify_item; Field *result; if (orig_type == Item::REF_ITEM) modify_item= 0; /* Loading Loading @@ -8198,6 +8198,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, convert_blob_length); if (orig_type == Item::REF_ITEM && orig_modify) ((Item_ref*)orig_item)->set_result_field(result); if (field->field->eq_def(result)) result->dflt_field= field->field; return result; } /* Fall through */ Loading @@ -8220,9 +8222,9 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, DBUG_ASSERT(((Item_result_field*)item)->result_field); *from_field= ((Item_result_field*)item)->result_field; } return create_tmp_field_from_item(thd, item, table, (make_copy_field ? 0 : copy_func), modify_item, convert_blob_length); return create_tmp_field_from_item(thd, item, table, (make_copy_field ? 0 : copy_func), modify_item, convert_blob_length); case Item::TYPE_HOLDER: return ((Item_type_holder *)item)->make_field_by_type(table); default: // Dosen't have to be stored Loading Loading @@ -8674,6 +8676,30 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields, null_count+= (field->field_length & 7); } field->reset(); if (field->dflt_field && field->dflt_field->ptr) { /* field->dflt_field is set only in the cases when 'field' can inherit the default value that is defined for the field referred by the Item_field object from which 'field' has been created. For a field created not from a Item_field item dflt_field == 0. */ my_ptrdiff_t diff; Field *orig_field= field->dflt_field; /* Get the value from default_values */ diff= (my_ptrdiff_t) (orig_field->table->s->default_values- orig_field->table->record[0]); orig_field->move_field(diff); // Points now at default_values bool is_null= orig_field->is_real_null(); char *from= orig_field->ptr; orig_field->move_field(-diff); // Back to record[0] if (is_null) field->set_null(); else memcpy(field->ptr, from, field->pack_length()); } if (from_field[i]) { /* Not a table Item */ copy->set(field,from_field[i],save_sum_fields); Loading