diff options
author | Sergei Golubchik <serg@mariadb.org> | 2017-01-24 22:57:08 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2017-02-13 18:12:04 +0100 |
commit | d2f84ab978c596fcaa96e0d53282b57f6225e50f (patch) | |
tree | 37fd91a75aa8e38d0ef2260d42654886f51ac547 | |
parent | b6a3917b0555a0fdaee7c3f13423009f4f4b878d (diff) | |
download | mariadb-git-d2f84ab978c596fcaa96e0d53282b57f6225e50f.tar.gz |
MDEV-10352 Server crashes in Field::set_default on CREATE TABLE
fix Item_default_value not to pretend being const_item
if the field's default_value expression isn't parsed yet
-rw-r--r-- | mysql-test/r/default.result | 2 | ||||
-rw-r--r-- | mysql-test/t/default.test | 6 | ||||
-rw-r--r-- | sql/item.cc | 8 |
3 files changed, 13 insertions, 3 deletions
diff --git a/mysql-test/r/default.result b/mysql-test/r/default.result index 014d4bee6c8..39202f5eabb 100644 --- a/mysql-test/r/default.result +++ b/mysql-test/r/default.result @@ -3362,4 +3362,6 @@ a b t 4 5 4 also expression DEFAULT(0)+0 4 5 5 the value of the DEFAULT(a), that is b drop table t1; +create table t1 (col1 int default(-(default(col1)))); +ERROR 01000: Expression for field `col1` is refering to uninitialized field `col1` # end of 10.2 test diff --git a/mysql-test/t/default.test b/mysql-test/t/default.test index c96f8ac239b..b9f97b08a72 100644 --- a/mysql-test/t/default.test +++ b/mysql-test/t/default.test @@ -2069,4 +2069,10 @@ insert into t1 values (b, 5, '5 the value of the DEFAULT(a), that is b'); select * from t1 order by t; drop table t1; +# +# MDEV-10352 Server crashes in Field::set_default on CREATE TABLE +# +--error ER_EXPRESSION_REFERS_TO_UNINIT_FIELD +create table t1 (col1 int default(-(default(col1)))); + --echo # end of 10.2 test diff --git a/sql/item.cc b/sql/item.cc index 3b3e878f4d3..c34d27fa63b 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -8853,9 +8853,11 @@ int Item_default_value::save_in_field(Field *field_arg, bool no_conversions) table_map Item_default_value::used_tables() const { - if (field && field->default_value && field->default_value->flags) - return field->default_value->expr->used_tables(); - return static_cast<table_map>(0); + if (!field || !field->default_value) + return static_cast<table_map>(0); + if (!field->default_value->expr) // not fully parsed field + return static_cast<table_map>(RAND_TABLE_BIT); + return field->default_value->expr->used_tables(); } /** |