Merge bb-10.2-ext into 10.3
This commit is contained in:
commit
cc3b5d1fe7
@ -134,9 +134,6 @@ ulonglong TIME_to_ulonglong_time(const MYSQL_TIME *);
|
|||||||
ulonglong TIME_to_ulonglong(const MYSQL_TIME *);
|
ulonglong TIME_to_ulonglong(const MYSQL_TIME *);
|
||||||
double TIME_to_double(const MYSQL_TIME *my_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);
|
int check_time_range(struct st_mysql_time *my_time, uint dec, int *warning);
|
||||||
my_bool check_datetime_range(const MYSQL_TIME *ltime);
|
my_bool check_datetime_range(const MYSQL_TIME *ltime);
|
||||||
|
|
||||||
|
@ -1218,5 +1218,86 @@ a
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET timestamp=DEFAULT;
|
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
|
# End of 10.3 tests
|
||||||
#
|
#
|
||||||
|
@ -1529,3 +1529,396 @@ ORDER BY country, dt;
|
|||||||
dt country amount first t_first last t_last
|
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
|
2000-01-01 DE 102 2000-01-01 00:00:00 2000-01-01 00:00:00
|
||||||
DROP TABLE t1;
|
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;
|
||||||
|
60
mysql-test/suite/sql_sequence/grant.result
Normal file
60
mysql-test/suite/sql_sequence/grant.result
Normal file
@ -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'@'%';
|
63
mysql-test/suite/sql_sequence/grant.test
Normal file
63
mysql-test/suite/sql_sequence/grant.test
Normal file
@ -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'@'%';
|
||||||
|
|
@ -163,7 +163,16 @@ ERROR HY000: Can't execute the query because you have a conflicting read lock
|
|||||||
unlock tables;
|
unlock tables;
|
||||||
drop sequence s1;
|
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 SEQUENCE s1 nocache engine=myisam;
|
||||||
CREATE table t1 (a int check (next value for s1 > 0));
|
CREATE table t1 (a int check (next value for s1 > 0));
|
||||||
|
@ -133,7 +133,18 @@ unlock tables;
|
|||||||
drop sequence s1;
|
drop sequence s1;
|
||||||
|
|
||||||
--echo #
|
--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 #
|
--echo #
|
||||||
|
|
||||||
CREATE SEQUENCE s1 nocache engine=myisam;
|
CREATE SEQUENCE s1 nocache engine=myisam;
|
||||||
|
@ -768,6 +768,83 @@ SELECT * FROM t1;
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET timestamp=DEFAULT;
|
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 #
|
||||||
--echo # End of 10.3 tests
|
--echo # End of 10.3 tests
|
||||||
|
@ -902,3 +902,368 @@ SELECT
|
|||||||
FROM t1
|
FROM t1
|
||||||
ORDER BY country, dt;
|
ORDER BY country, dt;
|
||||||
DROP TABLE t1;
|
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;
|
||||||
|
@ -1426,31 +1426,3 @@ double TIME_to_double(const MYSQL_TIME *my_time)
|
|||||||
d+= my_time->second_part/(double)TIME_SECOND_PART_FACTOR;
|
d+= my_time->second_part/(double)TIME_SECOND_PART_FACTOR;
|
||||||
return my_time->neg ? -d : d;
|
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;
|
|
||||||
}
|
|
||||||
|
24
sql/field.cc
24
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;
|
long daydiff= calc_daynr(ltime->year, ltime->month, ltime->day) - days;
|
||||||
ltime->year= ltime->month= 0;
|
ltime->year= ltime->month= 0;
|
||||||
if (daydiff >=0 )
|
if (daydiff >=0 )
|
||||||
|
{
|
||||||
ltime->day= daydiff;
|
ltime->day= daydiff;
|
||||||
|
ltime->time_type= MYSQL_TIMESTAMP_TIME;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
longlong timediff= ((((daydiff * 24LL +
|
longlong timediff= ((((daydiff * 24LL +
|
||||||
@ -5827,16 +5830,8 @@ static void calc_datetime_days_diff(MYSQL_TIME *ltime, long days)
|
|||||||
ltime->minute) * 60LL +
|
ltime->minute) * 60LL +
|
||||||
ltime->second) * 1000000LL +
|
ltime->second) * 1000000LL +
|
||||||
ltime->second_part);
|
ltime->second_part);
|
||||||
unpack_time(timediff, ltime);
|
unpack_time(timediff, ltime, MYSQL_TIMESTAMP_TIME);
|
||||||
/*
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
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);
|
packed= sec_part_unshift(packed - zero_point, dec);
|
||||||
|
|
||||||
unpack_time(packed, ltime);
|
unpack_time(packed, ltime, MYSQL_TIMESTAMP_TIME);
|
||||||
/*
|
|
||||||
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;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6837,7 +6825,7 @@ bool Field_datetime_hires::get_TIME(MYSQL_TIME *ltime, const uchar *pos,
|
|||||||
{
|
{
|
||||||
ASSERT_COLUMN_MARKED_FOR_READ;
|
ASSERT_COLUMN_MARKED_FOR_READ;
|
||||||
ulonglong packed= read_bigendian(pos, Field_datetime_hires::pack_length());
|
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);
|
return validate_MMDD(packed, ltime->month, ltime->day, fuzzydate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2016, MariaDB
|
Copyright (c) 2009, 2018, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -798,7 +798,9 @@ static my_bool closecon_handlerton(THD *thd, plugin_ref plugin,
|
|||||||
*/
|
*/
|
||||||
void ha_close_connection(THD* thd)
|
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,
|
static my_bool kill_handlerton(THD *thd, plugin_ref plugin,
|
||||||
|
14
sql/item.cc
14
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)
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
unpack_time(value, ltime);
|
unpack_time(value, ltime, mysql_timestamp_type());
|
||||||
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;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -10130,7 +10124,7 @@ Item *Item_cache_temporal::convert_to_basic_const_item(THD *thd)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
MYSQL_TIME ltime;
|
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,
|
new_item= (Item*) new (thd->mem_root) Item_datetime_literal(thd, <ime,
|
||||||
decimals);
|
decimals);
|
||||||
}
|
}
|
||||||
|
@ -3600,7 +3600,12 @@ public:
|
|||||||
int save_in_field(Field *field, bool no_conversions);
|
int save_in_field(Field *field, bool no_conversions);
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
double val_real() { return (double)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;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1321,7 +1321,7 @@ public:
|
|||||||
{
|
{
|
||||||
return MY_TEST(compare(collation, base + pos1 * size, base + pos2 * size));
|
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
|
class in_string :public in_vector
|
||||||
@ -1352,7 +1352,7 @@ public:
|
|||||||
Item_string_for_in_vector *to= (Item_string_for_in_vector*) item;
|
Item_string_for_in_vector *to= (Item_string_for_in_vector*) item;
|
||||||
to->set_value(str);
|
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
|
class in_longlong :public in_vector
|
||||||
@ -1379,7 +1379,7 @@ public:
|
|||||||
((Item_int*) item)->unsigned_flag= (bool)
|
((Item_int*) item)->unsigned_flag= (bool)
|
||||||
((packed_longlong*) base)[pos].unsigned_flag;
|
((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);
|
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)
|
void value_to_item(uint pos, Item *item)
|
||||||
{
|
{
|
||||||
packed_longlong *val= reinterpret_cast<packed_longlong*>(base)+pos;
|
packed_longlong *val= reinterpret_cast<packed_longlong*>(base)+pos;
|
||||||
Item_datetime *dt= reinterpret_cast<Item_datetime*>(item);
|
Item_datetime *dt= static_cast<Item_datetime*>(item);
|
||||||
dt->set(val->val);
|
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);
|
friend int cmp_longlong(void *cmp_arg, packed_longlong *a,packed_longlong *b);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1419,8 +1421,7 @@ public:
|
|||||||
:in_temporal(thd, elements)
|
:in_temporal(thd, elements)
|
||||||
{}
|
{}
|
||||||
void set(uint pos,Item *item);
|
void set(uint pos,Item *item);
|
||||||
uchar *get_value(Item *item)
|
const Type_handler *type_handler() const { return &type_handler_datetime2; }
|
||||||
{ return get_value_internal(item, MYSQL_TYPE_DATETIME); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1431,8 +1432,7 @@ public:
|
|||||||
:in_temporal(thd, elements)
|
:in_temporal(thd, elements)
|
||||||
{}
|
{}
|
||||||
void set(uint pos,Item *item);
|
void set(uint pos,Item *item);
|
||||||
uchar *get_value(Item *item)
|
const Type_handler *type_handler() const { return &type_handler_time2; }
|
||||||
{ return get_value_internal(item, MYSQL_TYPE_TIME); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1448,7 +1448,7 @@ public:
|
|||||||
{
|
{
|
||||||
((Item_float*)item)->value= ((double*) base)[pos];
|
((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_decimal *item_dec= (Item_decimal*)item;
|
||||||
item_dec->set_decimal_value(dec);
|
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);
|
void set(uint pos,Item *item);
|
||||||
uchar *get_value(Item *item);
|
uchar *get_value(Item *item);
|
||||||
friend class Item_func_in;
|
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; }
|
cmp_item *get_cmp_item() { return &tmp; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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)
|
if (i == 0 || (res < min_max ? cmp_sign : -cmp_sign) > 0)
|
||||||
min_max= res;
|
min_max= res;
|
||||||
}
|
}
|
||||||
unpack_time(min_max, ltime);
|
unpack_time(min_max, ltime, mysql_timestamp_type());
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(fuzzy_date & TIME_TIME_ONLY) &&
|
if (!(fuzzy_date & TIME_TIME_ONLY) &&
|
||||||
((null_value= check_date_with_warn(ltime, fuzzy_date,
|
((null_value= check_date_with_warn(ltime, fuzzy_date,
|
||||||
|
@ -7064,7 +7064,7 @@ SEL_TREE *Item_func_in::get_func_mm_tree(RANGE_OPT_PARAM *param,
|
|||||||
|
|
||||||
if (negated)
|
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, ...)",
|
We get here for conditions in form "t.key NOT IN (c1, c2, ...)",
|
||||||
|
@ -7476,13 +7476,12 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
|||||||
ulong orig_want_access= original_want_access;
|
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
|
we need to modify the requested access rights depending on how the
|
||||||
sequence is used.
|
sequence is used.
|
||||||
*/
|
*/
|
||||||
if (t_ref->sequence &&
|
if (t_ref->sequence &&
|
||||||
(bool)(orig_want_access &
|
!(want_access & ~(SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL)))
|
||||||
(SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL)))
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
We want to have either SELECT or INSERT rights to sequences depending
|
We want to have either SELECT or INSERT rights to sequences depending
|
||||||
|
@ -104,23 +104,25 @@ the transaction after every 10,000 inserted rows. */
|
|||||||
static bool wsrep_load_data_split(THD *thd, const TABLE *table,
|
static bool wsrep_load_data_split(THD *thd, const TABLE *table,
|
||||||
const COPY_INFO &info)
|
const COPY_INFO &info)
|
||||||
{
|
{
|
||||||
extern struct handlerton* innodb_hton_ptr;
|
|
||||||
|
|
||||||
DBUG_ENTER("wsrep_load_data_split");
|
DBUG_ENTER("wsrep_load_data_split");
|
||||||
|
|
||||||
if (wsrep_load_data_splitting && wsrep_on(thd)
|
if (!wsrep_load_data_splitting || !wsrep_on(thd)
|
||||||
&& info.records && !(info.records % 10000)
|
|| !info.records || (info.records % 10000)
|
||||||
&& thd->transaction.stmt.ha_list
|
|| !thd->transaction.stmt.ha_list
|
||||||
&& thd->transaction.stmt.ha_list->ht() == binlog_hton
|
|| thd->transaction.stmt.ha_list->ht() != binlog_hton
|
||||||
&& thd->transaction.stmt.ha_list->next()
|
|| !thd->transaction.stmt.ha_list->next()
|
||||||
&& thd->transaction.stmt.ha_list->next()->ht() == innodb_hton_ptr
|
|| thd->transaction.stmt.ha_list->next()->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");
|
WSREP_DEBUG("intermediate transaction commit in LOAD DATA");
|
||||||
if (wsrep_run_wsrep_commit(thd, true) != WSREP_TRX_OK) DBUG_RETURN(true);
|
if (wsrep_run_wsrep_commit(thd, true) != WSREP_TRX_OK) DBUG_RETURN(true);
|
||||||
if (binlog_hton->commit(binlog_hton, thd, true)) DBUG_RETURN(true);
|
if (binlog_hton->commit(binlog_hton, thd, true)) DBUG_RETURN(true);
|
||||||
wsrep_post_commit(thd, 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);
|
table->file->extra(HA_EXTRA_FAKE_START_STMT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1392,3 +1392,46 @@ bool datetime_to_time_with_warn(THD *thd, const MYSQL_TIME *dt,
|
|||||||
int warnings= 0;
|
int warnings= 0;
|
||||||
return check_time_range(tm, dec, &warnings);
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -231,4 +231,8 @@ bool make_date_with_warn(MYSQL_TIME *ltime,
|
|||||||
ulonglong fuzzy_date, timestamp_type ts_type);
|
ulonglong fuzzy_date, timestamp_type ts_type);
|
||||||
bool adjust_time_range_with_warn(MYSQL_TIME *ltime, uint dec);
|
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 */
|
#endif /* SQL_TIME_INCLUDED */
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "mysqld.h"
|
#include "mysqld.h"
|
||||||
#include "sql_array.h"
|
#include "sql_array.h"
|
||||||
#include "sql_const.h"
|
#include "sql_const.h"
|
||||||
#include "my_time.h"
|
#include "sql_time.h"
|
||||||
|
|
||||||
class Field;
|
class Field;
|
||||||
class Column_definition;
|
class Column_definition;
|
||||||
|
@ -2784,59 +2784,80 @@ sequence_def:
|
|||||||
| NO_SYM MINVALUE_SYM
|
| NO_SYM MINVALUE_SYM
|
||||||
{
|
{
|
||||||
if (Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value;
|
||||||
}
|
}
|
||||||
| NOMINVALUE_SYM
|
| NOMINVALUE_SYM
|
||||||
{
|
{
|
||||||
if (Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value;
|
||||||
}
|
}
|
||||||
| MAXVALUE_SYM opt_equal longlong_num
|
| 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->max_value= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value;
|
||||||
}
|
}
|
||||||
| NO_SYM MAXVALUE_SYM
|
| NO_SYM MAXVALUE_SYM
|
||||||
{
|
{
|
||||||
if (Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value;
|
||||||
}
|
}
|
||||||
| NOMAXVALUE_SYM
|
| NOMAXVALUE_SYM
|
||||||
{
|
{
|
||||||
if (Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value;
|
||||||
}
|
}
|
||||||
| START_SYM opt_with longlong_num
|
| 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->start= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_start;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_start;
|
||||||
}
|
}
|
||||||
| INCREMENT_SYM opt_by longlong_num
|
| 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->increment= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment;
|
||||||
}
|
}
|
||||||
| CACHE_SYM opt_equal longlong_num
|
| 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->cache= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache;
|
||||||
}
|
}
|
||||||
| NOCACHE_SYM
|
| 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->cache= 0;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache;
|
||||||
}
|
}
|
||||||
| CYCLE_SYM
|
| 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->cycle= 1;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle;
|
||||||
}
|
}
|
||||||
| NOCYCLE_SYM
|
| 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->cycle= 0;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle;
|
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");
|
thd->parse_error(ER_SYNTAX_ERROR, "RESTART");
|
||||||
YYABORT;
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart;
|
||||||
}
|
}
|
||||||
| RESTART_SYM opt_with longlong_num
|
| RESTART_SYM opt_with longlong_num
|
||||||
@ -2856,6 +2880,9 @@ sequence_def:
|
|||||||
thd->parse_error(ER_SYNTAX_ERROR, "RESTART");
|
thd->parse_error(ER_SYNTAX_ERROR, "RESTART");
|
||||||
YYABORT;
|
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->restart= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value;
|
||||||
}
|
}
|
||||||
|
@ -2141,59 +2141,80 @@ sequence_def:
|
|||||||
| NO_SYM MINVALUE_SYM
|
| NO_SYM MINVALUE_SYM
|
||||||
{
|
{
|
||||||
if (Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value;
|
||||||
}
|
}
|
||||||
| NOMINVALUE_SYM
|
| NOMINVALUE_SYM
|
||||||
{
|
{
|
||||||
if (Lex->create_info.seq_create_info->used_fields & seq_field_used_min_value)
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_min_value;
|
||||||
}
|
}
|
||||||
| MAXVALUE_SYM opt_equal longlong_num
|
| 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->max_value= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value;
|
||||||
}
|
}
|
||||||
| NO_SYM MAXVALUE_SYM
|
| NO_SYM MAXVALUE_SYM
|
||||||
{
|
{
|
||||||
if (Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value;
|
||||||
}
|
}
|
||||||
| NOMAXVALUE_SYM
|
| NOMAXVALUE_SYM
|
||||||
{
|
{
|
||||||
if (Lex->create_info.seq_create_info->used_fields & seq_field_used_max_value)
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_max_value;
|
||||||
}
|
}
|
||||||
| START_SYM opt_with longlong_num
|
| 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->start= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_start;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_start;
|
||||||
}
|
}
|
||||||
| INCREMENT_SYM opt_by longlong_num
|
| 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->increment= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_increment;
|
||||||
}
|
}
|
||||||
| CACHE_SYM opt_equal longlong_num
|
| 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->cache= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache;
|
||||||
}
|
}
|
||||||
| NOCACHE_SYM
|
| 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->cache= 0;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cache;
|
||||||
}
|
}
|
||||||
| CYCLE_SYM
|
| 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->cycle= 1;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle;
|
||||||
}
|
}
|
||||||
| NOCYCLE_SYM
|
| 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->cycle= 0;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_cycle;
|
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");
|
thd->parse_error(ER_SYNTAX_ERROR, "RESTART");
|
||||||
YYABORT;
|
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;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart;
|
||||||
}
|
}
|
||||||
| RESTART_SYM opt_with longlong_num
|
| RESTART_SYM opt_with longlong_num
|
||||||
@ -2213,6 +2237,9 @@ sequence_def:
|
|||||||
thd->parse_error(ER_SYNTAX_ERROR, "RESTART");
|
thd->parse_error(ER_SYNTAX_ERROR, "RESTART");
|
||||||
YYABORT;
|
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->restart= $3;
|
||||||
Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value;
|
Lex->create_info.seq_create_info->used_fields|= seq_field_used_restart | seq_field_used_restart_value;
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,10 @@ int wsrep_init_vars()
|
|||||||
return 0;
|
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)
|
bool wsrep_on_update (sys_var *self, THD* thd, enum_var_type var_type)
|
||||||
{
|
{
|
||||||
|
@ -136,7 +136,6 @@ SET(INNOBASE_SOURCES
|
|||||||
trx/trx0sys.cc
|
trx/trx0sys.cc
|
||||||
trx/trx0trx.cc
|
trx/trx0trx.cc
|
||||||
trx/trx0undo.cc
|
trx/trx0undo.cc
|
||||||
usr/usr0sess.cc
|
|
||||||
ut/ut0crc32.cc
|
ut/ut0crc32.cc
|
||||||
ut/ut0dbg.cc
|
ut/ut0dbg.cc
|
||||||
ut/ut0list.cc
|
ut/ut0list.cc
|
||||||
@ -150,6 +149,7 @@ SET(INNOBASE_SOURCES
|
|||||||
ut/ut0timer.cc)
|
ut/ut0timer.cc)
|
||||||
|
|
||||||
MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE
|
MYSQL_ADD_PLUGIN(innobase ${INNOBASE_SOURCES} STORAGE_ENGINE
|
||||||
|
MODULE_OUTPUT_NAME ha_innodb
|
||||||
DEFAULT RECOMPILE_FOR_EMBEDDED
|
DEFAULT RECOMPILE_FOR_EMBEDDED
|
||||||
LINK_LIBRARIES
|
LINK_LIBRARIES
|
||||||
${ZLIB_LIBRARY}
|
${ZLIB_LIBRARY}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 "row0mysql.h"
|
||||||
#include "pars0pars.h"
|
#include "pars0pars.h"
|
||||||
#include "trx0roll.h"
|
#include "trx0roll.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "ut0vec.h"
|
#include "ut0vec.h"
|
||||||
#include "dict0priv.h"
|
#include "dict0priv.h"
|
||||||
#include "fts0priv.h"
|
#include "fts0priv.h"
|
||||||
|
@ -2705,6 +2705,7 @@ retry:
|
|||||||
fts_table.parent = table->name.m_name;
|
fts_table.parent = table->name.m_name;
|
||||||
|
|
||||||
trx = trx_allocate_for_background();
|
trx = trx_allocate_for_background();
|
||||||
|
trx_start_internal(trx);
|
||||||
|
|
||||||
trx->op_info = "update the next FTS document id";
|
trx->op_info = "update the next FTS document id";
|
||||||
|
|
||||||
@ -2825,6 +2826,7 @@ fts_update_sync_doc_id(
|
|||||||
|
|
||||||
if (!trx) {
|
if (!trx) {
|
||||||
trx = trx_allocate_for_background();
|
trx = trx_allocate_for_background();
|
||||||
|
trx_start_internal(trx);
|
||||||
|
|
||||||
trx->op_info = "setting last FTS document id";
|
trx->op_info = "setting last FTS document id";
|
||||||
local_trx = TRUE;
|
local_trx = TRUE;
|
||||||
@ -3062,6 +3064,8 @@ fts_commit_table(
|
|||||||
fts_cache_t* cache = ftt->table->fts->cache;
|
fts_cache_t* cache = ftt->table->fts->cache;
|
||||||
trx_t* trx = trx_allocate_for_background();
|
trx_t* trx = trx_allocate_for_background();
|
||||||
|
|
||||||
|
trx_start_internal(trx);
|
||||||
|
|
||||||
rows = ftt->rows;
|
rows = ftt->rows;
|
||||||
|
|
||||||
ftt->fts_trx->trx = trx;
|
ftt->fts_trx->trx = trx;
|
||||||
@ -3803,6 +3807,7 @@ fts_doc_fetch_by_doc_id(
|
|||||||
trx_t* trx = trx_allocate_for_background();
|
trx_t* trx = trx_allocate_for_background();
|
||||||
que_t* graph;
|
que_t* graph;
|
||||||
|
|
||||||
|
trx_start_internal(trx);
|
||||||
trx->op_info = "fetching indexed FTS document";
|
trx->op_info = "fetching indexed FTS document";
|
||||||
|
|
||||||
/* The FTS index can be supplied by caller directly with
|
/* The FTS index can be supplied by caller directly with
|
||||||
@ -4149,6 +4154,7 @@ fts_sync_begin(
|
|||||||
sync->start_time = ut_time();
|
sync->start_time = ut_time();
|
||||||
|
|
||||||
sync->trx = trx_allocate_for_background();
|
sync->trx = trx_allocate_for_background();
|
||||||
|
trx_start_internal(sync->trx);
|
||||||
|
|
||||||
if (fts_enable_diag_print) {
|
if (fts_enable_diag_print) {
|
||||||
ib::info() << "FTS SYNC for table " << sync->table->name
|
ib::info() << "FTS SYNC for table " << sync->table->name
|
||||||
@ -5019,7 +5025,6 @@ fts_get_rows_count(
|
|||||||
char table_name[MAX_FULL_NAME_LEN];
|
char table_name[MAX_FULL_NAME_LEN];
|
||||||
|
|
||||||
trx = trx_allocate_for_background();
|
trx = trx_allocate_for_background();
|
||||||
|
|
||||||
trx->op_info = "fetching FT table rows count";
|
trx->op_info = "fetching FT table rows count";
|
||||||
|
|
||||||
info = pars_info_create();
|
info = pars_info_create();
|
||||||
@ -7341,6 +7346,7 @@ fts_load_stopword(
|
|||||||
|
|
||||||
if (!trx) {
|
if (!trx) {
|
||||||
trx = trx_allocate_for_background();
|
trx = trx_allocate_for_background();
|
||||||
|
trx_start_internal(trx);
|
||||||
trx->op_info = "upload FTS stopword";
|
trx->op_info = "upload FTS stopword";
|
||||||
new_trx = TRUE;
|
new_trx = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2007, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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) {
|
if (!trx) {
|
||||||
trx = trx_allocate_for_background();
|
trx = trx_allocate_for_background();
|
||||||
|
trx_start_internal(trx);
|
||||||
alloc_bk_trx = TRUE;
|
alloc_bk_trx = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1619,6 +1620,7 @@ fts_optimize_create(
|
|||||||
optim->table = table;
|
optim->table = table;
|
||||||
|
|
||||||
optim->trx = trx_allocate_for_background();
|
optim->trx = trx_allocate_for_background();
|
||||||
|
trx_start_internal(optim->trx);
|
||||||
|
|
||||||
optim->fts_common_table.parent = table->name.m_name;
|
optim->fts_common_table.parent = table->name.m_name;
|
||||||
optim->fts_common_table.table_id = table->id;
|
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);
|
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);
|
trx_free_for_background(optim->trx);
|
||||||
|
|
||||||
fts_doc_ids_free(optim->to_delete);
|
fts_doc_ids_free(optim->to_delete);
|
||||||
|
@ -148,12 +148,9 @@ TABLE *get_purge_table(THD *thd);
|
|||||||
|
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
#include "dict0priv.h"
|
#include "dict0priv.h"
|
||||||
#include "../storage/innobase/include/ut0byte.h"
|
#include "ut0byte.h"
|
||||||
#include <mysql/service_md5.h>
|
#include <mysql/service_md5.h>
|
||||||
|
|
||||||
class binlog_trx_data;
|
|
||||||
extern handlerton *binlog_hton;
|
|
||||||
|
|
||||||
extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log;
|
extern MYSQL_PLUGIN_IMPORT MYSQL_BIN_LOG mysql_bin_log;
|
||||||
|
|
||||||
static inline wsrep_ws_handle_t*
|
static inline wsrep_ws_handle_t*
|
||||||
@ -1880,14 +1877,11 @@ thd_innodb_tmpdir(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Obtain the InnoDB transaction of a MySQL thread.
|
/** 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 */
|
@return reference to transaction pointer */
|
||||||
MY_ATTRIBUTE((warn_unused_result))
|
static trx_t* thd_to_trx(THD* thd)
|
||||||
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
|
#ifdef WITH_WSREP
|
||||||
@ -2796,20 +2790,19 @@ check_trx_exists(
|
|||||||
/*=============*/
|
/*=============*/
|
||||||
THD* thd) /*!< in: user thread handle */
|
THD* thd) /*!< in: user thread handle */
|
||||||
{
|
{
|
||||||
trx_t*& trx = thd_to_trx(thd);
|
if (trx_t* trx = thd_to_trx(thd)) {
|
||||||
|
ut_a(trx->magic_n == TRX_MAGIC_N);
|
||||||
if (trx == NULL) {
|
innobase_trx_init(thd, trx);
|
||||||
|
return trx;
|
||||||
|
} else {
|
||||||
trx = innobase_trx_allocate(thd);
|
trx = innobase_trx_allocate(thd);
|
||||||
/* User trx can be forced to rollback,
|
/* User trx can be forced to rollback,
|
||||||
so we unset the disable flag. */
|
so we unset the disable flag. */
|
||||||
ut_ad(trx->in_innodb & TRX_FORCE_ROLLBACK_DISABLE);
|
ut_ad(trx->in_innodb & TRX_FORCE_ROLLBACK_DISABLE);
|
||||||
trx->in_innodb &= TRX_FORCE_ROLLBACK_MASK;
|
trx->in_innodb &= TRX_FORCE_ROLLBACK_MASK;
|
||||||
} else {
|
thd_set_ha_data(thd, innodb_hton_ptr, trx);
|
||||||
ut_a(trx->magic_n == TRX_MAGIC_N);
|
return trx;
|
||||||
innobase_trx_init(thd, trx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(trx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2823,8 +2816,7 @@ trx_t *current_trx()
|
|||||||
{
|
{
|
||||||
THD *thd=current_thd;
|
THD *thd=current_thd;
|
||||||
if (likely(thd != 0) && innodb_hton_ptr->slot != HA_SLOT_UNDEF) {
|
if (likely(thd != 0) && innodb_hton_ptr->slot != HA_SLOT_UNDEF) {
|
||||||
trx_t*& trx = thd_to_trx(thd);
|
return thd_to_trx(thd);
|
||||||
return(trx);
|
|
||||||
} else {
|
} else {
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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)
|
create_table_info_t::normalize_table_name_low(norm_name, name, FALSE)
|
||||||
#endif /* _WIN32 */
|
#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.
|
/** Converts an InnoDB error code to a MySQL error code.
|
||||||
Also tells to MySQL about a possible transaction rollback inside InnoDB caused
|
Also tells to MySQL about a possible transaction rollback inside InnoDB caused
|
||||||
by a lock wait timeout or a deadlock.
|
by a lock wait timeout or a deadlock.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 "univ.i"
|
||||||
#include "que0types.h"
|
#include "que0types.h"
|
||||||
#include "usr0types.h"
|
|
||||||
#include "pars0sym.h"
|
#include "pars0sym.h"
|
||||||
#include "dict0types.h"
|
#include "dict0types.h"
|
||||||
#include "row0sel.h"
|
#include "row0sel.h"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 "univ.i"
|
||||||
#include "que0types.h"
|
#include "que0types.h"
|
||||||
#include "usr0types.h"
|
|
||||||
#include "pars0types.h"
|
#include "pars0types.h"
|
||||||
#include "row0types.h"
|
#include "row0types.h"
|
||||||
#include "trx0types.h"
|
#include "trx0types.h"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 "univ.i"
|
||||||
#include "que0types.h"
|
#include "que0types.h"
|
||||||
#include "usr0types.h"
|
|
||||||
#include "dict0types.h"
|
#include "dict0types.h"
|
||||||
#include "pars0types.h"
|
#include "pars0types.h"
|
||||||
#include "row0types.h"
|
#include "row0types.h"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 "trx0trx.h"
|
||||||
#include "trx0roll.h"
|
#include "trx0roll.h"
|
||||||
#include "srv0srv.h"
|
#include "srv0srv.h"
|
||||||
#include "usr0types.h"
|
|
||||||
#include "que0types.h"
|
#include "que0types.h"
|
||||||
#include "row0types.h"
|
#include "row0types.h"
|
||||||
#include "pars0types.h"
|
#include "pars0types.h"
|
||||||
|
@ -23,8 +23,6 @@ Query graph
|
|||||||
Created 5/27/1996 Heikki Tuuri
|
Created 5/27/1996 Heikki Tuuri
|
||||||
*******************************************************/
|
*******************************************************/
|
||||||
|
|
||||||
#include "usr0sess.h"
|
|
||||||
|
|
||||||
/***********************************************************************//**
|
/***********************************************************************//**
|
||||||
Gets the trx of a query thread. */
|
Gets the trx of a query thread. */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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 "trx0sys.h"
|
||||||
#include "que0types.h"
|
#include "que0types.h"
|
||||||
#include "page0page.h"
|
#include "page0page.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "fil0fil.h"
|
#include "fil0fil.h"
|
||||||
#include "read0types.h"
|
#include "read0types.h"
|
||||||
|
|
||||||
@ -491,8 +490,6 @@ public:
|
|||||||
/** Destruct the purge system. */
|
/** Destruct the purge system. */
|
||||||
~purge_sys_t();
|
~purge_sys_t();
|
||||||
|
|
||||||
sess_t* sess; /*!< System session running the purge
|
|
||||||
query */
|
|
||||||
rw_lock_t latch; /*!< The latch protecting the purge
|
rw_lock_t latch; /*!< The latch protecting the purge
|
||||||
view. A purge operation must acquire an
|
view. A purge operation must acquire an
|
||||||
x-latch here for the instant at which
|
x-latch here for the instant at which
|
||||||
|
@ -38,7 +38,6 @@ Created 3/26/1996 Heikki Tuuri
|
|||||||
|
|
||||||
#include "lock0types.h"
|
#include "lock0types.h"
|
||||||
#include "log0log.h"
|
#include "log0log.h"
|
||||||
#include "usr0types.h"
|
|
||||||
#include "que0types.h"
|
#include "que0types.h"
|
||||||
#include "mem0mem.h"
|
#include "mem0mem.h"
|
||||||
#include "trx0xa.h"
|
#include "trx0xa.h"
|
||||||
@ -55,9 +54,6 @@ class FlushObserver;
|
|||||||
|
|
||||||
struct rw_trx_hash_element_t;
|
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
|
/** Set flush observer for the transaction
|
||||||
@param[in/out] trx transaction struct
|
@param[in/out] trx transaction struct
|
||||||
@param[in] observer flush observer */
|
@param[in] observer flush observer */
|
||||||
@ -1112,7 +1108,6 @@ public:
|
|||||||
ulint error_key_num; /*!< if the index creation fails to a
|
ulint error_key_num; /*!< if the index creation fails to a
|
||||||
duplicate key error, a mysql key
|
duplicate key error, a mysql key
|
||||||
number of that index is stored here */
|
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,
|
que_t* graph; /*!< query currently run in the session,
|
||||||
or NULL if none; NOTE that the query
|
or NULL if none; NOTE that the query
|
||||||
belongs to the session, and it can
|
belongs to the session, and it can
|
||||||
|
@ -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
|
|
@ -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
|
|
@ -35,7 +35,6 @@ Created 5/7/1996 Heikki Tuuri
|
|||||||
#include "lock0lock.h"
|
#include "lock0lock.h"
|
||||||
#include "lock0priv.h"
|
#include "lock0priv.h"
|
||||||
#include "dict0mem.h"
|
#include "dict0mem.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "trx0purge.h"
|
#include "trx0purge.h"
|
||||||
#include "trx0sys.h"
|
#include "trx0sys.h"
|
||||||
#include "srv0mon.h"
|
#include "srv0mon.h"
|
||||||
@ -54,7 +53,7 @@ Created 5/7/1996 Heikki Tuuri
|
|||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
/** Lock scheduling algorithm */
|
/** Lock scheduling algorithm */
|
||||||
ulong innodb_lock_schedule_algorithm = INNODB_LOCK_SCHEDULE_ALGORITHM_FCFS;
|
ulong innodb_lock_schedule_algorithm;
|
||||||
|
|
||||||
/** The value of innodb_deadlock_detect */
|
/** The value of innodb_deadlock_detect */
|
||||||
my_bool innobase_deadlock_detect;
|
my_bool innobase_deadlock_detect;
|
||||||
|
@ -29,7 +29,6 @@ Created 9/7/2013 Jimmy Yang
|
|||||||
#include "lock0priv.h"
|
#include "lock0priv.h"
|
||||||
#include "lock0prdt.h"
|
#include "lock0prdt.h"
|
||||||
#include "ha_prototypes.h"
|
#include "ha_prototypes.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "trx0purge.h"
|
#include "trx0purge.h"
|
||||||
#include "dict0mem.h"
|
#include "dict0mem.h"
|
||||||
#include "dict0boot.h"
|
#include "dict0boot.h"
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2009, Google Inc.
|
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
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -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_lock(&log_sys->checkpoint_lock);
|
||||||
rw_lock_s_unlock(&log_sys->checkpoint_lock);
|
rw_lock_s_unlock(&log_sys->checkpoint_lock);
|
||||||
|
|
||||||
DEBUG_SYNC_C("checkpoint_completed");
|
|
||||||
|
|
||||||
DBUG_EXECUTE_IF(
|
DBUG_EXECUTE_IF(
|
||||||
"crash_after_checkpoint",
|
"crash_after_checkpoint",
|
||||||
DBUG_SUICIDE(););
|
DBUG_SUICIDE(););
|
||||||
|
@ -27,7 +27,6 @@ Created 5/27/1996 Heikki Tuuri
|
|||||||
#include "ha_prototypes.h"
|
#include "ha_prototypes.h"
|
||||||
|
|
||||||
#include "que0que.h"
|
#include "que0que.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "trx0trx.h"
|
#include "trx0trx.h"
|
||||||
#include "trx0roll.h"
|
#include "trx0roll.h"
|
||||||
#include "row0undo.h"
|
#include "row0undo.h"
|
||||||
|
@ -45,7 +45,6 @@ Created 4/20/1996 Heikki Tuuri
|
|||||||
#include "log0log.h"
|
#include "log0log.h"
|
||||||
#include "eval0eval.h"
|
#include "eval0eval.h"
|
||||||
#include "data0data.h"
|
#include "data0data.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "buf0lru.h"
|
#include "buf0lru.h"
|
||||||
#include "fts0fts.h"
|
#include "fts0fts.h"
|
||||||
#include "fts0types.h"
|
#include "fts0types.h"
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2008, 2009 Google Inc.
|
Copyright (c) 2008, 2009 Google Inc.
|
||||||
Copyright (c) 2009, Percona Inc.
|
Copyright (c) 2009, Percona Inc.
|
||||||
Copyright (c) 2013, 2017, MariaDB Corporation.
|
Copyright (c) 2013, 2018, MariaDB Corporation.
|
||||||
|
|
||||||
Portions of this file contain modifications contributed and copyrighted by
|
Portions of this file contain modifications contributed and copyrighted by
|
||||||
Google, Inc. Those modifications are gratefully acknowledged and are described
|
Google, Inc. Those modifications are gratefully acknowledged and are described
|
||||||
@ -70,7 +70,6 @@ Created 10/8/1995 Heikki Tuuri
|
|||||||
#include "sync0sync.h"
|
#include "sync0sync.h"
|
||||||
#include "trx0i_s.h"
|
#include "trx0i_s.h"
|
||||||
#include "trx0purge.h"
|
#include "trx0purge.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "ut0crc32.h"
|
#include "ut0crc32.h"
|
||||||
#include "btr0defragment.h"
|
#include "btr0defragment.h"
|
||||||
#include "ut0mem.h"
|
#include "ut0mem.h"
|
||||||
|
@ -87,7 +87,6 @@ Created 2/16/1996 Heikki Tuuri
|
|||||||
#include "dict0load.h"
|
#include "dict0load.h"
|
||||||
#include "dict0stats_bg.h"
|
#include "dict0stats_bg.h"
|
||||||
#include "que0que.h"
|
#include "que0que.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "lock0lock.h"
|
#include "lock0lock.h"
|
||||||
#include "trx0roll.h"
|
#include "trx0roll.h"
|
||||||
#include "trx0purge.h"
|
#include "trx0purge.h"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
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
|
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
|
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
|
/** Build a purge 'query' graph. The actual purge is performed by executing
|
||||||
this query graph.
|
this query graph.
|
||||||
@param[in,out] sess the purge session
|
|
||||||
@return own: the query graph */
|
@return own: the query graph */
|
||||||
static
|
static
|
||||||
que_t*
|
que_t*
|
||||||
trx_purge_graph_build(sess_t* sess)
|
purge_graph_build()
|
||||||
{
|
{
|
||||||
ut_a(srv_n_purge_threads > 0);
|
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_t* trx = trx_allocate_for_background();
|
||||||
|
ut_ad(!trx->id);
|
||||||
trx->id = 0;
|
|
||||||
trx->start_time = ut_time();
|
trx->start_time = ut_time();
|
||||||
trx->state = TRX_STATE_ACTIVE;
|
trx->state = TRX_STATE_ACTIVE;
|
||||||
trx->op_info = "purge trx";
|
trx->op_info = "purge trx";
|
||||||
@ -198,9 +192,9 @@ trx_purge_graph_build(sess_t* sess)
|
|||||||
|
|
||||||
/** Construct the purge system. */
|
/** Construct the purge system. */
|
||||||
purge_sys_t::purge_sys_t()
|
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),
|
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),
|
view(), n_submitted(0), n_completed(0),
|
||||||
iter(), limit(),
|
iter(), limit(),
|
||||||
#ifdef UNIV_DEBUG
|
#ifdef UNIV_DEBUG
|
||||||
@ -220,10 +214,12 @@ purge_sys_t::~purge_sys_t()
|
|||||||
{
|
{
|
||||||
ut_ad(this == purge_sys);
|
ut_ad(this == purge_sys);
|
||||||
|
|
||||||
|
trx_t* trx = query->trx;
|
||||||
que_graph_free(query);
|
que_graph_free(query);
|
||||||
ut_a(sess->trx->id == 0);
|
ut_ad(!trx->id);
|
||||||
sess->trx->state = TRX_STATE_NOT_STARTED;
|
ut_ad(trx->state == TRX_STATE_ACTIVE);
|
||||||
sess_close(sess);
|
trx->state = TRX_STATE_NOT_STARTED;
|
||||||
|
trx_free_for_background(trx);
|
||||||
rw_lock_free(&latch);
|
rw_lock_free(&latch);
|
||||||
/* rw_lock_free() already called latch.~rw_lock_t(); tame the
|
/* rw_lock_free() already called latch.~rw_lock_t(); tame the
|
||||||
debug assertions when the destructor will be called once more. */
|
debug assertions when the destructor will be called once more. */
|
||||||
|
@ -46,7 +46,6 @@ Created 3/26/1996 Heikki Tuuri
|
|||||||
#include "trx0sys.h"
|
#include "trx0sys.h"
|
||||||
#include "trx0trx.h"
|
#include "trx0trx.h"
|
||||||
#include "trx0undo.h"
|
#include "trx0undo.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "ha_prototypes.h"
|
#include "ha_prototypes.h"
|
||||||
|
|
||||||
/** This many pages must be undone before a truncate is tried within
|
/** This many pages must be undone before a truncate is tried within
|
||||||
|
@ -513,11 +513,6 @@ trx_sys_t::close()
|
|||||||
" shutdown: " << size << " read views open";
|
" shutdown: " << size << " read views open";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trx_dummy_sess) {
|
|
||||||
sess_close(trx_dummy_sess);
|
|
||||||
trx_dummy_sess = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
rw_trx_hash.destroy();
|
rw_trx_hash.destroy();
|
||||||
|
|
||||||
/* There can't be any active transactions. */
|
/* There can't be any active transactions. */
|
||||||
|
@ -50,7 +50,6 @@ Created 3/26/1996 Heikki Tuuri
|
|||||||
#include "trx0rseg.h"
|
#include "trx0rseg.h"
|
||||||
#include "trx0undo.h"
|
#include "trx0undo.h"
|
||||||
#include "trx0xa.h"
|
#include "trx0xa.h"
|
||||||
#include "usr0sess.h"
|
|
||||||
#include "ut0new.h"
|
#include "ut0new.h"
|
||||||
#include "ut0pool.h"
|
#include "ut0pool.h"
|
||||||
#include "ut0vec.h"
|
#include "ut0vec.h"
|
||||||
@ -80,9 +79,6 @@ typedef std::set<
|
|||||||
std::less<table_id_t>,
|
std::less<table_id_t>,
|
||||||
ut_allocator<table_id_t> > table_id_set;
|
ut_allocator<table_id_t> > table_id_set;
|
||||||
|
|
||||||
/** Dummy session used currently in MySQL interface */
|
|
||||||
sess_t* trx_dummy_sess = NULL;
|
|
||||||
|
|
||||||
/** Constructor */
|
/** Constructor */
|
||||||
TrxVersion::TrxVersion(trx_t* trx)
|
TrxVersion::TrxVersion(trx_t* trx)
|
||||||
:
|
:
|
||||||
@ -532,8 +528,6 @@ trx_allocate_for_background(void)
|
|||||||
|
|
||||||
trx = trx_create_low();
|
trx = trx_create_low();
|
||||||
|
|
||||||
trx->sess = trx_dummy_sess;
|
|
||||||
|
|
||||||
return(trx);
|
return(trx);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -890,9 +884,7 @@ trx_lists_init_at_db_start()
|
|||||||
ut_a(srv_is_being_started);
|
ut_a(srv_is_being_started);
|
||||||
ut_ad(!srv_was_started);
|
ut_ad(!srv_was_started);
|
||||||
ut_ad(!purge_sys);
|
ut_ad(!purge_sys);
|
||||||
ut_ad(!trx_dummy_sess);
|
|
||||||
|
|
||||||
trx_dummy_sess = sess_open();
|
|
||||||
purge_sys = UT_NEW_NOKEY(purge_sys_t());
|
purge_sys = UT_NEW_NOKEY(purge_sys_t());
|
||||||
|
|
||||||
if (srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) {
|
if (srv_force_recovery >= SRV_FORCE_NO_UNDO_LOG_SCAN) {
|
||||||
|
@ -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);
|
|
||||||
}
|
|
@ -165,7 +165,6 @@ ut_new_boot()
|
|||||||
"trx0sys",
|
"trx0sys",
|
||||||
"trx0trx",
|
"trx0trx",
|
||||||
"trx0undo",
|
"trx0undo",
|
||||||
"usr0sess",
|
|
||||||
"ut0list",
|
"ut0list",
|
||||||
"ut0mem",
|
"ut0mem",
|
||||||
"ut0mutex",
|
"ut0mutex",
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
|
|
||||||
SET(WSREP_SOURCES wsrep_gtid.c wsrep_uuid.c wsrep_loader.c wsrep_dummy.c)
|
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})
|
ADD_CONVENIENCE_LIBRARY(wsrep ${WSREP_SOURCES})
|
||||||
DTRACE_INSTRUMENT(wsrep)
|
DTRACE_INSTRUMENT(wsrep)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user