]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Various minor bug fixes cherrypicked from trunk.
authordrh <>
Tue, 21 Apr 2026 22:55:44 +0000 (22:55 +0000)
committerdrh <>
Tue, 21 Apr 2026 22:55:44 +0000 (22:55 +0000)
FossilOrigin-Name: f1276db5dabe797dfeee2afbb9f3a3fe367b5f860a07af88963f16aa3986f7b9

manifest
manifest.uuid
src/alter.c
src/parse.y
src/select.c
src/where.c
test/altercons2.test
test/existsexpr.test
test/update.test

index a90571953bc8b5c5da098d43666ba17ee288f684..2b703ef8e1b6eca5eb161d642ad89e48db12fb92 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sanother\sbug\sin\sEXISTS-to-JOIN\s-\sthis\sone\nhaving\sto\sdo\swith\san\sOFFSET\sclause\sof\sa\sLIMIT.
-D 2026-04-21T13:06:15.482
+C Various\sminor\sbug\sfixes\scherrypicked\sfrom\strunk.
+D 2026-04-21T22:55:44.778
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -667,7 +667,7 @@ F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d
 F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 1b9c24374a85dfc7eb8fa7c4266ee0db4f9609cceecfc5481cd8307e5af04366
 F sqlite3.pc.in e6dee284fba59ef500092fdc1843df3be8433323a3733c91da96690a50a5b398
-F src/alter.c e257c51ac9301b3d72be4e1ac39c3c78528aad83194d963a075351344fbc14c7
+F src/alter.c 7d7ddbdc189f0e0c686e32ee170abdddc95c11f2089e40df4ffcee88f5334826
 F src/analyze.c 03bcfc083fc0cccaa9ded93604e1d4244ea245c17285d463ef6a60425fcb247d
 F src/attach.c 7cf07d4fa42b9fc8662237c60c40b730326c30aa90ae5fffc0b18b2d726ebf61
 F src/auth.c ebec42df26b34a62b6750d30d9c2c03554a1c522020182476f7729a439fef04f
@@ -724,7 +724,7 @@ F src/os_win.c 0d553b6e8b92c8eb85e7f1b4a8036fe8638c8b32c9ad8d9d72a861c10f81b4c5
 F src/os_win.h 5e168adf482484327195d10f9c3bce3520f598e04e07ffe62c9c5a8067c1037b
 F src/pager.c fe34fd22ec251436985d7b6ebdd05bf238a17901c2cb23d3d28974dd2361a912
 F src/pager.h 6137149346e6c8a3ddc1eeb40aee46381e9bc8b0fcc6dda8a1efde993c2275b8
-F src/parse.y 3b784d6083380a950e3b1b32ce5ddd303e8c7c209d8ab788df2c62aaf9ee8eb3
+F src/parse.y 8c8003a932f6f98ac612fd239d3cdc7ca64480f61ca5f4f680c4fe69b1bc68c9
 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
 F src/pcache.h 092b758d2c5e4dabb30eae46d8dfad77c0f70b16bf3ff1943f7a232b0fe0d4ba
 F src/pcache1.c 131ca0daf4e66b4608d2945ae76d6ed90de3f60539afbd5ef9ec65667a5f2fcd
@@ -734,7 +734,7 @@ F src/printf.c 50be92de0725e88c8b38978775ab46f9b42d74e21f65045c3423503173eb0566
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 928ff887f2a7c64275182060d94d06fdddbe32226c569781cf7e7edc6f58d7fd
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 2ef8d7c8d1bf8dfba18bd0264b2777c160e94941638de67a0f2ea9e422bfb390
+F src/select.c 4c05cde130f26991b7411d8c6809e0630625e18078742c963a047b4b9cc01d49
 F src/shell.c.in 4edf6ba701a13c0b9c519a56b33548a6519d5e67ebb683ba7e253d28543d04d0
 F src/sqlite.h.in e2915e4a86d5e0783afb5cb72411df38d987c7f3c5aa2d5441b8e74d30b649d8
 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
@@ -816,7 +816,7 @@ F src/vxworks.h 9d18819c5235b49c2340a8a4d48195ec5d5afb637b152406de95a9436beeaeab
 F src/wal.c 7340d4f9bb827bd349127cac6b2cf0cb7f76b9fda645f7b9b0bf7a6e0b1e2e7c
 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452
 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014
-F src/where.c bffca5e4ef20d0bfbdc24f1dc13fd3f955284225a8ad25a4454635f6be39aad0
+F src/where.c 1096566a629cccb0a4fd66e3304f39f73349c6c62d21111f8bbae46a43a15aa8
 F src/whereInt.h 8d94cb116c9e06205c3d5ac87af065fc044f8cf08bfdccd94b6ea1c1308e65da
 F src/wherecode.c 676cb6cb02878643e817d9917a2d3522b83a3736b2cedd3dc8a01d7bb92af6c2
 F src/whereexpr.c e9f7185fba366d9365aa7a97329609e4cf00b3dd0400d069fbaa5187350c17c6
@@ -838,7 +838,7 @@ F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256b
 F test/alterauth2.test 4b74fa8f184f4736497317feb587b65759eb87d87acfe3a8ef433d4d18bb002b
 F test/altercol.test 3661c432aacb42bc2198dd4611bbb9c3b09fc73251b59edda046109103b8ac00
 F test/altercons.test ea18def4a0f26b9066da56095c9c480df705df4d02e4ae151708fae76f7e3884
-F test/altercons2.test ade124ce5c733d7d939a5b602946eaf4a1825c7e355319a2b00bcc0b34aafe3f
+F test/altercons2.test 4933eadb035fc0ccfc34ed879f69a09051c53907f9dae9c3d36d25f93519ccc7
 F test/altercorrupt.test 2e1d705342cf9d7de884518ddbb053fd52d7e60d2b8869b7b63b2fda68435c12
 F test/alterdropcol.test a653a3945f964d26845ec0cd0a8e74189f46de3119a984c5bc45457da392612e
 F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a543280dfd4b4d41
@@ -1097,7 +1097,7 @@ F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650
 F test/exclusive2.test cd70b1d9c6fffd336f9795b711dcc5d9ceba133ad3f7001da3fda63615bdc91e
 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7
 F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac
-F test/existsexpr.test 630b64d75002d7dc1aab46899073ef7cec57fb0893ec8ab14ff50e882c03b56e
+F test/existsexpr.test b39974adaa7fa1deccc065a57f10db96f9005d2ba9e6f933a5f35c9128bcc1ad
 F test/existsexpr2.test dc23e76389eff3d29f6488ff733012a3560cd67ec8cfaecbecd52cced5d5af11
 F test/existsfault.test ff41c11f3052c1bbd4f8dd557802310026253d67d7c4e3a180c16d2f0862973e
 F test/expr.test db981f8a85520e99ae20aab7ad2e9b5b0437ed09159b57ced434c672075d2e61
@@ -1922,7 +1922,7 @@ F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264
 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2
 F test/unixexcl.test d2366ef2d3d95249314307861d748924d9ab4f24305541159a08be61ccd4a9ee
 F test/unordered.test 0edaf3411d300693bca595897c5201421c6c5ec787990a1dfe2f7f60ae93f1e2
-F test/update.test 258dcf26d401177d3cb7fdf0beab14d671dbe72e8ff6e0435fd85a08fcd57bd9
+F test/update.test 93fba5f7505f7a7b25d66135d98d9b055b7f1bd627a7e514dbba1ea6213f0c41
 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3
 F test/upfrom1.tcl 8859d9d437f03b44174c4524a7a734a391fd4526fcff65be08285dafc9dc9041
 F test/upfrom1.test 8cb06689e99cd707d884faa16da0e8eb26ff658bb01c47ddf72fadade666e6e1
@@ -2197,9 +2197,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 6215c9dd27ca446bf61d8ee7adcf455d35914853b19cb5f5feff5ce0f420e7b7
-Q +1dd3c6a5e50ac3f617683678223e42f48636c17e58905506c5c74cc4bf05845c
-R d3b0f34ce06fb693dab223e22f418668
+P f91099ecee5413b3ab7261461e774436f5a9214101eea10d234135abe70bb444
+Q +2d1d2947b28f5dcbf4c66b594e176038c4e71e61948a88db565c1cb1212657ce
+Q +9387238cb0bb2651c64ecb229072df039577d71fd91546a2f0c94ca9755bf25d
+Q +d0d95a39bc211034071746395ee6dbcfbea9d573d27480655391ba9698f7e214
+R 6756b6bc876bf4ad18628b0f5f7f5a2b
 U drh
-Z d8512a94c63bc3f8fdf01b2fbc91167c
+Z f826f21f19f117da333fc78a1dacd400
 # Remove this line to create a well-formed Fossil manifest.
index 92c50ade13b04a8af3d234046e8470a3ab64f3bc..b046e9aa21c52e911c4475fa890c1c3702823d8f 100644 (file)
@@ -1 +1 @@
-f91099ecee5413b3ab7261461e774436f5a9214101eea10d234135abe70bb444
+f1276db5dabe797dfeee2afbb9f3a3fe367b5f860a07af88963f16aa3986f7b9
index f3c7dff3e85ac2068233d35222c43d6cbf5013be..10b72526d1646605bfc5b611e39b803f501b2781 100644 (file)
@@ -2798,8 +2798,9 @@ void sqlite3AlterDropConstraint(
   if( !pTab ) return;
 
   if( pCons ){
-    sqlite3DequoteToken(pCons); 
-    zArg = sqlite3MPrintf(db, "%.*Q", pCons->n, pCons->z);
+    char *z = sqlite3NameFromToken(db, pCons);
+    zArg = sqlite3MPrintf(db, "%Q", z);
+    sqlite3DbFree(db, z);
   }else{
     int iCol;
     if( alterFindCol(pParse, pTab, pCol, &iCol) ) return;
index f5a6bed14b3c63b82ec59ef6567b8fc83459b42c..04b94205bc6676ee305612dd90bb08bb13cb2ed0 100644 (file)
@@ -1476,6 +1476,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] {
   A = sqlite3PExpr(pParse, TK_BETWEEN, A, 0);
   if( A ){
     A->x.pList = pList;
+    sqlite3ExprSetHeightAndFlags(pParse, A);
   }else{
     sqlite3ExprListDelete(pParse->db, pList);
   } 
index 840d800c980a7ee7c4966145a8066de4561bbeb0..41c14e91cdce2b3dc5c3e9554e88f19e10d9ff4e 100644 (file)
@@ -7372,7 +7372,6 @@ static SQLITE_NOINLINE void existsToJoin(
           sqlite3TreeViewSelect(0, p, 0);
         }
 #endif
-        existsToJoin(pParse, p, pSubWhere);
       }
     }
   }
index e3c1077785a0b79600f56b0f1e0c013663167855..ad160d1c7b475f17d9be4a4908899f5011984a9a 100644 (file)
@@ -7583,27 +7583,11 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
       }
 #endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */
     }
-    if( pTabList->a[pLevel->iFrom].fg.fromExists
-     && (i==pWInfo->nLevel-1
-           || pTabList->a[pWInfo->a[i+1].iFrom].fg.fromExists==0)
-    ){
-      /* This is an EXISTS-to-JOIN optimization which is either the
-      ** inner-most loop, or the inner-most of a group of nested
-      ** EXISTS-to-JOIN optimization loops.  If this loop sees a successful
-      ** row, it should break out of itself as well as other EXISTS-to-JOIN
-      ** loops in which is is directly nested. */
-      int nOuter = 0; /* Nr of outer EXISTS that this one is nested within */
-      while( nOuter<i ){
-        if( !pTabList->a[pLevel[-nOuter-1].iFrom].fg.fromExists ) break;
-        nOuter++;
-      }
-      testcase( nOuter>0 );
-      sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel[-nOuter].addrBrk);
-      if( nOuter ){
-        VdbeComment((v, "EXISTS break %d..%d", i-nOuter, i));
-      }else{
-        VdbeComment((v, "EXISTS break %d", i));
-      }
+    if( pTabList->a[pLevel->iFrom].fg.fromExists ){
+      /* This is an EXISTS-to-JOIN optimization loop. If this loop sees a 
+      ** successful row, it should break out of itself. */
+      sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->addrBrk);
+      VdbeComment((v, "EXISTS break %d", i));
     }
     sqlite3VdbeResolveLabel(v, pLevel->addrCont);
     if( pLevel->op!=OP_Noop ){
index 50c9ec0fa169ae0b32e12e3da36db41bb74b0a6f..1e6aa1acc3af54c21417d932622a9977228a4f00 100644 (file)
@@ -283,5 +283,13 @@ do_execsql_test 12.5 {
       "IsActive" INTEGER)}
 }
 
+do_execsql_test 12.6 {
+  CREATE TABLE t1(a, b CONSTRAINT "a""b" CHECK (b IS NOT NULL));
+}
+
+do_execsql_test 12.7 {
+  ALTER TABLE t1 DROP CONSTRAINT "a""b"
+}
+
 finish_test
 
index 724fa2574912f145c5a1a97f946f03a528eb7bfc..e2867bbdb08af9aa6ece9f16e6d3eefc18a14ed7 100644 (file)
@@ -537,4 +537,53 @@ do_execsql_test 11.1 {
    GROUP BY id;
 } {1 p1}
 
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 12.0 {
+  CREATE TABLE t2(id INT, data INT);
+  CREATE TABLE t3(amount INT);
+
+  INSERT INTO t2 VALUES (1,0),(2,0);
+  INSERT INTO t3 VALUES (1),(1);
+}
+
+do_execsql_test 12.1 {
+  SELECT * FROM t2
+    WHERE EXISTS (SELECT 1 FROM t3 WHERE t3.amount > t2.data)
+} {
+  1 0
+  2 0
+}
+
+do_execsql_test 12.2 {
+  SELECT * FROM t2
+    WHERE EXISTS (SELECT 1 FROM t3 WHERE t3.amount > t2.data)
+  LIMIT 2 OFFSET 3
+} {}
+
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 13.0 {
+  CREATE TABLE t1(b,c);
+  CREATE TABLE t2(x,y);
+  CREATE TABLE t3(p,q);
+
+  INSERT INTO t1 VALUES(7,10);
+  INSERT INTO t2 VALUES(1,1), (4,7);
+  INSERT INTO t3 VALUES(4,7);
+
+  PRAGMA automatic_index = 0;
+}
+
+do_execsql_test 13.1 {
+  SELECT * FROM t1 WHERE EXISTS (
+      SELECT 1 FROM t2
+      WHERE EXISTS (
+        SELECT 1 FROM t3 WHERE t3.p=t2.x AND t3.q=t1.b
+      )
+  )
+} {7 10}
+
+
 finish_test
index 0a380fa030553872c80f6265d6e43800e36d9041..7419add7e4e3d69b624e8f69eeeb541c2e4667f2 100644 (file)
@@ -787,4 +787,14 @@ do_eqp_test update-21.12 {
      `--SEARCH t3 USING AUTOMATIC COVERING INDEX (x=?)
 }
 
+# /forumpost/2026-04-21T19:10:55Z
+do_execsql_test update-22.0 {
+  DROP TABLE IF EXISTS t1;
+  CREATE TABLE t1(x INT, y INT);
+  INSERT INTO t1(x) VALUES(1),(2),(3),(4),(5);
+  UPDATE t1 SET x=x+100, y=x<=(SELECT min(x) FROM t1)
+   WHERE x<3 OR (1 BETWEEN 0 AND x<=(SELECT min(x)+2 FROM t1));
+  SELECT x FROM t1 WHERE x<100 ORDER BY x;
+} {4 5}
+
 finish_test