Merge 10.1 into 10.2

This commit is contained in:
Marko Mäkelä 2019-03-04 16:46:58 +02:00
commit 9835f7b80f
37 changed files with 665 additions and 279 deletions

View File

@ -581,6 +581,56 @@ HEX(a)
C3A4 C3A4
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-15744: Assertion `derived->table' failed in mysql_derived_merge_for_insert
#
create table t1 (a int, b int);
CREATE OR REPLACE VIEW t2 AS SELECT * FROM t1;
CREATE VIEW v2 AS SELECT * FROM t2;
LOAD DATA INFILE '../../std_data/loaddata7.dat' INTO TABLE v2
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';
select * from v2;
a b
2 2
3 3
4 4
5 5
6 6
select * from t2;
a b
2 2
3 3
4 4
5 5
6 6
DROP VIEW IF EXISTS v2,t2;
DROP TABLE IF EXISTS t1;
#
# MDEV-15950: LOAD DATA INTO compex_view crashed
#
create table t1 (a int, b int);
create table t0 (x int, y int);
CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1,t0;
CREATE VIEW v2 AS SELECT * FROM v1;
LOAD DATA INFILE '../../std_data/loaddata7.dat' INTO TABLE v1
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';
ERROR HY000: Incorrect usage of Multi-table VIEW and LOAD
LOAD DATA INFILE '../../std_data/loaddata7.dat' INTO TABLE v2
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';
ERROR HY000: Incorrect usage of Multi-table VIEW and LOAD
DROP VIEW IF EXISTS v2,v1;
DROP TABLE IF EXISTS t1,t0;
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a), UNIQUE(b));
INSERT INTO t1 VALUES (1,1);
CREATE TABLE t2 (c INT);
CREATE VIEW v AS SELECT t1.* FROM t1 JOIN t2;
SELECT a, b FROM t1 INTO OUTFILE '15645.data';
LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b);
ERROR HY000: Incorrect usage of Multi-table VIEW and LOAD
LOAD DATA INFILE '15645.data' REPLACE INTO TABLE v (a,b);
ERROR HY000: Incorrect usage of Multi-table VIEW and LOAD
drop table t1,t2;
drop view v;
#
# MDEV-15497 Wrong empty value in a GEOMETRY column on LOAD DATA # MDEV-15497 Wrong empty value in a GEOMETRY column on LOAD DATA
# #
SET sql_mode=''; SET sql_mode='';

View File

@ -76,3 +76,40 @@ set @@log_slow_filter=default;
set @@log_slow_verbosity=default; set @@log_slow_verbosity=default;
set global log_output= default; set global log_output= default;
truncate mysql.slow_log; truncate mysql.slow_log;
#
# MDEV-18333 Slow_queries count doesn't increase when slow_query_log is turned off
#
SET SESSION slow_query_log=OFF;
SET GLOBAL slow_query_log=OFF;
SET long_query_time=0.1;
# Although this query is disallowed by slow_query_log, it should still increment Slow_queries
SELECT VARIABLE_VALUE INTO @global_slow_queries
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME='SLOW_QUERIES';
SELECT sleep(0.2) INTO @tmp FROM DUAL;
SELECT
CAST(VARIABLE_VALUE AS UNSIGNED)-@global_slow_queries AS Slow_queries_increment
FROM
INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE
VARIABLE_NAME='SLOW_QUERIES';
Slow_queries_increment
1
# Although this query is disallowed by log_slow_filter, it should still increment Slow_queries
SET log_slow_filter=filesort;
SELECT sleep(0.2) INTO @tmp FROM DUAL;
SELECT VARIABLE_VALUE INTO @global_slow_queries
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME='SLOW_QUERIES';
SELECT sleep(0.2) INTO @tmp FROM DUAL;
SELECT
CAST(VARIABLE_VALUE AS UNSIGNED)-@global_slow_queries AS Slow_queries_increment
FROM
INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE
VARIABLE_NAME='SLOW_QUERIES';
Slow_queries_increment
1
SET log_slow_filter=DEFAULT;
SET @@long_query_time=default;
SET GLOBAL slow_query_log= @org_slow_query_log;

View File

@ -7926,6 +7926,39 @@ CALL sp;
c a b a b c a b a b
DROP PROCEDURE sp; DROP PROCEDURE sp;
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-17055: Server crashes in find_order_in_list upon
# 2nd (3rd) execution of SP with UPDATE
#
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1;
CREATE TABLE t2 (c INT);
CREATE PROCEDURE sp() UPDATE v1 SET a = 1 ORDER BY a, b LIMIT 1;
LOCK TABLE t2 READ;
CALL sp;
ERROR HY000: Table 'v1' was not locked with LOCK TABLES
UNLOCK TABLES;
CALL sp;
ERROR 42S22: Unknown column 'b' in 'order clause'
CALL sp;
ERROR 42S22: Unknown column 'b' in 'order clause'
CALL sp;
ERROR 42S22: Unknown column 'b' in 'order clause'
DROP PROCEDURE sp;
CREATE PROCEDURE sp() UPDATE v1 SET a = 1 WHERE a=1 and b=2;
LOCK TABLE t2 READ;
CALL sp;
ERROR HY000: Table 'v1' was not locked with LOCK TABLES
UNLOCK TABLES;
CALL sp;
ERROR 42S22: Unknown column 'b' in 'where clause'
CALL sp;
ERROR 42S22: Unknown column 'b' in 'where clause'
CALL sp;
ERROR 42S22: Unknown column 'b' in 'where clause'
DROP PROCEDURE sp;
DROP VIEW v1;
DROP TABLE t1, t2;
# End of 5.5 test # End of 5.5 test
# #
# MDEV-7040: Crash in field_conv, memcpy_field_possible, part#2 # MDEV-7040: Crash in field_conv, memcpy_field_possible, part#2

View File

@ -1,5 +1,5 @@
--- suite/encryption/r/innodb-checksum-algorithm.result --- suite/encryption/r/innodb-checksum-algorithm.result
+++ suite/encryption/r/innodb-checksum-algorithm,32k.reject +++ suite/encryption/r/innodb-checksum-algorithm.result
@@ -13,9 +13,9 @@ @@ -13,9 +13,9 @@
SET GLOBAL innodb_default_encryption_key_id=4; SET GLOBAL innodb_default_encryption_key_id=4;
SET GLOBAL innodb_checksum_algorithm=crc32; SET GLOBAL innodb_checksum_algorithm=crc32;
@ -9,10 +9,10 @@
create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb
-ROW_FORMAT=COMPRESSED encrypted=no; -ROW_FORMAT=COMPRESSED encrypted=no;
+ROW_FORMAT=DYNAMIC encrypted=no; +ROW_FORMAT=DYNAMIC encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_crc32(a serial, b blob, index(b(10))) engine=innodb create table te_crc32(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes; @@ -153,9 +153,9 @@
create table t_crc32(a serial, b blob, index(b(10))) engine=innodb
@@ -222,9 +222,9 @@
t_crc32, tpe_crc32, tp_crc32; t_crc32, tpe_crc32, tp_crc32;
SET GLOBAL innodb_checksum_algorithm=innodb; SET GLOBAL innodb_checksum_algorithm=innodb;
create table tce_innodb(a serial, b blob, index(b(10))) engine=innodb create table tce_innodb(a serial, b blob, index(b(10))) engine=innodb
@ -21,10 +21,10 @@
create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb
-ROW_FORMAT=COMPRESSED encrypted=no; -ROW_FORMAT=COMPRESSED encrypted=no;
+ROW_FORMAT=DYNAMIC encrypted=no; +ROW_FORMAT=DYNAMIC encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_innodb(a serial, b blob, index(b(10))) engine=innodb create table te_innodb(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes; @@ -293,9 +293,9 @@
create table t_innodb(a serial, b blob, index(b(10))) engine=innodb
@@ -431,9 +431,9 @@
t_innodb, tpe_innodb, tp_innodb; t_innodb, tpe_innodb, tp_innodb;
SET GLOBAL innodb_checksum_algorithm=none; SET GLOBAL innodb_checksum_algorithm=none;
create table tce_none(a serial, b blob, index(b(10))) engine=innodb create table tce_none(a serial, b blob, index(b(10))) engine=innodb
@ -33,6 +33,6 @@
create table tc_none(a serial, b blob, index(b(10))) engine=innodb create table tc_none(a serial, b blob, index(b(10))) engine=innodb
-ROW_FORMAT=COMPRESSED encrypted=no; -ROW_FORMAT=COMPRESSED encrypted=no;
+ROW_FORMAT=DYNAMIC encrypted=no; +ROW_FORMAT=DYNAMIC encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_none(a serial, b blob, index(b(10))) engine=innodb create table te_none(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes;
create table t_none(a serial, b blob, index(b(10))) engine=innodb

View File

@ -1,5 +1,5 @@
--- suite/encryption/r/innodb-checksum-algorithm.result --- suite/encryption/r/innodb-checksum-algorithm.result
+++ suite/encryption/r/innodb-checksum-algorithm,64k.reject +++ suite/encryption/r/innodb-checksum-algorithm.result
@@ -13,9 +13,9 @@ @@ -13,9 +13,9 @@
SET GLOBAL innodb_default_encryption_key_id=4; SET GLOBAL innodb_default_encryption_key_id=4;
SET GLOBAL innodb_checksum_algorithm=crc32; SET GLOBAL innodb_checksum_algorithm=crc32;
@ -9,10 +9,10 @@
create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb
-ROW_FORMAT=COMPRESSED encrypted=no; -ROW_FORMAT=COMPRESSED encrypted=no;
+ROW_FORMAT=DYNAMIC encrypted=no; +ROW_FORMAT=DYNAMIC encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_crc32(a serial, b blob, index(b(10))) engine=innodb create table te_crc32(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes; @@ -153,9 +153,9 @@
create table t_crc32(a serial, b blob, index(b(10))) engine=innodb
@@ -222,9 +222,9 @@
t_crc32, tpe_crc32, tp_crc32; t_crc32, tpe_crc32, tp_crc32;
SET GLOBAL innodb_checksum_algorithm=innodb; SET GLOBAL innodb_checksum_algorithm=innodb;
create table tce_innodb(a serial, b blob, index(b(10))) engine=innodb create table tce_innodb(a serial, b blob, index(b(10))) engine=innodb
@ -21,10 +21,10 @@
create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb
-ROW_FORMAT=COMPRESSED encrypted=no; -ROW_FORMAT=COMPRESSED encrypted=no;
+ROW_FORMAT=DYNAMIC encrypted=no; +ROW_FORMAT=DYNAMIC encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_innodb(a serial, b blob, index(b(10))) engine=innodb create table te_innodb(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes; @@ -293,9 +293,9 @@
create table t_innodb(a serial, b blob, index(b(10))) engine=innodb
@@ -431,9 +431,9 @@
t_innodb, tpe_innodb, tp_innodb; t_innodb, tpe_innodb, tp_innodb;
SET GLOBAL innodb_checksum_algorithm=none; SET GLOBAL innodb_checksum_algorithm=none;
create table tce_none(a serial, b blob, index(b(10))) engine=innodb create table tce_none(a serial, b blob, index(b(10))) engine=innodb
@ -33,6 +33,6 @@
create table tc_none(a serial, b blob, index(b(10))) engine=innodb create table tc_none(a serial, b blob, index(b(10))) engine=innodb
-ROW_FORMAT=COMPRESSED encrypted=no; -ROW_FORMAT=COMPRESSED encrypted=no;
+ROW_FORMAT=DYNAMIC encrypted=no; +ROW_FORMAT=DYNAMIC encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_none(a serial, b blob, index(b(10))) engine=innodb create table te_none(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes;
create table t_none(a serial, b blob, index(b(10))) engine=innodb

View File

@ -14,14 +14,20 @@ create table tce_crc32(a serial, b blob, index(b(10))) engine=innodb
ROW_FORMAT=COMPRESSED encrypted=yes; ROW_FORMAT=COMPRESSED encrypted=yes;
create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb create table tc_crc32(a serial, b blob, index(b(10))) engine=innodb
ROW_FORMAT=COMPRESSED encrypted=no; ROW_FORMAT=COMPRESSED encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_crc32(a serial, b blob, index(b(10))) engine=innodb create table te_crc32(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes; encrypted=yes;
create table t_crc32(a serial, b blob, index(b(10))) engine=innodb create table t_crc32(a serial, b blob, index(b(10))) engine=innodb
encrypted=no; encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table tpe_crc32(a serial, b blob, index(b(10))) engine=innodb create table tpe_crc32(a serial, b blob, index(b(10))) engine=innodb
page_compressed=yes encrypted=yes; page_compressed=yes encrypted=yes;
create table tp_crc32(a serial, b blob, index(b(10))) engine=innodb create table tp_crc32(a serial, b blob, index(b(10))) engine=innodb
page_compressed=yes encrypted=no; page_compressed=yes encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
begin; begin;
insert into tce_crc32(b) values (repeat('secret',20)); insert into tce_crc32(b) values (repeat('secret',20));
insert into tc_crc32(b) values (repeat('secret',20)); insert into tc_crc32(b) values (repeat('secret',20));
@ -148,14 +154,20 @@ create table tce_innodb(a serial, b blob, index(b(10))) engine=innodb
ROW_FORMAT=COMPRESSED encrypted=yes; ROW_FORMAT=COMPRESSED encrypted=yes;
create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb create table tc_innodb(a serial, b blob, index(b(10))) engine=innodb
ROW_FORMAT=COMPRESSED encrypted=no; ROW_FORMAT=COMPRESSED encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_innodb(a serial, b blob, index(b(10))) engine=innodb create table te_innodb(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes; encrypted=yes;
create table t_innodb(a serial, b blob, index(b(10))) engine=innodb create table t_innodb(a serial, b blob, index(b(10))) engine=innodb
encrypted=no; encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table tpe_innodb(a serial, b blob, index(b(10))) engine=innodb create table tpe_innodb(a serial, b blob, index(b(10))) engine=innodb
page_compressed=yes encrypted=yes; page_compressed=yes encrypted=yes;
create table tp_innodb(a serial, b blob, index(b(10))) engine=innodb create table tp_innodb(a serial, b blob, index(b(10))) engine=innodb
page_compressed=yes encrypted=no; page_compressed=yes encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
begin; begin;
insert into tce_innodb(b) values (repeat('secret',20)); insert into tce_innodb(b) values (repeat('secret',20));
insert into tc_innodb(b) values (repeat('secret',20)); insert into tc_innodb(b) values (repeat('secret',20));
@ -282,14 +294,20 @@ create table tce_none(a serial, b blob, index(b(10))) engine=innodb
ROW_FORMAT=COMPRESSED encrypted=yes; ROW_FORMAT=COMPRESSED encrypted=yes;
create table tc_none(a serial, b blob, index(b(10))) engine=innodb create table tc_none(a serial, b blob, index(b(10))) engine=innodb
ROW_FORMAT=COMPRESSED encrypted=no; ROW_FORMAT=COMPRESSED encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table te_none(a serial, b blob, index(b(10))) engine=innodb create table te_none(a serial, b blob, index(b(10))) engine=innodb
encrypted=yes; encrypted=yes;
create table t_none(a serial, b blob, index(b(10))) engine=innodb create table t_none(a serial, b blob, index(b(10))) engine=innodb
encrypted=no; encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
create table tpe_none(a serial, b blob, index(b(10))) engine=innodb create table tpe_none(a serial, b blob, index(b(10))) engine=innodb
page_compressed=yes encrypted=yes; page_compressed=yes encrypted=yes;
create table tp_none(a serial, b blob, index(b(10))) engine=innodb create table tp_none(a serial, b blob, index(b(10))) engine=innodb
page_compressed=yes encrypted=no; page_compressed=yes encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
begin; begin;
insert into tce_none(b) values (repeat('secret',20)); insert into tce_none(b) values (repeat('secret',20));
insert into tc_none(b) values (repeat('secret',20)); insert into tc_none(b) values (repeat('secret',20));

View File

@ -7,6 +7,8 @@ set GLOBAL innodb_default_encryption_key_id=4;
create table t1(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed; create table t1(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed;
create table t2(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes; create table t2(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes;
create table t3(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed encrypted=no; create table t3(a int not null primary key, b blob, index(b(10))) engine=innodb row_format=compressed encrypted=no;
Warnings:
Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
insert into t1 values (1, repeat('secret',6000)); insert into t1 values (1, repeat('secret',6000));
insert into t2 values (1, repeat('secret',6000)); insert into t2 values (1, repeat('secret',6000));
insert into t3 values (1, repeat('secret',6000)); insert into t3 values (1, repeat('secret',6000));

View File

@ -2,9 +2,16 @@ SET GLOBAL innodb_encrypt_tables = ON;
SET GLOBAL innodb_encryption_threads = 4; SET GLOBAL innodb_encryption_threads = 4;
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO ENCRYPTION_KEY_ID=4; CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO ENCRYPTION_KEY_ID=4;
Warnings: Warnings:
Warning 140 InnoDB: Ignored ENCRYPTION_KEY_ID 4 when encryption is disabled Warning 140 InnoDB: ENCRYPTED=NO implies ENCRYPTION_KEY_ID=1
DROP TABLE t1; DROP TABLE t1;
set @save_global = @@GLOBAL.innodb_default_encryption_key_id;
set innodb_default_encryption_key_id = 99; set innodb_default_encryption_key_id = 99;
Warnings:
Warning 1210 innodb_default_encryption_key=99 is not available
set global innodb_default_encryption_key_id = 99;
Warnings:
Warning 1210 innodb_default_encryption_key=99 is not available
set global innodb_default_encryption_key_id = @save_global;
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB; CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB;
ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options") ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options")
SHOW WARNINGS; SHOW WARNINGS;
@ -38,8 +45,6 @@ t1 CREATE TABLE `t1` (
PRIMARY KEY (`pk`) PRIMARY KEY (`pk`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 `ENCRYPTION_KEY_ID`=4 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 `ENCRYPTION_KEY_ID`=4
CREATE TABLE t2 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO ENCRYPTION_KEY_ID=1; CREATE TABLE t2 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO ENCRYPTION_KEY_ID=1;
Warnings:
Warning 140 InnoDB: Ignored ENCRYPTION_KEY_ID 1 when encryption is disabled
ALTER TABLE t1 ENCRYPTION_KEY_ID=99; ALTER TABLE t1 ENCRYPTION_KEY_ID=99;
ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTION_KEY_ID' ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTION_KEY_ID'
SHOW WARNINGS; SHOW WARNINGS;
@ -51,38 +56,32 @@ drop table t1,t2;
SET GLOBAL innodb_encrypt_tables=OFF; SET GLOBAL innodb_encrypt_tables=OFF;
CREATE TABLE t1 (a int not null primary key) engine=innodb; CREATE TABLE t1 (a int not null primary key) engine=innodb;
ALTER TABLE t1 ENCRYPTION_KEY_ID=4; ALTER TABLE t1 ENCRYPTION_KEY_ID=4;
ERROR HY000: Table storage engine 'InnoDB' does not support the create option 'ENCRYPTION_KEY_ID'
SHOW WARNINGS;
Level Code Message
Warning 140 InnoDB: innodb_encrypt_tables=OFF only allows ENCRYPTION_KEY_ID=1
Error 1478 Table storage engine 'InnoDB' does not support the create option 'ENCRYPTION_KEY_ID'
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL, `a` int(11) NOT NULL,
PRIMARY KEY (`a`) PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 `ENCRYPTION_KEY_ID`=4
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t2 (a int not null primary key) engine=innodb; CREATE TABLE t2 (a int not null primary key) engine=innodb;
ALTER TABLE t2 ENCRYPTION_KEY_ID=4, ALGORITHM=COPY; ALTER TABLE t2 ENCRYPTION_KEY_ID=4, ALGORITHM=COPY;
ERROR HY000: Can't create table `test`.`t2` (errno: 140 "Wrong create options")
SHOW WARNINGS; SHOW WARNINGS;
Level Code Message Level Code Message
Warning 140 InnoDB: innodb_encrypt_tables=OFF only allows ENCRYPTION_KEY_ID=1
Error 1005 Can't create table `test`.`t2` (errno: 140 "Wrong create options")
Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB
SHOW CREATE TABLE t2; SHOW CREATE TABLE t2;
Table Create Table Table Create Table
t2 CREATE TABLE `t2` ( t2 CREATE TABLE `t2` (
`a` int(11) NOT NULL, `a` int(11) NOT NULL,
PRIMARY KEY (`a`) PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 `ENCRYPTION_KEY_ID`=4
CREATE TABLE t3 (a int not null primary key) engine=innodb ENCRYPTION_KEY_ID=4; CREATE TABLE t3 (a int not null primary key) engine=innodb ENCRYPTION_KEY_ID=4;
ERROR HY000: Can't create table `test`.`t3` (errno: 140 "Wrong create options") DROP TABLE t3;
SET GLOBAL innodb_encrypt_tables='FORCE';
CREATE TABLE t1 (a int primary key) engine=innodb encrypted=no;
ERROR HY000: Can't create table `test`.`t1` (errno: 140 "Wrong create options")
SHOW WARNINGS; SHOW WARNINGS;
Level Code Message Level Code Message
Warning 140 InnoDB: innodb_encrypt_tables=OFF only allows ENCRYPTION_KEY_ID=1 Warning 140 InnoDB: ENCRYPTED=NO cannot be used with innodb_encrypt_tables=FORCE
Error 1005 Can't create table `test`.`t3` (errno: 140 "Wrong create options") Error 1005 Can't create table `test`.`t1` (errno: 140 "Wrong create options")
Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB
FLUSH TABLES; FLUSH TABLES;
create table t1(f1 int not null, f2 int not null)engine=innodb encrypted=yes; create table t1(f1 int not null, f2 int not null)engine=innodb encrypted=yes;

View File

@ -12,7 +12,10 @@ SET GLOBAL innodb_encryption_threads = 4;
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO ENCRYPTION_KEY_ID=4; CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB ENCRYPTED=NO ENCRYPTION_KEY_ID=4;
DROP TABLE t1; DROP TABLE t1;
set @save_global = @@GLOBAL.innodb_default_encryption_key_id;
set innodb_default_encryption_key_id = 99; set innodb_default_encryption_key_id = 99;
set global innodb_default_encryption_key_id = 99;
set global innodb_default_encryption_key_id = @save_global;
--error 1005 --error 1005
CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB; CREATE TABLE t1 (pk INT PRIMARY KEY AUTO_INCREMENT, c VARCHAR(256)) ENGINE=INNODB;
SHOW WARNINGS; SHOW WARNINGS;
@ -83,22 +86,24 @@ drop table t1,t2;
# #
# MDEV-17230: encryption_key_id from alter is ignored by encryption threads # MDEV-17230: encryption_key_id from alter is ignored by encryption threads
# #
--enable_warnings
SET GLOBAL innodb_encrypt_tables=OFF; SET GLOBAL innodb_encrypt_tables=OFF;
CREATE TABLE t1 (a int not null primary key) engine=innodb; CREATE TABLE t1 (a int not null primary key) engine=innodb;
--error ER_ILLEGAL_HA_CREATE_OPTION
ALTER TABLE t1 ENCRYPTION_KEY_ID=4; ALTER TABLE t1 ENCRYPTION_KEY_ID=4;
SHOW WARNINGS;
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t2 (a int not null primary key) engine=innodb; CREATE TABLE t2 (a int not null primary key) engine=innodb;
--error ER_CANT_CREATE_TABLE
ALTER TABLE t2 ENCRYPTION_KEY_ID=4, ALGORITHM=COPY; ALTER TABLE t2 ENCRYPTION_KEY_ID=4, ALGORITHM=COPY;
SHOW WARNINGS; SHOW WARNINGS;
SHOW CREATE TABLE t2; SHOW CREATE TABLE t2;
--error ER_CANT_CREATE_TABLE
CREATE TABLE t3 (a int not null primary key) engine=innodb ENCRYPTION_KEY_ID=4; CREATE TABLE t3 (a int not null primary key) engine=innodb ENCRYPTION_KEY_ID=4;
DROP TABLE t3;
SET GLOBAL innodb_encrypt_tables='FORCE';
--error ER_CANT_CREATE_TABLE
CREATE TABLE t1 (a int primary key) engine=innodb encrypted=no;
SHOW WARNINGS; SHOW WARNINGS;
FLUSH TABLES; FLUSH TABLES;

View File

@ -3,12 +3,9 @@ INSERT INTO t VALUES (1,2,3),(4,5,6),(7,8,9);
ALTER TABLE t CHANGE c1 c1 INT NULL FIRST, ALGORITHM=INPLACE; ALTER TABLE t CHANGE c1 c1 INT NULL FIRST, ALGORITHM=INPLACE;
affected rows: 0 affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0 info: Records: 0 Duplicates: 0 Warnings: 0
set @old_sql_mode = @@sql_mode;
set @@sql_mode = 'STRICT_TRANS_TABLES';
ALTER TABLE t MODIFY c3 INT NOT NULL, ALGORITHM=INPLACE; ALTER TABLE t MODIFY c3 INT NOT NULL, ALGORITHM=INPLACE;
affected rows: 0 affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0 info: Records: 0 Duplicates: 0 Warnings: 0
set @@sql_mode = @old_sql_mode;
ALTER TABLE t CHANGE c2 c2 INT, CHANGE c2 c2 INT NOT NULL; ALTER TABLE t CHANGE c2 c2 INT, CHANGE c2 c2 INT NOT NULL;
ERROR 42S22: Unknown column 'c2' in 't' ERROR 42S22: Unknown column 'c2' in 't'
ALTER TABLE t MODIFY c2 INT, MODIFY c2 INT NOT NULL; ALTER TABLE t MODIFY c2 INT, MODIFY c2 INT NOT NULL;
@ -24,8 +21,6 @@ ALTER TABLE t MODIFY c2 INT NOT NULL;
affected rows: 0 affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0 info: Records: 0 Duplicates: 0 Warnings: 0
connect con1,localhost,root,,; connect con1,localhost,root,,;
connection con1;
SET SQL_MODE='STRICT_ALL_TABLES';
UPDATE t SET c2=NULL; UPDATE t SET c2=NULL;
ERROR 23000: Column 'c2' cannot be null ERROR 23000: Column 'c2' cannot be null
SELECT * FROM t; SELECT * FROM t;
@ -61,3 +56,34 @@ CREATE TABLE t1(c1 INT) ENGINE=InnoDB;
ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1); ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1);
ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1); ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1);
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-18732 InnoDB: ALTER IGNORE returns error for NULL
#
CREATE TABLE t1(c INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (NULL);
ALTER IGNORE TABLE t1 MODIFY c INT NOT NULL;
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 1
Warnings:
Warning 1265 Data truncated for column 'c' at row 1
INSERT INTO t1 VALUES (NULL);
ERROR 23000: Column 'c' cannot be null
SELECT * FROM t1;
c
0
DROP TABLE t1;
CREATE TABLE t1(c INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (NULL),(1),(1);
ALTER IGNORE TABLE t1 ADD UNIQUE(c);
affected rows: 3
info: Records: 3 Duplicates: 1 Warnings: 0
ALTER IGNORE TABLE t1 ADD PRIMARY KEY(c);
affected rows: 2
info: Records: 2 Duplicates: 0 Warnings: 1
Warnings:
Warning 1265 Data truncated for column 'c' at row 1
SELECT * FROM t1;
c
0
1
DROP TABLE t1;

View File

@ -13,14 +13,7 @@ INSERT INTO t VALUES (1,2,3),(4,5,6),(7,8,9);
ALTER TABLE t CHANGE c1 c1 INT NULL FIRST, ALGORITHM=INPLACE; ALTER TABLE t CHANGE c1 c1 INT NULL FIRST, ALGORITHM=INPLACE;
# NULL -> NOT NULL only allowed INPLACE if strict sql_mode is on. # NULL -> NOT NULL only allowed INPLACE if strict sql_mode is on.
--disable_info
set @old_sql_mode = @@sql_mode;
set @@sql_mode = 'STRICT_TRANS_TABLES';
--enable_info
ALTER TABLE t MODIFY c3 INT NOT NULL, ALGORITHM=INPLACE; ALTER TABLE t MODIFY c3 INT NOT NULL, ALGORITHM=INPLACE;
--disable_info
set @@sql_mode = @old_sql_mode;
--enable_info
# Request some conflicting changes for a single column. # Request some conflicting changes for a single column.
--error ER_BAD_FIELD_ERROR --error ER_BAD_FIELD_ERROR
@ -38,9 +31,6 @@ ALTER TABLE t MODIFY c2 INT NOT NULL;
--disable_info --disable_info
connect (con1,localhost,root,,); connect (con1,localhost,root,,);
connection con1;
SET SQL_MODE='STRICT_ALL_TABLES';
--error ER_BAD_NULL_ERROR --error ER_BAD_NULL_ERROR
UPDATE t SET c2=NULL; UPDATE t SET c2=NULL;
@ -76,6 +66,29 @@ ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1);
ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1); ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1);
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-18732 InnoDB: ALTER IGNORE returns error for NULL
--echo #
CREATE TABLE t1(c INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (NULL);
--enable_info
ALTER IGNORE TABLE t1 MODIFY c INT NOT NULL;
--disable_info
--error ER_BAD_NULL_ERROR
INSERT INTO t1 VALUES (NULL);
SELECT * FROM t1;
DROP TABLE t1;
CREATE TABLE t1(c INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (NULL),(1),(1);
--enable_info
ALTER IGNORE TABLE t1 ADD UNIQUE(c);
ALTER IGNORE TABLE t1 ADD PRIMARY KEY(c);
--disable_info
SELECT * FROM t1;
DROP TABLE t1;
# Check that all connections opened by test cases in this file are really # Check that all connections opened by test cases in this file are really
# gone so execution of other tests won't be affected by their presence. # gone so execution of other tests won't be affected by their presence.
--source include/wait_until_count_sessions.inc --source include/wait_until_count_sessions.inc

View File

@ -677,6 +677,51 @@ LOAD DATA INFILE '../../std_data/loaddata/mdev-11631.txt' INTO TABLE t1 CHARACTE
SELECT HEX(a) FROM t1; SELECT HEX(a) FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-15744: Assertion `derived->table' failed in mysql_derived_merge_for_insert
--echo #
create table t1 (a int, b int);
CREATE OR REPLACE VIEW t2 AS SELECT * FROM t1;
CREATE VIEW v2 AS SELECT * FROM t2;
LOAD DATA INFILE '../../std_data/loaddata7.dat' INTO TABLE v2
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';
select * from v2;
select * from t2;
DROP VIEW IF EXISTS v2,t2;
DROP TABLE IF EXISTS t1;
--echo #
--echo # MDEV-15950: LOAD DATA INTO compex_view crashed
--echo #
create table t1 (a int, b int);
create table t0 (x int, y int);
CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1,t0;
CREATE VIEW v2 AS SELECT * FROM v1;
--error ER_WRONG_USAGE
LOAD DATA INFILE '../../std_data/loaddata7.dat' INTO TABLE v1
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';
--error ER_WRONG_USAGE
LOAD DATA INFILE '../../std_data/loaddata7.dat' INTO TABLE v2
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n';
DROP VIEW IF EXISTS v2,v1;
DROP TABLE IF EXISTS t1,t0;
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a), UNIQUE(b));
INSERT INTO t1 VALUES (1,1);
CREATE TABLE t2 (c INT);
CREATE VIEW v AS SELECT t1.* FROM t1 JOIN t2;
SELECT a, b FROM t1 INTO OUTFILE '15645.data';
--error ER_WRONG_USAGE
LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b);
--error ER_WRONG_USAGE
LOAD DATA INFILE '15645.data' REPLACE INTO TABLE v (a,b);
drop table t1,t2;
drop view v;
--echo # --echo #
--echo # MDEV-15497 Wrong empty value in a GEOMETRY column on LOAD DATA --echo # MDEV-15497 Wrong empty value in a GEOMETRY column on LOAD DATA

View File

@ -58,3 +58,43 @@ set @@log_slow_filter=default;
set @@log_slow_verbosity=default; set @@log_slow_verbosity=default;
set global log_output= default; set global log_output= default;
truncate mysql.slow_log; truncate mysql.slow_log;
--echo #
--echo # MDEV-18333 Slow_queries count doesn't increase when slow_query_log is turned off
--echo #
SET SESSION slow_query_log=OFF;
SET GLOBAL slow_query_log=OFF;
SET long_query_time=0.1;
--echo # Although this query is disallowed by slow_query_log, it should still increment Slow_queries
SELECT VARIABLE_VALUE INTO @global_slow_queries
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME='SLOW_QUERIES';
SELECT sleep(0.2) INTO @tmp FROM DUAL;
SELECT
CAST(VARIABLE_VALUE AS UNSIGNED)-@global_slow_queries AS Slow_queries_increment
FROM
INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE
VARIABLE_NAME='SLOW_QUERIES';
--echo # Although this query is disallowed by log_slow_filter, it should still increment Slow_queries
SET log_slow_filter=filesort;
SELECT sleep(0.2) INTO @tmp FROM DUAL;
SELECT VARIABLE_VALUE INTO @global_slow_queries
FROM INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE VARIABLE_NAME='SLOW_QUERIES';
SELECT sleep(0.2) INTO @tmp FROM DUAL;
SELECT
CAST(VARIABLE_VALUE AS UNSIGNED)-@global_slow_queries AS Slow_queries_increment
FROM
INFORMATION_SCHEMA.GLOBAL_STATUS
WHERE
VARIABLE_NAME='SLOW_QUERIES';
SET log_slow_filter=DEFAULT;
SET @@long_query_time=default;
SET GLOBAL slow_query_log= @org_slow_query_log;

View File

@ -9362,6 +9362,47 @@ CALL sp;
DROP PROCEDURE sp; DROP PROCEDURE sp;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-17055: Server crashes in find_order_in_list upon
--echo # 2nd (3rd) execution of SP with UPDATE
--echo #
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1;
CREATE TABLE t2 (c INT);
CREATE PROCEDURE sp() UPDATE v1 SET a = 1 ORDER BY a, b LIMIT 1;
LOCK TABLE t2 READ;
--error ER_TABLE_NOT_LOCKED
CALL sp;
UNLOCK TABLES;
--error ER_BAD_FIELD_ERROR
CALL sp;
--error ER_BAD_FIELD_ERROR
CALL sp;
--error ER_BAD_FIELD_ERROR
CALL sp;
# Cleanup
DROP PROCEDURE sp;
CREATE PROCEDURE sp() UPDATE v1 SET a = 1 WHERE a=1 and b=2;
LOCK TABLE t2 READ;
--error ER_TABLE_NOT_LOCKED
CALL sp;
UNLOCK TABLES;
--error ER_BAD_FIELD_ERROR
CALL sp;
--error ER_BAD_FIELD_ERROR
CALL sp;
--error ER_BAD_FIELD_ERROR
CALL sp;
# Cleanup
DROP PROCEDURE sp;
DROP VIEW v1;
DROP TABLE t1, t2;
--echo # End of 5.5 test --echo # End of 5.5 test

View File

@ -5340,7 +5340,7 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi,
thd->variables.sql_log_slow= opt_log_slow_slave_statements; thd->variables.sql_log_slow= opt_log_slow_slave_statements;
} }
thd->enable_slow_log= thd->variables.sql_log_slow; thd->enable_slow_log= true;
mysql_parse(thd, thd->query(), thd->query_length(), &parser_state, mysql_parse(thd, thd->query(), thd->query_length(), &parser_state,
FALSE, FALSE); FALSE, FALSE);
/* Finalize server status flags after executing a statement. */ /* Finalize server status flags after executing a statement. */

View File

@ -1305,7 +1305,6 @@ bool Sql_cmd_analyze_table::execute(THD *thd)
FALSE, UINT_MAX, FALSE)) FALSE, UINT_MAX, FALSE))
goto error; goto error;
WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table); WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table);
thd->enable_slow_log= opt_log_slow_admin_statements;
res= mysql_admin_table(thd, first_table, &m_lex->check_opt, res= mysql_admin_table(thd, first_table, &m_lex->check_opt,
"analyze", lock_type, 1, 0, 0, 0, "analyze", lock_type, 1, 0, 0, 0,
&handler::ha_analyze, 0); &handler::ha_analyze, 0);
@ -1337,8 +1336,6 @@ bool Sql_cmd_check_table::execute(THD *thd)
if (check_table_access(thd, SELECT_ACL, first_table, if (check_table_access(thd, SELECT_ACL, first_table,
TRUE, UINT_MAX, FALSE)) TRUE, UINT_MAX, FALSE))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->enable_slow_log= opt_log_slow_admin_statements;
res= mysql_admin_table(thd, first_table, &m_lex->check_opt, "check", res= mysql_admin_table(thd, first_table, &m_lex->check_opt, "check",
lock_type, 0, 0, HA_OPEN_FOR_REPAIR, 0, lock_type, 0, 0, HA_OPEN_FOR_REPAIR, 0,
&handler::ha_check, &view_check); &handler::ha_check, &view_check);
@ -1362,7 +1359,6 @@ bool Sql_cmd_optimize_table::execute(THD *thd)
FALSE, UINT_MAX, FALSE)) FALSE, UINT_MAX, FALSE))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table); WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table);
thd->enable_slow_log= opt_log_slow_admin_statements;
res= (specialflag & SPECIAL_NO_NEW_FUNC) ? res= (specialflag & SPECIAL_NO_NEW_FUNC) ?
mysql_recreate_table(thd, first_table, true) : mysql_recreate_table(thd, first_table, true) :
mysql_admin_table(thd, first_table, &m_lex->check_opt, mysql_admin_table(thd, first_table, &m_lex->check_opt,
@ -1395,7 +1391,6 @@ bool Sql_cmd_repair_table::execute(THD *thd)
if (check_table_access(thd, SELECT_ACL | INSERT_ACL, first_table, if (check_table_access(thd, SELECT_ACL | INSERT_ACL, first_table,
FALSE, UINT_MAX, FALSE)) FALSE, UINT_MAX, FALSE))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
thd->enable_slow_log= opt_log_slow_admin_statements;
WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table); WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table);
res= mysql_admin_table(thd, first_table, &m_lex->check_opt, "repair", res= mysql_admin_table(thd, first_table, &m_lex->check_opt, "repair",
TL_WRITE, 1, TL_WRITE, 1,

View File

@ -28,7 +28,7 @@ int reassign_keycache_tables(THD* thd, KEY_CACHE *src_cache,
/** /**
Sql_cmd_analyze_table represents the ANALYZE TABLE statement. Sql_cmd_analyze_table represents the ANALYZE TABLE statement.
*/ */
class Sql_cmd_analyze_table : public Sql_cmd class Sql_cmd_analyze_table : public Sql_cmd_admin
{ {
public: public:
/** /**
@ -53,7 +53,7 @@ public:
/** /**
Sql_cmd_check_table represents the CHECK TABLE statement. Sql_cmd_check_table represents the CHECK TABLE statement.
*/ */
class Sql_cmd_check_table : public Sql_cmd class Sql_cmd_check_table : public Sql_cmd_admin
{ {
public: public:
/** /**
@ -77,7 +77,7 @@ public:
/** /**
Sql_cmd_optimize_table represents the OPTIMIZE TABLE statement. Sql_cmd_optimize_table represents the OPTIMIZE TABLE statement.
*/ */
class Sql_cmd_optimize_table : public Sql_cmd class Sql_cmd_optimize_table : public Sql_cmd_admin
{ {
public: public:
/** /**
@ -102,7 +102,7 @@ public:
/** /**
Sql_cmd_repair_table represents the REPAIR TABLE statement. Sql_cmd_repair_table represents the REPAIR TABLE statement.
*/ */
class Sql_cmd_repair_table : public Sql_cmd class Sql_cmd_repair_table : public Sql_cmd_admin
{ {
public: public:
/** /**

View File

@ -303,8 +303,6 @@ bool Sql_cmd_alter_table::execute(THD *thd)
"INDEX DIRECTORY"); "INDEX DIRECTORY");
create_info.data_file_name= create_info.index_file_name= NULL; create_info.data_file_name= create_info.index_file_name= NULL;
thd->enable_slow_log= opt_log_slow_admin_statements;
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (WSREP(thd) && if (WSREP(thd) &&
(!thd->is_current_stmt_binlog_format_row() || (!thd->is_current_stmt_binlog_format_row() ||
@ -351,8 +349,6 @@ bool Sql_cmd_discard_import_tablespace::execute(THD *thd)
if (check_grant(thd, ALTER_ACL, table_list, false, UINT_MAX, false)) if (check_grant(thd, ALTER_ACL, table_list, false, UINT_MAX, false))
return true; return true;
thd->enable_slow_log= opt_log_slow_admin_statements;
/* /*
Check if we attempt to alter mysql.slow_log or Check if we attempt to alter mysql.slow_log or
mysql.general_log table and return an error if mysql.general_log table and return an error if

View File

@ -370,7 +370,7 @@ private:
statements. statements.
@todo move Alter_info and other ALTER generic structures from Lex here. @todo move Alter_info and other ALTER generic structures from Lex here.
*/ */
class Sql_cmd_common_alter_table : public Sql_cmd class Sql_cmd_common_alter_table : public Sql_cmd_admin
{ {
protected: protected:
/** /**

View File

@ -148,6 +148,8 @@ public:
*/ */
virtual bool execute(THD *thd) = 0; virtual bool execute(THD *thd) = 0;
virtual bool log_slow_enabled_statement(const THD *thd) const;
protected: protected:
Sql_cmd() Sql_cmd()
{} {}
@ -164,4 +166,17 @@ protected:
} }
}; };
class Sql_cmd_admin: public Sql_cmd
{
public:
Sql_cmd_admin()
{}
~Sql_cmd_admin()
{}
bool log_slow_enabled_statement(const THD *thd) const;
};
#endif // SQL_CMD_INCLUDED #endif // SQL_CMD_INCLUDED

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2000, 2010, Oracle and/or its affiliates. Copyright (c) 2000, 2010, Oracle and/or its affiliates.
Copyright (c) 2010, 2015, MariaDB Copyright (c) 2010, 2019, MariaDB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -41,7 +41,7 @@
#include "records.h" // init_read_record, #include "records.h" // init_read_record,
#include "filesort.h" #include "filesort.h"
#include "uniques.h" #include "uniques.h"
#include "sql_derived.h" // mysql_handle_list_of_derived #include "sql_derived.h" // mysql_handle_derived
// end_read_record // end_read_record
#include "sql_partition.h" // make_used_partitions_str #include "sql_partition.h" // make_used_partitions_str
@ -252,9 +252,9 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
if (open_and_lock_tables(thd, table_list, TRUE, 0)) if (open_and_lock_tables(thd, table_list, TRUE, 0))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (mysql_handle_list_of_derived(thd->lex, table_list, DT_MERGE_FOR_INSERT)) if (thd->lex->handle_list_of_derived(table_list, DT_MERGE_FOR_INSERT))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (mysql_handle_list_of_derived(thd->lex, table_list, DT_PREPARE)) if (thd->lex->handle_list_of_derived(table_list, DT_PREPARE))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (!table_list->single_table_updatable()) if (!table_list->single_table_updatable())

View File

@ -93,6 +93,7 @@ mysql_handle_derived(LEX *lex, uint phases)
sl= sl->next_select_in_list()) sl= sl->next_select_in_list())
{ {
TABLE_LIST *cursor= sl->get_table_list(); TABLE_LIST *cursor= sl->get_table_list();
sl->changed_elements|= TOUCHED_SEL_DERIVED;
/* /*
DT_MERGE_FOR_INSERT is not needed for views/derived tables inside DT_MERGE_FOR_INSERT is not needed for views/derived tables inside
subqueries. Views and derived tables of subqueries should be subqueries. Views and derived tables of subqueries should be
@ -202,36 +203,6 @@ mysql_handle_single_derived(LEX *lex, TABLE_LIST *derived, uint phases)
} }
/**
Run specified phases for derived tables/views in the given list
@param lex LEX for this thread
@param table_list list of derived tables/view to handle
@param phase_map phases to process tables/views through
@details
This function runs phases specified by the 'phases_map' on derived
tables/views found in the 'dt_list' with help of the
TABLE_LIST::handle_derived function.
'lex' is passed as an argument to the TABLE_LIST::handle_derived.
@return FALSE ok
@return TRUE error
*/
bool
mysql_handle_list_of_derived(LEX *lex, TABLE_LIST *table_list, uint phases)
{
for (TABLE_LIST *tl= table_list; tl; tl= tl->next_local)
{
if (tl->is_view_or_derived() &&
tl->handle_derived(lex, phases))
return TRUE;
}
return FALSE;
}
/** /**
Merge a derived table/view into the embedding select Merge a derived table/view into the embedding select

View File

@ -22,7 +22,6 @@ struct LEX;
bool mysql_handle_derived(LEX *lex, uint phases); bool mysql_handle_derived(LEX *lex, uint phases);
bool mysql_handle_single_derived(LEX *lex, TABLE_LIST *derived, uint phases); bool mysql_handle_single_derived(LEX *lex, TABLE_LIST *derived, uint phases);
bool mysql_handle_list_of_derived(LEX *lex, TABLE_LIST *dt_list, uint phases);
bool mysql_derived_reinit(THD *thd, LEX *lex, TABLE_LIST *derived); bool mysql_derived_reinit(THD *thd, LEX *lex, TABLE_LIST *derived);
/** /**

View File

@ -1482,7 +1482,7 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (table_list->handle_derived(thd->lex, DT_MERGE_FOR_INSERT)) if (table_list->handle_derived(thd->lex, DT_MERGE_FOR_INSERT))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (mysql_handle_list_of_derived(thd->lex, table_list, DT_PREPARE)) if (thd->lex->handle_list_of_derived(table_list, DT_PREPARE))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
/* /*
For subqueries in VALUES() we should not see the table in which we are For subqueries in VALUES() we should not see the table in which we are
@ -1568,7 +1568,6 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
select_lex->fix_prepare_information(thd, &fake_conds, &fake_conds); select_lex->fix_prepare_information(thd, &fake_conds, &fake_conds);
select_lex->first_execution= 0;
} }
/* /*
Only call prepare_for_posistion() if we are not performing a DELAYED Only call prepare_for_posistion() if we are not performing a DELAYED

View File

@ -2132,7 +2132,7 @@ void st_select_lex::init_query()
hidden_bit_fields= 0; hidden_bit_fields= 0;
subquery_in_having= explicit_limit= 0; subquery_in_having= explicit_limit= 0;
is_item_list_lookup= 0; is_item_list_lookup= 0;
first_execution= 1; changed_elements= 0;
first_natural_join_processing= 1; first_natural_join_processing= 1;
first_cond_optimization= 1; first_cond_optimization= 1;
parsing_place= NO_MATTER; parsing_place= NO_MATTER;
@ -3661,9 +3661,10 @@ void st_select_lex::fix_prepare_information(THD *thd, Item **conds,
Item **having_conds) Item **having_conds)
{ {
DBUG_ENTER("st_select_lex::fix_prepare_information"); DBUG_ENTER("st_select_lex::fix_prepare_information");
if (!thd->stmt_arena->is_conventional() && first_execution) if (!thd->stmt_arena->is_conventional() &&
!(changed_elements & TOUCHED_SEL_COND))
{ {
first_execution= 0; changed_elements|= TOUCHED_SEL_COND;
if (group_list.first) if (group_list.first)
{ {
if (!group_list_ptrs) if (!group_list_ptrs)
@ -3914,14 +3915,7 @@ bool st_select_lex::optimize_unflattened_subqueries(bool const_only)
bool st_select_lex::handle_derived(LEX *lex, uint phases) bool st_select_lex::handle_derived(LEX *lex, uint phases)
{ {
for (TABLE_LIST *cursor= (TABLE_LIST*) table_list.first; return lex->handle_list_of_derived(table_list.first, phases);
cursor;
cursor= cursor->next_local)
{
if (cursor->is_view_or_derived() && cursor->handle_derived(lex, phases))
return TRUE;
}
return FALSE;
} }
@ -4843,6 +4837,20 @@ bool LEX::is_partition_management() const
alter_info.flags == Alter_info::ALTER_REORGANIZE_PARTITION)); alter_info.flags == Alter_info::ALTER_REORGANIZE_PARTITION));
} }
bool Sql_cmd::log_slow_enabled_statement(const THD *thd) const
{
return global_system_variables.sql_log_slow && thd->variables.sql_log_slow;
}
bool Sql_cmd_admin::log_slow_enabled_statement(const THD *thd) const
{
return opt_log_slow_admin_statements &&
Sql_cmd::log_slow_enabled_statement(thd);
}
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
uint binlog_unsafe_map[256]; uint binlog_unsafe_map[256];

View File

@ -752,6 +752,10 @@ public:
:tmp_field(fld), producing_item(item) {} :tmp_field(fld), producing_item(item) {}
}; };
#define TOUCHED_SEL_COND 1/* WHERE/HAVING/ON should be reinited before use */
#define TOUCHED_SEL_DERIVED (1<<1)/* derived should be reinited before use */
/* /*
SELECT_LEX - store information of parsed SELECT statment SELECT_LEX - store information of parsed SELECT statment
*/ */
@ -926,7 +930,8 @@ public:
subquery. Prepared statements work OK in that regard, as in subquery. Prepared statements work OK in that regard, as in
case of an error during prepare the PS is not created. case of an error during prepare the PS is not created.
*/ */
bool first_execution; uint8 changed_elements; // see TOUCHED_SEL_*
/* TODO: add foloowing first_* to bitmap above */
bool first_natural_join_processing; bool first_natural_join_processing;
bool first_cond_optimization; bool first_cond_optimization;
/* do not wrap view fields with Item_ref */ /* do not wrap view fields with Item_ref */
@ -3157,6 +3162,31 @@ public:
*/ */
bool tmp_table() const { return create_info.tmp_table(); } bool tmp_table() const { return create_info.tmp_table(); }
bool if_exists() const { return create_info.if_exists(); } bool if_exists() const { return create_info.if_exists(); }
/*
Run specified phases for derived tables/views in the given list
@param table_list - list of derived tables/view to handle
@param phase - phases to process tables/views through
@details
This method runs phases specified by the 'phases' on derived
tables/views found in the 'table_list' with help of the
TABLE_LIST::handle_derived function.
'this' is passed as an argument to the TABLE_LIST::handle_derived.
@return false - ok
@return true - error
*/
bool handle_list_of_derived(TABLE_LIST *table_list, uint phases)
{
for (TABLE_LIST *tl= table_list; tl; tl= tl->next_local)
{
if (tl->is_view_or_derived() && tl->handle_derived(this, phases))
return true;
}
return false;
}
}; };

View File

@ -384,8 +384,9 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
if (open_and_lock_tables(thd, table_list, TRUE, 0)) if (open_and_lock_tables(thd, table_list, TRUE, 0))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (mysql_handle_single_derived(thd->lex, table_list, DT_MERGE_FOR_INSERT) || if (table_list->handle_derived(thd->lex, DT_MERGE_FOR_INSERT))
mysql_handle_single_derived(thd->lex, table_list, DT_PREPARE)) DBUG_RETURN(TRUE);
if (thd->lex->handle_list_of_derived(table_list, DT_PREPARE))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context, if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context,
&thd->lex->select_lex.top_join_list, &thd->lex->select_lex.top_join_list,
@ -401,6 +402,11 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
my_error(ER_NON_UPDATABLE_TABLE, MYF(0), table_list->alias, "LOAD"); my_error(ER_NON_UPDATABLE_TABLE, MYF(0), table_list->alias, "LOAD");
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
if (table_list->is_multitable())
{
my_error(ER_WRONG_USAGE, MYF(0), "Multi-table VIEW", "LOAD");
DBUG_RETURN(TRUE);
}
if (table_list->prepare_where(thd, 0, TRUE) || if (table_list->prepare_where(thd, 0, TRUE) ||
table_list->prepare_check_option(thd)) table_list->prepare_check_option(thd))
{ {

View File

@ -1616,7 +1616,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
Commands which always take a long time are logged into Commands which always take a long time are logged into
the slow log only if opt_log_slow_admin_statements is set. the slow log only if opt_log_slow_admin_statements is set.
*/ */
thd->enable_slow_log= thd->variables.sql_log_slow; thd->enable_slow_log= true;
thd->query_plan_flags= QPLAN_INIT; thd->query_plan_flags= QPLAN_INIT;
thd->lex->sql_command= SQLCOM_END; /* to avoid confusing VIEW detectors */ thd->lex->sql_command= SQLCOM_END; /* to avoid confusing VIEW detectors */
thd->reset_kill_query(); thd->reset_kill_query();
@ -2444,6 +2444,31 @@ com_multi_end:
} }
static bool log_slow_enabled_statement(const THD *thd)
{
/*
TODO-10.4: Add classes Sql_cmd_create_index and Sql_cmd_drop_index
for symmetry with other admin commands, so these statements can be
handled by this command:
*/
if (thd->lex->m_sql_cmd)
return thd->lex->m_sql_cmd->log_slow_enabled_statement(thd);
/*
Currently CREATE INDEX or DROP INDEX cause a full table rebuild
and thus classify as slow administrative statements just like
ALTER TABLE.
*/
if ((thd->lex->sql_command == SQLCOM_CREATE_INDEX ||
thd->lex->sql_command == SQLCOM_DROP_INDEX) &&
!opt_log_slow_admin_statements)
return true;
return global_system_variables.sql_log_slow &&
thd->variables.sql_log_slow;
}
/* /*
@note @note
This function must call delete_explain_query(). This function must call delete_explain_query().
@ -2460,13 +2485,18 @@ void log_slow_statement(THD *thd)
if (unlikely(thd->in_sub_stmt)) if (unlikely(thd->in_sub_stmt))
goto end; // Don't set time for sub stmt goto end; // Don't set time for sub stmt
/*
Skip both long_query_count increment and logging if the current
statement forces slow log suppression (e.g. an SP statement).
Note, we don't check for global_system_variables.sql_log_slow here.
According to the manual, the "Slow_queries" status variable does not require
sql_log_slow to be ON. So even if sql_log_slow is OFF, we still need to
continue and increment long_query_count (and skip only logging, see below):
*/
if (!thd->enable_slow_log)
goto end; // E.g. SP statement
/* Follow the slow log filter configuration. */
if (!thd->enable_slow_log || !global_system_variables.sql_log_slow ||
(thd->variables.log_slow_filter
&& !(thd->variables.log_slow_filter & thd->query_plan_flags)))
goto end;
if (((thd->server_status & SERVER_QUERY_WAS_SLOW) || if (((thd->server_status & SERVER_QUERY_WAS_SLOW) ||
((thd->server_status & ((thd->server_status &
(SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) && (SERVER_QUERY_NO_INDEX_USED | SERVER_QUERY_NO_GOOD_INDEX_USED)) &&
@ -2475,6 +2505,10 @@ void log_slow_statement(THD *thd)
thd->get_examined_row_count() >= thd->variables.min_examined_row_limit) thd->get_examined_row_count() >= thd->variables.min_examined_row_limit)
{ {
thd->status_var.long_query_count++; thd->status_var.long_query_count++;
if (!log_slow_enabled_statement(thd))
goto end;
/* /*
If rate limiting of slow log writes is enabled, decide whether to log If rate limiting of slow log writes is enabled, decide whether to log
this query to the log or not. this query to the log or not.
@ -2483,6 +2517,14 @@ void log_slow_statement(THD *thd)
(global_query_id % thd->variables.log_slow_rate_limit) != 0) (global_query_id % thd->variables.log_slow_rate_limit) != 0)
goto end; goto end;
/*
Follow the slow log filter configuration:
skip logging if the current statement matches the filter.
*/
if (thd->variables.log_slow_filter &&
!(thd->variables.log_slow_filter & thd->query_plan_flags))
goto end;
THD_STAGE_INFO(thd, stage_logging_slow_query); THD_STAGE_INFO(thd, stage_logging_slow_query);
slow_log_print(thd, thd->query(), thd->query_length(), slow_log_print(thd, thd->query(), thd->query_length(),
thd->utime_after_query); thd->utime_after_query);
@ -4033,12 +4075,6 @@ end_with_restore_list:
if (check_one_table_access(thd, INDEX_ACL, all_tables)) if (check_one_table_access(thd, INDEX_ACL, all_tables))
goto error; /* purecov: inspected */ goto error; /* purecov: inspected */
WSREP_TO_ISOLATION_BEGIN(first_table->db, first_table->table_name, NULL) WSREP_TO_ISOLATION_BEGIN(first_table->db, first_table->table_name, NULL)
/*
Currently CREATE INDEX or DROP INDEX cause a full table rebuild
and thus classify as slow administrative statements just like
ALTER TABLE.
*/
thd->enable_slow_log&= opt_log_slow_admin_statements;
thd->query_plan_flags|= QPLAN_ADMIN; thd->query_plan_flags|= QPLAN_ADMIN;
bzero((char*) &create_info, sizeof(create_info)); bzero((char*) &create_info, sizeof(create_info));

View File

@ -91,7 +91,6 @@ bool Sql_cmd_alter_table_exchange_partition::execute(THD *thd)
DBUG_ASSERT(!create_info.data_file_name && !create_info.index_file_name); DBUG_ASSERT(!create_info.data_file_name && !create_info.index_file_name);
WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table); WSREP_TO_ISOLATION_BEGIN_WRTCHK(NULL, NULL, first_table);
thd->enable_slow_log= opt_log_slow_admin_statements;
DBUG_RETURN(exchange_partition(thd, first_table, &alter_info)); DBUG_RETURN(exchange_partition(thd, first_table, &alter_info));
#ifdef WITH_WSREP #ifdef WITH_WSREP
wsrep_error_label: wsrep_error_label:

View File

@ -1,5 +1,5 @@
/* Copyright (c) 2002, 2015, Oracle and/or its affiliates. /* Copyright (c) 2002, 2015, Oracle and/or its affiliates.
Copyright (c) 2008, 2017, MariaDB Copyright (c) 2008, 2019, MariaDB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -2944,7 +2944,7 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
} }
for (; sl; sl= sl->next_select_in_list()) for (; sl; sl= sl->next_select_in_list())
{ {
if (!sl->first_execution) if (sl->changed_elements & TOUCHED_SEL_COND)
{ {
/* remove option which was put by mysql_explain_union() */ /* remove option which was put by mysql_explain_union() */
sl->options&= ~SELECT_DESCRIBE; sl->options&= ~SELECT_DESCRIBE;
@ -2991,8 +2991,13 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
order->next= sl->group_list_ptrs->at(ix+1); order->next= sl->group_list_ptrs->at(ix+1);
} }
} }
}
{ // no harm to do it (item_ptr set on parsing)
ORDER *order;
for (order= sl->group_list.first; order; order= order->next) for (order= sl->group_list.first; order; order= order->next)
{
order->item= &order->item_ptr; order->item= &order->item_ptr;
}
/* Fix ORDER list */ /* Fix ORDER list */
for (order= sl->order_list.first; order; order= order->next) for (order= sl->order_list.first; order; order= order->next)
order->item= &order->item_ptr; order->item= &order->item_ptr;
@ -3006,15 +3011,16 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
for (order= win_spec->order_list->first; order; order= order->next) for (order= win_spec->order_list->first; order; order= order->next)
order->item= &order->item_ptr; order->item= &order->item_ptr;
} }
{
#ifndef DBUG_OFF
bool res=
#endif
sl->handle_derived(lex, DT_REINIT);
DBUG_ASSERT(res == 0);
}
} }
if (sl->changed_elements & TOUCHED_SEL_DERIVED)
{
#ifndef DBUG_OFF
bool res=
#endif
sl->handle_derived(lex, DT_REINIT);
DBUG_ASSERT(res == 0);
}
{ {
SELECT_LEX_UNIT *unit= sl->master_unit(); SELECT_LEX_UNIT *unit= sl->master_unit();
unit->unclean(); unit->unclean();

View File

@ -1,5 +1,5 @@
/* Copyright (c) 2000, 2016 Oracle and/or its affiliates. /* Copyright (c) 2000, 2016 Oracle and/or its affiliates.
Copyright (c) 2009, 2018 MariaDB Corporation Copyright (c) 2009, 2019 MariaDB Corporation
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -898,7 +898,7 @@ JOIN::prepare(TABLE_LIST *tables_init,
select_lex->check_unrestricted_recursive( select_lex->check_unrestricted_recursive(
thd->variables.only_standard_compliant_cte)) thd->variables.only_standard_compliant_cte))
DBUG_RETURN(-1); DBUG_RETURN(-1);
if (select_lex->first_execution) if (!(select_lex->changed_elements & TOUCHED_SEL_COND))
select_lex->check_subqueries_with_recursive_references(); select_lex->check_subqueries_with_recursive_references();
int res= check_and_do_in_subquery_rewrites(this); int res= check_and_do_in_subquery_rewrites(this);

View File

@ -417,8 +417,9 @@ st_select_lex_unit::init_prepare_fake_select_lex(THD *thd_arg,
called at the first execution of the statement, while first_execution called at the first execution of the statement, while first_execution
shows whether this is called at the first execution of the union that shows whether this is called at the first execution of the union that
may form just a subselect. may form just a subselect.
*/ */
if (!fake_select_lex->first_execution && first_execution) if ((fake_select_lex->changed_elements & TOUCHED_SEL_COND) &&
first_execution)
{ {
for (ORDER *order= global_parameters()->order_list.first; for (ORDER *order= global_parameters()->order_list.first;
order; order;

View File

@ -4,7 +4,7 @@ Copyright (c) 2000, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2008, 2009 Google Inc.
Copyright (c) 2009, Percona Inc. Copyright (c) 2009, Percona Inc.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
Copyright (c) 2013, 2018, MariaDB Corporation. Copyright (c) 2013, 2019, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described Google, Inc. Those modifications are gratefully acknowledged and are described
@ -708,9 +708,25 @@ static MYSQL_THDVAR_BOOL(compression_default, PLUGIN_VAR_OPCMDARG,
"Is compression the default for new tables", "Is compression the default for new tables",
NULL, NULL, FALSE); NULL, NULL, FALSE);
/** Update callback for SET [SESSION] innodb_default_encryption_key_id */
static void
innodb_default_encryption_key_id_update(THD* thd, st_mysql_sys_var* var,
void* var_ptr, const void *save)
{
uint key_id = *static_cast<const uint*>(save);
if (key_id != FIL_DEFAULT_ENCRYPTION_KEY
&& !encryption_key_id_exists(key_id)) {
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_WRONG_ARGUMENTS,
"innodb_default_encryption_key=%u"
" is not available", key_id);
}
*static_cast<uint*>(var_ptr) = key_id;
}
static MYSQL_THDVAR_UINT(default_encryption_key_id, PLUGIN_VAR_RQCMDARG, static MYSQL_THDVAR_UINT(default_encryption_key_id, PLUGIN_VAR_RQCMDARG,
"Default encryption key id used for table encryption.", "Default encryption key id used for table encryption.",
NULL, NULL, NULL, innodb_default_encryption_key_id_update,
FIL_DEFAULT_ENCRYPTION_KEY, 1, UINT_MAX32, 0); FIL_DEFAULT_ENCRYPTION_KEY, 1, UINT_MAX32, 0);
/** /**
@ -11284,8 +11300,8 @@ err_col:
if (err == DB_SUCCESS) { if (err == DB_SUCCESS) {
err = row_create_table_for_mysql( err = row_create_table_for_mysql(
table, m_trx, table, m_trx,
(fil_encryption_t)options->encryption, fil_encryption_t(options->encryption),
(uint32_t)options->encryption_key_id); options->encryption_key_id);
m_drop_before_rollback = (err == DB_SUCCESS); m_drop_before_rollback = (err == DB_SUCCESS);
} }
@ -11757,25 +11773,61 @@ const char*
create_table_info_t::check_table_options() create_table_info_t::check_table_options()
{ {
enum row_type row_format = m_create_info->row_type; enum row_type row_format = m_create_info->row_type;
ha_table_option_struct *options= m_form->s->option_struct; const ha_table_option_struct *options= m_form->s->option_struct;
fil_encryption_t encrypt = (fil_encryption_t)options->encryption;
bool should_encrypt = (encrypt == FIL_ENCRYPTION_ON);
/* Currently we do not support encryption for switch (options->encryption) {
spatial indexes thus do not allow creating table with forced case FIL_ENCRYPTION_OFF:
encryption */ if (options->encryption_key_id != FIL_DEFAULT_ENCRYPTION_KEY) {
for(ulint i = 0; i < m_form->s->keys; i++) { push_warning(
const KEY* key = m_form->key_info + i; m_thd, Sql_condition::WARN_LEVEL_WARN,
if (key->flags & HA_SPATIAL && should_encrypt) { HA_WRONG_CREATE_OPTION,
push_warning_printf(m_thd, Sql_condition::WARN_LEVEL_WARN, "InnoDB: ENCRYPTED=NO implies"
HA_ERR_UNSUPPORTED, " ENCRYPTION_KEY_ID=1");
"InnoDB: ENCRYPTED=ON not supported for table because " compile_time_assert(FIL_DEFAULT_ENCRYPTION_KEY == 1);
"it contains spatial index."); }
return "ENCRYPTED"; if (srv_encrypt_tables != 2) {
break;
}
push_warning(
m_thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: ENCRYPTED=NO cannot be used with"
" innodb_encrypt_tables=FORCE");
return "ENCRYPTED";
case FIL_ENCRYPTION_DEFAULT:
if (!srv_encrypt_tables) {
break;
}
/* fall through */
case FIL_ENCRYPTION_ON:
if (!encryption_key_id_exists(options->encryption_key_id)) {
push_warning_printf(
m_thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: ENCRYPTION_KEY_ID %u not available",
options->encryption_key_id);
return "ENCRYPTION_KEY_ID";
}
/* Currently we do not support encryption for spatial indexes.
Do not allow ENCRYPTED=YES if any SPATIAL INDEX exists. */
if (options->encryption != FIL_ENCRYPTION_ON) {
break;
}
for (ulint i = 0; i < m_form->s->keys; i++) {
if (m_form->key_info[i].flags & HA_SPATIAL) {
push_warning(m_thd,
Sql_condition::WARN_LEVEL_WARN,
HA_ERR_UNSUPPORTED,
"InnoDB: ENCRYPTED=YES is not"
" supported for SPATIAL INDEX");
return "ENCRYPTED";
}
} }
} }
if (encrypt != FIL_ENCRYPTION_DEFAULT && !m_allow_file_per_table) { if (!m_allow_file_per_table
&& options->encryption != FIL_ENCRYPTION_DEFAULT) {
push_warning( push_warning(
m_thd, Sql_condition::WARN_LEVEL_WARN, m_thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION, HA_WRONG_CREATE_OPTION,
@ -11783,14 +11835,6 @@ create_table_info_t::check_table_options()
return "ENCRYPTED"; return "ENCRYPTED";
} }
if (encrypt == FIL_ENCRYPTION_OFF && srv_encrypt_tables == 2) {
push_warning(
m_thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: ENCRYPTED=OFF cannot be used when innodb_encrypt_tables=FORCE");
return "ENCRYPTED";
}
/* Check page compression requirements */ /* Check page compression requirements */
if (options->page_compressed) { if (options->page_compressed) {
@ -11872,46 +11916,6 @@ create_table_info_t::check_table_options()
} }
} }
/* If encryption is set up make sure that used key_id is found */
if (encrypt == FIL_ENCRYPTION_ON ||
(encrypt == FIL_ENCRYPTION_DEFAULT && srv_encrypt_tables)) {
if (!encryption_key_id_exists((unsigned int)options->encryption_key_id)) {
push_warning_printf(
m_thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: ENCRYPTION_KEY_ID %u not available",
(uint)options->encryption_key_id
);
return "ENCRYPTION_KEY_ID";
}
}
/* Ignore nondefault key_id if encryption is set off */
if (encrypt == FIL_ENCRYPTION_OFF &&
options->encryption_key_id != THDVAR(m_thd, default_encryption_key_id)) {
push_warning_printf(
m_thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: Ignored ENCRYPTION_KEY_ID %u when encryption is disabled",
(uint)options->encryption_key_id
);
options->encryption_key_id = FIL_DEFAULT_ENCRYPTION_KEY;
}
/* If default encryption is used and encryption is disabled, you may
not use nondefault encryption_key_id as it is not stored anywhere. */
if (encrypt == FIL_ENCRYPTION_DEFAULT
&& !srv_encrypt_tables
&& options->encryption_key_id != FIL_DEFAULT_ENCRYPTION_KEY) {
compile_time_assert(FIL_DEFAULT_ENCRYPTION_KEY == 1);
push_warning_printf(
m_thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: innodb_encrypt_tables=OFF only allows ENCRYPTION_KEY_ID=1"
);
return "ENCRYPTION_KEY_ID";
}
return NULL; return NULL;
} }

View File

@ -644,12 +644,24 @@ ha_innobase::check_if_supported_inplace_alter(
NULL to a NOT NULL value. */ NULL to a NOT NULL value. */
if ((ha_alter_info->handler_flags if ((ha_alter_info->handler_flags
& Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE) & Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE)
&& !thd_is_strict_mode(m_user_thd)) { && (ha_alter_info->ignore || !thd_is_strict_mode(m_user_thd))) {
ha_alter_info->unsupported_reason = innobase_get_err_msg( ha_alter_info->unsupported_reason = innobase_get_err_msg(
ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL); ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL);
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
} }
/* InnoDB cannot IGNORE when creating unique indexes. IGNORE
should silently delete some duplicate rows. Our inplace_alter
code will not delete anything from existing indexes. */
if (ha_alter_info->ignore
&& (ha_alter_info->handler_flags
& (Alter_inplace_info::ADD_PK_INDEX
| Alter_inplace_info::ADD_UNIQUE_INDEX))) {
ha_alter_info->unsupported_reason = innobase_get_err_msg(
ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_IGNORE);
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
}
/* DROP PRIMARY KEY is only allowed in combination with ADD /* DROP PRIMARY KEY is only allowed in combination with ADD
PRIMARY KEY. */ PRIMARY KEY. */
if ((ha_alter_info->handler_flags if ((ha_alter_info->handler_flags

View File

@ -5,7 +5,7 @@ Copyright (c) 2013, 2018, MariaDB Corporation.
Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2008, 2009 Google Inc.
Copyright (c) 2009, Percona Inc. Copyright (c) 2009, Percona Inc.
Copyright (c) 2012, Facebook Inc. Copyright (c) 2012, Facebook Inc.
Copyright (c) 2013, 2018, MariaDB Corporation. Copyright (c) 2013, 2019, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described Google, Inc. Those modifications are gratefully acknowledged and are described
@ -692,9 +692,25 @@ ib_cb_t innodb_api_cb[] = {
static void innodb_remember_check_sysvar_funcs(); static void innodb_remember_check_sysvar_funcs();
mysql_var_check_func check_sysvar_enum; mysql_var_check_func check_sysvar_enum;
/** Update callback for SET [SESSION] innodb_default_encryption_key_id */
static void
innodb_default_encryption_key_id_update(THD* thd, st_mysql_sys_var* var,
void* var_ptr, const void *save)
{
uint key_id = *static_cast<const uint*>(save);
if (key_id != FIL_DEFAULT_ENCRYPTION_KEY
&& !encryption_key_id_exists(key_id)) {
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_WRONG_ARGUMENTS,
"innodb_default_encryption_key=%u"
" is not available", key_id);
}
*static_cast<uint*>(var_ptr) = key_id;
}
static MYSQL_THDVAR_UINT(default_encryption_key_id, PLUGIN_VAR_RQCMDARG, static MYSQL_THDVAR_UINT(default_encryption_key_id, PLUGIN_VAR_RQCMDARG,
"Default encryption key id used for table encryption.", "Default encryption key id used for table encryption.",
NULL, NULL, NULL, innodb_default_encryption_key_id_update,
FIL_DEFAULT_ENCRYPTION_KEY, 1, UINT_MAX32, 0); FIL_DEFAULT_ENCRYPTION_KEY, 1, UINT_MAX32, 0);
/** /**
@ -11357,8 +11373,7 @@ create_table_def(
const char* remote_path, /*!< in: Remote path or zero length-string */ const char* remote_path, /*!< in: Remote path or zero length-string */
ulint flags, /*!< in: table flags */ ulint flags, /*!< in: table flags */
ulint flags2, /*!< in: table flags2 */ ulint flags2, /*!< in: table flags2 */
fil_encryption_t mode, /*!< in: encryption mode */ const ha_table_option_struct*options)
ulint key_id) /*!< in: encryption key_id */
{ {
THD* thd = trx->mysql_thd; THD* thd = trx->mysql_thd;
dict_table_t* table; dict_table_t* table;
@ -11549,7 +11564,9 @@ err_col:
fts_add_doc_id_column(table, heap); fts_add_doc_id_column(table, heap);
} }
err = row_create_table_for_mysql(table, trx, false, mode, key_id); err = row_create_table_for_mysql(table, trx, false,
fil_encryption_t(options->encryption),
options->encryption_key_id);
mem_heap_free(heap); mem_heap_free(heap);
@ -12380,21 +12397,47 @@ ha_innobase::check_table_options(
enum row_type row_format = table->s->row_type; enum row_type row_format = table->s->row_type;
ha_table_option_struct *options= table->s->option_struct; ha_table_option_struct *options= table->s->option_struct;
atomic_writes_t awrites = (atomic_writes_t)options->atomic_writes; atomic_writes_t awrites = (atomic_writes_t)options->atomic_writes;
fil_encryption_t encrypt = (fil_encryption_t)options->encryption;
if (encrypt != FIL_ENCRYPTION_DEFAULT && !use_tablespace) { switch (options->encryption) {
case FIL_ENCRYPTION_OFF:
if (options->encryption_key_id != FIL_DEFAULT_ENCRYPTION_KEY) {
push_warning(
thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: ENCRYPTED=NO implies"
" ENCRYPTION_KEY_ID=1");
compile_time_assert(FIL_DEFAULT_ENCRYPTION_KEY == 1);
}
if (srv_encrypt_tables != 2) {
break;
}
push_warning( push_warning(
thd, Sql_condition::WARN_LEVEL_WARN, thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION, HA_WRONG_CREATE_OPTION,
"InnoDB: ENCRYPTED requires innodb_file_per_table"); "InnoDB: ENCRYPTED=NO cannot be used with"
" innodb_encrypt_tables=FORCE");
return "ENCRYPTED"; return "ENCRYPTED";
case FIL_ENCRYPTION_DEFAULT:
if (!srv_encrypt_tables) {
break;
}
/* fall through */
case FIL_ENCRYPTION_ON:
if (!encryption_key_id_exists(options->encryption_key_id)) {
push_warning_printf(
thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: ENCRYPTION_KEY_ID %u not available",
options->encryption_key_id);
return "ENCRYPTION_KEY_ID";
}
} }
if (encrypt == FIL_ENCRYPTION_OFF && srv_encrypt_tables == 2) { if (!use_tablespace && options->encryption != FIL_ENCRYPTION_DEFAULT) {
push_warning( push_warning(thd, Sql_condition::WARN_LEVEL_WARN,
thd, Sql_condition::WARN_LEVEL_WARN, HA_WRONG_CREATE_OPTION,
HA_WRONG_CREATE_OPTION, "InnoDB: ENCRYPTED requires"
"InnoDB: ENCRYPTED=OFF cannot be used when innodb_encrypt_tables=FORCE"); " innodb_file_per_table");
return "ENCRYPTED"; return "ENCRYPTED";
} }
@ -12470,47 +12513,6 @@ ha_innobase::check_table_options(
} }
} }
/* If encryption is set up make sure that used key_id is found */
if (encrypt == FIL_ENCRYPTION_ON ||
(encrypt == FIL_ENCRYPTION_DEFAULT && srv_encrypt_tables)) {
if (!encryption_key_id_exists((unsigned int)options->encryption_key_id)) {
push_warning_printf(
thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: ENCRYPTION_KEY_ID %u not available",
(uint)options->encryption_key_id
);
return "ENCRYPTION_KEY_ID";
}
}
/* Ignore nondefault key_id if encryption is set off */
if (encrypt == FIL_ENCRYPTION_OFF &&
options->encryption_key_id != THDVAR(thd, default_encryption_key_id)) {
push_warning_printf(
thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: Ignored ENCRYPTION_KEY_ID %u when encryption is disabled",
(uint)options->encryption_key_id
);
options->encryption_key_id = FIL_DEFAULT_ENCRYPTION_KEY;
}
/* If default encryption is used and encryption is disabled, you may
not use nondefault encryption_key_id as it is not stored anywhere. */
if (encrypt == FIL_ENCRYPTION_DEFAULT
&& !srv_encrypt_tables
&& options->encryption_key_id != FIL_DEFAULT_ENCRYPTION_KEY) {
compile_time_assert(FIL_DEFAULT_ENCRYPTION_KEY == 1);
push_warning_printf(
thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION,
"InnoDB: innodb_encrypt_tables=OFF only allows ENCRYPTION_KEY_ID=1"
);
return "ENCRYPTION_KEY_ID";
}
/* Check atomic writes requirements */ /* Check atomic writes requirements */
if (awrites == ATOMIC_WRITES_ON || if (awrites == ATOMIC_WRITES_ON ||
(awrites == ATOMIC_WRITES_DEFAULT && srv_use_atomic_writes)) { (awrites == ATOMIC_WRITES_DEFAULT && srv_use_atomic_writes)) {
@ -12568,10 +12570,6 @@ ha_innobase::create(
const char* stmt; const char* stmt;
size_t stmt_len; size_t stmt_len;
/* Cache table options */
ha_table_option_struct *options= form->s->option_struct;
fil_encryption_t encrypt = (fil_encryption_t)options->encryption;
uint key_id = (uint)options->encryption_key_id;
DBUG_ENTER("ha_innobase::create"); DBUG_ENTER("ha_innobase::create");
@ -12594,7 +12592,7 @@ ha_innobase::create(
/* Validate create options if innodb_strict_mode is set. */ /* Validate create options if innodb_strict_mode is set. */
if (create_options_are_invalid( if (create_options_are_invalid(
thd, form, create_info, use_tablespace)) { thd, form, create_info, use_tablespace)) {
DBUG_RETURN(HA_WRONG_CREATE_OPTION); DBUG_RETURN(HA_WRONG_CREATE_OPTION);
} }
@ -12670,7 +12668,8 @@ ha_innobase::create(
row_mysql_lock_data_dictionary(trx); row_mysql_lock_data_dictionary(trx);
error = create_table_def(trx, form, norm_name, temp_path, error = create_table_def(trx, form, norm_name, temp_path,
remote_path, flags, flags2, encrypt, key_id); remote_path, flags, flags2,
form->s->option_struct);
if (error) { if (error) {
goto cleanup; goto cleanup;
} }

View File

@ -332,7 +332,7 @@ ha_innobase::check_if_supported_inplace_alter(
NULL to a NOT NULL value. */ NULL to a NOT NULL value. */
if ((ha_alter_info->handler_flags if ((ha_alter_info->handler_flags
& Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE) & Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE)
&& !thd_is_strict_mode(user_thd)) { && (ha_alter_info->ignore || !thd_is_strict_mode(user_thd))) {
ha_alter_info->unsupported_reason = innobase_get_err_msg( ha_alter_info->unsupported_reason = innobase_get_err_msg(
ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL); ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL);
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);

View File

@ -398,9 +398,10 @@ IF("$ENV{EXTRA_LIGHT_ARGS}")
ENDIF() ENDIF()
FILE(REMOVE mysql_server.wixobj extra.wixobj) FILE(REMOVE mysql_server.wixobj extra.wixobj)
STRING(REPLACE " " ";" EXTRA_WIX_PREPROCESSOR_FLAGS_LIST ${EXTRA_WIX_PREPROCESSOR_FLAGS})
EXECUTE_PROCESS( EXECUTE_PROCESS(
COMMAND ${CANDLE_EXECUTABLE} COMMAND ${CANDLE_EXECUTABLE}
${EXTRA_WIX_PREPROCESSOR_FLAGS} ${EXTRA_WIX_PREPROCESSOR_FLAGS_LIST}
${CANDLE_ARCH} ${CANDLE_ARCH}
-ext WixUtilExtension -ext WixUtilExtension
-ext WixFirewallExtension -ext WixFirewallExtension
@ -410,7 +411,7 @@ EXECUTE_PROCESS(
EXECUTE_PROCESS( EXECUTE_PROCESS(
COMMAND ${CANDLE_EXECUTABLE} ${CANDLE_ARCH} COMMAND ${CANDLE_EXECUTABLE} ${CANDLE_ARCH}
${EXTRA_WIX_PREPROCESSOR_FLAGS} ${EXTRA_WIX_PREPROCESSOR_FLAGS_LIST}
-ext WixUtilExtension -ext WixUtilExtension
-ext WixFirewallExtension -ext WixFirewallExtension
${CMAKE_CURRENT_BINARY_DIR}/extra.wxs ${CMAKE_CURRENT_BINARY_DIR}/extra.wxs