sqlite/test/distinct2.test
drh 172806e489 Fix the skip-ahead-distinct optimization so that it works with indexes that
have repeated columns with different collating sequences.

FossilOrigin-Name: ce1e2b88777e00a82c04abe5ba35eec81b5f324e462f099cd00b21054f369688
2017-04-13 21:29:02 +00:00

184 lines
5.3 KiB
Plaintext

# 2016-04-15
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
# This file implements regression tests for SQLite library. The
# focus of this script is DISTINCT queries using the skip-ahead
# optimization.
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix distinct2
do_execsql_test 100 {
CREATE TABLE t1(x INTEGER PRIMARY KEY);
INSERT INTO t1 VALUES(0),(1),(2);
CREATE TABLE t2 AS
SELECT DISTINCT a.x AS aa, b.x AS bb
FROM t1 a, t1 b;
SELECT *, '|' FROM t2 ORDER BY aa, bb;
} {0 0 | 0 1 | 0 2 | 1 0 | 1 1 | 1 2 | 2 0 | 2 1 | 2 2 |}
do_execsql_test 110 {
DROP TABLE t2;
CREATE TABLE t2 AS
SELECT DISTINCT a.x AS aa, b.x AS bb
FROM t1 a, t1 b
WHERE a.x IN t1 AND b.x IN t1;
SELECT *, '|' FROM t2 ORDER BY aa, bb;
} {0 0 | 0 1 | 0 2 | 1 0 | 1 1 | 1 2 | 2 0 | 2 1 | 2 2 |}
do_execsql_test 120 {
CREATE TABLE t102 (i0 TEXT UNIQUE NOT NULL);
INSERT INTO t102 VALUES ('0'),('1'),('2');
DROP TABLE t2;
CREATE TABLE t2 AS
SELECT DISTINCT *
FROM t102 AS t0
JOIN t102 AS t4 ON (t2.i0 IN t102)
NATURAL JOIN t102 AS t3
JOIN t102 AS t1 ON (t0.i0 IN t102)
JOIN t102 AS t2 ON (t2.i0=+t0.i0 OR (t0.i0<>500 AND t2.i0=t1.i0));
SELECT *, '|' FROM t2 ORDER BY 1, 2, 3, 4, 5;
} {0 0 0 0 | 0 0 1 0 | 0 0 1 1 | 0 0 2 0 | 0 0 2 2 | 0 1 0 0 | 0 1 1 0 | 0 1 1 1 | 0 1 2 0 | 0 1 2 2 | 0 2 0 0 | 0 2 1 0 | 0 2 1 1 | 0 2 2 0 | 0 2 2 2 | 1 0 0 0 | 1 0 0 1 | 1 0 1 1 | 1 0 2 1 | 1 0 2 2 | 1 1 0 0 | 1 1 0 1 | 1 1 1 1 | 1 1 2 1 | 1 1 2 2 | 1 2 0 0 | 1 2 0 1 | 1 2 1 1 | 1 2 2 1 | 1 2 2 2 | 2 0 0 0 | 2 0 0 2 | 2 0 1 1 | 2 0 1 2 | 2 0 2 2 | 2 1 0 0 | 2 1 0 2 | 2 1 1 1 | 2 1 1 2 | 2 1 2 2 | 2 2 0 0 | 2 2 0 2 | 2 2 1 1 | 2 2 1 2 | 2 2 2 2 |}
do_execsql_test 400 {
CREATE TABLE t4(a,b,c,d,e,f,g,h,i,j);
INSERT INTO t4 VALUES(0,1,2,3,4,5,6,7,8,9);
INSERT INTO t4 SELECT * FROM t4;
INSERT INTO t4 SELECT * FROM t4;
CREATE INDEX t4x ON t4(c,d,e);
SELECT DISTINCT a,b,c FROM t4 WHERE a=0 AND b=1;
} {0 1 2}
do_execsql_test 410 {
SELECT DISTINCT a,b,c,d FROM t4 WHERE a=0 AND b=1;
} {0 1 2 3}
do_execsql_test 411 {
SELECT DISTINCT d,a,b,c FROM t4 WHERE a=0 AND b=1;
} {3 0 1 2}
do_execsql_test 420 {
SELECT DISTINCT a,b,c,d,e FROM t4 WHERE a=0 AND b=1;
} {0 1 2 3 4}
do_execsql_test 430 {
SELECT DISTINCT a,b,c,d,e,f FROM t4 WHERE a=0 AND b=1;
} {0 1 2 3 4 5}
do_execsql_test 500 {
CREATE TABLE t5(a INT, b INT);
CREATE UNIQUE INDEX t5x ON t5(a+b);
INSERT INTO t5(a,b) VALUES(0,0),(1,0),(1,1),(0,3);
CREATE TEMP TABLE out AS SELECT DISTINCT a+b FROM t5;
SELECT * FROM out ORDER BY 1;
} {0 1 2 3}
do_execsql_test 600 {
CREATE TABLE t6a(x INTEGER PRIMARY KEY);
INSERT INTO t6a VALUES(1);
CREATE TABLE t6b(y INTEGER PRIMARY KEY);
INSERT INTO t6b VALUES(2),(3);
SELECT DISTINCT x, x FROM t6a, t6b;
} {1 1}
do_execsql_test 700 {
CREATE TABLE t7(a, b, c);
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE (i+1)<200
)
INSERT INTO t7 SELECT i/100, i/50, i FROM s;
}
do_execsql_test 710 {
SELECT DISTINCT a, b FROM t7;
} {
0 0 0 1
1 2 1 3
}
do_execsql_test 720 {
SELECT DISTINCT a, b+1 FROM t7;
} {
0 1 0 2
1 3 1 4
}
do_execsql_test 730 {
CREATE INDEX i7 ON t7(a, b+1);
ANALYZE;
SELECT DISTINCT a, b+1 FROM t7;
} {
0 1 0 2
1 3 1 4
}
do_execsql_test 800 {
CREATE TABLE t8(a, b, c);
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE (i+1)<100
)
INSERT INTO t8 SELECT i/40, i/20, i/40 FROM s;
}
do_execsql_test 820 {
SELECT DISTINCT a, b, c FROM t8;
} {
0 0 0 0 1 0
1 2 1 1 3 1
2 4 2
}
do_execsql_test 820 {
SELECT DISTINCT a, b, c FROM t8 WHERE b=3;
} {1 3 1}
do_execsql_test 830 {
CREATE INDEX i8 ON t8(a, c);
ANALYZE;
SELECT DISTINCT a, b, c FROM t8 WHERE b=3;
} {1 3 1}
do_execsql_test 900 {
CREATE TABLE t9(v);
INSERT INTO t9 VALUES
('abcd'), ('Abcd'), ('aBcd'), ('ABcd'), ('abCd'), ('AbCd'), ('aBCd'),
('ABCd'), ('abcD'), ('AbcD'), ('aBcD'), ('ABcD'), ('abCD'), ('AbCD'),
('aBCD'), ('ABCD'),
('wxyz'), ('Wxyz'), ('wXyz'), ('WXyz'), ('wxYz'), ('WxYz'), ('wXYz'),
('WXYz'), ('wxyZ'), ('WxyZ'), ('wXyZ'), ('WXyZ'), ('wxYZ'), ('WxYZ'),
('wXYZ'), ('WXYZ');
}
do_execsql_test 910 {
SELECT DISTINCT v COLLATE NOCASE, v FROM t9 ORDER BY +v;
} {
ABCD ABCD ABCd ABCd ABcD ABcD ABcd ABcd AbCD
AbCD AbCd AbCd AbcD AbcD Abcd Abcd
WXYZ WXYZ WXYz WXYz WXyZ WXyZ WXyz WXyz WxYZ
WxYZ WxYz WxYz WxyZ WxyZ Wxyz Wxyz
aBCD aBCD aBCd aBCd aBcD aBcD aBcd aBcd abCD
abCD abCd abCd abcD abcD abcd abcd
wXYZ wXYZ wXYz wXYz wXyZ wXyZ wXyz wXyz wxYZ
wxYZ wxYz wxYz wxyZ wxyZ wxyz wxyz
}
do_execsql_test 920 {
CREATE INDEX i9 ON t9(v COLLATE NOCASE, v);
ANALYZE;
SELECT DISTINCT v COLLATE NOCASE, v FROM t9 ORDER BY +v;
} {
ABCD ABCD ABCd ABCd ABcD ABcD ABcd ABcd AbCD
AbCD AbCd AbCd AbcD AbcD Abcd Abcd
WXYZ WXYZ WXYz WXYz WXyZ WXyZ WXyz WXyz WxYZ
WxYZ WxYz WxYz WxyZ WxyZ Wxyz Wxyz
aBCD aBCD aBCd aBCd aBcD aBcD aBcd aBcd abCD
abCD abCd abCd abcD abcD abcd abcd
wXYZ wXYZ wXYz wXYz wXyZ wXyZ wXyz wXyz wxYZ
wxYZ wxYz wxYz wxyZ wxyZ wxyz wxyz
}
finish_test