mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
Bug #21086: server crashes when VIEW defined with a SELECT with COLLATE clause is called
When executing INSERT over a view with calculated columns it was assuming all elements of the fields collection are actually Item_field instances. This may not be true when inserting into a view and that view has columns that are such expressions that allow updating (like setting a collation for example). Corrected to access field information through the filed_for_view_update() function and retrieve correctly the field info even for "update-friendly" non-Item_field items.
This commit is contained in:
parent
9e9fb3e4e4
commit
f5b0dd6a00
4 changed files with 40 additions and 3 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -728,7 +728,7 @@ public:
|
|||
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()
|
||||
{
|
||||
|
|
|
@ -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…
Reference in a new issue