summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/suite/vcol/r/vcol_misc.result7
-rw-r--r--mysql-test/suite/vcol/t/vcol_misc.test8
-rw-r--r--sql/table.cc10
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;