diff options
author | unknown <sanja@montyprogram.com> | 2013-08-01 09:25:50 +0300 |
---|---|---|
committer | unknown <sanja@montyprogram.com> | 2013-08-01 09:25:50 +0300 |
commit | edcae48734058eadd5ed29330b0a525544fa36ed (patch) | |
tree | 49406de026f1d5f4a5147e223ebad74b9c3a8fa7 | |
parent | 6bef652d91b9dc78af4794a87edfd760503d6d6d (diff) | |
download | mariadb-git-edcae48734058eadd5ed29330b0a525544fa36ed.tar.gz |
MDEV-4823: Server crashes in Item_func_not::fix_fields on creating a table with a virtual column using NOT
fix_field() call protocol was brocken (zero pointer passed as link to item which is possible only if you are sure that there can not be Items which transforms).
-rw-r--r-- | mysql-test/suite/vcol/r/vcol_misc.result | 7 | ||||
-rw-r--r-- | mysql-test/suite/vcol/t/vcol_misc.test | 8 | ||||
-rw-r--r-- | sql/table.cc | 10 |
3 files changed, 23 insertions, 2 deletions
diff --git a/mysql-test/suite/vcol/r/vcol_misc.result b/mysql-test/suite/vcol/r/vcol_misc.result index 4c301795f5c..bcded410856 100644 --- a/mysql-test/suite/vcol/r/vcol_misc.result +++ b/mysql-test/suite/vcol/r/vcol_misc.result @@ -193,3 +193,10 @@ SELECT COUNT(*) FROM t1; COUNT(*) 2 DROP TABLE t1; +# +# MDEV-4823 Server crashes in Item_func_not::fix_fields on +# creating a table with a virtual column using NOT +# +CREATE TABLE t1 ( f1 INT, v4 INT AS ( NOT f1 ) VIRTUAL ); +drop table t1; +# end of 5.2 tests diff --git a/mysql-test/suite/vcol/t/vcol_misc.test b/mysql-test/suite/vcol/t/vcol_misc.test index 0a689795b4c..ca88dedc0f4 100644 --- a/mysql-test/suite/vcol/t/vcol_misc.test +++ b/mysql-test/suite/vcol/t/vcol_misc.test @@ -198,3 +198,11 @@ SELECT COUNT(*) FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-4823 Server crashes in Item_func_not::fix_fields on +--echo # creating a table with a virtual column using NOT +--echo # +CREATE TABLE t1 ( f1 INT, v4 INT AS ( NOT f1 ) VIRTUAL ); +drop table t1; + +--echo # end of 5.2 tests diff --git a/sql/table.cc b/sql/table.cc index dfc9c2d933c..b9089d58cc7 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1812,7 +1812,7 @@ bool fix_vcol_expr(THD *thd, bool result= TRUE; TABLE_LIST tables; TABLE_LIST *save_table_list, *save_first_table, *save_last_table; - int error; + int error= 0; Name_resolution_context *context; const char *save_where; char* db_name; @@ -1860,7 +1860,13 @@ bool fix_vcol_expr(THD *thd, save_use_only_table_context= thd->lex->use_only_table_context; thd->lex->use_only_table_context= TRUE; /* Fix fields referenced to by the virtual column function */ - error= func_expr->fix_fields(thd, (Item**)0); + if (!func_expr->fixed) + error= func_expr->fix_fields(thd, &vcol_info->expr_item); + + /* fix_fields could change the expression */ + func_expr= vcol_info->expr_item; + /* Number of columns will be checked later */ + /* Restore the original context*/ thd->lex->use_only_table_context= save_use_only_table_context; context->table_list= save_table_list; |