]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix problems with expressions like "(?,?,?) IN (SELECT c,b,a FROM ...)" when there...
authordan <Dan Kennedy>
Thu, 4 Jun 2026 11:19:43 +0000 (11:19 +0000)
committerdan <Dan Kennedy>
Thu, 4 Jun 2026 11:19:43 +0000 (11:19 +0000)
FossilOrigin-Name: 07667afd0f17b73b58df8ace6a2a5c3a593276f9b7804cb14d4705051258dd75

manifest
manifest.uuid
src/expr.c
test/nulls1.test
test/nulls2.test [new file with mode: 0644]

index 9c56e44781b57186c93df769a5866cbdac4fe3e5..0997b2243d0c6988d1472779d65b04a26be80f8a 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Clearly\smark\sthe\sext/misc/wholenumber.c\sextension\sas\s"testing\sand\ndebugging\suse\sonly".\s\sFix\sa\spotential\sinteger\soverflow\sthat\scan\soccur\nif\sthe\sabove\swarning\sis\signored.\n[bugs:/info/2026-06-04T09:40:28Z|Bug\s2026-06-04T09:40:28Z].
-D 2026-06-04T11:18:11.467
+C Fix\sproblems\swith\sexpressions\slike\s"(?,?,?)\sIN\s(SELECT\sc,b,a\sFROM\s...)"\swhen\sthere\sis\san\sindex\son\scolumns\s"c",\s"b"\sand\s"a",\sbut\snot\sin\sthat\sorder.\sBug\s[bugs:/info/2026-06-04T07:02:53Z\s|\s2026-06-04T07:02:53Z].
+D 2026-06-04T11:19:43.017
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -688,7 +688,7 @@ F src/date.c 61e92f1f7e2e88e1cd91e91dc69eb2b2854e7877254470f9fabd776bfac922b8
 F src/dbpage.c c6a9de13b0a01f0bc94a41e16213ab1ecd15ccfe86df7255ced40fda9446257d
 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
 F src/delete.c 59eeca3fb88c29329afc41bb803ee568b120d9dd7470b5f38ab55cc38390b451
-F src/expr.c 9f1e3b85daf4204f0f40202a899dca751839086783edb19e477bd1020c4561db
+F src/expr.c 84ca652a0c7409b3884e099ba5cb79dcbcaaaf0342023f4712188934d7ec796d
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 931f74cec1dc8038a0217ef340c91ce147dd1bbed08dc40c47ee0ec6edfffb08
 F src/func.c 2837560c6232b7a3c9c163137a210d820ca82af2c33a5d446599fcb16c09192e
@@ -1474,7 +1474,8 @@ F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed
 F test/notnull2.test c2c7b670fb8fa6ffe5f9cc08af88864fbb8237e28b56ad528e8dee921019c5fe
 F test/notnullfault.test fc4bb7845582a2b3db376001ef49118393b1b11abe0d24adb03db057ee2b73d5
 F test/null.test b7ff206a1c60fe01aa2abd33ef9ea83c93727d993ca8a613de86e925c9f2bc6f
-F test/nulls1.test 8fc70d75ab363b0f2ce9151669c2cb897def5064e2e30f7d9322970480bf6e87
+F test/nulls1.test 642c27ae0792d5fc92969815eb8c4a17636cdcc164cb5b20f3d2b55a1a5d169d
+F test/nulls2.test 20356ab1de69f78363faed9c2cd8eb455bb92f805572c405131f1c5d8f2d37fb
 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1
 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823
 F test/offset1.test c21e67d2d5ae8ed310243fbe84fc2f0dca49e9ffed3ea89110c0d5914c0de620
@@ -2207,8 +2208,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 840be0ee62c0ba34f4916c382e2d07071bebd8ce7bca31deb1616869722bfa4d
-R 2492b2afdbc61c25eaa3d54298fe9baa
-U drh
-Z 15461e36c37555c1359586ce59b62b6c
+P 44154ea9ae99d532d5c7268d70bd8b32751f7a82c367c7bd1ec0e6948d71d1b8
+R 895c5f48837d22ba0f0d78bebe999c6b
+U dan
+Z d6ea39703d8349e075a552cbca57b001
 # Remove this line to create a well-formed Fossil manifest.
index bc273f1311aa6403f4a5ea2efd7b2db1170d78c7..16ebaa0860092440dbed961b5d8667cd04e123a5 100644 (file)
@@ -1 +1 @@
-44154ea9ae99d532d5c7268d70bd8b32751f7a82c367c7bd1ec0e6948d71d1b8
+07667afd0f17b73b58df8ace6a2a5c3a593276f9b7804cb14d4705051258dd75
index 07dacfccd293bbff6e5e0c5e47a82a0a01f2e509..6d8537e3a4ee8b73ab7543776de4acba65702d4f 100644 (file)
@@ -4190,7 +4190,7 @@ static void sqlite3ExprCodeIN(
     Expr *p = sqlite3VectorFieldSubexpr(pExpr->pLeft, i);
     if( pParse->nErr ) goto sqlite3ExprCodeIN_oom_error;
     if( sqlite3ExprCanBeNull(p) ){
-      sqlite3VdbeAddOp2(v, OP_IsNull, rLhs+i, destStep2);
+      sqlite3VdbeAddOp2(v, OP_IsNull, rLhs+aiMap[i], destStep2);
       VdbeCoverage(v);
     }
   }
@@ -4274,8 +4274,8 @@ static void sqlite3ExprCodeIN(
       ** ...)" is the collating sequence of x.".  */
       pColl = sqlite3ExprCollSeq(pParse, p);
     }
-    sqlite3VdbeAddOp3(v, OP_Column, iTab, i, r3);
-    sqlite3VdbeAddOp4(v, OP_Ne, rLhs+i, destNotNull, r3,
+    sqlite3VdbeAddOp3(v, OP_Column, iTab, aiMap[i], r3);
+    sqlite3VdbeAddOp4(v, OP_Ne, rLhs+aiMap[i], destNotNull, r3,
                       (void*)pColl, P4_COLLSEQ);
     VdbeCoverage(v);
     sqlite3ReleaseTempReg(pParse, r3);
index 76ef3dc1df964a32c5eb3c2389fe0889f15462fb..d914948ed980c1587ed59b80830317fd3cea0db5 100644 (file)
@@ -337,34 +337,43 @@ do_execsql_test 10.51 {
 } {X 3 X | X 4 X | X 5 X | X 7 X | X {} X | {} {} {} | Y {} {} |}
 
 #-------------------------------------------------------------------------
-reset_db
-
-do_execsql_test 11.1 {
-  CREATE TABLE t1(a TEXT COLLATE NOCASE, b TEXT);
-  INSERT INTO t1 VALUES('Hello', 'world');
-}
-
-foreach {tn sql res} {
-  0 "SELECT null" NULL
-
-  1 "SELECT     ('hello', NULL) IN (SELECT a, b FROM t1)"  NULL
-  2 "SELECT NOT ('hello', NULL) IN (SELECT a, b FROM t1)"  NULL
-
-  3 "SELECT ('Hello', NULL) IN (SELECT a, b FROM t1)"  NULL
-  4 "SELECT ('Hello' COLLATE NOCASE, NULL) IN (SELECT a, b FROM t1)"  NULL
-  5 "SELECT ('hello', 'world') IN (SELECT a, b FROM t1)" 1
 
-  6 "SELECT ('hi', NULL) IN (SELECT a, b FROM t1)" 0
-   
-  7 "SELECT ('hello', NULL) IN ((a, b), (3, 4), (5, 6)) FROM t1"  0
-  8 "SELECT (a, b) IN (('hello', NULL), (3, 4), (5, 6)) FROM t1"  NULL
-
-  9 "SELECT ('Hello', NULL) IN ((a, b), (3, 4), (5, 6)) FROM t1"  NULL
+foreach {tn idx} {
+  1 {}
+  2 { CREATE INDEX i1 ON t1(a, b) }
+  3 { CREATE INDEX i1 ON t1(b, a) }
 } {
-  db nullvalue NULL
-  do_execsql_test 11.2.$tn $sql $res
-}
+  reset_db
+  do_execsql_test 11.$tn.1 {
+    CREATE TABLE t1(a TEXT COLLATE NOCASE, b TEXT);
+    INSERT INTO t1 VALUES('Hello', 'world');
+  }
+  
+  do_execsql_test 11.$tn.2 $idx
+  
+  foreach {tn sql res} {
+    0 "SELECT null" NULL
+  
+    1 "SELECT     ('hello', NULL) IN (SELECT a, b FROM t1)"  NULL
+    2 "SELECT NOT ('hello', NULL) IN (SELECT a, b FROM t1)"  NULL
+  
+    3 "SELECT ('Hello', NULL) IN (SELECT a, b FROM t1)"  NULL
+    4 "SELECT ('Hello' COLLATE NOCASE, NULL) IN (SELECT a, b FROM t1)"  NULL
+    5 "SELECT ('hello', 'world') IN (SELECT a, b FROM t1)" 1
+  
+    6 "SELECT ('hi', NULL) IN (SELECT a, b FROM t1)" 0
+     
+    7 "SELECT ('hello', NULL) IN ((a, b), (3, 4), (5, 6)) FROM t1"  0
+    8 "SELECT (a, b) IN (('hello', NULL), (3, 4), (5, 6)) FROM t1"  NULL
+  
+    9 "SELECT ('Hello', NULL) IN ((a, b), (3, 4), (5, 6)) FROM t1"  NULL
+  } {
+    db nullvalue NULL
+    do_execsql_test 11.$tn.3.$tn $sql $res
+  }
 
+}
 
 
 
diff --git a/test/nulls2.test b/test/nulls2.test
new file mode 100644 (file)
index 0000000..af2a4cf
--- /dev/null
@@ -0,0 +1,74 @@
+# 2026 June 4
+#
+# 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 nulls2
+
+foreach {tn idx} {
+  1 {}
+  2 { CREATE INDEX i1 ON t1(a, b, c) }
+  3 { CREATE INDEX i1 ON t1(b, c, a) }
+  4 { CREATE INDEX i1 ON t1(c, a, b) }
+  5 { CREATE INDEX i1 ON t1(c, b, a) }
+} {
+  reset_db
+
+  do_execsql_test 1.$tn.0 {
+    CREATE TABLE t1(a, b, c);
+
+    INSERT INTO t1 VALUES(1, 1, NULL);
+    INSERT INTO t1 VALUES(2, 2, NULL);
+
+    CREATE TABLE t2(d NOT NULL, e NOT NULL, f);
+    INSERT INTO t2 VALUES(1, 1, NULL);
+    INSERT INTO t2 VALUES(2, 2, NULL);
+  }
+
+  execsql $idx
+
+  # This should return zero rows, as "f" is always NULL.
+  #
+  do_execsql_test 1.$tn.1 {
+    SELECT rowid FROM t2 WHERE (d, e, f) IN (
+        SELECT a, b, c FROM t1
+    )
+  }
+}
+
+foreach {tn idx} {
+  1 {}
+  2 { CREATE INDEX i1 ON t1(a, b, c) }
+  3 { CREATE INDEX i1 ON t1(b, c, a) }
+  4 { CREATE INDEX i1 ON t1(c, a, b) }
+  5 { CREATE INDEX i1 ON t1(c, b, a) }
+} {
+  reset_db
+
+  do_execsql_test 2.$tn.0 {
+    CREATE TABLE t1(a, b, c COLLATE nocase);
+    INSERT INTO t1 VALUES('one', 'two', 'THREE');
+    INSERT INTO t1 VALUES('four', 'five', 'SIX');
+  }
+
+  execsql $idx
+
+  do_execsql_test 1.$tn.1 {
+    SELECT (NULL, 'two', 'three') IN (
+        SELECT a, b, c FROM t1
+    ) IS NULL
+  } 1
+}
+
+
+finish_test