Incorporate the SQLITE_CHECKPOINT_TRUNCATE enhancement and a couple of

obscure bug fixes from trunk.

FossilOrigin-Name: 34ffa3b3c002b0e87d8382ad76e87dbaec0b2bc6
This commit is contained in:
drh
2014-12-04 23:35:08 +00:00
19 changed files with 422 additions and 171 deletions
+30
View File
@@ -222,4 +222,34 @@ do_execsql_test 4.1 {
SELECT quote(x) FROM t2 ORDER BY 1;
} {'xyzzy' X'0000000000'}
#----------------------------------------------------------------------------
# Ticket [c5ea805691bfc4204b1cb9e9aa0103bd48bc7d34] (2014-12-04)
# Make sure that DISTINCT works together with ORDER BY and descending
# indexes.
#
do_execsql_test 5.1 {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(x);
INSERT INTO t1(x) VALUES(3),(1),(5),(2),(6),(4),(5),(1),(3);
CREATE INDEX t1x ON t1(x DESC);
SELECT DISTINCT x FROM t1 ORDER BY x ASC;
} {1 2 3 4 5 6}
do_execsql_test 5.2 {
SELECT DISTINCT x FROM t1 ORDER BY x DESC;
} {6 5 4 3 2 1}
do_execsql_test 5.3 {
SELECT DISTINCT x FROM t1 ORDER BY x;
} {1 2 3 4 5 6}
do_execsql_test 5.4 {
DROP INDEX t1x;
CREATE INDEX t1x ON t1(x ASC);
SELECT DISTINCT x FROM t1 ORDER BY x ASC;
} {1 2 3 4 5 6}
do_execsql_test 5.5 {
SELECT DISTINCT x FROM t1 ORDER BY x DESC;
} {6 5 4 3 2 1}
do_execsql_test 5.6 {
SELECT DISTINCT x FROM t1 ORDER BY x;
} {1 2 3 4 5 6}
finish_test
+54
View File
@@ -106,5 +106,59 @@ do_test join5-2.12 {
execsql {SELECT * FROM xy LEFT JOIN ab ON NULL WHERE NULL}
} {}
# Ticket https://www.sqlite.org/src/tktview/6f2222d550f5b0ee7ed37601
# Incorrect output on a LEFT JOIN.
#
do_execsql_test join5-3.1 {
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
CREATE TABLE x1(a);
INSERT INTO x1 VALUES(1);
CREATE TABLE x2(b NOT NULL);
CREATE TABLE x3(c, d);
INSERT INTO x3 VALUES('a', NULL);
INSERT INTO x3 VALUES('b', NULL);
INSERT INTO x3 VALUES('c', NULL);
SELECT * FROM x1 LEFT JOIN x2 LEFT JOIN x3 ON x3.d = x2.b;
} {1 {} {} {}}
do_execsql_test join5-3.2 {
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
DROP TABLE IF EXISTS t4;
DROP TABLE IF EXISTS t5;
CREATE TABLE t1(x text NOT NULL, y text);
CREATE TABLE t2(u text NOT NULL, x text NOT NULL);
CREATE TABLE t3(w text NOT NULL, v text);
CREATE TABLE t4(w text NOT NULL, z text NOT NULL);
CREATE TABLE t5(z text NOT NULL, m text);
INSERT INTO t1 VALUES('f6d7661f-4efe-4c90-87b5-858e61cd178b',NULL);
INSERT INTO t1 VALUES('f6ea82c3-2cad-45ce-ae8f-3ddca4fb2f48',NULL);
INSERT INTO t1 VALUES('f6f47499-ecb4-474b-9a02-35be73c235e5',NULL);
INSERT INTO t1 VALUES('56f47499-ecb4-474b-9a02-35be73c235e5',NULL);
INSERT INTO t3 VALUES('007f2033-cb20-494c-b135-a1e4eb66130c',
'f6d7661f-4efe-4c90-87b5-858e61cd178b');
SELECT *
FROM t3
INNER JOIN t1 ON t1.x= t3.v AND t1.y IS NULL
LEFT JOIN t4 ON t4.w = t3.w
LEFT JOIN t5 ON t5.z = t4.z
LEFT JOIN t2 ON t2.u = t5.m
LEFT JOIN t1 xyz ON xyz.y = t2.x;
} {007f2033-cb20-494c-b135-a1e4eb66130c f6d7661f-4efe-4c90-87b5-858e61cd178b f6d7661f-4efe-4c90-87b5-858e61cd178b {} {} {} {} {} {} {} {} {}}
do_execsql_test join5-3.3 {
DROP TABLE IF EXISTS x1;
DROP TABLE IF EXISTS x2;
DROP TABLE IF EXISTS x3;
CREATE TABLE x1(a);
INSERT INTO x1 VALUES(1);
CREATE TABLE x2(b NOT NULL);
CREATE TABLE x3(c, d);
INSERT INTO x3 VALUES('a', NULL);
INSERT INTO x3 VALUES('b', NULL);
INSERT INTO x3 VALUES('c', NULL);
SELECT * FROM x1 LEFT JOIN x2 JOIN x3 WHERE x3.d = x2.b;
} {}
finish_test
+42 -1
View File
@@ -55,7 +55,8 @@ foreach {testprefix do_wal_checkpoint} {
if {[lsearch {-mode -db} $key]<0} { error "unknown switch: $key" }
}
if {$a(-mode)!="restart" && $a(-mode)!="full"} { set a(-mode) passive }
set vals {restart full truncate}
if {[lsearch -exact $vals $a(-mode)]<0} { set a(-mode) passive }
set cmd [list sqlite3_wal_checkpoint_v2 $dbhandle $a(-mode)]
if {[info exists a(-db)]} { lappend sql $a(-db) }
@@ -278,6 +279,11 @@ foreach {testprefix do_wal_checkpoint} {
9 RESTART 2 {1 4 3} 2
10 RESTART 3 {1 4 4} 3
11 TRUNCATE - {0 0 0} 3
12 TRUNCATE 1 {1 3 3} 1
13 TRUNCATE 2 {1 4 3} 2
14 TRUNCATE 3 {1 4 4} 3
} {
do_multiclient_test tn {
setup_and_attach_aux
@@ -348,6 +354,41 @@ foreach {testprefix do_wal_checkpoint} {
do_test 3.$tn.6 { code3 { do_wal_checkpoint db3 } } {0 0 0}
}
# Test SQLITE_CHECKPOINT_TRUNCATE.
#
do_multiclient_test tn {
code1 $do_wal_checkpoint
code2 $do_wal_checkpoint
code3 $do_wal_checkpoint
do_test 3.$tn.1 {
sql1 {
PRAGMA page_size = 1024;
PRAGMA journal_mode = WAL;
PRAGMA synchronous = normal;
CREATE TABLE t1(x, y);
CREATE INDEX i1 ON t1(x, y);
INSERT INTO t1 VALUES(1, 2);
INSERT INTO t1 VALUES(3, 4);
}
file size test.db-wal
} [wal_file_size 8 1024]
do_test 3.$tn.2 { do_wal_checkpoint db -mode truncate } {0 0 0}
do_test 3.$tn.3 { file size test.db-wal } 0
do_test 3.$tn.4 {
sql2 { SELECT * FROM t1 }
} {1 2 3 4}
do_test 3.$tn.5 {
sql2 { INSERT INTO t1 VALUES('a', 'b') }
file size test.db-wal
} [wal_file_size 2 1024]
}
}
+35
View File
@@ -640,4 +640,39 @@ do_execsql_test 4.2 {
} {/.*SCAN TABLE cx.*SEARCH TABLE px.*SEARCH TABLE le.*/}
# The following test is derived from a performance problem reported from
# the field. Notice the multiple indexes with the same initial tables,
# and the unusual WHERE clause terms.
#
do_test 5.1 {
set res [db eval {
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a,b,c,d,e,f,g,h);
CREATE INDEX t1abc ON t1(a,b,c);
CREATE INDEX t1abe ON t1(a,b,e);
CREATE INDEX t1abf ON t1(a,b,f);
ANALYZE;
DROP TABLE IF EXISTS sqlite_stat4;
DROP TABLE IF EXISTS sqlite_stat3;
DELETE FROM sqlite_stat1;
INSERT INTO sqlite_stat1(tbl,idx,stat)
VALUES('t1','t1abc','2000000 8000 1600 800'),
('t1','t1abe','2000000 8000 1600 150'),
('t1','t1abf','2000000 8000 1600 150');
ANALYZE sqlite_master;
EXPLAIN QUERY PLAN
SELECT * FROM t1
WHERE (a=1 OR a=2)
AND (b=3 OR b=4)
AND (d>=5 AND d<=5)
AND ((e>=7 AND e<=7) OR (f>=8 AND f<=8))
AND g>0;
}]
} {~/ANY/}
do_test 5.2 {set res} {/USING INDEX t1abe/}
do_test 5.3 {set res} {/USING INDEX t1abf/}
finish_test