mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-26938 Support descending indexes internally in InnoDB (server part)
* preserve DESC index property in the parser * store it in the frm (only for HA_KEY_ALG_BTREE) * read it from the frm * show it in SHOW CREATE * skip DESC indexes in opt_range.cc and opt_sum.cc * ORDER BY test This includes a fix of MDEV-27432.
This commit is contained in:
@ -318,7 +318,7 @@ a3 char(3),
|
|||||||
a4 real,
|
a4 real,
|
||||||
a5 date,
|
a5 date,
|
||||||
key k1(a2,a3),
|
key k1(a2,a3),
|
||||||
key k2(a4 desc,a1),
|
key k2(a4 /*desc*/,a1),
|
||||||
key k3(a5,a1)
|
key k3(a5,a1)
|
||||||
);
|
);
|
||||||
create table t2(
|
create table t2(
|
||||||
|
@ -206,7 +206,7 @@ create table t1(
|
|||||||
a4 real,
|
a4 real,
|
||||||
a5 date,
|
a5 date,
|
||||||
key k1(a2,a3),
|
key k1(a2,a3),
|
||||||
key k2(a4 desc,a1),
|
key k2(a4 /*desc*/,a1),
|
||||||
key k3(a5,a1)
|
key k3(a5,a1)
|
||||||
);
|
);
|
||||||
create table t2(
|
create table t2(
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
drop table if exists t1,t2,t3;
|
|
||||||
SET SQL_WARNINGS=1;
|
SET SQL_WARNINGS=1;
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
ID CHAR(32) NOT NULL,
|
ID CHAR(32) NOT NULL,
|
||||||
@ -685,3 +684,8 @@ c c
|
|||||||
9 10
|
9 10
|
||||||
10 11
|
10 11
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
|
||||||
|
#
|
||||||
|
create table t1 (a int, b int, key(a), key(a desc));
|
||||||
|
drop table t1;
|
||||||
|
@ -1,6 +1,3 @@
|
|||||||
--disable_warnings
|
|
||||||
drop table if exists t1,t2,t3;
|
|
||||||
--enable_warnings
|
|
||||||
--source include/have_sequence.inc
|
--source include/have_sequence.inc
|
||||||
SET SQL_WARNINGS=1;
|
SET SQL_WARNINGS=1;
|
||||||
|
|
||||||
@ -603,3 +600,9 @@ EXPLAIN SELECT t1.c, t2.c FROM t1, t2 WHERE t1.b=t2.a and t1.c=t2.b;
|
|||||||
SELECT t1.c, t2.c FROM t1, t2 WHERE t1.b=t2.a and t1.c=t2.b;
|
SELECT t1.c, t2.c FROM t1, t2 WHERE t1.b=t2.a and t1.c=t2.b;
|
||||||
|
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
|
||||||
|
--echo #
|
||||||
|
create table t1 (a int, b int, key(a), key(a desc));
|
||||||
|
drop table t1;
|
||||||
|
@ -1201,8 +1201,8 @@ EXPLAIN SELECT DISTINCT a FROM t1 {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "a",
|
"index": "a",
|
||||||
"usable": true,
|
"key_parts": ["a"],
|
||||||
"key_parts": ["a"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"best_covering_index_scan": {
|
"best_covering_index_scan": {
|
||||||
@ -1384,8 +1384,8 @@ EXPLAIN SELECT MIN(d) FROM t1 where b=2 and c=3 group by a {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "a",
|
"index": "a",
|
||||||
"usable": true,
|
"key_parts": ["a", "b", "c", "d"],
|
||||||
"key_parts": ["a", "b", "c", "d"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"best_covering_index_scan": {
|
"best_covering_index_scan": {
|
||||||
@ -1583,8 +1583,8 @@ EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a>=20010104e0 GROUP BY id {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "id",
|
"index": "id",
|
||||||
"usable": true,
|
"key_parts": ["id", "a"],
|
||||||
"key_parts": ["id", "a"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"best_covering_index_scan": {
|
"best_covering_index_scan": {
|
||||||
@ -1771,8 +1771,8 @@ EXPLAIN SELECT * FROM t1 WHERE a = 20010104e0 GROUP BY id {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "id",
|
"index": "id",
|
||||||
"usable": true,
|
"key_parts": ["id", "a"],
|
||||||
"key_parts": ["id", "a"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"best_covering_index_scan": {
|
"best_covering_index_scan": {
|
||||||
@ -2010,13 +2010,13 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "a_c",
|
"index": "a_c",
|
||||||
"usable": true,
|
"key_parts": ["a", "c"],
|
||||||
"key_parts": ["a", "c"]
|
"usable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "a_b",
|
"index": "a_b",
|
||||||
"usable": true,
|
"key_parts": ["a", "b"],
|
||||||
"key_parts": ["a", "b"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"setup_range_conditions": [],
|
"setup_range_conditions": [],
|
||||||
@ -2213,8 +2213,8 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "a_c",
|
"index": "a_c",
|
||||||
"usable": true,
|
"key_parts": ["a", "c"],
|
||||||
"key_parts": ["a", "c"]
|
"usable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "a_b",
|
"index": "a_b",
|
||||||
@ -3233,18 +3233,18 @@ explain select * from t1 where pk = 2 and a=5 and b=1 {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "pk",
|
"index": "pk",
|
||||||
"usable": true,
|
"key_parts": ["pk"],
|
||||||
"key_parts": ["pk"]
|
"usable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "pk_a",
|
"index": "pk_a",
|
||||||
"usable": true,
|
"key_parts": ["pk", "a"],
|
||||||
"key_parts": ["pk", "a"]
|
"usable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "pk_a_b",
|
"index": "pk_a_b",
|
||||||
"usable": true,
|
"key_parts": ["pk", "a", "b"],
|
||||||
"key_parts": ["pk", "a", "b"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"best_covering_index_scan": {
|
"best_covering_index_scan": {
|
||||||
@ -3751,8 +3751,8 @@ explain delete from t0 where t0.a<3 {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "a",
|
"index": "a",
|
||||||
"usable": true,
|
"key_parts": ["a"],
|
||||||
"key_parts": ["a"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"setup_range_conditions": [],
|
"setup_range_conditions": [],
|
||||||
@ -3889,8 +3889,8 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "a",
|
"index": "a",
|
||||||
"usable": true,
|
"key_parts": ["a"],
|
||||||
"key_parts": ["a"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"best_covering_index_scan": {
|
"best_covering_index_scan": {
|
||||||
@ -3954,8 +3954,8 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "a",
|
"index": "a",
|
||||||
"usable": true,
|
"key_parts": ["a"],
|
||||||
"key_parts": ["a"]
|
"usable": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"best_covering_index_scan": {
|
"best_covering_index_scan": {
|
||||||
|
@ -78,13 +78,13 @@ explain select * from t1 where a=1 or b=1 {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "a",
|
"index": "a",
|
||||||
"usable": true,
|
"key_parts": ["a"],
|
||||||
"key_parts": ["a"]
|
"usable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "b",
|
"index": "b",
|
||||||
"usable": true,
|
"key_parts": ["b"],
|
||||||
"key_parts": ["b"]
|
"usable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "c",
|
"index": "c",
|
||||||
|
@ -93,13 +93,13 @@ explain select * from t1 where pk1 != 0 and key1 = 1 {
|
|||||||
"potential_range_indexes": [
|
"potential_range_indexes": [
|
||||||
{
|
{
|
||||||
"index": "PRIMARY",
|
"index": "PRIMARY",
|
||||||
"usable": true,
|
"key_parts": ["pk1", "pk2"],
|
||||||
"key_parts": ["pk1", "pk2"]
|
"usable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "key1",
|
"index": "key1",
|
||||||
"usable": true,
|
"key_parts": ["key1"],
|
||||||
"key_parts": ["key1"]
|
"usable": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"index": "key2",
|
"index": "key2",
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
call mtr.add_suppression("Sort aborted.*");
|
call mtr.add_suppression("Sort aborted.*");
|
||||||
drop table if exists t1,t2,t3;
|
|
||||||
call mtr.add_suppression("Out of sort memory; increase server sort buffer size");
|
call mtr.add_suppression("Out of sort memory; increase server sort buffer size");
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
id int(6) DEFAULT '0' NOT NULL,
|
id int(6) DEFAULT '0' NOT NULL,
|
||||||
@ -4487,3 +4486,38 @@ a group_concat(t1.b)
|
|||||||
58 1
|
58 1
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
# End of 10.6 tests
|
# End of 10.6 tests
|
||||||
|
#
|
||||||
|
# MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
|
||||||
|
#
|
||||||
|
create table t1 (a int, b int, c int, key r (a desc, b asc));
|
||||||
|
insert t1 select seq % 10, seq div 10, seq from seq_1_to_55;
|
||||||
|
insert t1 values (NULL, NULL, NULL), (9, NULL, NULL);
|
||||||
|
explain select * from t1 force index(r) order by a,b limit 20;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 57 Using filesort
|
||||||
|
explain select * from t1 force index(r) order by a desc,b limit 20;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index NULL r 10 NULL 20
|
||||||
|
select * from t1 force index(r) order by a desc,b limit 20;
|
||||||
|
a b c
|
||||||
|
9 NULL NULL
|
||||||
|
9 0 9
|
||||||
|
9 1 19
|
||||||
|
9 2 29
|
||||||
|
9 3 39
|
||||||
|
9 4 49
|
||||||
|
8 0 8
|
||||||
|
8 1 18
|
||||||
|
8 2 28
|
||||||
|
8 3 38
|
||||||
|
8 4 48
|
||||||
|
7 0 7
|
||||||
|
7 1 17
|
||||||
|
7 2 27
|
||||||
|
7 3 37
|
||||||
|
7 4 47
|
||||||
|
6 0 6
|
||||||
|
6 1 16
|
||||||
|
6 2 26
|
||||||
|
6 3 36
|
||||||
|
drop table t1;
|
||||||
|
@ -3,11 +3,6 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
call mtr.add_suppression("Sort aborted.*");
|
call mtr.add_suppression("Sort aborted.*");
|
||||||
|
|
||||||
--disable_warnings
|
|
||||||
drop table if exists t1,t2,t3;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
call mtr.add_suppression("Out of sort memory; increase server sort buffer size");
|
call mtr.add_suppression("Out of sort memory; increase server sort buffer size");
|
||||||
--source include/have_sequence.inc
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
@ -15,8 +10,6 @@ call mtr.add_suppression("Out of sort memory; increase server sort buffer size")
|
|||||||
# Test old ORDER BY bug
|
# Test old ORDER BY bug
|
||||||
#
|
#
|
||||||
|
|
||||||
--source include/have_sequence.inc
|
|
||||||
|
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
id int(6) DEFAULT '0' NOT NULL,
|
id int(6) DEFAULT '0' NOT NULL,
|
||||||
idservice int(5),
|
idservice int(5),
|
||||||
@ -2649,3 +2642,14 @@ eval $query;
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
|
||||||
--echo # End of 10.6 tests
|
--echo # End of 10.6 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
|
||||||
|
--echo #
|
||||||
|
create table t1 (a int, b int, c int, key r (a desc, b asc));
|
||||||
|
insert t1 select seq % 10, seq div 10, seq from seq_1_to_55;
|
||||||
|
insert t1 values (NULL, NULL, NULL), (9, NULL, NULL);
|
||||||
|
explain select * from t1 force index(r) order by a,b limit 20;
|
||||||
|
explain select * from t1 force index(r) order by a desc,b limit 20;
|
||||||
|
select * from t1 force index(r) order by a desc,b limit 20;
|
||||||
|
drop table t1;
|
||||||
|
@ -220,6 +220,41 @@ dd.d1, dd.d2, dd.id limit 1
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY t1 index NULL PRIMARY 4 NULL # Using index
|
1 PRIMARY t1 index NULL PRIMARY 4 NULL # Using index
|
||||||
1 PRIMARY t2 eq_ref PRIMARY,id2 PRIMARY 4 func # Using where
|
1 PRIMARY t2 eq_ref PRIMARY,id2 PRIMARY 4 func # Using where
|
||||||
2 DEPENDENT SUBQUERY dd range id2,for_latest_sort for_latest_sort 6 NULL # Using where
|
2 DEPENDENT SUBQUERY dd index id2,for_latest_sort for_latest_sort 14 NULL # Using where
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
|
#
|
||||||
|
# MDEV-26938 Support descending indexes internally in InnoDB
|
||||||
|
#
|
||||||
|
create table t1 (a int, b int, c int, key r (a desc, b asc));
|
||||||
|
insert t1 select seq % 10, seq div 10, seq from seq_1_to_55;
|
||||||
|
insert t1 values (NULL, NULL, NULL), (9, NULL, NULL);
|
||||||
|
explain select * from t1 force index(r) order by a,b limit 20;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 ALL NULL NULL NULL NULL 57 Using filesort
|
||||||
|
explain select * from t1 force index(r) order by a desc,b limit 20;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index NULL r 10 NULL 20
|
||||||
|
select * from t1 force index(r) order by a desc,b limit 20;
|
||||||
|
a b c
|
||||||
|
9 NULL NULL
|
||||||
|
9 0 9
|
||||||
|
9 1 19
|
||||||
|
9 2 29
|
||||||
|
9 3 39
|
||||||
|
9 4 49
|
||||||
|
8 0 8
|
||||||
|
8 1 18
|
||||||
|
8 2 28
|
||||||
|
8 3 38
|
||||||
|
8 4 48
|
||||||
|
7 0 7
|
||||||
|
7 1 17
|
||||||
|
7 2 27
|
||||||
|
7 3 37
|
||||||
|
7 4 47
|
||||||
|
6 0 6
|
||||||
|
6 1 16
|
||||||
|
6 2 26
|
||||||
|
6 3 36
|
||||||
|
drop table t1;
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
#
|
#
|
||||||
# ORDER BY handling (e.g. filesort) tests that require innodb
|
# ORDER BY handling (e.g. filesort) tests that require innodb
|
||||||
#
|
#
|
||||||
-- source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t0,t1,t2,t3;
|
drop table if exists t0,t1,t2,t3;
|
||||||
@ -209,3 +210,14 @@ from
|
|||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-26938 Support descending indexes internally in InnoDB
|
||||||
|
--echo #
|
||||||
|
create table t1 (a int, b int, c int, key r (a desc, b asc));
|
||||||
|
insert t1 select seq % 10, seq div 10, seq from seq_1_to_55;
|
||||||
|
insert t1 values (NULL, NULL, NULL), (9, NULL, NULL);
|
||||||
|
explain select * from t1 force index(r) order by a,b limit 20;
|
||||||
|
explain select * from t1 force index(r) order by a desc,b limit 20;
|
||||||
|
select * from t1 force index(r) order by a desc,b limit 20;
|
||||||
|
drop table t1;
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
drop table if exists t1;
|
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
a int not null,
|
a int not null,
|
||||||
b int not null,
|
b int not null,
|
||||||
@ -783,3 +782,17 @@ a b c
|
|||||||
1 1 1
|
1 1 1
|
||||||
1 NULL NULL
|
1 NULL NULL
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
|
||||||
|
#
|
||||||
|
create table t1 (a int, b int, key(a desc)) partition by hash(a) partitions 4;
|
||||||
|
insert into t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6);
|
||||||
|
explain select * from t1 order by a limit 3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index NULL a 5 NULL 3
|
||||||
|
select * from t1 order by a limit 3;
|
||||||
|
a b
|
||||||
|
1 1
|
||||||
|
2 2
|
||||||
|
3 3
|
||||||
|
drop table t1;
|
||||||
|
@ -1,14 +1,9 @@
|
|||||||
#--disable_abort_on_error
|
|
||||||
#
|
#
|
||||||
# Simple test for the partition storage engine
|
# Simple test for the partition storage engine
|
||||||
# Focuses on tests of ordered index read
|
# Focuses on tests of ordered index read
|
||||||
#
|
#
|
||||||
-- source include/have_partition.inc
|
-- source include/have_partition.inc
|
||||||
|
|
||||||
--disable_warnings
|
|
||||||
drop table if exists t1;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ordered index read, int type
|
# Ordered index read, int type
|
||||||
#
|
#
|
||||||
@ -842,3 +837,12 @@ INSERT into t1 values (1, NULL, NULL), (2, NULL, '10');
|
|||||||
select * from t1 where a = 1 order by a desc, b desc;
|
select * from t1 where a = 1 order by a desc, b desc;
|
||||||
select * from t1 where a = 1 order by b desc;
|
select * from t1 where a = 1 order by b desc;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-13756 Implement descending index: KEY (a DESC, b ASC)
|
||||||
|
--echo #
|
||||||
|
create table t1 (a int, b int, key(a desc)) partition by hash(a) partitions 4;
|
||||||
|
insert into t1 values (1,1),(2,2),(3,3),(4,4),(5,5),(6,6);
|
||||||
|
explain select * from t1 order by a limit 3;
|
||||||
|
select * from t1 order by a limit 3;
|
||||||
|
drop table t1;
|
||||||
|
@ -575,7 +575,7 @@ a
|
|||||||
2010-02-01 09:31:02
|
2010-02-01 09:31:02
|
||||||
2010-02-01 09:31:03
|
2010-02-01 09:31:03
|
||||||
2010-02-01 09:31:04
|
2010-02-01 09:31:04
|
||||||
CREATE TABLE t2 ( a TIMESTAMP, KEY ( a DESC ) );
|
CREATE TABLE t2 ( a TIMESTAMP, KEY ( a ) );
|
||||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:01' );
|
INSERT INTO t2 VALUES( '2010-02-01 09:31:01' );
|
||||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:02' );
|
INSERT INTO t2 VALUES( '2010-02-01 09:31:02' );
|
||||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:03' );
|
INSERT INTO t2 VALUES( '2010-02-01 09:31:03' );
|
||||||
|
@ -386,7 +386,7 @@ EXPLAIN
|
|||||||
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
||||||
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
SELECT * FROM t1 WHERE a >= '2010-02-01 09:31:02.0';
|
||||||
|
|
||||||
CREATE TABLE t2 ( a TIMESTAMP, KEY ( a DESC ) );
|
CREATE TABLE t2 ( a TIMESTAMP, KEY ( a ) );
|
||||||
|
|
||||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:01' );
|
INSERT INTO t2 VALUES( '2010-02-01 09:31:01' );
|
||||||
INSERT INTO t2 VALUES( '2010-02-01 09:31:02' );
|
INSERT INTO t2 VALUES( '2010-02-01 09:31:02' );
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
@@ -13,7 +13,7 @@
|
@@ -13,212 +13,212 @@
|
||||||
#
|
#
|
||||||
# Pre-create several tables
|
# Pre-create several tables
|
||||||
SET SQL_MODE='STRICT_ALL_TABLES';
|
SET SQL_MODE='STRICT_ALL_TABLES';
|
||||||
@ -7,106 +7,347 @@
|
|||||||
INSERT INTO t1 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t1 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
||||||
(20), (30), (31);
|
(20), (30), (31);
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
@@ -28,7 +28,7 @@
|
a
|
||||||
20
|
--10
|
||||||
30
|
--1
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-5
|
||||||
|
-20
|
||||||
|
-30
|
||||||
31
|
31
|
||||||
-CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+5
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
+-1
|
||||||
|
+-10
|
||||||
+CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t2(a TINYINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t2 VALUES(-5);
|
INSERT INTO t2 VALUES(-5);
|
||||||
ERROR 22003: Out of range value for column 'a' at row 1
|
ERROR 22003: Out of range value for column 'a' at row 1
|
||||||
INSERT INTO t2 VALUES(0), (0), (0), (0), (8), (10), (0),
|
INSERT INTO t2 VALUES(0), (0), (0), (0), (8), (10), (0),
|
||||||
@@ -45,7 +45,7 @@
|
(20), (30), (31);
|
||||||
20
|
SELECT * FROM t2;
|
||||||
30
|
a
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-8
|
||||||
|
-10
|
||||||
|
-11
|
||||||
|
-20
|
||||||
|
-30
|
||||||
31
|
31
|
||||||
-CREATE TABLE t3(a SMALLINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t3(a SMALLINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+11
|
||||||
|
+10
|
||||||
|
+8
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
+CREATE TABLE t3(a SMALLINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t3(a SMALLINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t3 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t3 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
||||||
(20), (30), (31), (1024), (4096);
|
(20), (30), (31), (1024), (4096);
|
||||||
SELECT * FROM t3;
|
SELECT * FROM t3;
|
||||||
@@ -62,7 +62,7 @@
|
a
|
||||||
31
|
--10
|
||||||
1024
|
--1
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-5
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
-31
|
||||||
|
-1024
|
||||||
4096
|
4096
|
||||||
-CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+1024
|
||||||
|
+31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+5
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
+-1
|
||||||
|
+-10
|
||||||
+CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t4(a SMALLINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t4 VALUES(-5);
|
INSERT INTO t4 VALUES(-5);
|
||||||
ERROR 22003: Out of range value for column 'a' at row 1
|
ERROR 22003: Out of range value for column 'a' at row 1
|
||||||
INSERT INTO t4 VALUES(0), (0), (0), (0), (8), (10), (0),
|
INSERT INTO t4 VALUES(0), (0), (0), (0), (8), (10), (0),
|
||||||
@@ -81,7 +81,7 @@
|
(20), (30), (31), (1024), (4096);
|
||||||
31
|
SELECT * FROM t4;
|
||||||
1024
|
a
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-8
|
||||||
|
-10
|
||||||
|
-11
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
-31
|
||||||
|
-1024
|
||||||
4096
|
4096
|
||||||
-CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+1024
|
||||||
|
+31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+11
|
||||||
|
+10
|
||||||
|
+8
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
+CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t5(a MEDIUMINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t5 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t5 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
||||||
(20), (30), (31), (1000000), (1000005);
|
(20), (30), (31), (1000000), (1000005);
|
||||||
SELECT * FROM t5;
|
SELECT * FROM t5;
|
||||||
@@ -98,7 +98,7 @@
|
a
|
||||||
31
|
--10
|
||||||
1000000
|
--1
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-5
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
-31
|
||||||
|
-1000000
|
||||||
1000005
|
1000005
|
||||||
-CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+1000000
|
||||||
|
+31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+5
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
+-1
|
||||||
|
+-10
|
||||||
+CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t6(a MEDIUMINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t6 VALUES(-5);
|
INSERT INTO t6 VALUES(-5);
|
||||||
ERROR 22003: Out of range value for column 'a' at row 1
|
ERROR 22003: Out of range value for column 'a' at row 1
|
||||||
INSERT INTO t6 VALUES(0), (0), (0), (0), (8), (10), (0),
|
INSERT INTO t6 VALUES(0), (0), (0), (0), (8), (10), (0),
|
||||||
@@ -117,7 +117,7 @@
|
(20), (30), (31), (1000000), (1000005);
|
||||||
31
|
SELECT * FROM t6;
|
||||||
1000000
|
a
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-8
|
||||||
|
-10
|
||||||
|
-11
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
-31
|
||||||
|
-1000000
|
||||||
1000005
|
1000005
|
||||||
-CREATE TABLE t7(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t7(a INT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+1000000
|
||||||
|
+31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+11
|
||||||
|
+10
|
||||||
|
+8
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
+CREATE TABLE t7(a INT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t7(a INT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t7 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t7 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
||||||
(20), (30), (31), (100000000), (100000008);
|
(20), (30), (31), (100000000), (100000008);
|
||||||
SELECT * FROM t7;
|
SELECT * FROM t7;
|
||||||
@@ -134,7 +134,7 @@
|
a
|
||||||
31
|
--10
|
||||||
100000000
|
--1
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-5
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
-31
|
||||||
|
-100000000
|
||||||
100000008
|
100000008
|
||||||
-CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+100000000
|
||||||
|
+31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+5
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
+-1
|
||||||
|
+-10
|
||||||
+CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t8(a INT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t8 VALUES(-5);
|
INSERT INTO t8 VALUES(-5);
|
||||||
ERROR 22003: Out of range value for column 'a' at row 1
|
ERROR 22003: Out of range value for column 'a' at row 1
|
||||||
INSERT INTO t8 VALUES(0), (0), (0), (0), (8), (10), (0),
|
INSERT INTO t8 VALUES(0), (0), (0), (0), (8), (10), (0),
|
||||||
@@ -153,7 +153,7 @@
|
(20), (30), (31), (100000000), (100000008);
|
||||||
31
|
SELECT * FROM t8;
|
||||||
100000000
|
a
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-8
|
||||||
|
-10
|
||||||
|
-11
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
-31
|
||||||
|
-100000000
|
||||||
100000008
|
100000008
|
||||||
-CREATE TABLE t9(a BIGINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t9(a BIGINT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+100000000
|
||||||
|
+31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+11
|
||||||
|
+10
|
||||||
|
+8
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
+CREATE TABLE t9(a BIGINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t9(a BIGINT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t9 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t9 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
||||||
(20), (30), (31), (100000000000), (100000000006);
|
(20), (30), (31), (100000000000), (100000000006);
|
||||||
SELECT * FROM t9;
|
SELECT * FROM t9;
|
||||||
@@ -170,7 +170,7 @@
|
a
|
||||||
31
|
--10
|
||||||
100000000000
|
--1
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-5
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
-31
|
||||||
|
-100000000000
|
||||||
100000000006
|
100000000006
|
||||||
-CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+100000000000
|
||||||
|
+31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+5
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
+-1
|
||||||
|
+-10
|
||||||
+CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t10(a BIGINT UNSIGNED AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t10 VALUES(-5);
|
INSERT INTO t10 VALUES(-5);
|
||||||
ERROR 22003: Out of range value for column 'a' at row 1
|
ERROR 22003: Out of range value for column 'a' at row 1
|
||||||
INSERT INTO t10 VALUES(0), (0), (0), (0), (8), (10), (0),
|
INSERT INTO t10 VALUES(0), (0), (0), (0), (8), (10), (0),
|
||||||
@@ -189,7 +189,7 @@
|
(20), (30), (31), (100000000000), (100000000006);
|
||||||
31
|
SELECT * FROM t10;
|
||||||
100000000000
|
a
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-8
|
||||||
|
-10
|
||||||
|
-11
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
-31
|
||||||
|
-100000000000
|
||||||
100000000006
|
100000000006
|
||||||
-CREATE TABLE t11(a FLOAT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t11(a FLOAT AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+100000000000
|
||||||
|
+31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+11
|
||||||
|
+10
|
||||||
|
+8
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
+CREATE TABLE t11(a FLOAT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t11(a FLOAT AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t11 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
||||||
(20), (30), (31);
|
(20), (30), (31);
|
||||||
SELECT * FROM t11;
|
SELECT * FROM t11;
|
||||||
@@ -204,7 +204,7 @@
|
a
|
||||||
20
|
--10
|
||||||
30
|
--1
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-5
|
||||||
|
-20
|
||||||
|
-30
|
||||||
31
|
31
|
||||||
-CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
-CREATE TABLE t12(a DOUBLE AUTO_INCREMENT KEY) ENGINE = InnoDB;
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+5
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
+-1
|
||||||
|
+-10
|
||||||
+CREATE TABLE t12(a DOUBLE AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
+CREATE TABLE t12(a DOUBLE AUTO_INCREMENT, PRIMARY KEY(a DESC)) ENGINE = InnoDB;
|
||||||
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
INSERT INTO t12 VALUES(0), (0), (0), (0), (-1), (-10), (0),
|
||||||
(20), (30), (31);
|
(20), (30), (31);
|
||||||
SELECT * FROM t12;
|
SELECT * FROM t12;
|
||||||
@@ -242,7 +242,7 @@
|
a
|
||||||
|
--10
|
||||||
|
--1
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-5
|
||||||
|
-20
|
||||||
|
-30
|
||||||
|
31
|
||||||
|
+30
|
||||||
|
+20
|
||||||
|
+5
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
+-1
|
||||||
|
+-10
|
||||||
|
# Scenario 1: Normal restart, to test if the counters are persisted
|
||||||
|
# Scenario 2: Delete some values, to test the counters should not be the
|
||||||
|
# one which is the largest in current table
|
||||||
|
@@ -242,14 +242,14 @@
|
||||||
SELECT MAX(a) AS `Expect 100000000000` FROM t9;
|
SELECT MAX(a) AS `Expect 100000000000` FROM t9;
|
||||||
Expect 100000000000
|
Expect 100000000000
|
||||||
100000000000
|
100000000000
|
||||||
@ -115,6 +356,333 @@
|
|||||||
AUTO_INCREMENT = 1234;
|
AUTO_INCREMENT = 1234;
|
||||||
# restart
|
# restart
|
||||||
SHOW CREATE TABLE t13;
|
SHOW CREATE TABLE t13;
|
||||||
|
Table Create Table
|
||||||
|
t13 CREATE TABLE `t13` (
|
||||||
|
`a` int(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1234 DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t13 VALUES(0);
|
||||||
|
SELECT a AS `Expect 1234` FROM t13;
|
||||||
|
@@ -464,28 +464,28 @@
|
||||||
|
INSERT INTO t1 VALUES(0), (0);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
INSERT INTO t3 VALUES(0), (0);
|
||||||
|
SELECT * FROM t3;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
INSERT INTO t5 VALUES(0), (0);
|
||||||
|
SELECT * FROM t5;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
INSERT INTO t7 VALUES(0), (0);
|
||||||
|
SELECT * FROM t7;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
INSERT INTO t9 VALUES(0), (0);
|
||||||
|
SELECT * FROM t9;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
# Ensure that all changes before the server is killed are persisted.
|
||||||
|
set global innodb_flush_log_at_trx_commit=1;
|
||||||
|
TRUNCATE TABLE t1;
|
||||||
|
@@ -498,63 +498,63 @@
|
||||||
|
INSERT INTO t19 VALUES(0), (0);
|
||||||
|
SELECT * FROM t19;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
# restart
|
||||||
|
INSERT INTO t1 VALUES(0), (0);
|
||||||
|
SELECT * FROM t1;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
INSERT INTO t3 VALUES(0), (0);
|
||||||
|
SELECT * FROM t3;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
INSERT INTO t5 VALUES(0), (0);
|
||||||
|
SELECT * FROM t5;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
INSERT INTO t7 VALUES(0), (0);
|
||||||
|
SELECT * FROM t7;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
INSERT INTO t19 VALUES(0), (0);
|
||||||
|
SELECT * FROM t19;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
DELETE FROM t19 WHERE a = 4;
|
||||||
|
RENAME TABLE t19 to t9;
|
||||||
|
INSERT INTO t9 VALUES(0), (0);
|
||||||
|
SELECT * FROM t9;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-5
|
||||||
|
6
|
||||||
|
+5
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
TRUNCATE TABLE t9;
|
||||||
|
INSERT INTO t9 VALUES(0), (0);
|
||||||
|
SELECT * FROM t9;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
2
|
||||||
|
+1
|
||||||
|
# Scenario 8: Test ALTER TABLE operations
|
||||||
|
INSERT INTO t3 VALUES(0), (0), (100), (200), (1000);
|
||||||
|
SELECT * FROM t3;
|
||||||
|
a
|
||||||
|
-1
|
||||||
|
-2
|
||||||
|
-3
|
||||||
|
-4
|
||||||
|
-100
|
||||||
|
-200
|
||||||
|
1000
|
||||||
|
+200
|
||||||
|
+100
|
||||||
|
+4
|
||||||
|
+3
|
||||||
|
+2
|
||||||
|
+1
|
||||||
|
DELETE FROM t3 WHERE a > 300;
|
||||||
|
SELECT MAX(a) AS `Expect 200` FROM t3;
|
||||||
|
Expect 200
|
||||||
|
@@ -566,7 +566,7 @@
|
||||||
|
Table Create Table
|
||||||
|
t3 CREATE TABLE `t3` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t3 VALUES(0);
|
||||||
|
SELECT MAX(a) AS `Expect 201` FROM t3;
|
||||||
|
@@ -579,7 +579,7 @@
|
||||||
|
Table Create Table
|
||||||
|
t3 CREATE TABLE `t3` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=500 DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t3 VALUES(0);
|
||||||
|
SELECT MAX(a) AS `Expect 500` FROM t3;
|
||||||
|
@@ -591,13 +591,13 @@
|
||||||
|
Table Create Table
|
||||||
|
t3 CREATE TABLE `t3` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t3 VALUES(0), (0);
|
||||||
|
SELECT * FROM t3;
|
||||||
|
a
|
||||||
|
-100
|
||||||
|
101
|
||||||
|
+100
|
||||||
|
INSERT INTO t3 VALUES(150), (180);
|
||||||
|
UPDATE t3 SET a = 200 WHERE a = 150;
|
||||||
|
INSERT INTO t3 VALUES(220);
|
||||||
|
@@ -607,7 +607,7 @@
|
||||||
|
Table Create Table
|
||||||
|
t3 CREATE TABLE `t3` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=221 DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t3 VALUES(0);
|
||||||
|
SELECT MAX(a) AS `Expect 221` FROM t3;
|
||||||
|
@@ -619,7 +619,7 @@
|
||||||
|
Table Create Table
|
||||||
|
t3 CREATE TABLE `t3` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=120 DEFAULT CHARSET=latin1
|
||||||
|
# MDEV-6076: Test adding an AUTO_INCREMENT COLUMN
|
||||||
|
CREATE TABLE mdev6076a (b INT) ENGINE=InnoDB;
|
||||||
|
@@ -669,18 +669,18 @@
|
||||||
|
INSERT INTO t_inplace SELECT * FROM t3;
|
||||||
|
SELECT * FROM t_inplace;
|
||||||
|
a
|
||||||
|
-100
|
||||||
|
-101
|
||||||
|
-120
|
||||||
|
-121
|
||||||
|
-122
|
||||||
|
-200
|
||||||
|
210
|
||||||
|
+200
|
||||||
|
+122
|
||||||
|
+121
|
||||||
|
+120
|
||||||
|
+101
|
||||||
|
+100
|
||||||
|
SHOW CREATE TABLE t_inplace;
|
||||||
|
Table Create Table
|
||||||
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1
|
||||||
|
# This will keep the autoinc counter
|
||||||
|
ALTER TABLE t_inplace AUTO_INCREMENT = 250, ALGORITHM = INPLACE;
|
||||||
|
@@ -689,7 +689,7 @@
|
||||||
|
Table Create Table
|
||||||
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1
|
||||||
|
# This should keep the autoinc counter as well
|
||||||
|
ALTER TABLE t_inplace ADD COLUMN b INT, ALGORITHM = INPLACE;
|
||||||
|
@@ -699,16 +699,16 @@
|
||||||
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
`b` int(11) DEFAULT NULL,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1
|
||||||
|
DELETE FROM t_inplace WHERE a > 150;
|
||||||
|
SELECT * FROM t_inplace;
|
||||||
|
a b
|
||||||
|
-100 NULL
|
||||||
|
-101 NULL
|
||||||
|
-120 NULL
|
||||||
|
-121 NULL
|
||||||
|
122 NULL
|
||||||
|
+121 NULL
|
||||||
|
+120 NULL
|
||||||
|
+101 NULL
|
||||||
|
+100 NULL
|
||||||
|
# This should reset the autoinc counter to the one specified
|
||||||
|
# Since it's smaller than current one but bigger than existing
|
||||||
|
# biggest counter in the table
|
||||||
|
@@ -719,7 +719,7 @@
|
||||||
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
`b` int(11) DEFAULT NULL,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=180 DEFAULT CHARSET=latin1
|
||||||
|
# This should reset the autoinc counter to the next value of
|
||||||
|
# current max counter in the table, since the specified value
|
||||||
|
@@ -730,7 +730,7 @@
|
||||||
|
Table Create Table
|
||||||
|
t_inplace CREATE TABLE `t_inplace` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t_inplace VALUES(0), (0);
|
||||||
|
SELECT MAX(a) AS `Expect 124` FROM t_inplace;
|
||||||
|
@@ -757,18 +757,18 @@
|
||||||
|
INSERT INTO t_copy SELECT * FROM t3;
|
||||||
|
SELECT * FROM t_copy;
|
||||||
|
a
|
||||||
|
-100
|
||||||
|
-101
|
||||||
|
-120
|
||||||
|
-121
|
||||||
|
-122
|
||||||
|
-200
|
||||||
|
210
|
||||||
|
+200
|
||||||
|
+122
|
||||||
|
+121
|
||||||
|
+120
|
||||||
|
+101
|
||||||
|
+100
|
||||||
|
SHOW CREATE TABLE t_copy;
|
||||||
|
Table Create Table
|
||||||
|
t_copy CREATE TABLE `t_copy` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1
|
||||||
|
# This will keep the autoinc counter
|
||||||
|
ALTER TABLE t_copy AUTO_INCREMENT = 250, ALGORITHM = COPY;
|
||||||
|
@@ -777,7 +777,7 @@
|
||||||
|
Table Create Table
|
||||||
|
t_copy CREATE TABLE `t_copy` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1
|
||||||
|
# This should keep the autoinc counter as well
|
||||||
|
ALTER TABLE t_copy ADD COLUMN b INT, ALGORITHM = COPY;
|
||||||
|
@@ -787,16 +787,16 @@
|
||||||
|
t_copy CREATE TABLE `t_copy` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
`b` int(11) DEFAULT NULL,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=250 DEFAULT CHARSET=latin1
|
||||||
|
DELETE FROM t_copy WHERE a > 150;
|
||||||
|
SELECT * FROM t_copy;
|
||||||
|
a b
|
||||||
|
-100 NULL
|
||||||
|
-101 NULL
|
||||||
|
-120 NULL
|
||||||
|
-121 NULL
|
||||||
|
122 NULL
|
||||||
|
+121 NULL
|
||||||
|
+120 NULL
|
||||||
|
+101 NULL
|
||||||
|
+100 NULL
|
||||||
|
# This should reset the autoinc counter to the one specified
|
||||||
|
# Since it's smaller than current one but bigger than existing
|
||||||
|
# biggest counter in the table
|
||||||
|
@@ -807,7 +807,7 @@
|
||||||
|
t_copy CREATE TABLE `t_copy` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
`b` int(11) DEFAULT NULL,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=180 DEFAULT CHARSET=latin1
|
||||||
|
# This should reset the autoinc counter to the next value of
|
||||||
|
# current max counter in the table, since the specified value
|
||||||
|
@@ -818,7 +818,7 @@
|
||||||
|
Table Create Table
|
||||||
|
t_copy CREATE TABLE `t_copy` (
|
||||||
|
`a` smallint(6) NOT NULL AUTO_INCREMENT,
|
||||||
|
- PRIMARY KEY (`a`)
|
||||||
|
+ PRIMARY KEY (`a` DESC)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t_copy VALUES(0), (0);
|
||||||
|
SELECT MAX(a) AS `Expect 124` FROM t_copy;
|
||||||
@@ -842,7 +842,7 @@
|
@@ -842,7 +842,7 @@
|
||||||
126
|
126
|
||||||
DROP TABLE t_copy, it_copy;
|
DROP TABLE t_copy, it_copy;
|
||||||
@ -124,7 +692,7 @@
|
|||||||
set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
|
set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
|
||||||
INSERT INTO t30 VALUES(NULL, 1), (200, 2), (0, 3);
|
INSERT INTO t30 VALUES(NULL, 1), (200, 2), (0, 3);
|
||||||
INSERT INTO t30(b) VALUES(4), (5), (6), (7);
|
INSERT INTO t30(b) VALUES(4), (5), (6), (7);
|
||||||
@@ -869,7 +869,7 @@
|
@@ -869,20 +869,20 @@
|
||||||
set global innodb_flush_log_at_trx_commit=1;
|
set global innodb_flush_log_at_trx_commit=1;
|
||||||
CREATE TABLE t31 (a INT) ENGINE = InnoDB;
|
CREATE TABLE t31 (a INT) ENGINE = InnoDB;
|
||||||
INSERT INTO t31 VALUES(1), (2);
|
INSERT INTO t31 VALUES(1), (2);
|
||||||
@ -133,8 +701,17 @@
|
|||||||
INSERT INTO t31 VALUES(3, 0), (4, NULL), (5, NULL);
|
INSERT INTO t31 VALUES(3, 0), (4, NULL), (5, NULL);
|
||||||
INSERT INTO t31 VALUES(6, 0);
|
INSERT INTO t31 VALUES(6, 0);
|
||||||
ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
|
ERROR 23000: Duplicate entry '0' for key 'PRIMARY'
|
||||||
@@ -882,7 +882,7 @@
|
SELECT * FROM t31;
|
||||||
|
a b
|
||||||
|
-3 0
|
||||||
|
-1 1
|
||||||
|
-2 2
|
||||||
|
-4 3
|
||||||
5 4
|
5 4
|
||||||
|
+4 3
|
||||||
|
+2 2
|
||||||
|
+1 1
|
||||||
|
+3 0
|
||||||
SET SQL_MODE = 0;
|
SET SQL_MODE = 0;
|
||||||
# Scenario 10: Rollback would not rollback the counter
|
# Scenario 10: Rollback would not rollback the counter
|
||||||
-CREATE TABLE t32 (a BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
|
-CREATE TABLE t32 (a BIGINT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
|
||||||
@ -151,6 +728,26 @@
|
|||||||
INSERT INTO t33 VALUES(1, NULL);
|
INSERT INTO t33 VALUES(1, NULL);
|
||||||
INSERT INTO t33 VALUES(2, NULL);
|
INSERT INTO t33 VALUES(2, NULL);
|
||||||
INSERT INTO t33 VALUES(2, NULL);
|
INSERT INTO t33 VALUES(2, NULL);
|
||||||
|
@@ -920,13 +920,13 @@
|
||||||
|
INSERT INTO t31(a) VALUES(6), (0);
|
||||||
|
SELECT * FROM t31;
|
||||||
|
a b
|
||||||
|
-3 0
|
||||||
|
-1 1
|
||||||
|
-2 2
|
||||||
|
-4 3
|
||||||
|
-5 4
|
||||||
|
-6 5
|
||||||
|
0 6
|
||||||
|
+6 5
|
||||||
|
+5 4
|
||||||
|
+4 3
|
||||||
|
+2 2
|
||||||
|
+1 1
|
||||||
|
+3 0
|
||||||
|
DROP TABLE t31;
|
||||||
|
set SQL_MODE = NO_AUTO_VALUE_ON_ZERO;
|
||||||
|
DELETE FROM t30 WHERE a = 0;
|
||||||
@@ -965,7 +965,7 @@
|
@@ -965,7 +965,7 @@
|
||||||
DROP TABLE t33;
|
DROP TABLE t33;
|
||||||
CREATE TABLE t33 (
|
CREATE TABLE t33 (
|
||||||
@ -160,3 +757,13 @@
|
|||||||
ALTER TABLE t33 DISCARD TABLESPACE;
|
ALTER TABLE t33 DISCARD TABLESPACE;
|
||||||
restore: t33 .ibd and .cfg files
|
restore: t33 .ibd and .cfg files
|
||||||
ALTER TABLE t33 IMPORT TABLESPACE;
|
ALTER TABLE t33 IMPORT TABLESPACE;
|
||||||
|
@@ -975,7 +975,7 @@
|
||||||
|
4
|
||||||
|
SELECT * FROM t33;
|
||||||
|
a b
|
||||||
|
-10 1
|
||||||
|
-2 2
|
||||||
|
3 4
|
||||||
|
+2 2
|
||||||
|
+10 1
|
||||||
|
DROP TABLE t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t30, t32, t33;
|
||||||
|
@ -1969,7 +1969,7 @@ Table Create Table
|
|||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`id` int(11) NOT NULL,
|
`id` int(11) NOT NULL,
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
UNIQUE KEY `id` (`id`)
|
UNIQUE KEY `id` (`id` DESC)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
@ -194,9 +194,20 @@ ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT in
|
|||||||
CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
|
CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
|
||||||
UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC), FULLTEXT(b))
|
UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC), FULLTEXT(b))
|
||||||
ENGINE=InnoDB;
|
ENGINE=InnoDB;
|
||||||
DROP TABLE t1;
|
ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index
|
||||||
CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
|
CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
|
||||||
UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC)) ENGINE=InnoDB;
|
UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC)) ENGINE=InnoDB;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) NOT NULL,
|
||||||
|
`b` text DEFAULT NULL,
|
||||||
|
`FTS_DOC_ID` bigint(20) unsigned NOT NULL,
|
||||||
|
PRIMARY KEY (`a`),
|
||||||
|
UNIQUE KEY `FTS_DOC_ID_INDEX` (`FTS_DOC_ID` DESC)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE;
|
ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE;
|
||||||
|
ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index
|
||||||
ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY;
|
ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY;
|
||||||
|
ERROR HY000: Index 'FTS_DOC_ID_INDEX' is of wrong type for an InnoDB FULLTEXT index
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -122,17 +122,16 @@ engine=innodb;
|
|||||||
--echo # MDEV-26938 Support descending indexes internally in InnoDB
|
--echo # MDEV-26938 Support descending indexes internally in InnoDB
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
# Unfortunately, the HA_REVERSE_SORT flag is not being stored in the .frm file.
|
--error ER_INNODB_FT_WRONG_DOCID_INDEX
|
||||||
#FIXME: --error ER_INNODB_FT_WRONG_DOCID_INDEX
|
|
||||||
CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
|
CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
|
||||||
UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC), FULLTEXT(b))
|
UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC), FULLTEXT(b))
|
||||||
ENGINE=InnoDB;
|
ENGINE=InnoDB;
|
||||||
DROP TABLE t1;
|
|
||||||
|
|
||||||
CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
|
CREATE TABLE t1(a INT PRIMARY KEY, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
|
||||||
UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC)) ENGINE=InnoDB;
|
UNIQUE KEY FTS_DOC_ID_INDEX(FTS_DOC_ID DESC)) ENGINE=InnoDB;
|
||||||
#FIXME: --error ER_INNODB_FT_WRONG_DOCID_INDEX
|
SHOW CREATE TABLE t1;
|
||||||
|
--error ER_INNODB_FT_WRONG_DOCID_INDEX
|
||||||
ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE;
|
ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=INPLACE;
|
||||||
#FIXME: --error ER_INNODB_FT_WRONG_DOCID_INDEX
|
--error ER_INNODB_FT_WRONG_DOCID_INDEX
|
||||||
ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY;
|
ALTER TABLE t1 ADD FULLTEXT INDEX(b), ALGORITHM=COPY;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@ -342,7 +342,7 @@ tab CREATE TABLE `tab` (
|
|||||||
`c7` geometrycollection DEFAULT NULL,
|
`c7` geometrycollection DEFAULT NULL,
|
||||||
`c8` geometry DEFAULT NULL,
|
`c8` geometry DEFAULT NULL,
|
||||||
UNIQUE KEY `idx2` (`c8`(5)),
|
UNIQUE KEY `idx2` (`c8`(5)),
|
||||||
KEY `idx1` (`c2`(5)) USING BTREE,
|
KEY `idx1` (`c2`(5) DESC) USING BTREE,
|
||||||
KEY `idx3` (`c3`(5)) USING BTREE
|
KEY `idx3` (`c3`(5)) USING BTREE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||||
#check the data after modify
|
#check the data after modify
|
||||||
@ -778,7 +778,7 @@ tab3 CREATE TABLE `tab3` (
|
|||||||
`c7` geometrycollection DEFAULT NULL,
|
`c7` geometrycollection DEFAULT NULL,
|
||||||
`c8` geometry DEFAULT NULL,
|
`c8` geometry DEFAULT NULL,
|
||||||
UNIQUE KEY `idx2` (`c8`(5)),
|
UNIQUE KEY `idx2` (`c8`(5)),
|
||||||
KEY `idx1` (`c2`(5)) USING BTREE,
|
KEY `idx1` (`c2`(5) DESC) USING BTREE,
|
||||||
KEY `idx3` (`c3`(5)) USING BTREE
|
KEY `idx3` (`c3`(5)) USING BTREE
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=16
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC KEY_BLOCK_SIZE=16
|
||||||
#check index with WKB function
|
#check index with WKB function
|
||||||
|
11
sql/key.cc
11
sql/key.cc
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||||
Copyright (c) 2018, 2020, MariaDB
|
Copyright (c) 2018, 2021, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -573,6 +573,9 @@ int key_rec_cmp(void *key_p, uchar *first_rec, uchar *second_rec)
|
|||||||
/* loop over every key part */
|
/* loop over every key part */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
const int GREATER= key_part->key_part_flag & HA_REVERSE_SORT ? -1 : +1;
|
||||||
|
const int LESS= -GREATER;
|
||||||
|
|
||||||
field= key_part->field;
|
field= key_part->field;
|
||||||
|
|
||||||
if (key_part->null_bit)
|
if (key_part->null_bit)
|
||||||
@ -593,12 +596,12 @@ int key_rec_cmp(void *key_p, uchar *first_rec, uchar *second_rec)
|
|||||||
; /* Fall through, no NULL fields */
|
; /* Fall through, no NULL fields */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DBUG_RETURN(+1);
|
DBUG_RETURN(GREATER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!sec_is_null)
|
else if (!sec_is_null)
|
||||||
{
|
{
|
||||||
DBUG_RETURN(-1);
|
DBUG_RETURN(LESS);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
goto next_loop; /* Both were NULL */
|
goto next_loop; /* Both were NULL */
|
||||||
@ -612,7 +615,7 @@ int key_rec_cmp(void *key_p, uchar *first_rec, uchar *second_rec)
|
|||||||
*/
|
*/
|
||||||
if ((result= field->cmp_prefix(field->ptr+first_diff, field->ptr+sec_diff,
|
if ((result= field->cmp_prefix(field->ptr+first_diff, field->ptr+sec_diff,
|
||||||
key_part->length)))
|
key_part->length)))
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result * GREATER);
|
||||||
next_loop:
|
next_loop:
|
||||||
key_part++;
|
key_part++;
|
||||||
key_part_num++;
|
key_part_num++;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2008, 2020, MariaDB
|
Copyright (c) 2008, 2021, MariaDB
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -2805,11 +2805,11 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
|||||||
continue; // ToDo: ft-keys in non-ft ranges, if possible SerG
|
continue; // ToDo: ft-keys in non-ft ranges, if possible SerG
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_idx_details.add("usable", true);
|
|
||||||
param.key[param.keys]=key_parts;
|
param.key[param.keys]=key_parts;
|
||||||
key_part_info= key_info->key_part;
|
key_part_info= key_info->key_part;
|
||||||
uint cur_key_len= 0;
|
uint cur_key_len= 0;
|
||||||
Json_writer_array trace_keypart(thd, "key_parts");
|
Json_writer_array trace_keypart(thd, "key_parts");
|
||||||
|
bool unusable_has_desc_keyparts= false;
|
||||||
for (uint part= 0 ; part < n_key_parts ;
|
for (uint part= 0 ; part < n_key_parts ;
|
||||||
part++, key_parts++, key_part_info++)
|
part++, key_parts++, key_part_info++)
|
||||||
{
|
{
|
||||||
@ -2824,8 +2824,17 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
|||||||
(key_info->flags & HA_SPATIAL) ? Field::itMBR : Field::itRAW;
|
(key_info->flags & HA_SPATIAL) ? Field::itMBR : Field::itRAW;
|
||||||
/* Only HA_PART_KEY_SEG is used */
|
/* Only HA_PART_KEY_SEG is used */
|
||||||
key_parts->flag= (uint8) key_part_info->key_part_flag;
|
key_parts->flag= (uint8) key_part_info->key_part_flag;
|
||||||
|
if (key_part_info->key_part_flag & HA_REVERSE_SORT)
|
||||||
|
unusable_has_desc_keyparts= true;
|
||||||
trace_keypart.add(key_parts->field->field_name);
|
trace_keypart.add(key_parts->field->field_name);
|
||||||
}
|
}
|
||||||
|
trace_keypart.end();
|
||||||
|
trace_idx_details.add("usable", !unusable_has_desc_keyparts);
|
||||||
|
if (unusable_has_desc_keyparts) // TODO MDEV-13756
|
||||||
|
{
|
||||||
|
key_parts= param.key[param.keys];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
param.real_keynr[param.keys++]=idx;
|
param.real_keynr[param.keys++]=idx;
|
||||||
if (cur_key_len > max_key_len)
|
if (cur_key_len > max_key_len)
|
||||||
max_key_len= cur_key_len;
|
max_key_len= cur_key_len;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2008, 2017, MariaDB Corporation.
|
Copyright (c) 2008, 2021, 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
|
||||||
@ -953,6 +953,9 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
|||||||
part->length < part_field->key_length())
|
part->length < part_field->key_length())
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (part->key_part_flag & HA_REVERSE_SORT)
|
||||||
|
break; // TODO MDEV-27576
|
||||||
|
|
||||||
if (field->eq(part->field))
|
if (field->eq(part->field))
|
||||||
{
|
{
|
||||||
ref->key= idx;
|
ref->key= idx;
|
||||||
|
@ -290,9 +290,9 @@ class Key_part_spec :public Sql_alloc {
|
|||||||
public:
|
public:
|
||||||
LEX_CSTRING field_name;
|
LEX_CSTRING field_name;
|
||||||
uint length;
|
uint length;
|
||||||
bool generated;
|
bool generated, asc;
|
||||||
Key_part_spec(const LEX_CSTRING *name, uint len, bool gen= false)
|
Key_part_spec(const LEX_CSTRING *name, uint len, bool gen= false)
|
||||||
: field_name(*name), length(len), generated(gen)
|
: field_name(*name), length(len), generated(gen), asc(1)
|
||||||
{}
|
{}
|
||||||
bool operator==(const Key_part_spec& other) const;
|
bool operator==(const Key_part_spec& other) const;
|
||||||
/**
|
/**
|
||||||
|
@ -2369,6 +2369,8 @@ int show_create_table_ex(THD *thd, TABLE_LIST *table_list,
|
|||||||
packet->append_parenthesized((long) key_part->length /
|
packet->append_parenthesized((long) key_part->length /
|
||||||
key_part->field->charset()->mbmaxlen);
|
key_part->field->charset()->mbmaxlen);
|
||||||
}
|
}
|
||||||
|
if (key_part->key_part_flag & HA_REVERSE_SORT)
|
||||||
|
packet->append(STRING_WITH_LEN(" DESC"));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key_info->without_overlaps)
|
if (key_info->without_overlaps)
|
||||||
|
@ -2281,7 +2281,7 @@ void promote_first_timestamp_column(List<Create_field> *column_definitions)
|
|||||||
|
|
||||||
static bool key_cmp(const Key_part_spec &a, const Key_part_spec &b)
|
static bool key_cmp(const Key_part_spec &a, const Key_part_spec &b)
|
||||||
{
|
{
|
||||||
return a.length == b.length &&
|
return a.length == b.length && a.asc == b.asc &&
|
||||||
!lex_string_cmp(system_charset_info, &a.field_name, &b.field_name);
|
!lex_string_cmp(system_charset_info, &a.field_name, &b.field_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3328,6 +3328,7 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
key_part_info->fieldnr= field;
|
key_part_info->fieldnr= field;
|
||||||
key_part_info->offset= (uint16) sql_field->offset;
|
key_part_info->offset= (uint16) sql_field->offset;
|
||||||
key_part_info->key_type=sql_field->pack_flag;
|
key_part_info->key_type=sql_field->pack_flag;
|
||||||
|
key_part_info->key_part_flag= column->asc ? 0 : HA_REVERSE_SORT;
|
||||||
uint key_part_length= sql_field->type_handler()->
|
uint key_part_length= sql_field->type_handler()->
|
||||||
calc_key_length(*sql_field);
|
calc_key_length(*sql_field);
|
||||||
|
|
||||||
@ -6335,6 +6336,14 @@ Compare_keys compare_keys_but_name(const KEY *table_key, const KEY *new_key,
|
|||||||
return Compare_keys::NotEqual;
|
return Compare_keys::NotEqual;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Check the descending flag for index field.
|
||||||
|
*/
|
||||||
|
if ((new_part->key_part_flag ^ key_part->key_part_flag) & HA_REVERSE_SORT)
|
||||||
|
{
|
||||||
|
return Compare_keys::NotEqual;
|
||||||
|
}
|
||||||
|
|
||||||
auto compare= table->file->compare_key_parts(
|
auto compare= table->file->compare_key_parts(
|
||||||
*table->field[key_part->fieldnr - 1], new_field, *key_part, *new_part);
|
*table->field[key_part->fieldnr - 1], new_field, *key_part, *new_part);
|
||||||
result= merge(result, compare);
|
result= merge(result, compare);
|
||||||
@ -8386,9 +8395,10 @@ mysql_prepare_alter_table(THD *thd, TABLE *table,
|
|||||||
key_part_length= 0; // Use whole field
|
key_part_length= 0; // Use whole field
|
||||||
}
|
}
|
||||||
key_part_length /= kfield->charset()->mbmaxlen;
|
key_part_length /= kfield->charset()->mbmaxlen;
|
||||||
key_parts.push_back(new (thd->mem_root) Key_part_spec(&cfield->field_name,
|
Key_part_spec *kps= new (thd->mem_root) Key_part_spec(&cfield->field_name,
|
||||||
key_part_length, true),
|
key_part_length, true);
|
||||||
thd->mem_root);
|
kps->asc= !(key_part->key_part_flag & HA_REVERSE_SORT);
|
||||||
|
key_parts.push_back(kps, thd->mem_root);
|
||||||
if (!(cfield->invisible == INVISIBLE_SYSTEM && cfield->vers_sys_field()))
|
if (!(cfield->invisible == INVISIBLE_SYSTEM && cfield->vers_sys_field()))
|
||||||
user_keyparts= true;
|
user_keyparts= true;
|
||||||
}
|
}
|
||||||
|
@ -6803,10 +6803,12 @@ ignorability:
|
|||||||
key_list:
|
key_list:
|
||||||
key_list ',' key_part order_dir
|
key_list ',' key_part order_dir
|
||||||
{
|
{
|
||||||
|
$3->asc= $4;
|
||||||
Lex->last_key->columns.push_back($3, thd->mem_root);
|
Lex->last_key->columns.push_back($3, thd->mem_root);
|
||||||
}
|
}
|
||||||
| key_part order_dir
|
| key_part order_dir
|
||||||
{
|
{
|
||||||
|
$1->asc= $2;
|
||||||
Lex->last_key->columns.push_back($1, thd->mem_root);
|
Lex->last_key->columns.push_back($1, thd->mem_root);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
Copyright (c) 2000, 2011, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2020, MariaDB Corporation.
|
Copyright (c) 2009, 2021, 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
|
||||||
@ -685,6 +685,13 @@ static uint pack_keys(uchar *keybuff, uint key_count, KEY *keyinfo,
|
|||||||
DBUG_PRINT("loop", ("flags: %lu key_parts: %d key_part: %p",
|
DBUG_PRINT("loop", ("flags: %lu key_parts: %d key_part: %p",
|
||||||
key->flags, key->user_defined_key_parts,
|
key->flags, key->user_defined_key_parts,
|
||||||
key->key_part));
|
key->key_part));
|
||||||
|
|
||||||
|
/* For SPATIAL, FULLTEXT and HASH indexes (anything other than B-tree),
|
||||||
|
ignore the ASC/DESC attribute of columns. */
|
||||||
|
const uchar ha_reverse_sort=
|
||||||
|
key->algorithm > HA_KEY_ALG_BTREE || key->flags & (HA_FULLTEXT|HA_SPATIAL)
|
||||||
|
? 0 : HA_REVERSE_SORT;
|
||||||
|
|
||||||
for (key_part=key->key_part,key_part_end=key_part+key->user_defined_key_parts ;
|
for (key_part=key->key_part,key_part_end=key_part+key->user_defined_key_parts ;
|
||||||
key_part != key_part_end ;
|
key_part != key_part_end ;
|
||||||
key_part++)
|
key_part++)
|
||||||
@ -697,7 +704,8 @@ static uint pack_keys(uchar *keybuff, uint key_count, KEY *keyinfo,
|
|||||||
int2store(pos,key_part->fieldnr+1+FIELD_NAME_USED);
|
int2store(pos,key_part->fieldnr+1+FIELD_NAME_USED);
|
||||||
offset= (uint) (key_part->offset+data_offset+1);
|
offset= (uint) (key_part->offset+data_offset+1);
|
||||||
int2store(pos+2, offset);
|
int2store(pos+2, offset);
|
||||||
pos[4]=0; // Sort order
|
key_part->key_part_flag &= ha_reverse_sort;
|
||||||
|
pos[4]= (uchar)(key_part->key_part_flag);
|
||||||
int2store(pos+5,key_part->key_type);
|
int2store(pos+5,key_part->key_type);
|
||||||
int2store(pos+7,key_part->length);
|
int2store(pos+7,key_part->length);
|
||||||
pos+=9;
|
pos+=9;
|
||||||
|
Reference in New Issue
Block a user