diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-02-15 11:48:30 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-02-15 11:48:30 +0200 |
commit | cc3b5d1fe75cf1d9b83b7918151f8d90e9263d34 (patch) | |
tree | 126aa92625cbe953175cefec87dbd92d97ce7a54 | |
parent | b006d2ead4640f0ab4e29687fd7d24988b1c98f1 (diff) | |
parent | 22770a9f9a7fb4c30dbdc204e5a8f829303b7373 (diff) | |
download | mariadb-git-cc3b5d1fe75cf1d9b83b7918151f8d90e9263d34.tar.gz |
Merge bb-10.2-ext into 10.3
54 files changed, 1272 insertions, 356 deletions
diff --git a/include/my_time.h b/include/my_time.h index 661e9fa8020..2638b18d027 100644 --- a/include/my_time.h +++ b/include/my_time.h @@ -134,9 +134,6 @@ ulonglong TIME_to_ulonglong_time(const MYSQL_TIME *); ulonglong TIME_to_ulonglong(const MYSQL_TIME *); double TIME_to_double(const MYSQL_TIME *my_time); -longlong pack_time(const MYSQL_TIME *my_time); -MYSQL_TIME *unpack_time(longlong packed, MYSQL_TIME *my_time); - int check_time_range(struct st_mysql_time *my_time, uint dec, int *warning); my_bool check_datetime_range(const MYSQL_TIME *ltime); diff --git a/mysql-test/r/type_datetime.result b/mysql-test/r/type_datetime.result index 95e421821c1..74b761a2e8f 100644 --- a/mysql-test/r/type_datetime.result +++ b/mysql-test/r/type_datetime.result @@ -1218,5 +1218,86 @@ a DROP TABLE t1; SET timestamp=DEFAULT; # +# MDEV-15310 Range optimizer does not work well for "WHERE temporal_column NOT IN (const_list)" +# +# +# DATETIME(0) +# +CREATE TABLE t1 (a DATETIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:02', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:03', 'yes'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('2001-01-01 23:00:01','2001-01-01 23:00:02'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 6 NULL 5 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('2001-01-01 23:00:01','2001-01-01 23:00:02'); +a filler +2001-01-01 23:00:03 yes +2001-01-01 23:00:04 yes +DROP TABLE t1; +# +# DATETIME(1) +# +CREATE TABLE t1 (a DATETIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:02.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('2001-01-01 23:00:01.1','2001-01-01 23:00:02.1'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 7 NULL 5 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('2001-01-01 23:00:01.1','2001-01-01 23:00:02.1'); +a filler +2001-01-01 23:00:03.1 yes +2001-01-01 23:00:04.1 yes +DROP TABLE t1; +# # End of 10.3 tests # diff --git a/mysql-test/r/type_time.result b/mysql-test/r/type_time.result index c08575776e9..3f34ae6c09b 100644 --- a/mysql-test/r/type_time.result +++ b/mysql-test/r/type_time.result @@ -1529,3 +1529,396 @@ ORDER BY country, dt; dt country amount first t_first last t_last 2000-01-01 DE 102 2000-01-01 00:00:00 2000-01-01 00:00:00 DROP TABLE t1; +# +# MDEV-15310 Range optimizer does not work well for "WHERE temporal_column NOT IN (const_list)" +# +# +# TIME(0), positive within 24 hour +# +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:02', 'no'); +INSERT INTO t1 VALUES ('23:00:03', 'yes'); +INSERT INTO t1 VALUES ('23:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('23:00:01','23:00:02'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 4 NULL 5 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('23:00:01','23:00:02'); +a filler +23:00:03 yes +23:00:04 yes +DROP TABLE t1; +# +# TIME(0), negative +# +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:02', 'no'); +INSERT INTO t1 VALUES ('-23:00:03', 'yes'); +INSERT INTO t1 VALUES ('-23:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-23:00:01','-23:00:02'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 4 NULL 4 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('-23:00:01','-23:00:02'); +a filler +-23:00:04 yes +-23:00:03 yes +DROP TABLE t1; +# +# TIME(0), positive ouside 24 hours +# +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:02', 'no'); +INSERT INTO t1 VALUES ('24:00:03', 'yes'); +INSERT INTO t1 VALUES ('24:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('24:00:01','24:00:02'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 4 NULL 5 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('24:00:01','24:00:02'); +a filler +24:00:03 yes +24:00:04 yes +DROP TABLE t1; +# +# TIME(0), negative, ouside 24 hours +# +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:02', 'no'); +INSERT INTO t1 VALUES ('-24:00:03', 'yes'); +INSERT INTO t1 VALUES ('-24:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-24:00:01','-24:00:02'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 4 NULL 4 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('-24:00:01','-24:00:02'); +a filler +-24:00:04 yes +-24:00:03 yes +DROP TABLE t1; +# +# TIME(0), positive, huge +# +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:02', 'no'); +INSERT INTO t1 VALUES ('838:00:03', 'yes'); +INSERT INTO t1 VALUES ('838:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('838:00:01','838:00:02'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 4 NULL 5 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('838:00:01','838:00:02'); +a filler +838:00:03 yes +838:00:04 yes +DROP TABLE t1; +# +# TIME(0), negative, huge +# +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:02', 'no'); +INSERT INTO t1 VALUES ('-838:00:03', 'yes'); +INSERT INTO t1 VALUES ('-838:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-838:00:01','-838:00:02'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 4 NULL 4 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('-838:00:01','-838:00:02'); +a filler +-838:00:04 yes +-838:00:03 yes +DROP TABLE t1; +# +# TIME(1), positive within 24 hours +# +CREATE TABLE t1 (a TIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:02.1', 'no'); +INSERT INTO t1 VALUES ('23:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('23:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('23:00:01.1','23:00:02.1'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 5 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('23:00:01.1','23:00:02.1'); +a filler +23:00:03.1 yes +23:00:04.1 yes +DROP TABLE t1; +# +# TIME(1), negative within 24 hours +# +CREATE TABLE t1 (a TIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:02.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('-23:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-23:00:01.1','-23:00:02.1'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 4 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('-23:00:01.1','-23:00:02.1'); +a filler +-23:00:04.1 yes +-23:00:03.1 yes +DROP TABLE t1; +# +# TIME(1), positive, huge +# +CREATE TABLE t1 (a TIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:02.1', 'no'); +INSERT INTO t1 VALUES ('838:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('838:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('838:00:01.1','838:00:02.1'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 5 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('838:00:01.1','838:00:02.1'); +a filler +838:00:03.1 yes +838:00:04.1 yes +DROP TABLE t1; +# +# TIME(1), negative, huge +# +CREATE TABLE t1 (a TIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:02.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('-838:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-838:00:01.1','-838:00:02.1'); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range a a 5 NULL 4 Using index condition +SELECT * FROM t1 WHERE a NOT IN ('-838:00:01.1','-838:00:02.1'); +a filler +-838:00:04.1 yes +-838:00:03.1 yes +DROP TABLE t1; diff --git a/mysql-test/suite/sql_sequence/grant.result b/mysql-test/suite/sql_sequence/grant.result new file mode 100644 index 00000000000..7085d548588 --- /dev/null +++ b/mysql-test/suite/sql_sequence/grant.result @@ -0,0 +1,60 @@ +SET @@SQL_MODE = REPLACE(@@SQL_MODE, 'NO_AUTO_CREATE_USER', ''); +create database mysqltest_1; +use mysqltest_1; +grant all on mysqltest_1.* to 'normal'@'%'; +grant select on mysqltest_1.* to 'read_only'@'%'; +grant select,insert on mysqltest_1.* to 'read_write'@'%'; +grant select,insert,alter on mysqltest_1.* to 'alter'@'%'; +grant alter on mysqltest_1.* to only_alter@'%'; +connect normal,localhost,normal,,mysqltest_1; +connect read_only,localhost,read_only,,mysqltest_1; +connect read_write,localhost,read_write,,mysqltest_1; +connect alter,localhost,alter,,mysqltest_1; +connect only_alter, localhost, only_alter,,mysqltest_1; +connection normal; +create sequence s1; +select next value for s1; +next value for s1 +1 +alter sequence s1 restart= 11; +select * from s1; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +11 1 9223372036854775806 1 1 1000 0 0 +connection read_only; +select next value for s1; +ERROR 42000: INSERT command denied to user 'read_only'@'localhost' for table 's1' +alter sequence s1 restart= 11; +ERROR 42000: ALTER command denied to user 'read_only'@'localhost' for table 's1' +select * from s1; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +11 1 9223372036854775806 1 1 1000 0 0 +connection read_write; +select next value for s1; +next value for s1 +11 +alter sequence s1 restart= 11; +ERROR 42000: ALTER command denied to user 'read_write'@'localhost' for table 's1' +select * from s1; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +1011 1 9223372036854775806 1 1 1000 0 0 +connection alter; +select next value for s1; +next value for s1 +12 +alter sequence s1 restart= 11; +select * from s1; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +11 1 9223372036854775806 1 1 1000 0 0 +connection only_alter; +select next value for s1; +ERROR 42000: INSERT command denied to user 'only_alter'@'localhost' for table 's1' +alter sequence s1 restart= 11; +select * from s1; +ERROR 42000: SELECT command denied to user 'only_alter'@'localhost' for table 's1' +connection default; +drop database mysqltest_1; +drop user 'normal'@'%'; +drop user 'read_only'@'%'; +drop user 'read_write'@'%'; +drop user 'alter'@'%'; +drop user 'only_alter'@'%'; diff --git a/mysql-test/suite/sql_sequence/grant.test b/mysql-test/suite/sql_sequence/grant.test new file mode 100644 index 00000000000..790b876a831 --- /dev/null +++ b/mysql-test/suite/sql_sequence/grant.test @@ -0,0 +1,63 @@ +# +# Test some grants with sequences +# Note that replication.test also does some grant testing +# + +SET @@SQL_MODE = REPLACE(@@SQL_MODE, 'NO_AUTO_CREATE_USER', ''); +create database mysqltest_1; +use mysqltest_1; +grant all on mysqltest_1.* to 'normal'@'%'; +grant select on mysqltest_1.* to 'read_only'@'%'; +grant select,insert on mysqltest_1.* to 'read_write'@'%'; +grant select,insert,alter on mysqltest_1.* to 'alter'@'%'; +grant alter on mysqltest_1.* to only_alter@'%'; + +connect(normal,localhost,normal,,mysqltest_1); +connect(read_only,localhost,read_only,,mysqltest_1); +connect(read_write,localhost,read_write,,mysqltest_1); +connect(alter,localhost,alter,,mysqltest_1); +connect(only_alter, localhost, only_alter,,mysqltest_1); + +connection normal; +create sequence s1; +select next value for s1; +alter sequence s1 restart= 11; +select * from s1; + +connection read_only; +--error ER_TABLEACCESS_DENIED_ERROR +select next value for s1; +--error ER_TABLEACCESS_DENIED_ERROR +alter sequence s1 restart= 11; +select * from s1; + +connection read_write; +select next value for s1; +--error ER_TABLEACCESS_DENIED_ERROR +alter sequence s1 restart= 11; +select * from s1; + +connection alter; +select next value for s1; +alter sequence s1 restart= 11; +select * from s1; + +connection only_alter; +--error ER_TABLEACCESS_DENIED_ERROR +select next value for s1; +alter sequence s1 restart= 11; +--error ER_TABLEACCESS_DENIED_ERROR +select * from s1; + +# +# Cleanup +# + +connection default; +drop database mysqltest_1; +drop user 'normal'@'%'; +drop user 'read_only'@'%'; +drop user 'read_write'@'%'; +drop user 'alter'@'%'; +drop user 'only_alter'@'%'; + diff --git a/mysql-test/suite/sql_sequence/other.result b/mysql-test/suite/sql_sequence/other.result index 86263eb4b70..e3ec94cf2c5 100644 --- a/mysql-test/suite/sql_sequence/other.result +++ b/mysql-test/suite/sql_sequence/other.result @@ -163,7 +163,16 @@ ERROR HY000: Can't execute the query because you have a conflicting read lock unlock tables; drop sequence s1; # -# Don't allow SQUENCE to be used with CHECK or virtual fields +# MDEV-14761 +# Assertion `!mysql_parse_status || thd->is_error() || +# thd->get_internal_handler()' failed in parse_sql +# +CREATE SEQUENCE s1; +ALTER SEQUENCE s1 MAXVALUE 100 NO MAXVALUE; +ERROR HY000: Option 'MAXVALUE' used twice in statement +DROP SEQUENCE s1; +# +# Don't allow SEQUENCE to be used with CHECK or virtual fields # CREATE SEQUENCE s1 nocache engine=myisam; CREATE table t1 (a int check (next value for s1 > 0)); diff --git a/mysql-test/suite/sql_sequence/other.test b/mysql-test/suite/sql_sequence/other.test index 1903fc296f9..ff0db9e158d 100644 --- a/mysql-test/suite/sql_sequence/other.test +++ b/mysql-test/suite/sql_sequence/other.test @@ -133,7 +133,18 @@ unlock tables; drop sequence s1; --echo # ---echo # Don't allow SQUENCE to be used with CHECK or virtual fields +--echo # MDEV-14761 +--echo # Assertion `!mysql_parse_status || thd->is_error() || +--echo # thd->get_internal_handler()' failed in parse_sql +--echo # + +CREATE SEQUENCE s1; +--error ER_DUP_ARGUMENT +ALTER SEQUENCE s1 MAXVALUE 100 NO MAXVALUE; +DROP SEQUENCE s1; + +--echo # +--echo # Don't allow SEQUENCE to be used with CHECK or virtual fields --echo # CREATE SEQUENCE s1 nocache engine=myisam; diff --git a/mysql-test/t/type_datetime.test b/mysql-test/t/type_datetime.test index b8029d616a5..dafa9f9456e 100644 --- a/mysql-test/t/type_datetime.test +++ b/mysql-test/t/type_datetime.test @@ -768,6 +768,83 @@ SELECT * FROM t1; DROP TABLE t1; SET timestamp=DEFAULT; +--echo # +--echo # MDEV-15310 Range optimizer does not work well for "WHERE temporal_column NOT IN (const_list)" +--echo # + +--echo # +--echo # DATETIME(0) +--echo # + +CREATE TABLE t1 (a DATETIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:02', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:03', 'yes'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('2001-01-01 23:00:01','2001-01-01 23:00:02'); +SELECT * FROM t1 WHERE a NOT IN ('2001-01-01 23:00:01','2001-01-01 23:00:02'); +DROP TABLE t1; + + +--echo # +--echo # DATETIME(1) +--echo # + +CREATE TABLE t1 (a DATETIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:02.1', 'no'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('2001-01-01 23:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('2001-01-01 23:00:01.1','2001-01-01 23:00:02.1'); +SELECT * FROM t1 WHERE a NOT IN ('2001-01-01 23:00:01.1','2001-01-01 23:00:02.1'); +DROP TABLE t1; + --echo # --echo # End of 10.3 tests diff --git a/mysql-test/t/type_time.test b/mysql-test/t/type_time.test index 4bb4e5c4267..6fffd948dc5 100644 --- a/mysql-test/t/type_time.test +++ b/mysql-test/t/type_time.test @@ -902,3 +902,368 @@ SELECT FROM t1 ORDER BY country, dt; DROP TABLE t1; + + +--echo # +--echo # MDEV-15310 Range optimizer does not work well for "WHERE temporal_column NOT IN (const_list)" +--echo # + +--echo # +--echo # TIME(0), positive within 24 hour +--echo # + +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:01', 'no'); +INSERT INTO t1 VALUES ('23:00:02', 'no'); +INSERT INTO t1 VALUES ('23:00:03', 'yes'); +INSERT INTO t1 VALUES ('23:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('23:00:01','23:00:02'); +SELECT * FROM t1 WHERE a NOT IN ('23:00:01','23:00:02'); +DROP TABLE t1; + +--echo # +--echo # TIME(0), negative +--echo # + +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:01', 'no'); +INSERT INTO t1 VALUES ('-23:00:02', 'no'); +INSERT INTO t1 VALUES ('-23:00:03', 'yes'); +INSERT INTO t1 VALUES ('-23:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-23:00:01','-23:00:02'); +SELECT * FROM t1 WHERE a NOT IN ('-23:00:01','-23:00:02'); +DROP TABLE t1; + +--echo # +--echo # TIME(0), positive ouside 24 hours +--echo # + +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:01', 'no'); +INSERT INTO t1 VALUES ('24:00:02', 'no'); +INSERT INTO t1 VALUES ('24:00:03', 'yes'); +INSERT INTO t1 VALUES ('24:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('24:00:01','24:00:02'); +SELECT * FROM t1 WHERE a NOT IN ('24:00:01','24:00:02'); +DROP TABLE t1; + +--echo # +--echo # TIME(0), negative, ouside 24 hours +--echo # + +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:01', 'no'); +INSERT INTO t1 VALUES ('-24:00:02', 'no'); +INSERT INTO t1 VALUES ('-24:00:03', 'yes'); +INSERT INTO t1 VALUES ('-24:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-24:00:01','-24:00:02'); +SELECT * FROM t1 WHERE a NOT IN ('-24:00:01','-24:00:02'); +DROP TABLE t1; + +--echo # +--echo # TIME(0), positive, huge +--echo # + +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:01', 'no'); +INSERT INTO t1 VALUES ('838:00:02', 'no'); +INSERT INTO t1 VALUES ('838:00:03', 'yes'); +INSERT INTO t1 VALUES ('838:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('838:00:01','838:00:02'); +SELECT * FROM t1 WHERE a NOT IN ('838:00:01','838:00:02'); +DROP TABLE t1; + +--echo # +--echo # TIME(0), negative, huge +--echo # + +CREATE TABLE t1 (a TIME, filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:01', 'no'); +INSERT INTO t1 VALUES ('-838:00:02', 'no'); +INSERT INTO t1 VALUES ('-838:00:03', 'yes'); +INSERT INTO t1 VALUES ('-838:00:04', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-838:00:01','-838:00:02'); +SELECT * FROM t1 WHERE a NOT IN ('-838:00:01','-838:00:02'); +DROP TABLE t1; + +--echo # +--echo # TIME(1), positive within 24 hours +--echo # + +CREATE TABLE t1 (a TIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('23:00:02.1', 'no'); +INSERT INTO t1 VALUES ('23:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('23:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('23:00:01.1','23:00:02.1'); +SELECT * FROM t1 WHERE a NOT IN ('23:00:01.1','23:00:02.1'); +DROP TABLE t1; + +--echo # +--echo # TIME(1), negative within 24 hours +--echo # + +CREATE TABLE t1 (a TIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:02.1', 'no'); +INSERT INTO t1 VALUES ('-23:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('-23:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-23:00:01.1','-23:00:02.1'); +SELECT * FROM t1 WHERE a NOT IN ('-23:00:01.1','-23:00:02.1'); +DROP TABLE t1; + +--echo # +--echo # TIME(1), positive, huge +--echo # + +CREATE TABLE t1 (a TIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('838:00:02.1', 'no'); +INSERT INTO t1 VALUES ('838:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('838:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('838:00:01.1','838:00:02.1'); +SELECT * FROM t1 WHERE a NOT IN ('838:00:01.1','838:00:02.1'); +DROP TABLE t1; + +--echo # +--echo # TIME(1), negative, huge +--echo # + +CREATE TABLE t1 (a TIME(1), filler CHAR(200), KEY(a)); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:01.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:02.1', 'no'); +INSERT INTO t1 VALUES ('-838:00:03.1', 'yes'); +INSERT INTO t1 VALUES ('-838:00:04.1', 'yes'); +EXPLAIN SELECT * FROM t1 WHERE a NOT IN ('-838:00:01.1','-838:00:02.1'); +SELECT * FROM t1 WHERE a NOT IN ('-838:00:01.1','-838:00:02.1'); +DROP TABLE t1; diff --git a/sql-common/my_time.c b/sql-common/my_time.c index eac02581f0d..c4731d6b601 100644 --- a/sql-common/my_time.c +++ b/sql-common/my_time.c @@ -1426,31 +1426,3 @@ double TIME_to_double(const MYSQL_TIME *my_time) d+= my_time->second_part/(double)TIME_SECOND_PART_FACTOR; return my_time->neg ? -d : d; } - -longlong pack_time(const MYSQL_TIME *my_time) -{ - return ((((((my_time->year * 13ULL + - my_time->month) * 32ULL + - my_time->day) * 24ULL + - my_time->hour) * 60ULL + - my_time->minute) * 60ULL + - my_time->second) * 1000000ULL + - my_time->second_part) * (my_time->neg ? -1 : 1); -} - -#define get_one(WHERE, FACTOR) WHERE= (ulong)(packed % FACTOR); packed/= FACTOR - -MYSQL_TIME *unpack_time(longlong packed, MYSQL_TIME *my_time) -{ - if ((my_time->neg= packed < 0)) - packed= -packed; - get_one(my_time->second_part, 1000000ULL); - get_one(my_time->second, 60U); - get_one(my_time->minute, 60U); - get_one(my_time->hour, 24U); - get_one(my_time->day, 32U); - get_one(my_time->month, 13U); - my_time->year= (uint)packed; - my_time->time_type= MYSQL_TIMESTAMP_DATETIME; - return my_time; -} diff --git a/sql/field.cc b/sql/field.cc index 7c88f230734..1f97e587eb3 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -5819,7 +5819,10 @@ static void calc_datetime_days_diff(MYSQL_TIME *ltime, long days) long daydiff= calc_daynr(ltime->year, ltime->month, ltime->day) - days; ltime->year= ltime->month= 0; if (daydiff >=0 ) + { ltime->day= daydiff; + ltime->time_type= MYSQL_TIMESTAMP_TIME; + } else { longlong timediff= ((((daydiff * 24LL + @@ -5827,16 +5830,8 @@ static void calc_datetime_days_diff(MYSQL_TIME *ltime, long days) ltime->minute) * 60LL + ltime->second) * 1000000LL + ltime->second_part); - unpack_time(timediff, ltime); - /* - unpack_time() broke down hours into ltime members hour,day,month. - Mix them back to ltime->hour using the same factors - that pack_time()/unpack_time() use (i.e. 32 for month). - */ - ltime->hour+= (ltime->month * 32 + ltime->day) * 24; - ltime->month= ltime->day= 0; + unpack_time(timediff, ltime, MYSQL_TIMESTAMP_TIME); } - ltime->time_type= MYSQL_TIMESTAMP_TIME; } @@ -6167,14 +6162,7 @@ bool Field_time_hires::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) packed= sec_part_unshift(packed - zero_point, dec); - unpack_time(packed, ltime); - /* - unpack_time() returns MYSQL_TIMESTAMP_DATETIME. - To get MYSQL_TIMESTAMP_TIME we need few adjustments - */ - ltime->time_type= MYSQL_TIMESTAMP_TIME; - ltime->hour+= (ltime->month*32+ltime->day)*24; - ltime->month= ltime->day= 0; + unpack_time(packed, ltime, MYSQL_TIMESTAMP_TIME); return false; } @@ -6837,7 +6825,7 @@ bool Field_datetime_hires::get_TIME(MYSQL_TIME *ltime, const uchar *pos, { ASSERT_COLUMN_MARKED_FOR_READ; ulonglong packed= read_bigendian(pos, Field_datetime_hires::pack_length()); - unpack_time(sec_part_unshift(packed, dec), ltime); + unpack_time(sec_part_unshift(packed, dec), ltime, MYSQL_TIMESTAMP_DATETIME); return validate_MMDD(packed, ltime->month, ltime->day, fuzzydate); } diff --git a/sql/handler.cc b/sql/handler.cc index 0534a701b73..06abd149aa5 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2016, Oracle and/or its affiliates. - Copyright (c) 2009, 2016, MariaDB + Copyright (c) 2009, 2018, MariaDB Corporation. 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 @@ -798,7 +798,9 @@ static my_bool closecon_handlerton(THD *thd, plugin_ref plugin, */ void ha_close_connection(THD* thd) { - plugin_foreach(thd, closecon_handlerton, MYSQL_STORAGE_ENGINE_PLUGIN, 0); + plugin_foreach_with_mask(thd, closecon_handlerton, + MYSQL_STORAGE_ENGINE_PLUGIN, + PLUGIN_IS_DELETED|PLUGIN_IS_READY, 0); } static my_bool kill_handlerton(THD *thd, plugin_ref plugin, diff --git a/sql/item.cc b/sql/item.cc index 34db1a80dcd..85a71f5bb59 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -7002,9 +7002,9 @@ Item *Item_int::clone_item(THD *thd) } -void Item_datetime::set(longlong packed) +void Item_datetime::set(longlong packed, enum_mysql_timestamp_type ts_type) { - unpack_time(packed, <ime); + unpack_time(packed, <ime, ts_type); } int Item_datetime::save_in_field(Field *field, bool no_conversions) @@ -10079,13 +10079,7 @@ bool Item_cache_temporal::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) return 1; } - unpack_time(value, ltime); - ltime->time_type= mysql_timestamp_type(); - if (ltime->time_type == MYSQL_TIMESTAMP_TIME) - { - ltime->hour+= (ltime->month*32+ltime->day)*24; - ltime->month= ltime->day= 0; - } + unpack_time(value, ltime, mysql_timestamp_type()); return 0; } @@ -10130,7 +10124,7 @@ Item *Item_cache_temporal::convert_to_basic_const_item(THD *thd) else { MYSQL_TIME ltime; - unpack_time(val_datetime_packed(), <ime); + unpack_time(val_datetime_packed(), <ime, MYSQL_TIMESTAMP_DATETIME); new_item= (Item*) new (thd->mem_root) Item_datetime_literal(thd, <ime, decimals); } diff --git a/sql/item.h b/sql/item.h index 7572b7cece2..648ff39d54a 100644 --- a/sql/item.h +++ b/sql/item.h @@ -3600,7 +3600,12 @@ public: int save_in_field(Field *field, bool no_conversions); longlong val_int(); double val_real() { return (double)val_int(); } - void set(longlong packed); + void set(longlong packed, enum_mysql_timestamp_type ts_type); + bool get_date(MYSQL_TIME *to, ulonglong fuzzydate) + { + *to= ltime; + return false; + } }; diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 44d1063fd57..4d0ee5cf993 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -1321,7 +1321,7 @@ public: { return MY_TEST(compare(collation, base + pos1 * size, base + pos2 * size)); } - virtual Item_result result_type()= 0; + virtual const Type_handler *type_handler() const= 0; }; class in_string :public in_vector @@ -1352,7 +1352,7 @@ public: Item_string_for_in_vector *to= (Item_string_for_in_vector*) item; to->set_value(str); } - Item_result result_type() { return STRING_RESULT; } + const Type_handler *type_handler() const { return &type_handler_varchar; } }; class in_longlong :public in_vector @@ -1379,7 +1379,7 @@ public: ((Item_int*) item)->unsigned_flag= (bool) ((packed_longlong*) base)[pos].unsigned_flag; } - Item_result result_type() { return INT_RESULT; } + const Type_handler *type_handler() const { return &type_handler_longlong; } friend int cmp_longlong(void *cmp_arg, packed_longlong *a,packed_longlong *b); }; @@ -1405,9 +1405,11 @@ public: void value_to_item(uint pos, Item *item) { packed_longlong *val= reinterpret_cast<packed_longlong*>(base)+pos; - Item_datetime *dt= reinterpret_cast<Item_datetime*>(item); - dt->set(val->val); + Item_datetime *dt= static_cast<Item_datetime*>(item); + dt->set(val->val, type_handler()->mysql_timestamp_type()); } + uchar *get_value(Item *item) + { return get_value_internal(item, type_handler()->field_type()); } friend int cmp_longlong(void *cmp_arg, packed_longlong *a,packed_longlong *b); }; @@ -1419,8 +1421,7 @@ public: :in_temporal(thd, elements) {} void set(uint pos,Item *item); - uchar *get_value(Item *item) - { return get_value_internal(item, MYSQL_TYPE_DATETIME); } + const Type_handler *type_handler() const { return &type_handler_datetime2; } }; @@ -1431,8 +1432,7 @@ public: :in_temporal(thd, elements) {} void set(uint pos,Item *item); - uchar *get_value(Item *item) - { return get_value_internal(item, MYSQL_TYPE_TIME); } + const Type_handler *type_handler() const { return &type_handler_time2; } }; @@ -1448,7 +1448,7 @@ public: { ((Item_float*)item)->value= ((double*) base)[pos]; } - Item_result result_type() { return REAL_RESULT; } + const Type_handler *type_handler() const { return &type_handler_double; } }; @@ -1466,7 +1466,7 @@ public: Item_decimal *item_dec= (Item_decimal*)item; item_dec->set_decimal_value(dec); } - Item_result result_type() { return DECIMAL_RESULT; } + const Type_handler *type_handler() const { return &type_handler_newdecimal; } }; @@ -2439,7 +2439,7 @@ public: void set(uint pos,Item *item); uchar *get_value(Item *item); friend class Item_func_in; - Item_result result_type() { return ROW_RESULT; } + const Type_handler *type_handler() const { return &type_handler_row; } cmp_item *get_cmp_item() { return &tmp; } }; diff --git a/sql/item_func.cc b/sql/item_func.cc index f2dabf74060..1b9b0e801bc 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2714,13 +2714,7 @@ bool Item_func_min_max::get_date_native(MYSQL_TIME *ltime, ulonglong fuzzy_date) if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0) min_max= res; } - unpack_time(min_max, ltime); - - if (Item_func_min_max::field_type() == MYSQL_TYPE_DATE) - { - ltime->time_type= MYSQL_TIMESTAMP_DATE; - ltime->hour= ltime->minute= ltime->second= ltime->second_part= 0; - } + unpack_time(min_max, ltime, mysql_timestamp_type()); if (!(fuzzy_date & TIME_TIME_ONLY) && ((null_value= check_date_with_warn(ltime, fuzzy_date, diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 77bf64f991a..b24411c5733 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -7064,7 +7064,7 @@ SEL_TREE *Item_func_in::get_func_mm_tree(RANGE_OPT_PARAM *param, if (negated) { - if (array && array->result_type() != ROW_RESULT) + if (array && array->type_handler()->result_type() != ROW_RESULT) { /* We get here for conditions in form "t.key NOT IN (c1, c2, ...)", diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index b1faed6aa36..96ed36da755 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -7476,13 +7476,12 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables, ulong orig_want_access= original_want_access; /* - If sequence is used as part of NEXT VALUE, PREVIUS VALUE or SELECT, + If sequence is used as part of NEXT VALUE, PREVIOUS VALUE or SELECT, we need to modify the requested access rights depending on how the sequence is used. */ if (t_ref->sequence && - (bool)(orig_want_access & - (SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL))) + !(want_access & ~(SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL))) { /* We want to have either SELECT or INSERT rights to sequences depending diff --git a/sql/sql_load.cc b/sql/sql_load.cc index 17e2aca79e4..c0ee0057016 100644 --- a/sql/sql_load.cc +++ b/sql/sql_load.cc @@ -104,23 +104,25 @@ the transaction after every 10,000 inserted rows. */ static bool wsrep_load_data_split(THD *thd, const TABLE *table, const COPY_INFO &info) { - extern struct handlerton* innodb_hton_ptr; - DBUG_ENTER("wsrep_load_data_split"); - if (wsrep_load_data_splitting && wsrep_on(thd) - && info.records && !(info.records % 10000) - && thd->transaction.stmt.ha_list - && thd->transaction.stmt.ha_list->ht() == binlog_hton - && thd->transaction.stmt.ha_list->next() - && thd->transaction.stmt.ha_list->next()->ht() == innodb_hton_ptr - && !thd->transaction.stmt.ha_list->next()->next()) + if (!wsrep_load_data_splitting || !wsrep_on(thd) + || !info.records || (info.records % 10000) + || !thd->transaction.stmt.ha_list + || thd->transaction.stmt.ha_list->ht() != binlog_hton + || !thd->transaction.stmt.ha_list->next() + || thd->transaction.stmt.ha_list->next()->next()) + DBUG_RETURN(false); + + if (handlerton* hton= thd->transaction.stmt.ha_list->next()->ht()) { + if (hton->db_type != DB_TYPE_INNODB) + DBUG_RETURN(false); WSREP_DEBUG("intermediate transaction commit in LOAD DATA"); if (wsrep_run_wsrep_commit(thd, true) != WSREP_TRX_OK) DBUG_RETURN(true); if (binlog_hton->commit(binlog_hton, thd, true)) DBUG_RETURN(true); wsrep_post_commit(thd, true); - innodb_hton_ptr->commit(innodb_hton_ptr, thd, true); + hton->commit(hton, thd, true); table->file->extra(HA_EXTRA_FAKE_START_STMT); } diff --git a/sql/sql_time.cc b/sql/sql_time.cc index 95435c698f8..b0de8dab4c5 100644 --- a/sql/sql_time.cc +++ b/sql/sql_time.cc @@ -1392,3 +1392,46 @@ bool datetime_to_time_with_warn(THD *thd, const MYSQL_TIME *dt, int warnings= 0; return check_time_range(tm, dec, &warnings); } + + +longlong pack_time(const MYSQL_TIME *my_time) +{ + return ((((((my_time->year * 13ULL + + my_time->month) * 32ULL + + my_time->day) * 24ULL + + my_time->hour) * 60ULL + + my_time->minute) * 60ULL + + my_time->second) * 1000000ULL + + my_time->second_part) * (my_time->neg ? -1 : 1); +} + +#define get_one(WHERE, FACTOR) WHERE= (ulong)(packed % FACTOR); packed/= FACTOR + +void unpack_time(longlong packed, MYSQL_TIME *my_time, + enum_mysql_timestamp_type ts_type) +{ + if ((my_time->neg= packed < 0)) + packed= -packed; + get_one(my_time->second_part, 1000000ULL); + get_one(my_time->second, 60U); + get_one(my_time->minute, 60U); + get_one(my_time->hour, 24U); + get_one(my_time->day, 32U); + get_one(my_time->month, 13U); + my_time->year= (uint)packed; + my_time->time_type= ts_type; + switch (ts_type) { + case MYSQL_TIMESTAMP_TIME: + my_time->hour+= (my_time->month * 32 + my_time->day) * 24; + my_time->month= my_time->day= 0; + break; + case MYSQL_TIMESTAMP_DATE: + my_time->hour= my_time->minute= my_time->second= my_time->second_part= 0; + break; + case MYSQL_TIMESTAMP_NONE: + case MYSQL_TIMESTAMP_ERROR: + DBUG_ASSERT(0); + case MYSQL_TIMESTAMP_DATETIME: + break; + } +} diff --git a/sql/sql_time.h b/sql/sql_time.h index 94f24be3748..d7d04d77f0e 100644 --- a/sql/sql_time.h +++ b/sql/sql_time.h @@ -231,4 +231,8 @@ bool make_date_with_warn(MYSQL_TIME *ltime, ulonglong fuzzy_date, timestamp_type ts_type); bool adjust_time_range_with_warn(MYSQL_TIME *ltime, uint dec); +longlong pack_time(const MYSQL_TIME *my_time); +void unpack_time(longlong packed, MYSQL_TIME *my_time, + enum_mysql_timestamp_type ts_type); + #endif /* SQL_TIME_INCLUDED */ diff --git a/sql/sql_type.h b/sql/sql_type.h index 3c4ed054bb6..0446c93f88f 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -24,7 +24,7 @@ #include "mysqld.h" #include "sql_array.h" #include "sql_const.h" -#include "my_time.h" +#include "sql_time.h" class Field; class Column_definition; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f7c69af45a2..c773c8da506 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2784,59 +2784,80 @@ sequence_def: | NO_SYM MINVALUE_SYM { if (Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value) - MYSQL_YYABORT; + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; } | NOMINVALUE_SYM { if (Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value) - MYSQL_YYABORT; + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; } | MAXVALUE_SYM opt_equal longlong_num { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_max_value) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); Lex->create_info.seq_create_info->max_value= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; } | NO_SYM MAXVALUE_SYM { if (Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value) - MYSQL_YYABORT; + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; } | NOMAXVALUE_SYM { if (Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value) - MYSQL_YYABORT; + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; } | START_SYM opt_with longlong_num { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_start) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "START")); Lex->create_info.seq_create_info->start= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_start; } | INCREMENT_SYM opt_by longlong_num { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_increment) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "INCREMENT")); Lex->create_info.seq_create_info->increment= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment; } | CACHE_SYM opt_equal longlong_num { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); Lex->create_info.seq_create_info->cache= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; } | NOCACHE_SYM { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); Lex->create_info.seq_create_info->cache= 0; Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; } | CYCLE_SYM { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); Lex->create_info.seq_create_info->cycle= 1; Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; } | NOCYCLE_SYM { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); Lex->create_info.seq_create_info->cycle= 0; Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; } @@ -2847,6 +2868,9 @@ sequence_def: thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); YYABORT; } + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart; } | RESTART_SYM opt_with longlong_num @@ -2856,6 +2880,9 @@ sequence_def: thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); YYABORT; } + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); Lex->create_info.seq_create_info->restart= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value; } diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index dd84847387a..dda3b876953 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -2141,59 +2141,80 @@ sequence_def: | NO_SYM MINVALUE_SYM { if (Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value) - MYSQL_YYABORT; + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; } | NOMINVALUE_SYM { if (Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value) - MYSQL_YYABORT; + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MINVALUE")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value; } | MAXVALUE_SYM opt_equal longlong_num { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_max_value) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); Lex->create_info.seq_create_info->max_value= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; } | NO_SYM MAXVALUE_SYM { if (Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value) - MYSQL_YYABORT; + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; } | NOMAXVALUE_SYM { if (Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value) - MYSQL_YYABORT; + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "MAXVALUE")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value; } | START_SYM opt_with longlong_num { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_start) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "START")); Lex->create_info.seq_create_info->start= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_start; } | INCREMENT_SYM opt_by longlong_num { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_increment) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "INCREMENT")); Lex->create_info.seq_create_info->increment= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment; } | CACHE_SYM opt_equal longlong_num { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); Lex->create_info.seq_create_info->cache= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; } | NOCACHE_SYM { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_cache) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CACHE")); Lex->create_info.seq_create_info->cache= 0; Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache; } | CYCLE_SYM { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); Lex->create_info.seq_create_info->cycle= 1; Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; } | NOCYCLE_SYM { + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_cycle) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "CYCLE")); Lex->create_info.seq_create_info->cycle= 0; Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle; } @@ -2204,6 +2225,9 @@ sequence_def: thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); YYABORT; } + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart; } | RESTART_SYM opt_with longlong_num @@ -2213,6 +2237,9 @@ sequence_def: thd->parse_error(ER_SYNTAX_ERROR, "RESTART"); YYABORT; } + if (Lex->create_info.seq_create_info->used_fields & + seq_field_used_restart) + my_yyabort_error((ER_DUP_ARGUMENT, MYF(0), "RESTART")); Lex->create_info.seq_create_info->restart= $3; Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value; } diff --git a/sql/wsrep_var.cc b/sql/wsrep_var.cc index c54a5481187..ffa969a811c 100644 --- a/sql/wsrep_var.cc +++ b/sql/wsrep_var.cc @@ -42,7 +42,10 @@ int wsrep_init_vars() return 0; } -extern ulong innodb_lock_schedule_algorithm; +/* This is intentionally declared as a weak global symbol, so that +linking will succeed even if the server is built with a dynamically +linked InnoDB. */ +ulong innodb_lock_schedule_algorithm __attribute__((weak)); bool wsrep_on_update (sys_var *self, THD* thd, enum_var_type var_type) { diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 0a2882220db..c2d614451a3 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -136,7 +136,6 @@ SET(INNOBASE_SOURCES trx/trx0sys.cc trx/trx0trx.cc trx/trx0undo.cc - usr/usr0sess.cc ut/ut0crc32.cc ut/ut0dbg.cc ut/ut0list.cc @@ -150,6 +149,7 @@ SET(INNOBASE_SOURCES ut/ut0timer.cc) MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE + MODULE_OUTPUT_NAME ha_innodb DEFAULT RECOMPILE_FOR_EMBEDDED LINK_LIBRARIES ${ZLIB_LIBRARY} diff --git a/storage/innobase/dict/dict0crea.cc b/storage/innobase/dict/dict0crea.cc index 77a79e32605..5fc9ba3d6e0 100644 --- a/storage/innobase/dict/dict0crea.cc +++ b/storage/innobase/dict/dict0crea.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 the Free Software @@ -38,7 +38,6 @@ Created 1/8/1996 Heikki Tuuri #include "row0mysql.h" #include "pars0pars.h" #include "trx0roll.h" -#include "usr0sess.h" #include "ut0vec.h" #include "dict0priv.h" #include "fts0priv.h" diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc index 45be56e1997..8635c5d49fe 100644 --- a/storage/innobase/fts/fts0fts.cc +++ b/storage/innobase/fts/fts0fts.cc @@ -2705,6 +2705,7 @@ retry: fts_table.parent = table->name.m_name; trx = trx_allocate_for_background(); + trx_start_internal(trx); trx->op_info = "update the next FTS document id"; @@ -2825,6 +2826,7 @@ fts_update_sync_doc_id( if (!trx) { trx = trx_allocate_for_background(); + trx_start_internal(trx); trx->op_info = "setting last FTS document id"; local_trx = TRUE; @@ -3062,6 +3064,8 @@ fts_commit_table( fts_cache_t* cache = ftt->table->fts->cache; trx_t* trx = trx_allocate_for_background(); + trx_start_internal(trx); + rows = ftt->rows; ftt->fts_trx->trx = trx; @@ -3803,6 +3807,7 @@ fts_doc_fetch_by_doc_id( trx_t* trx = trx_allocate_for_background(); que_t* graph; + trx_start_internal(trx); trx->op_info = "fetching indexed FTS document"; /* The FTS index can be supplied by caller directly with @@ -4149,6 +4154,7 @@ fts_sync_begin( sync->start_time = ut_time(); sync->trx = trx_allocate_for_background(); + trx_start_internal(sync->trx); if (fts_enable_diag_print) { ib::info() << "FTS SYNC for table " << sync->table->name @@ -5019,7 +5025,6 @@ fts_get_rows_count( char table_name[MAX_FULL_NAME_LEN]; trx = trx_allocate_for_background(); - trx->op_info = "fetching FT table rows count"; info = pars_info_create(); @@ -7341,6 +7346,7 @@ fts_load_stopword( if (!trx) { trx = trx_allocate_for_background(); + trx_start_internal(trx); trx->op_info = "upload FTS stopword"; new_trx = TRUE; } diff --git a/storage/innobase/fts/fts0opt.cc b/storage/innobase/fts/fts0opt.cc index d7e434320a3..3a05f1f013a 100644 --- a/storage/innobase/fts/fts0opt.cc +++ b/storage/innobase/fts/fts0opt.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, MariaDB Corporation. All Rights reserved. +Copyright (c) 2016, 2018, MariaDB Corporation. 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 the Free Software @@ -989,6 +989,7 @@ fts_table_fetch_doc_ids( if (!trx) { trx = trx_allocate_for_background(); + trx_start_internal(trx); alloc_bk_trx = TRUE; } @@ -1619,6 +1620,7 @@ fts_optimize_create( optim->table = table; optim->trx = trx_allocate_for_background(); + trx_start_internal(optim->trx); optim->fts_common_table.parent = table->name.m_name; optim->fts_common_table.table_id = table->id; @@ -1741,6 +1743,7 @@ fts_optimize_free( { mem_heap_t* heap = static_cast<mem_heap_t*>(optim->self_heap->arg); + trx_commit_for_mysql(optim->trx); trx_free_for_background(optim->trx); fts_doc_ids_free(optim->to_delete); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 28c2615db83..f7fde2794e8 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -148,12 +148,9 @@ TABLE *get_purge_table(THD *thd); #ifdef WITH_WSREP #include "dict0priv.h" -#include "../storage/innobase/include/ut0byte.h" +#include "ut0byte.h" #include <mysql/service_md5.h> -class binlog_trx_data; -extern handlerton *binlog_hton; - extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log; static inline wsrep_ws_handle_t* @@ -1880,14 +1877,11 @@ thd_innodb_tmpdir( } /** Obtain the InnoDB transaction of a MySQL thread. -@param[in,out] thd MySQL thread handler. +@param[in,out] thd thread handle @return reference to transaction pointer */ -MY_ATTRIBUTE((warn_unused_result)) -trx_t*& -thd_to_trx( - THD* thd) +static trx_t* thd_to_trx(THD* thd) { - return(*(trx_t**) thd_ha_data(thd, innodb_hton_ptr)); + return *reinterpret_cast<trx_t**>(thd_ha_data(thd, innodb_hton_ptr)); } #ifdef WITH_WSREP @@ -2796,20 +2790,19 @@ check_trx_exists( /*=============*/ THD* thd) /*!< in: user thread handle */ { - trx_t*& trx = thd_to_trx(thd); - - if (trx == NULL) { + if (trx_t* trx = thd_to_trx(thd)) { + ut_a(trx->magic_n == TRX_MAGIC_N); + innobase_trx_init(thd, trx); + return trx; + } else { trx = innobase_trx_allocate(thd); /* User trx can be forced to rollback, so we unset the disable flag. */ ut_ad(trx->in_innodb & TRX_FORCE_ROLLBACK_DISABLE); trx->in_innodb &= TRX_FORCE_ROLLBACK_MASK; - } else { - ut_a(trx->magic_n == TRX_MAGIC_N); - innobase_trx_init(thd, trx); + thd_set_ha_data(thd, innodb_hton_ptr, trx); + return trx; } - - return(trx); } /** @@ -2823,8 +2816,7 @@ trx_t *current_trx() { THD *thd=current_thd; if (likely(thd != 0) && innodb_hton_ptr->slot != HA_SLOT_UNDEF) { - trx_t*& trx = thd_to_trx(thd); - return(trx); + return thd_to_trx(thd); } else { return(NULL); } diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h index 492e61be3fa..34c01929a56 100644 --- a/storage/innobase/handler/ha_innodb.h +++ b/storage/innobase/handler/ha_innodb.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. 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 the Free Software @@ -911,11 +911,6 @@ innodb_base_col_setup_for_stored( create_table_info_t::normalize_table_name_low(norm_name, name, FALSE) #endif /* _WIN32 */ -/** Obtain the InnoDB transaction of a MySQL thread. -@param[in,out] thd MySQL thread handler. -@return reference to transaction pointer */ -trx_t*& thd_to_trx(THD* thd); - /** Converts an InnoDB error code to a MySQL error code. Also tells to MySQL about a possible transaction rollback inside InnoDB caused by a lock wait timeout or a deadlock. diff --git a/storage/innobase/include/pars0opt.h b/storage/innobase/include/pars0opt.h index 13ea38cc385..d9debcf325e 100644 --- a/storage/innobase/include/pars0opt.h +++ b/storage/innobase/include/pars0opt.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 the Free Software @@ -29,7 +29,6 @@ Created 12/21/1997 Heikki Tuuri #include "univ.i" #include "que0types.h" -#include "usr0types.h" #include "pars0sym.h" #include "dict0types.h" #include "row0sel.h" diff --git a/storage/innobase/include/pars0pars.h b/storage/innobase/include/pars0pars.h index dad7953424c..37498c1c638 100644 --- a/storage/innobase/include/pars0pars.h +++ b/storage/innobase/include/pars0pars.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 the Free Software @@ -29,7 +29,6 @@ Created 11/19/1996 Heikki Tuuri #include "univ.i" #include "que0types.h" -#include "usr0types.h" #include "pars0types.h" #include "row0types.h" #include "trx0types.h" diff --git a/storage/innobase/include/pars0sym.h b/storage/innobase/include/pars0sym.h index 4e511719639..920087b96c2 100644 --- a/storage/innobase/include/pars0sym.h +++ b/storage/innobase/include/pars0sym.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 the Free Software @@ -29,7 +29,6 @@ Created 12/15/1997 Heikki Tuuri #include "univ.i" #include "que0types.h" -#include "usr0types.h" #include "dict0types.h" #include "pars0types.h" #include "row0types.h" diff --git a/storage/innobase/include/que0que.h b/storage/innobase/include/que0que.h index 13be7291f00..f01b596a52e 100644 --- a/storage/innobase/include/que0que.h +++ b/storage/innobase/include/que0que.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 the Free Software @@ -33,7 +33,6 @@ Created 5/27/1996 Heikki Tuuri #include "trx0trx.h" #include "trx0roll.h" #include "srv0srv.h" -#include "usr0types.h" #include "que0types.h" #include "row0types.h" #include "pars0types.h" diff --git a/storage/innobase/include/que0que.ic b/storage/innobase/include/que0que.ic index ec61081cfe2..545d5288298 100644 --- a/storage/innobase/include/que0que.ic +++ b/storage/innobase/include/que0que.ic @@ -23,8 +23,6 @@ Query graph Created 5/27/1996 Heikki Tuuri *******************************************************/ -#include "usr0sess.h" - /***********************************************************************//** Gets the trx of a query thread. */ UNIV_INLINE diff --git a/storage/innobase/include/trx0purge.h b/storage/innobase/include/trx0purge.h index 0b42479cc21..33f46b32a7d 100644 --- a/storage/innobase/include/trx0purge.h +++ b/storage/innobase/include/trx0purge.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. All Rights Reserved. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 the Free Software @@ -33,7 +33,6 @@ Created 3/26/1996 Heikki Tuuri #include "trx0sys.h" #include "que0types.h" #include "page0page.h" -#include "usr0sess.h" #include "fil0fil.h" #include "read0types.h" @@ -491,8 +490,6 @@ public: /** Destruct the purge system. */ ~purge_sys_t(); - sess_t* sess; /*!< System session running the purge - query */ rw_lock_t latch; /*!< The latch protecting the purge view. A purge operation must acquire an x-latch here for the instant at which diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index c6c3e539ba8..012f34099e8 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -38,7 +38,6 @@ Created 3/26/1996 Heikki Tuuri #include "lock0types.h" #include "log0log.h" -#include "usr0types.h" #include "que0types.h" #include "mem0mem.h" #include "trx0xa.h" @@ -55,9 +54,6 @@ class FlushObserver; struct rw_trx_hash_element_t; -/** Dummy session used currently in MySQL interface */ -extern sess_t* trx_dummy_sess; - /** Set flush observer for the transaction @param[in/out] trx transaction struct @param[in] observer flush observer */ @@ -1112,7 +1108,6 @@ public: ulint error_key_num; /*!< if the index creation fails to a duplicate key error, a mysql key number of that index is stored here */ - sess_t* sess; /*!< session of the trx, NULL if none */ que_t* graph; /*!< query currently run in the session, or NULL if none; NOTE that the query belongs to the session, and it can diff --git a/storage/innobase/include/usr0sess.h b/storage/innobase/include/usr0sess.h deleted file mode 100644 index 8e9497a85c5..00000000000 --- a/storage/innobase/include/usr0sess.h +++ /dev/null @@ -1,69 +0,0 @@ -/***************************************************************************** - -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. - -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 the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -/**************************************************//** -@file include/usr0sess.h -Sessions - -Created 6/25/1996 Heikki Tuuri -*******************************************************/ - -#ifndef usr0sess_h -#define usr0sess_h - -#include "univ.i" -#include "ut0byte.h" -#include "trx0types.h" -#include "srv0srv.h" -#include "trx0types.h" -#include "usr0types.h" -#include "que0types.h" -#include "data0data.h" -#include "rem0rec.h" - -/*********************************************************************//** -Opens a session. -@return own: session object */ -sess_t* -sess_open(void); -/*============*/ -/*********************************************************************//** -Closes a session, freeing the memory occupied by it. */ -void -sess_close( -/*=======*/ - sess_t* sess); /* in, own: session object */ - -/* The session handle. This data structure is only used by purge and is -not really necessary. We should get rid of it. */ -struct sess_t{ - ulint state; /*!< state of the session */ - trx_t* trx; /*!< transaction object permanently - assigned for the session: the - transaction instance designated by the - trx id changes, but the memory - structure is preserved */ -}; - -/* Session states */ -#define SESS_ACTIVE 1 -#define SESS_ERROR 2 /* session contains an error message - which has not yet been communicated - to the client */ -#endif diff --git a/storage/innobase/include/usr0types.h b/storage/innobase/include/usr0types.h deleted file mode 100644 index 6ba937cacc8..00000000000 --- a/storage/innobase/include/usr0types.h +++ /dev/null @@ -1,31 +0,0 @@ -/***************************************************************************** - -Copyright (c) 1996, 2009, Oracle and/or its affiliates. All Rights Reserved. - -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 the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -/**************************************************//** -@file include/usr0types.h -Users and sessions global types - -Created 6/25/1996 Heikki Tuuri -*******************************************************/ - -#ifndef usr0types_h -#define usr0types_h - -struct sess_t; - -#endif diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index b45e7d77dfb..83874d03fdd 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -35,7 +35,6 @@ Created 5/7/1996 Heikki Tuuri #include "lock0lock.h" #include "lock0priv.h" #include "dict0mem.h" -#include "usr0sess.h" #include "trx0purge.h" #include "trx0sys.h" #include "srv0mon.h" @@ -54,7 +53,7 @@ Created 5/7/1996 Heikki Tuuri #endif /* WITH_WSREP */ /** Lock scheduling algorithm */ -ulong innodb_lock_schedule_algorithm = INNODB_LOCK_SCHEDULE_ALGORITHM_FCFS; +ulong innodb_lock_schedule_algorithm; /** The value of innodb_deadlock_detect */ my_bool innobase_deadlock_detect; diff --git a/storage/innobase/lock/lock0prdt.cc b/storage/innobase/lock/lock0prdt.cc index dc2c6e2d15e..0e79dd5b460 100644 --- a/storage/innobase/lock/lock0prdt.cc +++ b/storage/innobase/lock/lock0prdt.cc @@ -29,7 +29,6 @@ Created 9/7/2013 Jimmy Yang #include "lock0priv.h" #include "lock0prdt.h" #include "ha_prototypes.h" -#include "usr0sess.h" #include "trx0purge.h" #include "dict0mem.h" #include "dict0boot.h" diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index aec890f8374..899a48c80b9 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -2,7 +2,7 @@ Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2009, Google Inc. -Copyright (c) 2014, 2017, MariaDB Corporation. +Copyright (c) 2014, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -1584,8 +1584,6 @@ log_write_checkpoint_info(bool sync, lsn_t end_lsn) rw_lock_s_lock(&log_sys->checkpoint_lock); rw_lock_s_unlock(&log_sys->checkpoint_lock); - DEBUG_SYNC_C("checkpoint_completed"); - DBUG_EXECUTE_IF( "crash_after_checkpoint", DBUG_SUICIDE();); diff --git a/storage/innobase/que/que0que.cc b/storage/innobase/que/que0que.cc index 47c41519b40..937f215dc39 100644 --- a/storage/innobase/que/que0que.cc +++ b/storage/innobase/que/que0que.cc @@ -27,7 +27,6 @@ Created 5/27/1996 Heikki Tuuri #include "ha_prototypes.h" #include "que0que.h" -#include "usr0sess.h" #include "trx0trx.h" #include "trx0roll.h" #include "row0undo.h" diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 49a05717f82..e87e857c812 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -45,7 +45,6 @@ Created 4/20/1996 Heikki Tuuri #include "log0log.h" #include "eval0eval.h" #include "data0data.h" -#include "usr0sess.h" #include "buf0lru.h" #include "fts0fts.h" #include "fts0types.h" diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 9cb8c0ab729..fe449dd00df 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -3,7 +3,7 @@ Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, 2009 Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2017, MariaDB Corporation. +Copyright (c) 2013, 2018, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -70,7 +70,6 @@ Created 10/8/1995 Heikki Tuuri #include "sync0sync.h" #include "trx0i_s.h" #include "trx0purge.h" -#include "usr0sess.h" #include "ut0crc32.h" #include "btr0defragment.h" #include "ut0mem.h" diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 882dbf335d8..1fb306cec88 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -87,7 +87,6 @@ Created 2/16/1996 Heikki Tuuri #include "dict0load.h" #include "dict0stats_bg.h" #include "que0que.h" -#include "usr0sess.h" #include "lock0lock.h" #include "trx0roll.h" #include "trx0purge.h" diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 0fc61b32292..43b5253b064 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2018, MariaDB Corporation. 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 the Free Software @@ -164,21 +164,15 @@ TrxUndoRsegsIterator::set_next() /** Build a purge 'query' graph. The actual purge is performed by executing this query graph. -@param[in,out] sess the purge session @return own: the query graph */ static que_t* -trx_purge_graph_build(sess_t* sess) +purge_graph_build() { ut_a(srv_n_purge_threads > 0); - /* A purge transaction is not a real transaction, we use a transaction - here only because the query threads code requires it. It is otherwise - quite unnecessary. We should get rid of it eventually. */ - trx_t* trx = sess->trx; - ut_ad(trx->sess == sess); - - trx->id = 0; + trx_t* trx = trx_allocate_for_background(); + ut_ad(!trx->id); trx->start_time = ut_time(); trx->state = TRX_STATE_ACTIVE; trx->op_info = "purge trx"; @@ -198,9 +192,9 @@ trx_purge_graph_build(sess_t* sess) /** Construct the purge system. */ purge_sys_t::purge_sys_t() - : sess(sess_open()), latch(), event(os_event_create(0)), + : latch(), event(os_event_create(0)), n_stop(0), running(false), state(PURGE_STATE_INIT), - query(trx_purge_graph_build(sess)), + query(purge_graph_build()), view(), n_submitted(0), n_completed(0), iter(), limit(), #ifdef UNIV_DEBUG @@ -220,10 +214,12 @@ purge_sys_t::~purge_sys_t() { ut_ad(this == purge_sys); + trx_t* trx = query->trx; que_graph_free(query); - ut_a(sess->trx->id == 0); - sess->trx->state = TRX_STATE_NOT_STARTED; - sess_close(sess); + ut_ad(!trx->id); + ut_ad(trx->state == TRX_STATE_ACTIVE); + trx->state = TRX_STATE_NOT_STARTED; + trx_free_for_background(trx); rw_lock_free(&latch); /* rw_lock_free() already called latch.~rw_lock_t(); tame the debug assertions when the destructor will be called once more. */ diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index c3590302c8e..bf73759a499 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -46,7 +46,6 @@ Created 3/26/1996 Heikki Tuuri #include "trx0sys.h" #include "trx0trx.h" #include "trx0undo.h" -#include "usr0sess.h" #include "ha_prototypes.h" /** This many pages must be undone before a truncate is tried within diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index 877531f833b..d19c2ad23ee 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -513,11 +513,6 @@ trx_sys_t::close() " shutdown: " << size << " read views open"; } - if (trx_dummy_sess) { - sess_close(trx_dummy_sess); - trx_dummy_sess = NULL; - } - rw_trx_hash.destroy(); /* There can't be any active transactions. */ diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index a5cafe5895a..7b104653cf9 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -50,7 +50,6 @@ Created 3/26/1996 Heikki Tuuri #include "trx0rseg.h" #include "trx0undo.h" #include "trx0xa.h" -#include "usr0sess.h" #include "ut0new.h" #include "ut0pool.h" #include "ut0vec.h" @@ -80,9 +79,6 @@ typedef std::set< std::less<table_id_t>, ut_allocator<table_id_t> > table_id_set; -/** Dummy session used currently in MySQL interface */ -sess_t* trx_dummy_sess = NULL; - /** Constructor */ TrxVersion::TrxVersion(trx_t* trx) : @@ -532,8 +528,6 @@ trx_allocate_for_background(void) trx = trx_create_low(); - trx->sess = trx_dummy_sess; - return(trx); } @@ -890,9 +884,7 @@ trx_lists_init_at_db_start() ut_a(srv_is_being_started); ut_ad(!srv_was_started); ut_ad(!purge_sys); - ut_ad(!trx_dummy_sess); - trx_dummy_sess = sess_open(); purge_sys = UT_NEW_NOKEY(purge_sys_t()); if (srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) { diff --git a/storage/innobase/usr/usr0sess.cc b/storage/innobase/usr/usr0sess.cc deleted file mode 100644 index 55ce9500e5c..00000000000 --- a/storage/innobase/usr/usr0sess.cc +++ /dev/null @@ -1,58 +0,0 @@ -/***************************************************************************** - -Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. - -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 the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -/**************************************************//** -@file usr/usr0sess.cc -Sessions - -Created 6/25/1996 Heikki Tuuri -*******************************************************/ - -#include "usr0sess.h" -#include "trx0trx.h" - -/*********************************************************************//** -Opens a session. -@return own: session object */ -sess_t* -sess_open(void) -/*===========*/ -{ - sess_t* sess; - - sess = static_cast<sess_t*>(ut_zalloc_nokey(sizeof(*sess))); - - sess->state = SESS_ACTIVE; - - sess->trx = trx_allocate_for_background(); - sess->trx->sess = sess; - - return(sess); -} - -/*********************************************************************//** -Closes a session, freeing the memory occupied by it. */ -void -sess_close( -/*=======*/ - sess_t* sess) /*!< in, own: session object */ -{ - trx_free_for_background(sess->trx); - ut_free(sess); -} diff --git a/storage/innobase/ut/ut0new.cc b/storage/innobase/ut/ut0new.cc index 1815c26a288..35d49073678 100644 --- a/storage/innobase/ut/ut0new.cc +++ b/storage/innobase/ut/ut0new.cc @@ -165,7 +165,6 @@ ut_new_boot() "trx0sys", "trx0trx", "trx0undo", - "usr0sess", "ut0list", "ut0mem", "ut0mutex", diff --git a/wsrep/CMakeLists.txt b/wsrep/CMakeLists.txt index 53c8e853078..ff2bdec4def 100644 --- a/wsrep/CMakeLists.txt +++ b/wsrep/CMakeLists.txt @@ -15,6 +15,10 @@ SET(WSREP_SOURCES wsrep_gtid.c wsrep_uuid.c wsrep_loader.c wsrep_dummy.c) +IF(NOT WITH_INNOBASE_STORAGE_ENGINE) + MESSAGE(WARNING "WSRep is enabled, but innodb is not. This configuration is not supported") +ENDIF() + ADD_CONVENIENCE_LIBRARY(wsrep ${WSREP_SOURCES}) DTRACE_INSTRUMENT(wsrep) |