mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-01 06:27:03 +03:00
When attempting to optimize "expr AND false" to "false" and
"expr IN ()" to "false", take care not to delete aggregate functions in the "expr" as doing so can change the meaning of the query. FossilOrigin-Name: 355c7902de8da79f35f6d729d0fc5bdd74cdc1a1b249cf440ef74839ec025850
This commit is contained in:
@ -358,7 +358,7 @@ do_catchsql_test 8.6 {
|
||||
CREATE INDEX i0 ON t0(likelihood(1,2) AND 0);
|
||||
ALTER TABLE t0 RENAME TO t1;
|
||||
SELECT sql FROM sqlite_master WHERE name='i0';
|
||||
} {1 {error in index i0: second argument to likelihood() must be a constant between 0.0 and 1.0}}
|
||||
} {1 {second argument to likelihood() must be a constant between 0.0 and 1.0}}
|
||||
|
||||
|
||||
reset_db
|
||||
|
@ -190,14 +190,14 @@ do_execsql_test 8.1 {
|
||||
}
|
||||
do_execsql_test 8.2.1 {
|
||||
CREATE TABLE t2 (c0);
|
||||
CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 100) IN ()));
|
||||
CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 1.0) IN ()));
|
||||
ALTER TABLE t2 RENAME COLUMN c0 TO c1;
|
||||
}
|
||||
do_execsql_test 8.2.2 {
|
||||
SELECT sql FROM sqlite_master WHERE tbl_name = 't2';
|
||||
} {
|
||||
{CREATE TABLE t2 (c1)}
|
||||
{CREATE INDEX i2 ON t2((LIKELIHOOD(c0, 100) IN ()))}
|
||||
{CREATE INDEX i2 ON t2((LIKELIHOOD(c1, 1.0) IN ()))}
|
||||
}
|
||||
do_test 8.2.3 {
|
||||
sqlite3 db2 test.db
|
||||
@ -662,14 +662,6 @@ do_execsql_test 27.2 {
|
||||
{CREATE TABLE t1(a, b AS ((WITH w1 (xyz) AS ( SELECT t1.b FROM t1 ) SELECT 123) IN ()))}
|
||||
}
|
||||
|
||||
do_execsql_test 27.3 {
|
||||
CREATE TABLE t0(c0 , c1 AS (CASE TRUE NOT IN () WHEN NULL THEN CASE + 0xa ISNULL WHEN NOT + 0x9 THEN t0.c1 ELSE CURRENT_TIME LIKE CAST (t0.c1 REGEXP '-([1-9]\d*.\d*|0\.\d*[1-9]\d*)'ESCAPE (c1) COLLATE BINARY BETWEEN c1 AND c1 NOT IN (WITH t4 (c0) AS (WITH t3 (c0) AS NOT MATERIALIZED (WITH RECURSIVE t2 (c0) AS (WITH RECURSIVE t1 AS (VALUES (x'717171ff71717171' ) ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY 0x9 ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c1 ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY typeof(0x9 ) ) SELECT DISTINCT t0.c0 FROM t0 NOT INDEXED WHERE t0.c0 =t0.c0 GROUP BY typeof(typeof(0x9 ) ) ) IN t0 BETWEEN typeof(typeof(typeof(hex(*) FILTER (WHERE + x'5ccd1e68' ) ) ) ) AND 1 >0xa AS BLOB (+4.4E4 , -0xe ) ) END <> c1 IN () END ) VIRTUAL , c35 PRIMARY KEY , c60 , c64 NUMERIC (-6.8 , -0xE ) ) WITHOUT ROWID ;
|
||||
} {}
|
||||
|
||||
do_execsql_test 27.4 {
|
||||
ALTER TABLE t0 DROP COLUMN c60;
|
||||
} {}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
reset_db
|
||||
do_execsql_test 28.1 {
|
||||
|
@ -100,4 +100,26 @@ do_execsql_test parser1-3.1 {
|
||||
PRAGMA foreign_key_list(t301);
|
||||
} {0 0 t300 c2 id RESTRICT CASCADE NONE 1 0 t300 c1 id RESTRICT CASCADE NONE}
|
||||
|
||||
# 2025-07-01 https://sqlite.org/forum/forumpost/f4878de3e7dd4764
|
||||
# Do not allow parse-time optimizations to omit aggregate functions,
|
||||
# because doing so can change the meaning of the query.
|
||||
#
|
||||
unset -nocomplain zero
|
||||
set zero [expr {0+0}]
|
||||
do_execsql_test parser1-4.1 {
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1(x);
|
||||
SELECT max(x) AND $zero FROM t1;
|
||||
} 0
|
||||
do_execsql_test parser1-4.2 {
|
||||
SELECT max(x) AND 0 FROM t1;
|
||||
} 0
|
||||
do_execsql_test parser1-4.3 {
|
||||
SELECT max(x) IN () FROM t1;
|
||||
} 0
|
||||
do_execsql_test parser1-4.4 {
|
||||
SELECT max(x) NOT IN () FROM t1;
|
||||
} 1
|
||||
|
||||
|
||||
finish_test
|
||||
|
Reference in New Issue
Block a user