Loading mysql-test/r/view.result +13 −0 Original line number Diff line number Diff line Loading @@ -2807,3 +2807,16 @@ yadda yad DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (s1 char); INSERT INTO t1 VALUES ('Z'); CREATE VIEW v1 AS SELECT s1 collate latin1_german1_ci AS col FROM t1; CREATE VIEW v2 (col) AS SELECT s1 collate latin1_german1_ci FROM t1; INSERT INTO v1 (col) VALUES ('b'); INSERT INTO v2 (col) VALUES ('c'); SELECT s1 FROM t1; s1 Z b c DROP VIEW v1, v2; DROP TABLE t1; mysql-test/t/view.test +19 −0 Original line number Diff line number Diff line Loading @@ -2667,3 +2667,22 @@ SELECT * FROM v1; DROP VIEW v1; DROP TABLE t1; # # Bug #21086: server crashes when VIEW defined with a SELECT with COLLATE # clause is called # CREATE TABLE t1 (s1 char); INSERT INTO t1 VALUES ('Z'); CREATE VIEW v1 AS SELECT s1 collate latin1_german1_ci AS col FROM t1; CREATE VIEW v2 (col) AS SELECT s1 collate latin1_german1_ci FROM t1; # either of these statements will cause crash INSERT INTO v1 (col) VALUES ('b'); INSERT INTO v2 (col) VALUES ('c'); SELECT s1 FROM t1; DROP VIEW v1, v2; DROP TABLE t1; sql/item_strfunc.h +1 −1 Original line number Diff line number Diff line Loading @@ -728,7 +728,7 @@ class Item_func_set_collation :public Item_str_func void fix_length_and_dec(); bool eq(const Item *item, bool binary_cmp) const; const char *func_name() const { return "collate"; } enum Functype func_type() const { return COLLATE_FUNC; } enum Functype functype() const { return COLLATE_FUNC; } void print(String *str); Item_field *filed_for_view_update() { Loading sql/sql_base.cc +7 −2 Original line number Diff line number Diff line Loading @@ -4959,12 +4959,17 @@ fill_record(THD * thd, List<Item> &fields, List<Item> &values, bool ignore_errors) { List_iterator_fast<Item> f(fields),v(values); Item *value; Item *value, *fld; Item_field *field; DBUG_ENTER("fill_record"); while ((field=(Item_field*) f++)) while ((fld= f++)) { if (!(field= fld->filed_for_view_update())) { my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name); DBUG_RETURN(TRUE); } value=v++; Field *rfield= field->field; TABLE *table= rfield->table; Loading Loading
mysql-test/r/view.result +13 −0 Original line number Diff line number Diff line Loading @@ -2807,3 +2807,16 @@ yadda yad DROP VIEW v1; DROP TABLE t1; CREATE TABLE t1 (s1 char); INSERT INTO t1 VALUES ('Z'); CREATE VIEW v1 AS SELECT s1 collate latin1_german1_ci AS col FROM t1; CREATE VIEW v2 (col) AS SELECT s1 collate latin1_german1_ci FROM t1; INSERT INTO v1 (col) VALUES ('b'); INSERT INTO v2 (col) VALUES ('c'); SELECT s1 FROM t1; s1 Z b c DROP VIEW v1, v2; DROP TABLE t1;
mysql-test/t/view.test +19 −0 Original line number Diff line number Diff line Loading @@ -2667,3 +2667,22 @@ SELECT * FROM v1; DROP VIEW v1; DROP TABLE t1; # # Bug #21086: server crashes when VIEW defined with a SELECT with COLLATE # clause is called # CREATE TABLE t1 (s1 char); INSERT INTO t1 VALUES ('Z'); CREATE VIEW v1 AS SELECT s1 collate latin1_german1_ci AS col FROM t1; CREATE VIEW v2 (col) AS SELECT s1 collate latin1_german1_ci FROM t1; # either of these statements will cause crash INSERT INTO v1 (col) VALUES ('b'); INSERT INTO v2 (col) VALUES ('c'); SELECT s1 FROM t1; DROP VIEW v1, v2; DROP TABLE t1;
sql/item_strfunc.h +1 −1 Original line number Diff line number Diff line Loading @@ -728,7 +728,7 @@ class Item_func_set_collation :public Item_str_func void fix_length_and_dec(); bool eq(const Item *item, bool binary_cmp) const; const char *func_name() const { return "collate"; } enum Functype func_type() const { return COLLATE_FUNC; } enum Functype functype() const { return COLLATE_FUNC; } void print(String *str); Item_field *filed_for_view_update() { Loading
sql/sql_base.cc +7 −2 Original line number Diff line number Diff line Loading @@ -4959,12 +4959,17 @@ fill_record(THD * thd, List<Item> &fields, List<Item> &values, bool ignore_errors) { List_iterator_fast<Item> f(fields),v(values); Item *value; Item *value, *fld; Item_field *field; DBUG_ENTER("fill_record"); while ((field=(Item_field*) f++)) while ((fld= f++)) { if (!(field= fld->filed_for_view_update())) { my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), fld->name); DBUG_RETURN(TRUE); } value=v++; Field *rfield= field->field; TABLE *table= rfield->table; Loading