summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2016-12-07 10:10:08 +0100
committerSergei Golubchik <serg@mariadb.org>2016-12-12 20:44:46 +0100
commitb3e335655747c7655e72525d6e47e0cc989e84d9 (patch)
tree0e2fcca88bb1504f9b04c59ec19513c47bc6c807
parenta9a362d3fd52010f601eae99af7e168b370da9d2 (diff)
downloadmariadb-git-b3e335655747c7655e72525d6e47e0cc989e84d9.tar.gz
bugfix: reset MODE_NO_BACKSLASH_ESCAPES during vcol parsing
-rw-r--r--mysql-test/r/func_like.result27
-rw-r--r--mysql-test/t/func_like.test14
-rw-r--r--sql/table.cc3
3 files changed, 44 insertions, 0 deletions
diff --git a/mysql-test/r/func_like.result b/mysql-test/r/func_like.result
index 842ba25e556..0a309bcfab6 100644
--- a/mysql-test/r/func_like.result
+++ b/mysql-test/r/func_like.result
@@ -262,3 +262,30 @@ select * from v1;
'foo!' like 'foo!!' 'foo!' like 'foo!!' escape '!'
0 1
drop view v1;
+create table t1 (a varchar(100),
+b int default (a like '%f\\_'),
+c int default (a like '%f\\_' escape ''),
+d int default (a like '%f\\_' escape '\\'));
+show create table t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` varchar(100) DEFAULT NULL,
+ `b` int(11) DEFAULT (`a` like '%f\\_'),
+ `c` int(11) DEFAULT (`a` like '%f\\_' escape ''),
+ `d` int(11) DEFAULT (`a` like '%f\\_' escape '\\')
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+insert t1 (a) values ('1 f_'), ('1 f\\_');
+set sql_mode=no_backslash_escapes;
+insert t1 (a) values ('2 f_'), ('2 f\_');
+flush tables;
+insert t1 (a) values ('3 f_'), ('3 f\_');
+set sql_mode=default;
+select * from t1;
+a b c d
+1 f_ 1 0 1
+1 f\_ 0 1 0
+2 f_ 1 0 1
+2 f\_ 0 1 0
+3 f_ 1 0 1
+3 f\_ 0 1 0
+drop table t1;
diff --git a/mysql-test/t/func_like.test b/mysql-test/t/func_like.test
index ed648fdc70a..b65bff63298 100644
--- a/mysql-test/t/func_like.test
+++ b/mysql-test/t/func_like.test
@@ -193,3 +193,17 @@ create view v1 as select 'foo!' like 'foo!!', 'foo!' like 'foo!!' escape '!';
show create view v1;
select * from v1;
drop view v1;
+
+create table t1 (a varchar(100),
+ b int default (a like '%f\\_'),
+ c int default (a like '%f\\_' escape ''),
+ d int default (a like '%f\\_' escape '\\'));
+show create table t1;
+insert t1 (a) values ('1 f_'), ('1 f\\_');
+set sql_mode=no_backslash_escapes;
+insert t1 (a) values ('2 f_'), ('2 f\_');
+flush tables;
+insert t1 (a) values ('3 f_'), ('3 f\_');
+set sql_mode=default;
+select * from t1;
+drop table t1;
diff --git a/sql/table.cc b/sql/table.cc
index 1496d1b8c46..9b312b593b4 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -995,6 +995,7 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table,
Field **vfield_ptr= table->vfield;
Field **dfield_ptr= table->default_field;
Virtual_column_info **check_constraint_ptr= table->check_constraints;
+ sql_mode_t saved_mode= thd->variables.sql_mode;
Query_arena backup_arena;
Virtual_column_info *vcol;
StringBuffer<MAX_FIELD_WIDTH> expr_str;
@@ -1020,6 +1021,7 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table,
thd->stmt_arena= table->expr_arena;
thd->update_charset(&my_charset_utf8mb4_general_ci, table->s->table_charset);
expr_str.append(&parse_vcol_keyword);
+ thd->variables.sql_mode &= ~MODE_NO_BACKSLASH_ESCAPES;
while (pos < end)
{
@@ -1135,6 +1137,7 @@ end:
thd->stmt_arena= backup_stmt_arena_ptr;
if (save_character_set_client)
thd->update_charset(save_character_set_client, save_collation);
+ thd->variables.sql_mode= saved_mode;
DBUG_RETURN(res);
}