# 2026-10-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. # set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix like4 ifcapable !like_match_blobs { finish_test return } do_execsql_test 1.0 { CREATE TABLE t0(a, c); INSERT INTO t0 VALUES(1, 'A'); INSERT INTO t0 VALUES(2, 'A'); INSERT INTO t0 VALUES(1, X'41'); INSERT INTO t0 VALUES(2, X'41'); } foreach {tn idx} { 1 "" 2 "CREATE INDEX idx ON t0(a, c)" 3 "CREATE INDEX idx ON t0(c, a)" } { execsql { DROP INDEX IF EXISTS idx } execsql $idx do_execsql_test 1.$tn.1 { SELECT a, count(*) FROM t0 WHERE a IN (1,2) AND c GLOB 'A' GROUP BY a; } {1 2 2 2} do_execsql_test 1.$tn.2 { SELECT a, quote(c) FROM t0 WHERE a IN (1,2) AND c GLOB 'A' ORDER BY a; } { 1 'A' 1 X'41' 2 'A' 2 X'41' } } #------------------------------------------------------------------------- reset_db do_execsql_test 2.0 { CREATE TABLE t1(a, b); CREATE INDEX t1b ON t1(b); INSERT INTO t1 VALUES(1, 'abc'); INSERT INTO t1 VALUES(2, X'616263'); INSERT INTO t1 VALUES(3, 'abd'); INSERT INTO t1 VALUES(4, X'616264'); } do_execsql_test 2.1 { SELECT a FROM t1 WHERE b GLOB 'ab*' ORDER BY b } {1 3 2 4} do_execsql_test 2.2 { SELECT a FROM t1 WHERE b GLOB 'ab*' ORDER BY b DESC } {4 2 3 1} #------------------------------------------------------------------------- reset_db do_execsql_test 3.0 { CREATE TABLE t(a, c); CREATE INDEX ti ON t(a, c); WITH RECURSIVE n(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM n WHERE i<100) INSERT INTO t SELECT i%3, 'x'||i FROM n; INSERT INTO t VALUES(2, 'A'), (1, x'41'); } do_execsql_test 3.1 { SELECT a, quote(c) FROM t WHERE c GLOB 'A' ORDER BY a; } { 1 X'41' 2 'A' } do_execsql_test 3.2 { ANALYZE; } do_execsql_test 3.3 { SELECT a, quote(c) FROM t WHERE c GLOB 'A' ORDER BY a; } { 1 X'41' 2 'A' } #------------------------------------------------------------------------- # Skip-scan on combined with IN(...) and the LIKE optimization. # reset_db do_execsql_test 4.0 { CREATE TABLE t(a, b, c); CREATE INDEX ti ON t(a, b, c); WITH RECURSIVE n(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM n WHERE i<300) INSERT INTO t SELECT i%3, i%2, 'x'||i FROM n; INSERT INTO t VALUES(2, 0, 'A'), (2, 1, x'41'); INSERT INTO t VALUES(1, 1, 'A'), (1, 0, x'41'); INSERT INTO t VALUES(0, 1, 'A'); ANALYZE; } do_eqp_test 4.1 { SELECT a, b, quote(c) FROM t WHERE b IN (0,1) AND c GLOB 'A' ORDER BY a, b; } {SEARCH t USING COVERING INDEX ti (ANY(a) AND b=? AND c>? AND c? AND y