diff --git a/mysql-test/r/information_schema.result b/mysql-test/r/information_schema.result
index 00ec9d9..3367a21 100644
--- a/mysql-test/r/information_schema.result
+++ b/mysql-test/r/information_schema.result
@@ -659,7 +659,7 @@ proc	body	longblob
 proc	definer	char(141)
 proc	created	timestamp
 proc	modified	timestamp
-proc	sql_mode	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')
+proc	sql_mode	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY')
 proc	comment	text
 proc	character_set_client	char(32)
 proc	collation_connection	char(32)
diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result
index 2630546..c6ff381 100644
--- a/mysql-test/r/mysqld--help.result
+++ b/mysql-test/r/mysqld--help.result
@@ -1070,7 +1070,8 @@ The following options may be given as the first argument:
  NO_ZERO_DATE, ALLOW_INVALID_DATES, 
  ERROR_FOR_DIVISION_BY_ZERO, TRADITIONAL, 
  NO_AUTO_CREATE_USER, HIGH_NOT_PRECEDENCE, 
- NO_ENGINE_SUBSTITUTION, PAD_CHAR_TO_FULL_LENGTH
+ NO_ENGINE_SUBSTITUTION, PAD_CHAR_TO_FULL_LENGTH, 
+ SET_CONSISTENCY
  --stack-trace       Print a symbolic stack trace on failure
  (Defaults to on; use --skip-stack-trace to disable.)
  --standard-compliant-cte 
diff --git a/mysql-test/r/set_consistency.result b/mysql-test/r/set_consistency.result
new file mode 100644
index 0000000..37c7f6a
--- /dev/null
+++ b/mysql-test/r/set_consistency.result
@@ -0,0 +1,339 @@
+SET sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,SET_CONSISTENCY';
+#
+# MDEV-13417 UPDATE produces wrong values if an UPDATEd column is later used as an UPDATE source
+# MDEV-13418 Compatibility: The order of evaluation of SELECT..INTO assignments
+#
+CREATE TABLE t1 (c1 INTEGER, c2 INTEGER, c3 INTEGER) ENGINE=InnoDb;
+INSERT INTO t1(c1,c2,c3) VALUES (1,1,1);
+CREATE TABLE  t2 (c1 INTEGER, c2 INTEGER, c3 INTEGER) ENGINE=InnoDb;
+INSERT INTO t2(c1,c2,c3) VALUES (1,1,1);
+
+Check that a column is only updated once.
+
+UPDATE t1
+SET c1 = 1,
+c1 = 2;
+ERROR HY000: The column test.t1.c1 cannot be changed more than once in a single UPDATE statement
+UPDATE t1, t2
+SET t1.c1 = t1.c1 + 1,
+t1.c2 = t1.c1 + 1,
+t2.c2 = t1.c2 + 1,
+t2.c2 = t1.c2 + 1;
+ERROR HY000: The column test.t2.c2 cannot be changed more than once in a single UPDATE statement
+
+Check standard update
+
+UPDATE t1
+SET c1 = c1+1,
+c2 = c1+1,
+c3 = c2+1
+WHERE c1=10;
+START TRANSACTION;
+UPDATE t1
+SET c1 = c1+1,
+c2 = c1+1,
+c3 = c2+1;
+SELECT * FROM t1;
+c1	c2	c3
+2	2	2
+ROLLBACK;
+
+Check multi update
+
+START TRANSACTION;
+UPDATE t1, t2
+SET t1.c1 = t1.c1 + 1,
+t1.c2 = t1.c1 + 1,
+t2.c2 = t1.c2 + 1,
+t2.c3 = t2.c2 + 1
+WHERE t1.c1=t2.c1;
+SELECT * FROM t1;
+c1	c2	c3
+2	2	1
+SELECT * FROM t2;
+c1	c2	c3
+1	2	2
+ROLLBACK;
+CREATE TRIGGER tr1 BEFORE UPDATE ON t1 FOR EACH ROW
+BEGIN
+INSERT INTO t2 VALUES(10+old.c1,10+old.c2,10+old.c3);
+INSERT INTO t2 VALUES(20+new.c1,10+new.c2,10+new.c3);
+END;
+/
+START TRANSACTION;
+UPDATE t1
+SET c1 = c1+1,
+c2 = c1+1,
+c3 = c2+1;
+SELECT * FROM t1;
+c1	c2	c3
+2	2	2
+SELECT * FROM t2;
+c1	c2	c3
+1	1	1
+11	11	11
+22	12	12
+ROLLBACK;
+DROP TABLE t1;
+DROP TABLE t2;
+
+Check update fired by INSERT ... ON DUPLICATE KEY UPDATE
+
+CREATE TABLE t1 (
+id INT(11) NOT NULL AUTO_INCREMENT,
+name VARCHAR(60) NOT NULL,
+nb_visits INT NOT NULL,
+nb_visits_prev INT NOT NULL default 0,
+PRIMARY KEY (id),
+UNIQUE KEY name (name)
+) ENGINE=InnoDB AUTO_INCREMENT=1;
+INSERT INTO t1(name, nb_visits) VALUES('nico', 1)
+ON DUPLICATE KEY UPDATE nb_visits = nb_visits + 1;
+SELECT * FROM t1;
+id	name	nb_visits	nb_visits_prev
+1	nico	1	0
+INSERT INTO t1(name, nb_visits) VALUES('nico', 1)
+ON DUPLICATE KEY UPDATE nb_visits = nb_visits + 1, nb_visits_prev=nb_visits;
+SELECT * FROM t1;
+id	name	nb_visits	nb_visits_prev
+1	nico	2	1
+DROP TABLE t1;
+
+Update table with virtual column
+
+CREATE TABLE t1 (c1 INTEGER, c2 INTEGER, c3 INTEGER AS (c1 MOD 10) VIRTUAL, c4 INTEGER AS (c1+c2 MOD 5) PERSISTENT ) ENGINE=InnoDb;
+INSERT INTO t1(c1,c2) VALUES (1,1);
+SELECT * FROM t1;
+c1	c2	c3	c4
+1	1	1	2
+UPDATE t1 SET c2 = 10, c1 = c2;
+SELECT * FROM t1;
+c1	c2	c3	c4
+1	10	1	1
+UPDATE t1 SET c2 = 4, c1 = c2;
+SELECT * FROM t1;
+c1	c2	c3	c4
+10	4	0	14
+DROP TABLE t1;
+
+Update dynamic column
+
+SET @@local.character_set_connection='latin1';
+CREATE TABLE assets (
+item_name VARCHAR(32) PRIMARY KEY,
+dynamic_col1  BLOB,
+dynamic_col2  BLOB
+);
+INSERT INTO assets VALUES ('Thinkpad Laptop', COLUMN_CREATE('color', 'black', 'price', 500),COLUMN_CREATE('CPU', 'Core I7', 'memory', '8Go'));
+INSERT INTO assets VALUES ('Thinkpad Laptop2', COLUMN_CREATE('color', 'yellow', 'price', 700),COLUMN_CREATE('CPU', 'Core I7', 'memory', '16Go'));
+SELECT item_name, COLUMN_GET(dynamic_col1, 'color' as char) AS color1,
+COLUMN_GET(dynamic_col2, 'color' as char) AS color2
+FROM assets;
+item_name	color1	color2
+Thinkpad Laptop	black	NULL
+Thinkpad Laptop2	yellow	NULL
+UPDATE assets
+SET dynamic_col1=COLUMN_ADD(dynamic_col1, 'warranty', '3 years'),
+dynamic_col2=dynamic_col1
+WHERE item_name LIKE 'Thinkpad Laptop%';
+SELECT item_name, COLUMN_GET(dynamic_col1, 'warranty' as char) AS waranty1,
+COLUMN_GET(dynamic_col2, 'warranty' as char) AS waranty2,
+COLUMN_GET(dynamic_col2, 'color' as char) AS color2
+FROM assets;
+item_name	waranty1	waranty2	color2
+Thinkpad Laptop	3 years	NULL	black
+Thinkpad Laptop2	3 years	NULL	yellow
+
+Select into on dynamic columns
+
+SELECT COLUMN_ADD(dynamic_col1, 'warranty', '4 years'),dynamic_col1 INTO @col1,@col2 FROM assets WHERE item_name='Thinkpad Laptop';
+SELECT COLUMN_GET(@col1, 'warranty' as char) AS waranty1,
+COLUMN_GET(@col2, 'warranty' as char) AS waranty2;
+waranty1	waranty2
+4 years	3 years
+
+Select into on dynamic columns in stored procedure
+
+CREATE OR REPLACE PROCEDURE ps1(INOUT war1 CHAR(20) CHARACTER SET latin1,
+INOUT war2 CHAR(20) CHARACTER SET latin1)
+BEGIN
+SET war1=' YYY' ;
+SELECT COLUMN_GET(@col1, 'warranty' as char),
+CONCAT(COLUMN_GET(@col2, 'warranty' as char), war1)
+INTO war1,war2
+FROM assets WHERE item_name='Thinkpad Laptop';
+END
+/
+CALL ps1(@w1,@w2);
+SELECT @w1,@w2;
+@w1	@w2
+4 years	3 years YYY
+DROP PROCEDURE ps1;
+DROP TABLE assets;
+
+Update TEXT column
+
+CREATE TABLE ft2(copy TEXT,copy2 TEXT,FULLTEXT(copy)) ENGINE=MyISAM;
+INSERT INTO ft2(copy) VALUES
+('MySQL vs MariaDB database'),
+('Oracle vs MariaDB database'),
+('PostgreSQL vs MariaDB database'),
+('MariaDB overview'),
+('Foreign keys'),
+('Primary keys'),
+('Indexes'),
+('Transactions'),
+('Triggers');
+SELECT * FROM ft2;
+copy	copy2
+MySQL vs MariaDB database	NULL
+Oracle vs MariaDB database	NULL
+PostgreSQL vs MariaDB database	NULL
+MariaDB overview	NULL
+Foreign keys	NULL
+Primary keys	NULL
+Indexes	NULL
+Transactions	NULL
+Triggers	NULL
+UPDATE ft2 SET copy = UPPER(copy),
+copy2= copy;
+SELECT * FROM ft2;
+copy	copy2
+MYSQL VS MARIADB DATABASE	MySQL vs MariaDB database
+ORACLE VS MARIADB DATABASE	Oracle vs MariaDB database
+POSTGRESQL VS MARIADB DATABASE	PostgreSQL vs MariaDB database
+MARIADB OVERVIEW	MariaDB overview
+FOREIGN KEYS	Foreign keys
+PRIMARY KEYS	Primary keys
+INDEXES	Indexes
+TRANSACTIONS	Transactions
+TRIGGERS	Triggers
+DROP TABLE ft2;
+
+Check group set error
+
+SET @@join_buffer_size=256, @@join_buffer_size=256;
+ERROR HY000: Group assignment is not allowed.
+SET @w=1, @x=2;
+ERROR HY000: Group assignment is not allowed.
+CREATE OR REPLACE PROCEDURE ps1(INOUT res VARCHAR(20))
+BEGIN
+DECLARE b1 VARCHAR(20);
+SET b1='xxxx', res=b1;
+END
+/
+ERROR HY000: Group assignment is not allowed.
+
+Select into user_variable
+
+SET @w1=1;
+SET @w2=2;
+SELECT @w2,@w1 INTO @w1,@w2;
+SELECT @w1,@w2;
+@w1	@w2
+2	1
+SET @w1=1;
+SET @w2=2;
+SELECT 10,@w1 INTO @w1,@w2;
+SELECT @w1,@w2;
+@w1	@w2
+10	1
+SELECT 10,11,12 INTO @w1,@w1,@w1;
+SELECT @w1;
+@w1
+12
+SET @w1=1;
+SELECT 10,@w1+1,@w1+2 INTO @w1,@w1,@w1;
+SELECT @w1;
+@w1
+3
+
+Select into sp variable
+
+CREATE OR REPLACE PROCEDURE p1()
+BEGIN
+declare v1 integer;
+SELECT 1,2 INTO v1, v1;
+select v1;
+SELECT v1 + 1 , v1 + v1 INTO v1, v1;
+select v1;
+END
+/
+call p1();
+v1
+2
+v1
+4
+
+Select variable into output parameter (stored procedure)
+
+CREATE OR REPLACE PROCEDURE ps1(INOUT par1 VARCHAR(20),
+INOUT par2 VARCHAR(20))
+BEGIN
+SELECT 'A',par1 INTO par1, par2;
+END
+/
+SET @p1='X';
+SET @p2='?';
+CALL ps1(@p1,@p2);
+SELECT @p1,@p2;
+@p1	@p2
+A	X
+SET @p1=null;
+SET @p2='?';
+CALL ps1(@p1,@p2);
+SELECT @p1,@p2;
+@p1	@p2
+A	NULL
+DROP PROCEDURE ps1;
+
+Select from table into output parameter (stored procedure)
+
+CREATE OR REPLACE PROCEDURE ps1(INOUT par1 VARCHAR(20),
+INOUT par2 VARCHAR(20))
+BEGIN
+SELECT 'A',par1 INTO par1, par2 FROM DUAL WHERE par1 LIKE 'X%';
+END
+/
+SET @p1='X';
+SET @p2='?';
+CALL ps1(@p1,@p2);
+SELECT @p1,@p2;
+@p1	@p2
+A	X
+DROP PROCEDURE ps1;
+
+Select row
+
+set sql_mode='ORACLE';
+CREATE OR REPLACE PROCEDURE p1()
+AS
+rec1 ROW(a INT,b INT);
+rec2 ROW(a INT,b INT);
+BEGIN
+-- assign multiple field
+rec1:=ROW(1,1);
+SELECT rec1.a + 1 ,rec1.a into rec1.a, rec1.b;
+SELECT rec1.a, rec1.b;
+-- work with NULL row
+rec1:=NULL;
+SELECT rec1.a + 1 ,rec1.a into rec1.a, rec1.b;
+SELECT rec1.a, rec1.b;
+SET rec1.a=1;
+SELECT rec1.a + 1 ,rec1.a into rec1.a, rec1.b;
+SELECT rec1.a, rec1.b;
+SET rec1.a=1;
+SELECT rec1.a + 1 , rec1.a +2 , rec1.a + rec1.b into rec1.a, rec1.a, rec1.b;
+SELECT rec1.a, rec1.b;
+END;
+/
+CALL p1();
+rec1.a	rec1.b
+2	1
+rec1.a	rec1.b
+NULL	NULL
+rec1.a	rec1.b
+2	1
+rec1.a	rec1.b
+3	2
+DROP PROCEDURE p1;
diff --git a/mysql-test/r/sql_mode.result b/mysql-test/r/sql_mode.result
index 7c881fd..e8191b8 100644
--- a/mysql-test/r/sql_mode.result
+++ b/mysql-test/r/sql_mode.result
@@ -75,7 +75,7 @@ t1	CREATE TABLE `t1` (
 set sql_mode="postgresql,oracle,mssql,db2,maxdb";
 select @@sql_mode;
 @@sql_mode
-PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,POSTGRESQL,ORACLE,MSSQL,DB2,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
+PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,POSTGRESQL,ORACLE,MSSQL,DB2,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY
 show create table t1;
 Table	Create Table
 t1	CREATE TABLE "t1" (
@@ -475,8 +475,8 @@ set sql_mode=16384+(65536*4);
 select @@sql_mode;
 @@sql_mode
 REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_TABLE_OPTIONS,ANSI
-set sql_mode=2147483648*2;
-ERROR 42000: Variable 'sql_mode' can't be set to the value of '4294967296'
+set sql_mode=2147483648*2*2;
+ERROR 42000: Variable 'sql_mode' can't be set to the value of '8589934592'
 select @@sql_mode;
 @@sql_mode
 REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_TABLE_OPTIONS,ANSI
diff --git a/mysql-test/r/system_mysql_db.result b/mysql-test/r/system_mysql_db.result
index b88497d..8bb8b9e 100644
--- a/mysql-test/r/system_mysql_db.result
+++ b/mysql-test/r/system_mysql_db.result
@@ -214,7 +214,7 @@ proc	CREATE TABLE `proc` (
   `definer` char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
   `created` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
   `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
-  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
+  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') NOT NULL DEFAULT '',
   `comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
   `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
   `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
@@ -239,7 +239,7 @@ event	CREATE TABLE `event` (
   `ends` datetime DEFAULT NULL,
   `status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED',
   `on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP',
-  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
+  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') NOT NULL DEFAULT '',
   `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
   `originator` int(10) unsigned NOT NULL,
   `time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM',
diff --git a/mysql-test/r/system_mysql_db_fix40123.result b/mysql-test/r/system_mysql_db_fix40123.result
index b88497d..8bb8b9e 100644
--- a/mysql-test/r/system_mysql_db_fix40123.result
+++ b/mysql-test/r/system_mysql_db_fix40123.result
@@ -214,7 +214,7 @@ proc	CREATE TABLE `proc` (
   `definer` char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
   `created` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
   `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
-  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
+  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') NOT NULL DEFAULT '',
   `comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
   `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
   `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
@@ -239,7 +239,7 @@ event	CREATE TABLE `event` (
   `ends` datetime DEFAULT NULL,
   `status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED',
   `on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP',
-  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
+  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') NOT NULL DEFAULT '',
   `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
   `originator` int(10) unsigned NOT NULL,
   `time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM',
diff --git a/mysql-test/r/system_mysql_db_fix50030.result b/mysql-test/r/system_mysql_db_fix50030.result
index 14905ab..3e7bcf9 100644
--- a/mysql-test/r/system_mysql_db_fix50030.result
+++ b/mysql-test/r/system_mysql_db_fix50030.result
@@ -214,7 +214,7 @@ proc	CREATE TABLE `proc` (
   `definer` char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
   `created` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
   `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
-  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
+  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') NOT NULL DEFAULT '',
   `comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
   `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
   `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
@@ -239,7 +239,7 @@ event	CREATE TABLE `event` (
   `ends` datetime DEFAULT NULL,
   `status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED',
   `on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP',
-  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
+  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') NOT NULL DEFAULT '',
   `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
   `originator` int(10) unsigned NOT NULL,
   `time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM',
diff --git a/mysql-test/r/system_mysql_db_fix50117.result b/mysql-test/r/system_mysql_db_fix50117.result
index b88497d..8bb8b9e 100644
--- a/mysql-test/r/system_mysql_db_fix50117.result
+++ b/mysql-test/r/system_mysql_db_fix50117.result
@@ -214,7 +214,7 @@ proc	CREATE TABLE `proc` (
   `definer` char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
   `created` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
   `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
-  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
+  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') NOT NULL DEFAULT '',
   `comment` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
   `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
   `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
@@ -239,7 +239,7 @@ event	CREATE TABLE `event` (
   `ends` datetime DEFAULT NULL,
   `status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED',
   `on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP',
-  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
+  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') NOT NULL DEFAULT '',
   `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
   `originator` int(10) unsigned NOT NULL,
   `time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM',
diff --git a/mysql-test/suite/compat/oracle/r/binlog_stm_ps.result b/mysql-test/suite/compat/oracle/r/binlog_stm_ps.result
index c60e349..7ed0fa6 100644
--- a/mysql-test/suite/compat/oracle/r/binlog_stm_ps.result
+++ b/mysql-test/suite/compat/oracle/r/binlog_stm_ps.result
@@ -3,7 +3,8 @@ SET sql_mode=ORACLE;
 # MDEV-10801 sql_mode: dynamic SQL placeholders
 #
 CREATE TABLE t1 (a INT, b INT);
-SET @a=10, @b=20;
+SET @a=10;
+SET @b=20;
 PREPARE stmt FROM 'INSERT INTO t1 VALUES (?,?)';
 EXECUTE stmt USING @a, @b;
 PREPARE stmt FROM 'INSERT INTO t1 VALUES (:a,:b)';
diff --git a/mysql-test/suite/compat/oracle/r/ps.result b/mysql-test/suite/compat/oracle/r/ps.result
index ed7cb4c..cfeaa84 100644
--- a/mysql-test/suite/compat/oracle/r/ps.result
+++ b/mysql-test/suite/compat/oracle/r/ps.result
@@ -2,7 +2,8 @@ SET sql_mode=ORACLE;
 #
 # MDEV-10801 sql_mode: dynamic SQL placeholders
 #
-SET @a=10, @b=20;
+SET @a=10;
+SET @b=20;
 PREPARE stmt FROM 'SELECT ?,?';
 EXECUTE stmt USING @a, @b;
 ?	?
diff --git a/mysql-test/suite/compat/oracle/r/sp-param.result b/mysql-test/suite/compat/oracle/r/sp-param.result
index 4f4585c..d0b8ef4 100644
--- a/mysql-test/suite/compat/oracle/r/sp-param.result
+++ b/mysql-test/suite/compat/oracle/r/sp-param.result
@@ -5,7 +5,7 @@ SET sql_mode=ORACLE;
 CREATE FUNCTION f1(param CHAR) RETURN CHAR AS BEGIN RETURN param; END;;
 SHOW CREATE FUNCTION f1;
 Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
-f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param CHAR) RETURN varchar(2000) CHARSET latin1
+f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param CHAR) RETURN varchar(2000) CHARSET latin1
 AS BEGIN RETURN param; END	latin1	latin1_swedish_ci	latin1_swedish_ci
 SELECT LENGTH(f1(REPEAT('a',2000)));;
 LENGTH(f1(REPEAT('a',2000)))
@@ -21,7 +21,7 @@ DROP FUNCTION f1;
 CREATE FUNCTION f1(param NCHAR) RETURN NCHAR AS BEGIN RETURN param; END;;
 SHOW CREATE FUNCTION f1;
 Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
-f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param NCHAR) RETURN varchar(2000) CHARSET utf8
+f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param NCHAR) RETURN varchar(2000) CHARSET utf8
 AS BEGIN RETURN param; END	latin1	latin1_swedish_ci	latin1_swedish_ci
 SELECT LENGTH(f1(REPEAT('a',2000)));;
 LENGTH(f1(REPEAT('a',2000)))
@@ -37,7 +37,7 @@ DROP FUNCTION f1;
 CREATE FUNCTION f1(param BINARY) RETURN BINARY AS BEGIN RETURN param; END;;
 SHOW CREATE FUNCTION f1;
 Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
-f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param BINARY) RETURN varbinary(2000)
+f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param BINARY) RETURN varbinary(2000)
 AS BEGIN RETURN param; END	latin1	latin1_swedish_ci	latin1_swedish_ci
 SELECT LENGTH(f1(REPEAT('a',2000)));;
 LENGTH(f1(REPEAT('a',2000)))
@@ -53,7 +53,7 @@ DROP FUNCTION f1;
 CREATE FUNCTION f1(param VARCHAR) RETURN VARCHAR AS BEGIN RETURN param; END;;
 SHOW CREATE FUNCTION f1;
 Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
-f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARCHAR) RETURN varchar(4000) CHARSET latin1
+f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARCHAR) RETURN varchar(4000) CHARSET latin1
 AS BEGIN RETURN param; END	latin1	latin1_swedish_ci	latin1_swedish_ci
 SELECT LENGTH(f1(REPEAT('a',4000)));;
 LENGTH(f1(REPEAT('a',4000)))
@@ -69,7 +69,7 @@ DROP FUNCTION f1;
 CREATE FUNCTION f1(param VARCHAR2) RETURN VARCHAR2 AS BEGIN RETURN param; END;;
 SHOW CREATE FUNCTION f1;
 Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
-f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARCHAR2) RETURN varchar(4000) CHARSET latin1
+f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARCHAR2) RETURN varchar(4000) CHARSET latin1
 AS BEGIN RETURN param; END	latin1	latin1_swedish_ci	latin1_swedish_ci
 SELECT LENGTH(f1(REPEAT('a',4000)));;
 LENGTH(f1(REPEAT('a',4000)))
@@ -85,7 +85,7 @@ DROP FUNCTION f1;
 CREATE FUNCTION f1(param NVARCHAR) RETURN NVARCHAR AS BEGIN RETURN param; END;;
 SHOW CREATE FUNCTION f1;
 Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
-f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param NVARCHAR) RETURN varchar(4000) CHARSET utf8
+f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param NVARCHAR) RETURN varchar(4000) CHARSET utf8
 AS BEGIN RETURN param; END	latin1	latin1_swedish_ci	latin1_swedish_ci
 SELECT LENGTH(f1(REPEAT('a',4000)));;
 LENGTH(f1(REPEAT('a',4000)))
@@ -101,7 +101,7 @@ DROP FUNCTION f1;
 CREATE FUNCTION f1(param VARBINARY) RETURN VARBINARY AS BEGIN RETURN param; END;;
 SHOW CREATE FUNCTION f1;
 Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
-f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARBINARY) RETURN varbinary(4000)
+f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param VARBINARY) RETURN varbinary(4000)
 AS BEGIN RETURN param; END	latin1	latin1_swedish_ci	latin1_swedish_ci
 SELECT LENGTH(f1(REPEAT('a',4000)));;
 LENGTH(f1(REPEAT('a',4000)))
@@ -117,7 +117,7 @@ DROP FUNCTION f1;
 CREATE FUNCTION f1(param RAW) RETURN RAW AS BEGIN RETURN param; END;;
 SHOW CREATE FUNCTION f1;
 Function	sql_mode	Create Function	character_set_client	collation_connection	Database Collation
-f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param RAW) RETURN varbinary(4000)
+f1	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY	CREATE DEFINER="root"@"localhost" FUNCTION "f1"(param RAW) RETURN varbinary(4000)
 AS BEGIN RETURN param; END	latin1	latin1_swedish_ci	latin1_swedish_ci
 SELECT LENGTH(f1(REPEAT('a',4000)));;
 LENGTH(f1(REPEAT('a',4000)))
diff --git a/mysql-test/suite/compat/oracle/r/sp-row.result b/mysql-test/suite/compat/oracle/r/sp-row.result
index 16421cd..8df410c 100644
--- a/mysql-test/suite/compat/oracle/r/sp-row.result
+++ b/mysql-test/suite/compat/oracle/r/sp-row.result
@@ -365,7 +365,11 @@ AS
 rec ROW(a INT,b DOUBLE,c VARCHAR(10));
 a INT;
 BEGIN
-SET @a= 10, rec.a=10, rec.b=20, rec.c= 'test', a= 5;
+SET @a= 10;
+SET rec.a= 10;
+SET rec.b= 20;
+SET rec.c= 'test';
+SET a= 5;
 SELECT rec.a, rec.b, rec.c, a;
 END;
 $$
diff --git a/mysql-test/suite/compat/oracle/r/sp.result b/mysql-test/suite/compat/oracle/r/sp.result
index a915825..ab1e6cd 100644
--- a/mysql-test/suite/compat/oracle/r/sp.result
+++ b/mysql-test/suite/compat/oracle/r/sp.result
@@ -8,7 +8,7 @@ END;
 /
 SHOW CREATE FUNCTION f1;
 Function	f1
-sql_mode	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
+sql_mode	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY
 Create Function	CREATE DEFINER="root"@"localhost" FUNCTION "f1"() RETURN int(11)
 AS
 BEGIN
@@ -29,7 +29,7 @@ END;
 /
 SHOW CREATE PROCEDURE p1;
 Procedure	p1
-sql_mode	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
+sql_mode	PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY
 Create Procedure	CREATE DEFINER="root"@"localhost" PROCEDURE "p1"()
 AS
 BEGIN
@@ -134,7 +134,8 @@ SET p1='p1new';
 SET p2='p2new';
 END;
 /
-SET @p1='p1', @p2='p2';
+SET @p1='p1';
+SET @p2='p2';
 CALL p1(@p1, @p2);
 SELECT @p1, @p2;
 @p1	@p2
diff --git a/mysql-test/suite/compat/oracle/t/binlog_stm_ps.test b/mysql-test/suite/compat/oracle/t/binlog_stm_ps.test
index 996ef57..fe72e18 100644
--- a/mysql-test/suite/compat/oracle/t/binlog_stm_ps.test
+++ b/mysql-test/suite/compat/oracle/t/binlog_stm_ps.test
@@ -12,7 +12,8 @@ SET sql_mode=ORACLE;
 --echo #
 
 CREATE TABLE t1 (a INT, b INT);
-SET @a=10, @b=20;
+SET @a=10;
+SET @b=20;
 PREPARE stmt FROM 'INSERT INTO t1 VALUES (?,?)';
 EXECUTE stmt USING @a, @b;
 PREPARE stmt FROM 'INSERT INTO t1 VALUES (:a,:b)';
diff --git a/mysql-test/suite/compat/oracle/t/ps.test b/mysql-test/suite/compat/oracle/t/ps.test
index 08bb957..f681841 100644
--- a/mysql-test/suite/compat/oracle/t/ps.test
+++ b/mysql-test/suite/compat/oracle/t/ps.test
@@ -4,7 +4,8 @@ SET sql_mode=ORACLE;
 --echo # MDEV-10801 sql_mode: dynamic SQL placeholders
 --echo #
 
-SET @a=10, @b=20;
+SET @a=10;
+SET @b=20;
 PREPARE stmt FROM 'SELECT ?,?';
 EXECUTE stmt USING @a, @b;
 PREPARE stmt FROM 'SELECT :a,:b';
diff --git a/mysql-test/suite/compat/oracle/t/sp-row.test b/mysql-test/suite/compat/oracle/t/sp-row.test
index 94cc5db..8647b46 100644
--- a/mysql-test/suite/compat/oracle/t/sp-row.test
+++ b/mysql-test/suite/compat/oracle/t/sp-row.test
@@ -472,7 +472,11 @@ AS
   rec ROW(a INT,b DOUBLE,c VARCHAR(10));
   a INT;
 BEGIN
-  SET @a= 10, rec.a=10, rec.b=20, rec.c= 'test', a= 5;
+  SET @a= 10;
+  SET rec.a= 10;
+  SET rec.b= 20;
+  SET rec.c= 'test';
+  SET a= 5;
   SELECT rec.a, rec.b, rec.c, a;
 END;
 $$
diff --git a/mysql-test/suite/compat/oracle/t/sp.test b/mysql-test/suite/compat/oracle/t/sp.test
index 4717ebe..407f53d 100644
--- a/mysql-test/suite/compat/oracle/t/sp.test
+++ b/mysql-test/suite/compat/oracle/t/sp.test
@@ -132,7 +132,8 @@ BEGIN
 END;
 /
 DELIMITER ;/
-SET @p1='p1', @p2='p2';
+SET @p1='p1';
+SET @p2='p2';
 CALL p1(@p1, @p2);
 SELECT @p1, @p2;
 DROP PROCEDURE p1;
diff --git a/mysql-test/suite/funcs_1/r/is_columns_mysql.result b/mysql-test/suite/funcs_1/r/is_columns_mysql.result
index d021c73..272e52a 100644
--- a/mysql-test/suite/funcs_1/r/is_columns_mysql.result
+++ b/mysql-test/suite/funcs_1/r/is_columns_mysql.result
@@ -60,7 +60,7 @@ def	mysql	event	modified	9	'0000-00-00 00:00:00'	NO	timestamp	NULL	NULL	NULL	NUL
 def	mysql	event	name	2	''	NO	char	64	192	NULL	NULL	NULL	utf8	utf8_general_ci	char(64)	PRI		select,insert,update,references		NEVER	NULL
 def	mysql	event	on_completion	14	'DROP'	NO	enum	8	24	NULL	NULL	NULL	utf8	utf8_general_ci	enum('DROP','PRESERVE')			select,insert,update,references		NEVER	NULL
 def	mysql	event	originator	17	NULL	NO	int	NULL	NULL	10	0	NULL	NULL	NULL	int(10) unsigned			select,insert,update,references		NEVER	NULL
-def	mysql	event	sql_mode	15	''	NO	set	494	1482	NULL	NULL	NULL	utf8	utf8_general_ci	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')			select,insert,update,references		NEVER	NULL
+def	mysql	event	sql_mode	15	''	NO	set	510	1530	NULL	NULL	NULL	utf8	utf8_general_ci	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY')			select,insert,update,references		NEVER	NULL
 def	mysql	event	starts	11	NULL	YES	datetime	NULL	NULL	NULL	NULL	0	NULL	NULL	datetime			select,insert,update,references		NEVER	NULL
 def	mysql	event	status	13	'ENABLED'	NO	enum	18	54	NULL	NULL	NULL	utf8	utf8_general_ci	enum('ENABLED','DISABLED','SLAVESIDE_DISABLED')			select,insert,update,references		NEVER	NULL
 def	mysql	event	time_zone	18	'SYSTEM'	NO	char	64	64	NULL	NULL	NULL	latin1	latin1_swedish_ci	char(64)			select,insert,update,references		NEVER	NULL
@@ -151,7 +151,7 @@ def	mysql	proc	returns	10	NULL	NO	longblob	4294967295	4294967295	NULL	NULL	NULL
 def	mysql	proc	security_type	8	'DEFINER'	NO	enum	7	21	NULL	NULL	NULL	utf8	utf8_general_ci	enum('INVOKER','DEFINER')			select,insert,update,references		NEVER	NULL
 def	mysql	proc	specific_name	4	''	NO	char	64	192	NULL	NULL	NULL	utf8	utf8_general_ci	char(64)			select,insert,update,references		NEVER	NULL
 def	mysql	proc	sql_data_access	6	'CONTAINS_SQL'	NO	enum	17	51	NULL	NULL	NULL	utf8	utf8_general_ci	enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA')			select,insert,update,references		NEVER	NULL
-def	mysql	proc	sql_mode	15	''	NO	set	494	1482	NULL	NULL	NULL	utf8	utf8_general_ci	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')			select,insert,update,references		NEVER	NULL
+def	mysql	proc	sql_mode	15	''	NO	set	510	1530	NULL	NULL	NULL	utf8	utf8_general_ci	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY')			select,insert,update,references		NEVER	NULL
 def	mysql	proc	type	3	NULL	NO	enum	9	27	NULL	NULL	NULL	utf8	utf8_general_ci	enum('FUNCTION','PROCEDURE')	PRI		select,insert,update,references		NEVER	NULL
 def	mysql	procs_priv	Db	2	''	NO	char	64	192	NULL	NULL	NULL	utf8	utf8_bin	char(64)	PRI		select,insert,update,references		NEVER	NULL
 def	mysql	procs_priv	Grantor	6	''	NO	char	141	423	NULL	NULL	NULL	utf8	utf8_bin	char(141)	MUL		select,insert,update,references		NEVER	NULL
@@ -391,7 +391,7 @@ NULL	mysql	event	starts	datetime	NULL	NULL	NULL	NULL	datetime
 NULL	mysql	event	ends	datetime	NULL	NULL	NULL	NULL	datetime
 3.0000	mysql	event	status	enum	18	54	utf8	utf8_general_ci	enum('ENABLED','DISABLED','SLAVESIDE_DISABLED')
 3.0000	mysql	event	on_completion	enum	8	24	utf8	utf8_general_ci	enum('DROP','PRESERVE')
-3.0000	mysql	event	sql_mode	set	494	1482	utf8	utf8_general_ci	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')
+3.0000	mysql	event	sql_mode	set	510	1530	utf8	utf8_general_ci	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY')
 3.0000	mysql	event	comment	char	64	192	utf8	utf8_bin	char(64)
 NULL	mysql	event	originator	int	NULL	NULL	NULL	NULL	int(10) unsigned
 1.0000	mysql	event	time_zone	char	64	64	latin1	latin1_swedish_ci	char(64)
@@ -482,7 +482,7 @@ NULL	mysql	innodb_table_stats	sum_of_other_index_sizes	bigint	NULL	NULL	NULL	NUL
 3.0000	mysql	proc	definer	char	141	423	utf8	utf8_bin	char(141)
 NULL	mysql	proc	created	timestamp	NULL	NULL	NULL	NULL	timestamp
 NULL	mysql	proc	modified	timestamp	NULL	NULL	NULL	NULL	timestamp
-3.0000	mysql	proc	sql_mode	set	494	1482	utf8	utf8_general_ci	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')
+3.0000	mysql	proc	sql_mode	set	510	1530	utf8	utf8_general_ci	set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY')
 1.0000	mysql	proc	comment	text	65535	65535	utf8	utf8_bin	text
 3.0000	mysql	proc	character_set_client	char	32	96	utf8	utf8_bin	char(32)
 3.0000	mysql	proc	collation_connection	char	32	96	utf8	utf8_bin	char(32)
diff --git a/mysql-test/suite/sys_vars/r/sql_mode_basic.result b/mysql-test/suite/sys_vars/r/sql_mode_basic.result
index 1bd35c0..170d9c8 100644
--- a/mysql-test/suite/sys_vars/r/sql_mode_basic.result
+++ b/mysql-test/suite/sys_vars/r/sql_mode_basic.result
@@ -158,7 +158,7 @@ MYSQL40,HIGH_NOT_PRECEDENCE
 SET @@global.sql_mode = ORACLE;
 SELECT @@global.sql_mode;
 @@global.sql_mode
-PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
+PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY
 SET @@global.sql_mode = POSTGRESQL;
 SELECT @@global.sql_mode;
 @@global.sql_mode
@@ -288,7 +288,7 @@ MYSQL40,HIGH_NOT_PRECEDENCE
 SET @@session.sql_mode = ORACLE;
 SELECT @@session.sql_mode;
 @@session.sql_mode
-PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
+PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY
 SET @@session.sql_mode = POSTGRESQL;
 SELECT @@session.sql_mode;
 @@session.sql_mode
@@ -357,17 +357,17 @@ REAL_AS_FLOAT,PIPES_AS_CONCAT
 SET @@global.sql_mode = 50000;
 SELECT @@global.sql_mode;
 @@global.sql_mode
-PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,IGNORE_BAD_TABLE_OPTIONS,NO_UNSIGNED_SUBTRACTION,POSTGRESQL,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
+PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,IGNORE_BAD_TABLE_OPTIONS,NO_UNSIGNED_SUBTRACTION,POSTGRESQL,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY
 SET @@global.sql_mode = 500000;
 SELECT @@global.sql_mode;
 @@global.sql_mode
 REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,POSTGRESQL,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,MYSQL323,MYSQL40,ANSI,HIGH_NOT_PRECEDENCE
-SET @@global.sql_mode = 4294967295;
+SET @@global.sql_mode = 8589934591;
 SELECT @@global.sql_mode;
 @@global.sql_mode
-REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,IGNORE_BAD_TABLE_OPTIONS,ONLY_FULL_GROUP_BY,NO_UNSIGNED_SUBTRACTION,NO_DIR_IN_CREATE,POSTGRESQL,ORACLE,MSSQL,DB2,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,MYSQL323,MYSQL40,ANSI,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,HIGH_NOT_PRECEDENCE,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH
-SET @@global.sql_mode = 4294967296;
-ERROR 42000: Variable 'sql_mode' can't be set to the value of '4294967296'
+REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,IGNORE_BAD_TABLE_OPTIONS,ONLY_FULL_GROUP_BY,NO_UNSIGNED_SUBTRACTION,NO_DIR_IN_CREATE,POSTGRESQL,ORACLE,MSSQL,DB2,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,MYSQL323,MYSQL40,ANSI,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,HIGH_NOT_PRECEDENCE,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH,SET_CONSISTENCY
+SET @@global.sql_mode = 8589934592;
+ERROR 42000: Variable 'sql_mode' can't be set to the value of '8589934592'
 SET @@global.sql_mode = 0.4;
 ERROR 42000: Incorrect argument type to variable 'sql_mode'
 '#---------------------FN_DYNVARS_152_08----------------------#'
@@ -397,7 +397,7 @@ ANSI_QUOTES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,A
 SET @@global.sql_mode = 'ONLY_FULL_GROUP_BY,PIPES_AS_CONCAT,REAL_AS_FLOAT,ORACLE,POSTGRESQL';
 SELECT @@global.sql_mode;
 @@global.sql_mode
-REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,POSTGRESQL,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER
+REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,POSTGRESQL,ORACLE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,SET_CONSISTENCY
 SET @@session.sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,FOOBAR,IGNORE_SPACE';
 ERROR 42000: Variable 'sql_mode' can't be set to the value of 'FOOBAR'
 SET @@sql_mode=',';
diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
index 5777cce..d4eff14 100644
--- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
+++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result
@@ -4374,7 +4374,7 @@ VARIABLE_COMMENT	Sets the sql mode
 NUMERIC_MIN_VALUE	NULL
 NUMERIC_MAX_VALUE	NULL
 NUMERIC_BLOCK_SIZE	NULL
-ENUM_VALUE_LIST	REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,IGNORE_BAD_TABLE_OPTIONS,ONLY_FULL_GROUP_BY,NO_UNSIGNED_SUBTRACTION,NO_DIR_IN_CREATE,POSTGRESQL,ORACLE,MSSQL,DB2,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,MYSQL323,MYSQL40,ANSI,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,HIGH_NOT_PRECEDENCE,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH
+ENUM_VALUE_LIST	REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,IGNORE_BAD_TABLE_OPTIONS,ONLY_FULL_GROUP_BY,NO_UNSIGNED_SUBTRACTION,NO_DIR_IN_CREATE,POSTGRESQL,ORACLE,MSSQL,DB2,MAXDB,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,MYSQL323,MYSQL40,ANSI,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,HIGH_NOT_PRECEDENCE,NO_ENGINE_SUBSTITUTION,PAD_CHAR_TO_FULL_LENGTH,SET_CONSISTENCY
 READ_ONLY	NO
 COMMAND_LINE_ARGUMENT	REQUIRED
 VARIABLE_NAME	SQL_NOTES
diff --git a/mysql-test/suite/sys_vars/t/sql_mode_basic.test b/mysql-test/suite/sys_vars/t/sql_mode_basic.test
index ad1c722..1730af5 100644
--- a/mysql-test/suite/sys_vars/t/sql_mode_basic.test
+++ b/mysql-test/suite/sys_vars/t/sql_mode_basic.test
@@ -307,11 +307,11 @@ SELECT @@global.sql_mode;
 SET @@global.sql_mode = 500000;
 SELECT @@global.sql_mode;
 
-SET @@global.sql_mode = 4294967295;
+SET @@global.sql_mode = 8589934591;
 SELECT @@global.sql_mode;
 
 --Error ER_WRONG_VALUE_FOR_VAR
-SET @@global.sql_mode = 4294967296;
+SET @@global.sql_mode = 8589934592;
 
 # use of decimal values
 
diff --git a/mysql-test/t/set_consistency.test b/mysql-test/t/set_consistency.test
new file mode 100644
index 0000000..2f3c15d
--- /dev/null
+++ b/mysql-test/t/set_consistency.test
@@ -0,0 +1,315 @@
+-- source include/have_innodb.inc
+SET sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,SET_CONSISTENCY';
+
+--echo #
+--echo # MDEV-13417 UPDATE produces wrong values if an UPDATEd column is later used as an UPDATE source
+--echo # MDEV-13418 Compatibility: The order of evaluation of SELECT..INTO assignments
+--echo #
+
+CREATE TABLE t1 (c1 INTEGER, c2 INTEGER, c3 INTEGER) ENGINE=InnoDb;
+INSERT INTO t1(c1,c2,c3) VALUES (1,1,1);
+CREATE TABLE  t2 (c1 INTEGER, c2 INTEGER, c3 INTEGER) ENGINE=InnoDb;
+INSERT INTO t2(c1,c2,c3) VALUES (1,1,1);
+
+--echo
+--echo Check that a column is only updated once.
+--echo
+
+--error ER_UPDATED_COLUMN_ONLY_ONCE
+UPDATE t1
+   SET c1 = 1,
+       c1 = 2;
+
+--error ER_UPDATED_COLUMN_ONLY_ONCE
+UPDATE t1, t2
+   SET t1.c1 = t1.c1 + 1,
+       t1.c2 = t1.c1 + 1,
+       t2.c2 = t1.c2 + 1,
+       t2.c2 = t1.c2 + 1;
+
+--echo
+--echo Check standard update
+--echo
+
+UPDATE t1
+   SET c1 = c1+1,
+       c2 = c1+1,
+       c3 = c2+1
+ WHERE c1=10;
+
+START TRANSACTION;
+UPDATE t1
+   SET c1 = c1+1,
+       c2 = c1+1,
+       c3 = c2+1;
+SELECT * FROM t1;
+ROLLBACK;
+
+--echo
+--echo Check multi update
+--echo
+
+START TRANSACTION;
+UPDATE t1, t2
+   SET t1.c1 = t1.c1 + 1,
+       t1.c2 = t1.c1 + 1,
+       t2.c2 = t1.c2 + 1,
+       t2.c3 = t2.c2 + 1
+WHERE t1.c1=t2.c1;
+SELECT * FROM t1;
+SELECT * FROM t2;
+ROLLBACK;
+
+DELIMITER /;
+CREATE TRIGGER tr1 BEFORE UPDATE ON t1 FOR EACH ROW
+BEGIN
+  INSERT INTO t2 VALUES(10+old.c1,10+old.c2,10+old.c3);
+  INSERT INTO t2 VALUES(20+new.c1,10+new.c2,10+new.c3);
+END;
+/
+DELIMITER ;/
+START TRANSACTION;
+UPDATE t1
+   SET c1 = c1+1,
+       c2 = c1+1,
+       c3 = c2+1;
+SELECT * FROM t1;
+SELECT * FROM t2;
+ROLLBACK;
+
+DROP TABLE t1;
+DROP TABLE t2;
+
+--echo
+--echo Check update fired by INSERT ... ON DUPLICATE KEY UPDATE
+--echo
+
+CREATE TABLE t1 (
+  id INT(11) NOT NULL AUTO_INCREMENT,
+  name VARCHAR(60) NOT NULL,
+  nb_visits INT NOT NULL,
+  nb_visits_prev INT NOT NULL default 0,
+  PRIMARY KEY (id),
+  UNIQUE KEY name (name)
+) ENGINE=InnoDB AUTO_INCREMENT=1;
+
+INSERT INTO t1(name, nb_visits) VALUES('nico', 1)
+    ON DUPLICATE KEY UPDATE nb_visits = nb_visits + 1;
+SELECT * FROM t1;
+INSERT INTO t1(name, nb_visits) VALUES('nico', 1)
+        ON DUPLICATE KEY UPDATE nb_visits = nb_visits + 1, nb_visits_prev=nb_visits;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+--echo
+--echo Update table with virtual column
+--echo
+
+CREATE TABLE t1 (c1 INTEGER, c2 INTEGER, c3 INTEGER AS (c1 MOD 10) VIRTUAL, c4 INTEGER AS (c1+c2 MOD 5) PERSISTENT ) ENGINE=InnoDb;
+INSERT INTO t1(c1,c2) VALUES (1,1);
+
+SELECT * FROM t1;
+UPDATE t1 SET c2 = 10, c1 = c2;
+SELECT * FROM t1;
+UPDATE t1 SET c2 = 4, c1 = c2;
+SELECT * FROM t1;
+DROP TABLE t1;
+
+--echo
+--echo Update dynamic column
+--echo
+SET @@local.character_set_connection='latin1';
+CREATE TABLE assets (
+  item_name VARCHAR(32) PRIMARY KEY,
+  dynamic_col1  BLOB,
+  dynamic_col2  BLOB
+);
+
+INSERT INTO assets VALUES ('Thinkpad Laptop', COLUMN_CREATE('color', 'black', 'price', 500),COLUMN_CREATE('CPU', 'Core I7', 'memory', '8Go'));
+INSERT INTO assets VALUES ('Thinkpad Laptop2', COLUMN_CREATE('color', 'yellow', 'price', 700),COLUMN_CREATE('CPU', 'Core I7', 'memory', '16Go'));
+SELECT item_name, COLUMN_GET(dynamic_col1, 'color' as char) AS color1,
+       COLUMN_GET(dynamic_col2, 'color' as char) AS color2
+  FROM assets;
+UPDATE assets
+   SET dynamic_col1=COLUMN_ADD(dynamic_col1, 'warranty', '3 years'),
+       dynamic_col2=dynamic_col1
+ WHERE item_name LIKE 'Thinkpad Laptop%';
+
+SELECT item_name, COLUMN_GET(dynamic_col1, 'warranty' as char) AS waranty1,
+       COLUMN_GET(dynamic_col2, 'warranty' as char) AS waranty2,
+       COLUMN_GET(dynamic_col2, 'color' as char) AS color2
+  FROM assets;
+
+--echo
+--echo Select into on dynamic columns
+--echo
+SELECT COLUMN_ADD(dynamic_col1, 'warranty', '4 years'),dynamic_col1 INTO @col1,@col2 FROM assets WHERE item_name='Thinkpad Laptop';
+SELECT COLUMN_GET(@col1, 'warranty' as char) AS waranty1,
+       COLUMN_GET(@col2, 'warranty' as char) AS waranty2;
+
+--echo
+--echo Select into on dynamic columns in stored procedure
+--echo
+DELIMITER /;
+CREATE OR REPLACE PROCEDURE ps1(INOUT war1 CHAR(20) CHARACTER SET latin1,
+                                INOUT war2 CHAR(20) CHARACTER SET latin1)
+BEGIN
+  SET war1=' YYY' ;
+  SELECT COLUMN_GET(@col1, 'warranty' as char),
+         CONCAT(COLUMN_GET(@col2, 'warranty' as char), war1)
+         INTO war1,war2
+     FROM assets WHERE item_name='Thinkpad Laptop';
+END
+/
+DELIMITER ;/
+CALL ps1(@w1,@w2);
+SELECT @w1,@w2;
+DROP PROCEDURE ps1;
+DROP TABLE assets;
+
+--echo
+--echo Update TEXT column
+--echo
+
+CREATE TABLE ft2(copy TEXT,copy2 TEXT,FULLTEXT(copy)) ENGINE=MyISAM;
+INSERT INTO ft2(copy) VALUES
+ ('MySQL vs MariaDB database'),
+ ('Oracle vs MariaDB database'),
+ ('PostgreSQL vs MariaDB database'),
+ ('MariaDB overview'),
+ ('Foreign keys'),
+ ('Primary keys'),
+ ('Indexes'),
+ ('Transactions'),
+ ('Triggers');
+SELECT * FROM ft2;
+UPDATE ft2 SET copy = UPPER(copy),
+               copy2= copy;
+SELECT * FROM ft2;
+DROP TABLE ft2;
+
+--echo
+--echo Check group set error
+--echo
+--error ER_SP_GROUPSET_PROHIBITED
+SET @@join_buffer_size=256, @@join_buffer_size=256;
+
+--error ER_SP_GROUPSET_PROHIBITED
+SET @w=1, @x=2;
+DELIMITER /;
+--error ER_SP_GROUPSET_PROHIBITED
+CREATE OR REPLACE PROCEDURE ps1(INOUT res VARCHAR(20))
+BEGIN
+  DECLARE b1 VARCHAR(20);
+  SET b1='xxxx', res=b1;
+END
+/
+DELIMITER ;/
+
+--echo
+--echo Select into user_variable
+--echo
+
+SET @w1=1;
+SET @w2=2;
+SELECT @w2,@w1 INTO @w1,@w2;
+SELECT @w1,@w2;
+
+SET @w1=1;
+SET @w2=2;
+SELECT 10,@w1 INTO @w1,@w2;
+SELECT @w1,@w2;
+
+SELECT 10,11,12 INTO @w1,@w1,@w1;
+SELECT @w1;
+
+SET @w1=1;
+SELECT 10,@w1+1,@w1+2 INTO @w1,@w1,@w1;
+SELECT @w1;
+
+--echo
+--echo Select into sp variable
+--echo
+DELIMITER /;
+CREATE OR REPLACE PROCEDURE p1()
+BEGIN
+  declare v1 integer;
+  SELECT 1,2 INTO v1, v1;
+  select v1;
+  SELECT v1 + 1 , v1 + v1 INTO v1, v1;
+  select v1;
+END
+/
+DELIMITER ;/
+call p1();
+
+--echo
+--echo Select variable into output parameter (stored procedure)
+--echo
+DELIMITER /;
+CREATE OR REPLACE PROCEDURE ps1(INOUT par1 VARCHAR(20),
+                                INOUT par2 VARCHAR(20))
+BEGIN
+  SELECT 'A',par1 INTO par1, par2;
+END
+/
+DELIMITER ;/
+SET @p1='X';
+SET @p2='?';
+CALL ps1(@p1,@p2);
+SELECT @p1,@p2;
+SET @p1=null;
+SET @p2='?';
+CALL ps1(@p1,@p2);
+SELECT @p1,@p2;
+DROP PROCEDURE ps1;
+
+--echo
+--echo Select from table into output parameter (stored procedure)
+--echo
+DELIMITER /;
+CREATE OR REPLACE PROCEDURE ps1(INOUT par1 VARCHAR(20),
+                                INOUT par2 VARCHAR(20))
+BEGIN
+  SELECT 'A',par1 INTO par1, par2 FROM DUAL WHERE par1 LIKE 'X%';
+END
+/
+DELIMITER ;/
+SET @p1='X';
+SET @p2='?';
+CALL ps1(@p1,@p2);
+SELECT @p1,@p2;
+DROP PROCEDURE ps1;
+
+--echo
+--echo Select row
+--echo
+set sql_mode='ORACLE';
+DELIMITER /;
+CREATE OR REPLACE PROCEDURE p1()
+AS
+  rec1 ROW(a INT,b INT);
+  rec2 ROW(a INT,b INT);
+BEGIN
+  -- assign multiple field
+  rec1:=ROW(1,1);
+  SELECT rec1.a + 1 ,rec1.a into rec1.a, rec1.b;
+  SELECT rec1.a, rec1.b;
+
+  -- work with NULL row
+  rec1:=NULL;
+  SELECT rec1.a + 1 ,rec1.a into rec1.a, rec1.b;
+  SELECT rec1.a, rec1.b;
+
+  SET rec1.a=1;
+  SELECT rec1.a + 1 ,rec1.a into rec1.a, rec1.b;
+  SELECT rec1.a, rec1.b;
+
+  SET rec1.a=1;
+  SELECT rec1.a + 1 , rec1.a +2 , rec1.a + rec1.b into rec1.a, rec1.a, rec1.b;
+  SELECT rec1.a, rec1.b;
+END;
+/
+DELIMITER ;/
+CALL p1();
+DROP PROCEDURE p1;
diff --git a/mysql-test/t/sql_mode.test b/mysql-test/t/sql_mode.test
index 97a694f..31e38db 100644
--- a/mysql-test/t/sql_mode.test
+++ b/mysql-test/t/sql_mode.test
@@ -264,7 +264,7 @@ select @@sql_mode;
 set sql_mode=16384+(65536*4);
 select @@sql_mode;
 --error 1231
-set sql_mode=2147483648*2; # that mode does not exist
+set sql_mode=2147483648*2*2; # that mode does not exist
 select @@sql_mode;
 
 #
diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql
index 7b61416..60378fe 100644
--- a/scripts/mysql_system_tables.sql
+++ b/scripts/mysql_system_tables.sql
@@ -80,7 +80,7 @@ CREATE TABLE IF NOT EXISTS time_zone_transition_type (   Time_zone_id int unsign
 
 CREATE TABLE IF NOT EXISTS time_zone_leap_second (   Transition_time bigint signed NOT NULL, Correction int signed NOT NULL, PRIMARY KEY TranTime (Transition_time) ) engine=MyISAM CHARACTER SET utf8   comment='Leap seconds information for time zones';
 
-CREATE TABLE IF NOT EXISTS proc (db char(64) collate utf8_bin DEFAULT '' NOT NULL, name char(64) DEFAULT '' NOT NULL, type enum('FUNCTION','PROCEDURE') NOT NULL, specific_name char(64) DEFAULT '' NOT NULL, language enum('SQL') DEFAULT 'SQL' NOT NULL, sql_data_access enum( 'CONTAINS_SQL', 'NO_SQL', 'READS_SQL_DATA', 'MODIFIES_SQL_DATA') DEFAULT 'CONTAINS_SQL' NOT NULL, is_deterministic enum('YES','NO') DEFAULT 'NO' NOT NULL, security_type enum('INVOKER','DEFINER') DEFAULT 'DEFINER' NOT NULL, param_list blob NOT NULL, returns longblob NOT NULL, body longblob NOT NULL, definer char(141) collate utf8_bin DEFAULT '' NOT NULL, created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', sql_mode set( 'REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', 'IGNORE_SPACE', 'IGNORE_BAD_TABLE_OPTIONS', 'ONLY_FULL_GROUP_BY', 'NO_UNSIGNED_SUBTRACTION', 'NO_DIR_IN_CREATE', 'POSTGRESQL', 'ORACLE', 'MSSQL', 'DB2', 'MAXDB', 'NO_KEY_OPTIONS', 'NO_TABLE_OPTIONS', 'NO_FIELD_OPTIONS', 'MYSQL323', 'MYSQL40', 'ANSI', 'NO_AUTO_VALUE_ON_ZERO', 'NO_BACKSLASH_ESCAPES', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'INVALID_DATES', 'ERROR_FOR_DIVISION_BY_ZERO', 'TRADITIONAL', 'NO_AUTO_CREATE_USER', 'HIGH_NOT_PRECEDENCE', 'NO_ENGINE_SUBSTITUTION', 'PAD_CHAR_TO_FULL_LENGTH') DEFAULT '' NOT NULL, comment text collate utf8_bin NOT NULL, character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db,name,type)) engine=MyISAM character set utf8 comment='Stored Procedures';
+CREATE TABLE IF NOT EXISTS proc (db char(64) collate utf8_bin DEFAULT '' NOT NULL, name char(64) DEFAULT '' NOT NULL, type enum('FUNCTION','PROCEDURE') NOT NULL, specific_name char(64) DEFAULT '' NOT NULL, language enum('SQL') DEFAULT 'SQL' NOT NULL, sql_data_access enum( 'CONTAINS_SQL', 'NO_SQL', 'READS_SQL_DATA', 'MODIFIES_SQL_DATA') DEFAULT 'CONTAINS_SQL' NOT NULL, is_deterministic enum('YES','NO') DEFAULT 'NO' NOT NULL, security_type enum('INVOKER','DEFINER') DEFAULT 'DEFINER' NOT NULL, param_list blob NOT NULL, returns longblob NOT NULL, body longblob NOT NULL, definer char(141) collate utf8_bin DEFAULT '' NOT NULL, created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', sql_mode set( 'REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', 'IGNORE_SPACE', 'IGNORE_BAD_TABLE_OPTIONS', 'ONLY_FULL_GROUP_BY', 'NO_UNSIGNED_SUBTRACTION', 'NO_DIR_IN_CREATE', 'POSTGRESQL', 'ORACLE', 'MSSQL', 'DB2', 'MAXDB', 'NO_KEY_OPTIONS', 'NO_TABLE_OPTIONS', 'NO_FIELD_OPTIONS', 'MYSQL323', 'MYSQL40', 'ANSI', 'NO_AUTO_VALUE_ON_ZERO', 'NO_BACKSLASH_ESCAPES', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'INVALID_DATES', 'ERROR_FOR_DIVISION_BY_ZERO', 'TRADITIONAL', 'NO_AUTO_CREATE_USER', 'HIGH_NOT_PRECEDENCE', 'NO_ENGINE_SUBSTITUTION', 'PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') DEFAULT '' NOT NULL, comment text collate utf8_bin NOT NULL, character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db,name,type)) engine=MyISAM character set utf8 comment='Stored Procedures';
 
 CREATE TABLE IF NOT EXISTS procs_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(80) binary DEFAULT '' NOT NULL, Routine_name char(64) COLLATE utf8_general_ci DEFAULT '' NOT NULL, Routine_type enum('FUNCTION','PROCEDURE') NOT NULL, Grantor char(141) DEFAULT '' NOT NULL, Proc_priv set('Execute','Alter Routine','Grant') COLLATE utf8_general_ci DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (Host,Db,User,Routine_name,Routine_type), KEY Grantor (Grantor) ) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin   comment='Procedure privileges';
 
@@ -101,7 +101,7 @@ PREPARE stmt FROM @str;
 EXECUTE stmt;
 DROP PREPARE stmt;
 
-CREATE TABLE IF NOT EXISTS event ( db char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', name char(64) CHARACTER SET utf8 NOT NULL default '', body longblob NOT NULL, definer char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', execute_at DATETIME default NULL, interval_value int(11) default NULL, interval_field ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') default NULL, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, modified TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', last_executed DATETIME default NULL, starts DATETIME default NULL, ends DATETIME default NULL, status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED', on_completion ENUM('DROP','PRESERVE') NOT NULL default 'DROP', sql_mode  set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') DEFAULT '' NOT NULL, comment char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', originator INTEGER UNSIGNED NOT NULL, time_zone char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db, name) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
+CREATE TABLE IF NOT EXISTS event ( db char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', name char(64) CHARACTER SET utf8 NOT NULL default '', body longblob NOT NULL, definer char(141) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', execute_at DATETIME default NULL, interval_value int(11) default NULL, interval_field ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') default NULL, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, modified TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', last_executed DATETIME default NULL, starts DATETIME default NULL, ends DATETIME default NULL, status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED', on_completion ENUM('DROP','PRESERVE') NOT NULL default 'DROP', sql_mode  set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','SET_CONSISTENCY') DEFAULT '' NOT NULL, comment char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL default '', originator INTEGER UNSIGNED NOT NULL, time_zone char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', character_set_client char(32) collate utf8_bin, collation_connection char(32) collate utf8_bin, db_collation char(32) collate utf8_bin, body_utf8 longblob, PRIMARY KEY (db, name) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'Events';
 
 SET @create_innodb_table_stats="CREATE TABLE IF NOT EXISTS innodb_table_stats (
 	database_name			VARCHAR(64) NOT NULL,
diff --git a/scripts/mysql_system_tables_fix.sql b/scripts/mysql_system_tables_fix.sql
index 80d0ef7..c021a7c 100644
--- a/scripts/mysql_system_tables_fix.sql
+++ b/scripts/mysql_system_tables_fix.sql
@@ -448,7 +448,8 @@ ALTER TABLE proc MODIFY name char(64) DEFAULT '' NOT NULL,
                             'NO_AUTO_CREATE_USER',
                             'HIGH_NOT_PRECEDENCE',
                             'NO_ENGINE_SUBSTITUTION',
-                            'PAD_CHAR_TO_FULL_LENGTH'
+                            'PAD_CHAR_TO_FULL_LENGTH',
+                            'SET_CONSISTENCY'
                             ) DEFAULT '' NOT NULL,
                  DEFAULT CHARACTER SET utf8;
 
@@ -572,7 +573,8 @@ ALTER TABLE event MODIFY sql_mode
                             'NO_AUTO_CREATE_USER',
                             'HIGH_NOT_PRECEDENCE',
                             'NO_ENGINE_SUBSTITUTION',
-                            'PAD_CHAR_TO_FULL_LENGTH'
+                            'PAD_CHAR_TO_FULL_LENGTH',
+                            'SET_CONSISTENCY'
                             ) DEFAULT '' NOT NULL AFTER on_completion;
 ALTER TABLE event MODIFY name char(64) CHARACTER SET utf8 NOT NULL default '';
 
diff --git a/sql/event_db_repository.cc b/sql/event_db_repository.cc
index e71cfdc..fc504d0 100644
--- a/sql/event_db_repository.cc
+++ b/sql/event_db_repository.cc
@@ -124,7 +124,8 @@ const TABLE_FIELD_TYPE event_table_fields[ET_FIELD_COUNT] =
     "'ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES',"
     "'STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES',"
     "'ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER',"
-    "'HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')") },
+    "'HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH',"
+    "'SET_CONSISTENCY')") },
     {NULL, 0}
   },
   {
diff --git a/sql/item.h b/sql/item.h
index 75c14c6..539d5c8 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -2044,6 +2044,7 @@ class Item_args
 
 class Item_spvar_args: public Item_args
 {
+protected:
   TABLE *m_table;
 public:
   Item_spvar_args():Item_args(), m_table(NULL) { }
@@ -2900,6 +2901,7 @@ class Item_field_row: public Item_field,
   bool element_index_by_name(uint *idx, const LEX_CSTRING &name) const;
   Item* element_index(uint i) { return arg_count ? args[i] : this; }
   Item** addr(uint i) { return arg_count ? args + i : NULL; }
+  TABLE * table() { return m_table; }
   bool check_cols(uint c)
   {
     if (cols() != c)
@@ -2909,6 +2911,7 @@ class Item_field_row: public Item_field,
     }
     return false;
   }
+
 };
 
 
diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt
index 235ae5c..14414ee 100644
--- a/sql/share/errmsg-utf8.txt
+++ b/sql/share/errmsg-utf8.txt
@@ -7775,3 +7775,7 @@ ER_WRONG_INSERT_INTO_SEQUENCE
         eng "Wrong INSERT into a SEQUENCE. One can only do single table INSERT into a squence object (like with mysqldump).  If you want to change the SEQUENCE, use ALTER SEQUENCE instead."
 ER_SP_STACK_TRACE
         eng "At line %u in %s"
+ER_UPDATED_COLUMN_ONLY_ONCE
+        eng "The column %s cannot be changed more than once in a single UPDATE statement"
+ER_SP_GROUPSET_PROHIBITED
+        eng "Group assignment is not allowed."
diff --git a/sql/sp.cc b/sql/sp.cc
index 015e2f7..d999ddb 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -173,7 +173,8 @@ TABLE_FIELD_TYPE proc_table_fields[MYSQL_PROC_FIELD_COUNT] =
     "'ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES',"
     "'STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES',"
     "'ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER',"
-    "'HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')") },
+    "'HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH',"
+    "'SET_CONSISTENCY')") },
     { NULL, 0 }
   },
   {
@@ -688,7 +689,7 @@ Sp_handler::db_find_routine(THD *thd,
   // Get additional information
   modified= table->field[MYSQL_PROC_FIELD_MODIFIED]->val_int();
   created= table->field[MYSQL_PROC_FIELD_CREATED]->val_int();
-  sql_mode= (ulong) table->field[MYSQL_PROC_FIELD_SQL_MODE]->val_int();
+  sql_mode= (sql_mode_t) table->field[MYSQL_PROC_FIELD_SQL_MODE]->val_int();
 
   creation_ctx= Stored_routine_creation_ctx::load_from_db(thd, name, table);
 
diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc
index 3ceba42..8c598e8 100644
--- a/sql/sp_rcontext.cc
+++ b/sql/sp_rcontext.cc
@@ -118,7 +118,9 @@ bool sp_rcontext::init_var_table(THD *thd,
 
   DBUG_ASSERT(field_def_lst.elements == m_root_parsing_ctx->max_var_index());
 
-  if (!(m_var_table= create_virtual_tmp_table(thd, field_def_lst)))
+  if (!(m_var_table= create_virtual_tmp_table(thd, field_def_lst,
+                                              thd->variables.sql_mode &
+                                                   MODE_SET_CONSISTENCY)))
     return true;
 
   return false;
@@ -331,7 +333,7 @@ bool sp_rcontext::init_var_items(THD *thd,
 bool Item_spvar_args::row_create_items(THD *thd, List<Spvar_definition> *list)
 {
   DBUG_ASSERT(list);
-  if (!(m_table= create_virtual_tmp_table(thd, *list)))
+  if (!(m_table= create_virtual_tmp_table(thd, *list, true)))
     return true;
 
   if (alloc_arguments(thd, list->elements))
@@ -569,6 +571,40 @@ uint sp_rcontext::exit_handler(Diagnostics_area *da)
   DBUG_RETURN(continue_ip);
 }
 
+int sp_rcontext::save_set_n_switch(THD *thd, uint idx, Item **value)
+{
+  Item *dst= m_var_items[idx];
+  if (dst->cmp_type() != ROW_RESULT)
+  {
+    Field *field= m_var_table->field[idx];
+    save_or_restore_value(m_var_table, field);
+
+    // evaluate value
+    int evalret= 0;
+    if (!value)
+      field->set_null();
+    else
+      evalret= sp_eval_expr(thd, dst, field, value);
+
+    // move pointer on field in record[1]
+    if (!evalret)
+    {
+      my_ptrdiff_t rowoffset= m_var_table->record[1] - m_var_table->record[0];
+      field->move_field_offset(rowoffset);
+    }
+    return evalret;
+  }
+
+  return set_variable(thd, idx, value);
+}
+
+
+void  sp_rcontext::switch_to_new_value(uint idx)
+{
+  if (m_var_items[idx]->cmp_type() != ROW_RESULT)
+    switch_to_value_in_record(m_var_table, m_var_table->field[idx], 0);
+}
+
 
 int sp_rcontext::set_variable(THD *thd, uint idx, Item **value)
 {
@@ -631,6 +667,75 @@ void sp_rcontext::set_variable_row_field_to_null(THD *thd,
 }
 
 
+int sp_rcontext::save_set_n_switch_row_field(THD *thd, uint var_idx,
+                                             uint field_idx, Item **value)
+{
+  Item *dst= get_item(var_idx);
+  DBUG_ASSERT(dst->type() == Item::FIELD_ITEM);
+  DBUG_ASSERT(dst->cmp_type() == ROW_RESULT);
+  Item_field_row *item_field_row= (Item_field_row*) dst;
+
+  TABLE *tbl=item_field_row->table();
+  save_or_restore_value(tbl, tbl->field[field_idx]);
+
+  // evaluate value
+  int evalret= set_variable_row_field(thd, var_idx, field_idx, value);
+
+  // move pointer on field in record[1]
+  if (!evalret)
+      switch_to_value_in_record(tbl, tbl->field[field_idx], 1);
+
+  return evalret;
+}
+
+
+void sp_rcontext::save_or_restore_value(TABLE *tbl, Field *f)
+{
+  my_ptrdiff_t rowoffset= tbl->record[1] - tbl->record[0];
+
+  if (f->ptr >= tbl->record[1] && f->ptr <
+      tbl->record[1] + tbl->s->rec_buff_length)
+  {
+    // Variable is already changed. Restore value in record[0] and point on it.
+    memcpy(f->ptr - rowoffset, f->ptr, f->pack_length());
+    if (f->is_real_null())
+      f->set_null(-rowoffset);
+    else
+      f->set_notnull(-rowoffset);
+    f->move_field_offset(-rowoffset);
+  }
+  else
+  {
+    memcpy(f->ptr + rowoffset, f->ptr, f->pack_length());
+    if (f->is_real_null())
+      f->set_null(rowoffset);
+    else
+      f->set_notnull(rowoffset);
+  }
+}
+
+
+void sp_rcontext::switch_to_new_value_row_field(uint var_idx, uint field_idx)
+{
+  Item_field_row *item_field_row= (Item_field_row*) get_item(var_idx);
+  TABLE *tbl=item_field_row->table();
+  switch_to_value_in_record(tbl, tbl->field[field_idx], 0);
+}
+
+
+void sp_rcontext::switch_to_value_in_record(TABLE *tbl, Field *f,
+                                            uint record_number)
+{
+  if (!(f->ptr >= tbl->record[record_number] && f->ptr <
+      tbl->record[record_number] + tbl->s->rec_buff_length))
+  {
+    my_ptrdiff_t rowoffset= tbl->record[1] - tbl->record[0];
+    f->move_field_offset(record_number ? rowoffset : -rowoffset);
+  }
+}
+
+
+
 int sp_rcontext::set_variable_row_field(THD *thd, uint var_idx, uint field_idx,
                                         Item **value)
 {
diff --git a/sql/sp_rcontext.h b/sql/sp_rcontext.h
index 9846451..281a00e 100644
--- a/sql/sp_rcontext.h
+++ b/sql/sp_rcontext.h
@@ -187,6 +187,15 @@ class sp_rcontext : public Sql_alloc
   /////////////////////////////////////////////////////////////////////////
 
   int set_variable(THD *thd, uint var_idx, Item **value);
+  void switch_to_value_in_record(TABLE *tbl, Field *f, uint record_number);
+  void save_or_restore_value(TABLE *tbl, Field *f);
+  int save_set_n_switch(THD *thd, uint var_idx, Item **value);
+  void switch_to_new_value(uint idx);
+
+  int save_set_n_switch_row_field(THD *thd, uint var_idx, uint field_idx,
+                             Item **value);
+  void switch_to_new_value_row_field(uint var_idx, uint field_idx);
+
   void set_variable_row_field_to_null(THD *thd, uint var_idx, uint field_idx);
   int set_variable_row_field(THD *thd, uint var_idx, uint field_idx,
                              Item **value);
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index 60247c8..debb81a 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -7902,6 +7902,8 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
   List_iterator_fast<Item> f(fields),v(values);
   Item *value, *fld;
   Item_field *field;
+  Field *rfield;
+  TABLE *table;
   bool save_abort_on_warning= thd->abort_on_warning;
   bool save_no_errors= thd->no_errors;
   DBUG_ENTER("fill_record");
@@ -7936,8 +7938,8 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
       goto err;
     }
     value=v++;
-    Field *rfield= field->field;
-    TABLE* table= rfield->table;
+    rfield= field->field;
+    table= rfield->table;
     if (table->next_number_field &&
         rfield->field_index ==  table->next_number_field->field_index)
       table->auto_increment_field_not_null= TRUE;
@@ -7952,15 +7954,41 @@ fill_record(THD *thd, TABLE *table_arg, List<Item> &fields, List<Item> &values,
                           ER_THD(thd, ER_WARNING_NON_DEFAULT_VALUE_FOR_VIRTUAL_COLUMN),
                           rfield->field_name.str, table->s->table_name.str);
     }
-    if (rfield->stored_in_db() &&
-        (value->save_in_field(rfield, 0)) < 0 && !ignore_errors)
+    if (rfield->stored_in_db())
     {
-      my_message(ER_UNKNOWN_ERROR, ER_THD(thd, ER_UNKNOWN_ERROR), MYF(0));
-      goto err;
+      if (value->save_in_field(rfield, 0) < 0 && !ignore_errors)
+      {
+        my_message(ER_UNKNOWN_ERROR, ER_THD(thd, ER_UNKNOWN_ERROR), MYF(0));
+        goto err;
+      }
+      /*
+      ** In sql MODE_SET_CONSISTENCY,
+      ** move field pointer on value stored in record[1]
+      ** which contains row before update (see MDEV-13417)
+      */
+      if (update && thd->variables.sql_mode & MODE_SET_CONSISTENCY)
+        rfield->move_field_offset((my_ptrdiff_t) (table->record[1] -
+                                                  table->record[0]));
     }
     rfield->set_explicit_default(value);
   }
 
+  if (update && thd->variables.sql_mode & MODE_SET_CONSISTENCY)
+  {
+    // restore fields pointers on record[0]
+    f.rewind();
+    while ((fld= f++))
+    {
+      rfield= fld->field_for_view_update()->field;
+      if (rfield->stored_in_db())
+      {
+        table= rfield->table;
+        rfield->move_field_offset((my_ptrdiff_t) (table->record[0] -
+                                                  table->record[1]));
+      }
+    }
+  }
+
   if (!update && table_arg->default_field &&
       table_arg->update_default_fields(0, ignore_errors))
     goto err;
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 2e3c5bd..24ee792 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -3883,6 +3883,7 @@ Statement_map::~Statement_map()
   my_hash_free(&st_hash);
 }
 
+
 bool my_var_user::set(THD *thd, Item *item)
 {
   Item_func_set_user_var *suv= new (thd->mem_root) Item_func_set_user_var(thd, &name, item);
@@ -3890,14 +3891,57 @@ bool my_var_user::set(THD *thd, Item *item)
   return suv->fix_fields(thd, 0) || suv->update();
 }
 
+
+bool my_var_user::save_set_n_switch(THD *thd, Item *item)
+{
+  suv= new (thd->mem_root) Item_func_set_user_var(thd, &name, item);
+  suv->save_item_result(item);
+  return 0;
+}
+
+
+bool my_var_user::switch_to_new_value(THD *thd)
+{
+  return suv->fix_fields(thd, 0) || suv->update();
+}
+
 bool my_var_sp::set(THD *thd, Item *item)
 {
   return thd->spcont->set_variable(thd, offset, &item);
 }
 
+
+bool my_var_sp::save_set_n_switch(THD *thd, Item *item)
+{
+  return thd->spcont->save_set_n_switch(thd, offset, &item);
+}
+
+
+bool my_var_sp::switch_to_new_value(THD *thd)
+{
+  thd->spcont->switch_to_new_value(offset);
+  return 0;
+}
+
+
 bool my_var_sp_row_field::set(THD *thd, Item *item)
 {
-  return thd->spcont->set_variable_row_field(thd, offset, m_field_offset, &item);
+  return thd->spcont->set_variable_row_field(thd, offset, m_field_offset,
+                                             &item);
+}
+
+
+bool my_var_sp_row_field::save_set_n_switch(THD *thd, Item *item)
+{
+  return thd->spcont->save_set_n_switch_row_field(thd, offset, m_field_offset,
+                                                  &item);
+}
+
+
+bool my_var_sp_row_field::switch_to_new_value(THD *thd)
+{
+  thd->spcont->switch_to_new_value_row_field(offset, m_field_offset);
+  return 0;
 }
 
 
@@ -3908,6 +3952,24 @@ bool select_dumpvar::send_data_to_var_list(List<Item> &items)
   List_iterator<Item> it(items);
   Item *item;
   my_var *mv;
+
+  if (var_list.elements > 1 &&
+      (thd->variables.sql_mode & MODE_SET_CONSISTENCY))
+  {
+    while ((mv= var_li++) && (item= it++))
+    {
+      if (mv->save_set_n_switch(thd, item))
+        DBUG_RETURN(true);
+    }
+    var_li.rewind();
+    while ((mv= var_li++))
+    {
+      if (mv->switch_to_new_value(thd))
+        DBUG_RETURN(true);
+    }
+    DBUG_RETURN(false);
+  }
+
   while ((mv= var_li++) && (item= it++))
   {
     if (mv->set(thd, item))
diff --git a/sql/sql_class.h b/sql/sql_class.h
index f30b442..d058f35 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -139,6 +139,7 @@ enum enum_binlog_row_image {
 #define MODE_HIGH_NOT_PRECEDENCE        (1ULL << 29)
 #define MODE_NO_ENGINE_SUBSTITUTION     (1ULL << 30)
 #define MODE_PAD_CHAR_TO_FULL_LENGTH    (1ULL << 31)
+#define MODE_SET_CONSISTENCY            (1ULL << 32)
 
 /* Bits for different old style modes */
 #define OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE	(1 << 0)
@@ -5544,6 +5545,8 @@ class my_var : public Sql_alloc  {
   my_var(const LEX_CSTRING *j, enum type s) : name(*j), scope(s) { }
   virtual ~my_var() {}
   virtual bool set(THD *thd, Item *val) = 0;
+  virtual bool save_set_n_switch(THD *thd, Item *val) = 0;
+  virtual bool switch_to_new_value(THD *thd) = 0;
   virtual class my_var_sp *get_my_var_sp() { return NULL; }
 };
 
@@ -5561,6 +5564,9 @@ class my_var_sp: public my_var {
     : my_var(j, LOCAL_VAR), m_type_handler(type_handler), offset(o), sp(s) { }
   ~my_var_sp() { }
   bool set(THD *thd, Item *val);
+  bool save_set_n_switch(THD *thd, Item *item);
+  bool switch_to_new_value(THD *thd);
+
   my_var_sp *get_my_var_sp() { return this; }
   const Type_handler *type_handler() const { return m_type_handler; }
 };
@@ -5579,14 +5585,19 @@ class my_var_sp_row_field: public my_var_sp
     m_field_offset(field_idx)
   { }
   bool set(THD *thd, Item *val);
+  bool save_set_n_switch(THD *thd, Item *item);
+  bool switch_to_new_value(THD *thd);
 };
 
 class my_var_user: public my_var {
 public:
+  Item_func_set_user_var *suv;
   my_var_user(const LEX_CSTRING *j)
     : my_var(j, SESSION_VAR) { }
   ~my_var_user() { }
   bool set(THD *thd, Item *val);
+  bool save_set_n_switch(THD *thd, Item *item);
+  bool switch_to_new_value(THD *thd);
 };
 
 class select_dumpvar :public select_result_interceptor {
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index da28626..27e510e 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -17606,6 +17606,11 @@ void Virtual_tmp_table::setup_field_pointers()
 
 bool Virtual_tmp_table::open()
 {
+  return open(false);
+}
+
+bool Virtual_tmp_table::open(bool alloc_second_record)
+{
   // Make sure that we added all the fields we planned to:
   DBUG_ASSERT(s->fields == m_alloced_field_count);
   field[s->fields]= NULL;            // mark the end of the list
@@ -17616,12 +17621,16 @@ bool Virtual_tmp_table::open()
   s->rec_buff_length= ALIGN_SIZE(s->reclength + 1);
   if (!(record[0]= (uchar*) in_use->alloc(s->rec_buff_length)))
     return true;
+  if (alloc_second_record &&
+      !(record[1]= (uchar*) in_use->calloc(s->rec_buff_length)))
+    return true;
   if (null_pack_length)
   {
     null_flags= (uchar*) record[0];
     s->null_bytes= s->null_bytes_for_compare= null_pack_length;
   }
   setup_field_pointers();
+
   return false;
 }
 
diff --git a/sql/sql_select.h b/sql/sql_select.h
index 3592752..b05275e 100644
--- a/sql/sql_select.h
+++ b/sql/sql_select.h
@@ -2121,6 +2121,7 @@ class Virtual_tmp_table: public TABLE
     @return true  - on error (e.g. could not allocate the record buffer).
   */
   bool open();
+  bool open(bool alloc_second_record);
 };
 
 
@@ -2145,7 +2146,8 @@ class Virtual_tmp_table: public TABLE
 */
 
 inline TABLE *
-create_virtual_tmp_table(THD *thd, List<Spvar_definition> &field_list)
+create_virtual_tmp_table(THD *thd, List<Spvar_definition> &field_list,
+                         bool alloc_second_record)
 {
   Virtual_tmp_table *table;
   if (!(table= new(thd) Virtual_tmp_table(thd)))
@@ -2163,7 +2165,7 @@ create_virtual_tmp_table(THD *thd, List<Spvar_definition> &field_list)
 
   if (table->init(field_list.elements) ||
       table->add(field_list) ||
-      table->open())
+      table->open(alloc_second_record))
   {
     delete table;
     return NULL;
@@ -2190,7 +2192,7 @@ create_virtual_tmp_table(THD *thd, Field *field)
     return NULL;
   if (table->init(1) ||
       table->add(field) ||
-      table->open())
+      table->open(false))
   {
     delete table;
     return NULL;
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 568dd40..5796b96 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -129,25 +129,44 @@ bool compare_record(const TABLE *table)
     FALSE Items are OK
 */
 
-static bool check_fields(THD *thd, List<Item> &items)
+static bool check_fields(THD *thd, List<Item> &items, bool update_view)
 {
-  List_iterator<Item> it(items);
   Item *item;
-  Item_field *field;
+  if (update_view)
+  {
+    List_iterator<Item> it(items);
+    Item_field *field;
+    while ((item= it++))
+    {
+      if (!(field= item->field_for_view_update()))
+      {
+        /* item has name, because it comes from VIEW SELECT list */
+        my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name.str);
+        return TRUE;
+      }
+      /*
+        we make temporary copy of Item_field, to avoid influence of changing
+        result_field on Item_ref which refer on this field
+      */
+      thd->change_item_tree(it.ref(),
+                            new (thd->mem_root) Item_field(thd, field));
+    }
+  }
 
-  while ((item= it++))
+  if (thd->variables.sql_mode & MODE_SET_CONSISTENCY)
   {
-    if (!(field= item->field_for_view_update()))
+    // Make sure that a column is updated only once
+    List_iterator_fast<Item> it(items);
+    List<Item> ul;
+    ul.empty();
+    while ((item= it++) && !ul.add_unique(item, &cmp_items)) ;
+
+    if (item)
     {
-      /* item has name, because it comes from VIEW SELECT list */
-      my_error(ER_NONUPDATEABLE_COLUMN, MYF(0), item->name.str);
+      // same field appear more than once in a single update statement.
+      my_error(ER_UPDATED_COLUMN_ONLY_ONCE, MYF(0), item->full_name());
       return TRUE;
     }
-    /*
-      we make temporary copy of Item_field, to avoid influence of changing
-      result_field on Item_ref which refer on this field
-    */
-    thd->change_item_tree(it.ref(), new (thd->mem_root) Item_field(thd, field));
   }
   return FALSE;
 }
@@ -344,7 +363,7 @@ int mysql_update(THD *thd,
   if (setup_fields_with_no_wrap(thd, Ref_ptr_array(),
                                 fields, MARK_COLUMNS_WRITE, 0, 0))
     DBUG_RETURN(1);                     /* purecov: inspected */
-  if (table_list->view && check_fields(thd, fields))
+  if (check_fields(thd, fields, table_list->view))
   {
     DBUG_RETURN(1);
   }
@@ -1417,7 +1436,7 @@ int mysql_multi_update_prepare(THD *thd)
     }
   }
 
-  if (update_view && check_fields(thd, *fields))
+  if (check_fields(thd, *fields, update_view))
   {
     DBUG_RETURN(TRUE);
   }
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index b4aa1b6..2189e6d 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -15063,7 +15063,12 @@ start_option_value_list_following_option_type:
 /* Remainder of the option value list after first option value. */
 option_value_list_continued:
           /* empty */
-        | ',' option_value_list
+        | ','
+          {
+            if (thd->variables.sql_mode & MODE_SET_CONSISTENCY)
+              my_yyabort_error((ER_SP_GROUPSET_PROHIBITED, MYF(0)));
+          }
+          option_value_list
         ;
 
 /* Repeating list of option values after first option value. */
diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy
index 746d43f..97a55df 100644
--- a/sql/sql_yacc_ora.yy
+++ b/sql/sql_yacc_ora.yy
@@ -15286,7 +15286,12 @@ start_option_value_list_following_option_type:
 /* Remainder of the option value list after first option value. */
 option_value_list_continued:
           /* empty */
-        | ',' option_value_list
+        | ','
+          {
+            if (thd->variables.sql_mode & MODE_SET_CONSISTENCY)
+              my_yyabort_error((ER_SP_GROUPSET_PROHIBITED, MYF(0)));
+          }
+          option_value_list
         ;
 
 /* Repeating list of option values after first option value. */
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index feb31f0..f316ab7 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -3006,7 +3006,8 @@ export sql_mode_t expand_sql_mode(sql_mode_t sql_mode)
     sql_mode|= (MODE_PIPES_AS_CONCAT | MODE_ANSI_QUOTES |
                 MODE_IGNORE_SPACE |
                 MODE_NO_KEY_OPTIONS | MODE_NO_TABLE_OPTIONS |
-                MODE_NO_FIELD_OPTIONS | MODE_NO_AUTO_CREATE_USER);
+                MODE_NO_FIELD_OPTIONS | MODE_NO_AUTO_CREATE_USER |
+                MODE_SET_CONSISTENCY);
   if (sql_mode & MODE_MSSQL)
     sql_mode|= (MODE_PIPES_AS_CONCAT | MODE_ANSI_QUOTES |
                 MODE_IGNORE_SPACE |
@@ -3075,7 +3076,7 @@ static const char *sql_mode_names[]=
   "STRICT_ALL_TABLES", "NO_ZERO_IN_DATE", "NO_ZERO_DATE",
   "ALLOW_INVALID_DATES", "ERROR_FOR_DIVISION_BY_ZERO", "TRADITIONAL",
   "NO_AUTO_CREATE_USER", "HIGH_NOT_PRECEDENCE", "NO_ENGINE_SUBSTITUTION",
-  "PAD_CHAR_TO_FULL_LENGTH",
+  "PAD_CHAR_TO_FULL_LENGTH","SET_CONSISTENCY",
   0
 };
 
