1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Rework the fix to the problem described by

[forum:/forumpost/b9647a113b465950|forum post b9647a113b] so that it
provides a more complete fix that covers cases that were not resolved by
the original fix, and so that it does not cause performance regressions.

FossilOrigin-Name: 28db0d152d90fb5e62d03ea5caceabe8901be98522aef3dc2b54564fbc35355d
This commit is contained in:
drh
2025-07-07 16:19:44 +00:00
7 changed files with 77 additions and 34 deletions

View File

@ -788,6 +788,9 @@ do_execsql_test 33.3 {
# INTEGER PRIMARY KEY, and the columns that UNIQUE constraint are
# used in a rowvalue-IN operator constraint.
#
# 2025-07-07 Discovered that the original fix was incomplete and
# new tests added. See tag-20250707-01 in the code.
#
reset_db
do_execsql_test 34.1 {
CREATE TABLE items (
@ -804,5 +807,39 @@ do_execsql_test 34.1 {
WHERE (Id, Item) IN (SELECT Id, Item FROM items);
SELECT Id, Item, test FROM items ORDER BY id;
} {1 2 ok 2 2 ok 3 3 ok 4 5 ok}
db null NULL
do_execsql_test 34.2 {
CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d);
CREATE INDEX idx ON t1(b,a);
INSERT INTO t1(a,b) VALUES (1, 22);
SELECT * FROM t1 INDEXED BY idx WHERE (b,a) IN (SELECT b,a FROM t1);
} {1 22 NULL NULL}
do_execsql_test 34.3 {
DROP TABLE t1;
CREATE TABLE t1(a, b, c, d);
CREATE INDEX idx ON t1(b,a,a);
INSERT INTO t1(a,b) VALUES (1, 22);
SELECT * FROM t1 INDEXED BY idx WHERE (b,a) IN (SELECT b,a FROM t1);
} {1 22 NULL NULL}
do_execsql_test 34.4 {
DROP TABLE t1;
CREATE TABLE t1(id INTEGER PRIMARY KEY, a INT);
CREATE INDEX t1a ON t1(a,id); -- index includes PRIMARY KEY
CREATE TABLE t2(id INTEGER PRIMARY KEY);
WITH RECURSIVE c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<100)
INSERT INTO t1(id,a) SELECT n, 777 FROM c;
INSERT INTO t2 SELECT id FROM t1;
SELECT *
FROM t1 JOIN t2 USING(id)
WHERE t1.a=777 AND t2.id>999
ORDER BY t1.id;
} {}
do_execsql_test 34.5 {
EXPLAIN QUERY PLAN
SELECT *
FROM t1 JOIN t2 USING(id)
WHERE t1.a=777 AND t2.id>999
ORDER BY t1.id;
} {/SEARCH t1 USING COVERING INDEX t1a .a=. AND id>../}
finish_test