mirror of
https://github.com/status-im/sqlcipher.git
synced 2026-08-30 22:11:14 +00:00
Snapshot of upstream SQLite 3.25.0
This commit is contained in:
+189
-1
@@ -86,10 +86,198 @@ do_execsql_test 2.0 {
|
||||
}
|
||||
|
||||
do_catchsql_test 2.1 {
|
||||
SELECT * FROM aa LEFT JOIN cc ON (a=b) JOIN bb ON (b=c);
|
||||
SELECT * FROM aa LEFT JOIN cc ON (a=b) JOIN bb ON (b=coalesce(c,1));
|
||||
} {1 {ON clause references tables to its right}}
|
||||
do_catchsql_test 2.2 {
|
||||
SELECT * FROM aa JOIN cc ON (a=b) JOIN bb ON (b=c);
|
||||
} {0 {one one one}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test that a problem causing where.c to overlook opportunities to
|
||||
# omit unnecessary tables from a LEFT JOIN when UNIQUE, NOT NULL column
|
||||
# that makes this possible happens to be the leftmost in its table.
|
||||
#
|
||||
reset_db
|
||||
do_execsql_test 3.0 {
|
||||
CREATE TABLE t1(k1 INTEGER PRIMARY KEY, k2, k3);
|
||||
CREATE TABLE t2(k2 INTEGER PRIMARY KEY, v2);
|
||||
|
||||
-- Prior to this problem being fixed, table t3_2 would be omitted from
|
||||
-- the join queries below, but if t3_1 were used in its place it would
|
||||
-- not.
|
||||
CREATE TABLE t3_1(k3 PRIMARY KEY, v3) WITHOUT ROWID;
|
||||
CREATE TABLE t3_2(v3, k3 PRIMARY KEY) WITHOUT ROWID;
|
||||
}
|
||||
|
||||
do_eqp_test 3.1 {
|
||||
SELECT v2 FROM t1 LEFT JOIN t2 USING (k2) LEFT JOIN t3_1 USING (k3);
|
||||
} {
|
||||
QUERY PLAN
|
||||
|--SCAN TABLE t1
|
||||
`--SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?)
|
||||
}
|
||||
|
||||
do_eqp_test 3.2 {
|
||||
SELECT v2 FROM t1 LEFT JOIN t2 USING (k2) LEFT JOIN t3_2 USING (k3);
|
||||
} {
|
||||
QUERY PLAN
|
||||
|--SCAN TABLE t1
|
||||
`--SEARCH TABLE t2 USING INTEGER PRIMARY KEY (rowid=?)
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Test that tables other than the rightmost can be omitted from a
|
||||
# LEFT JOIN query.
|
||||
#
|
||||
do_execsql_test 4.0 {
|
||||
CREATE TABLE c1(k INTEGER PRIMARY KEY, v1);
|
||||
CREATE TABLE c2(k INTEGER PRIMARY KEY, v2);
|
||||
CREATE TABLE c3(k INTEGER PRIMARY KEY, v3);
|
||||
|
||||
INSERT INTO c1 VALUES(1, 2);
|
||||
INSERT INTO c2 VALUES(2, 3);
|
||||
INSERT INTO c3 VALUES(3, 'v3');
|
||||
|
||||
INSERT INTO c1 VALUES(111, 1112);
|
||||
INSERT INTO c2 VALUES(112, 1113);
|
||||
INSERT INTO c3 VALUES(113, 'v1113');
|
||||
}
|
||||
do_execsql_test 4.1.1 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2);
|
||||
} {2 v3 1112 {}}
|
||||
do_execsql_test 4.1.2 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
|
||||
} {2 v3 1112 {}}
|
||||
|
||||
do_execsql_test 4.1.3 {
|
||||
SELECT DISTINCT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1);
|
||||
} {2 v3 1112 {}}
|
||||
|
||||
do_execsql_test 4.1.4 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1);
|
||||
} {2 v3 2 v3 1112 {} 1112 {}}
|
||||
|
||||
do_eqp_test 4.1.5 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2);
|
||||
} {
|
||||
QUERY PLAN
|
||||
|--SCAN TABLE c1
|
||||
|--SEARCH TABLE c2 USING INTEGER PRIMARY KEY (rowid=?)
|
||||
`--SEARCH TABLE c3 USING INTEGER PRIMARY KEY (rowid=?)
|
||||
}
|
||||
do_eqp_test 4.1.6 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
|
||||
} {
|
||||
QUERY PLAN
|
||||
|--SCAN TABLE c1
|
||||
`--SEARCH TABLE c3 USING INTEGER PRIMARY KEY (rowid=?)
|
||||
}
|
||||
|
||||
do_execsql_test 4.2.0 {
|
||||
DROP TABLE c1;
|
||||
DROP TABLE c2;
|
||||
DROP TABLE c3;
|
||||
CREATE TABLE c1(k UNIQUE, v1);
|
||||
CREATE TABLE c2(k UNIQUE, v2);
|
||||
CREATE TABLE c3(k UNIQUE, v3);
|
||||
|
||||
INSERT INTO c1 VALUES(1, 2);
|
||||
INSERT INTO c2 VALUES(2, 3);
|
||||
INSERT INTO c3 VALUES(3, 'v3');
|
||||
|
||||
INSERT INTO c1 VALUES(111, 1112);
|
||||
INSERT INTO c2 VALUES(112, 1113);
|
||||
INSERT INTO c3 VALUES(113, 'v1113');
|
||||
}
|
||||
do_execsql_test 4.2.1 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2);
|
||||
} {2 v3 1112 {}}
|
||||
do_execsql_test 4.2.2 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
|
||||
} {2 v3 1112 {}}
|
||||
|
||||
do_execsql_test 4.2.3 {
|
||||
SELECT DISTINCT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1);
|
||||
} {2 v3 1112 {}}
|
||||
|
||||
do_execsql_test 4.2.4 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 LEFT JOIN c3 ON (c3.k=v1+1);
|
||||
} {2 v3 2 v3 1112 {} 1112 {}}
|
||||
|
||||
do_eqp_test 4.2.5 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v2);
|
||||
} {
|
||||
QUERY PLAN
|
||||
|--SCAN TABLE c1
|
||||
|--SEARCH TABLE c2 USING INDEX sqlite_autoindex_c2_1 (k=?)
|
||||
`--SEARCH TABLE c3 USING INDEX sqlite_autoindex_c3_1 (k=?)
|
||||
}
|
||||
do_eqp_test 4.2.6 {
|
||||
SELECT v1, v3 FROM c1 LEFT JOIN c2 ON (c2.k=v1) LEFT JOIN c3 ON (c3.k=v1+1);
|
||||
} {
|
||||
QUERY PLAN
|
||||
|--SCAN TABLE c1
|
||||
`--SEARCH TABLE c3 USING INDEX sqlite_autoindex_c3_1 (k=?)
|
||||
}
|
||||
|
||||
# 2017-11-23 (Thanksgiving day)
|
||||
# OSSFuzz found an assertion fault in the new LEFT JOIN eliminator code.
|
||||
#
|
||||
do_execsql_test 4.3.0 {
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
CREATE TABLE t1(x PRIMARY KEY) WITHOUT ROWID;
|
||||
CREATE TABLE t2(x);
|
||||
SELECT a.x
|
||||
FROM t1 AS a
|
||||
LEFT JOIN t1 AS b ON (a.x=b.x)
|
||||
LEFT JOIN t2 AS c ON (a.x=c.x);
|
||||
} {}
|
||||
do_execsql_test 4.3.1 {
|
||||
WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10)
|
||||
INSERT INTO t1(x) SELECT x FROM c;
|
||||
INSERT INTO t2(x) SELECT x+9 FROM t1;
|
||||
SELECT a.x, c.x
|
||||
FROM t1 AS a
|
||||
LEFT JOIN t1 AS b ON (a.x=b.x)
|
||||
LEFT JOIN t2 AS c ON (a.x=c.x);
|
||||
} {1 {} 2 {} 3 {} 4 {} 5 {} 6 {} 7 {} 8 {} 9 {} 10 10}
|
||||
|
||||
do_execsql_test 5.0 {
|
||||
CREATE TABLE s1 (a INTEGER PRIMARY KEY);
|
||||
CREATE TABLE s2 (a INTEGER PRIMARY KEY);
|
||||
CREATE TABLE s3 (a INTEGER);
|
||||
CREATE UNIQUE INDEX ndx on s3(a);
|
||||
}
|
||||
do_eqp_test 5.1 {
|
||||
SELECT s1.a FROM s1 left join s2 using (a);
|
||||
} {SCAN TABLE s1}
|
||||
|
||||
do_eqp_test 5.2 {
|
||||
SELECT s1.a FROM s1 left join s3 using (a);
|
||||
} {SCAN TABLE s1}
|
||||
|
||||
do_execsql_test 6.0 {
|
||||
CREATE TABLE u1(a INTEGER PRIMARY KEY, b, c);
|
||||
CREATE TABLE u2(a INTEGER PRIMARY KEY, b, c);
|
||||
CREATE INDEX u1ab ON u1(b, c);
|
||||
}
|
||||
do_eqp_test 6.1 {
|
||||
SELECT u2.* FROM u2 LEFT JOIN u1 ON( u1.a=u2.a AND u1.b=u2.b AND u1.c=u2.c );
|
||||
} {SCAN TABLE u2}
|
||||
|
||||
db close
|
||||
sqlite3 db :memory:
|
||||
do_execsql_test 7.0 {
|
||||
CREATE TABLE t1(a,b); INSERT INTO t1 VALUES(1,2),(3,4),(5,6);
|
||||
CREATE TABLE t2(c,d); INSERT INTO t2 VALUES(2,4),(3,6);
|
||||
CREATE TABLE t3(x); INSERT INTO t3 VALUES(9);
|
||||
CREATE VIEW test AS
|
||||
SELECT *, 'x'
|
||||
FROM t1 LEFT JOIN (SELECT * FROM t2, t3) ON (c=b AND x=9)
|
||||
WHERE c IS NULL;
|
||||
SELECT * FROM test;
|
||||
} {3 4 {} {} {} x 5 6 {} {} {} x}
|
||||
|
||||
|
||||
finish_test
|
||||
|
||||
Reference in New Issue
Block a user