]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Handle constraints like "a=$var" where the value bound to $var is -1, 0 or 1 in the... reprepare-a=var
authordan <Dan Kennedy>
Thu, 14 May 2026 17:54:23 +0000 (17:54 +0000)
committerdan <Dan Kennedy>
Thu, 14 May 2026 17:54:23 +0000 (17:54 +0000)
FossilOrigin-Name: 224e827e87ac8aa4b18ff9b2193decbdcd832579bf6b6e0883c03db90ebd5319

manifest
manifest.tags
manifest.uuid
src/where.c
test/analyze3.test
test/eqp2.test

index b7e7b61d1b156c5b7028b184860b461113ec0efd..adb26a09dc7cee5f2d2a5c8b74fc19ea467142be 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sthe\ssqlite3changegroup_change_finish()\sAPI\sso\sthat\sit\scorrectly\shandles\sNULL\sbeing\spassed\sfor\sthe\spzErr\sparameter.
-D 2026-05-13T20:37:30.527
+C Handle\sconstraints\slike\s"a=$var"\swhere\sthe\svalue\sbound\sto\s$var\sis\s-1,\s0\sor\s1\sin\sthe\ssame\sway\sas\sa\sliteral\s-1,\s0,\s1.\sThis\smight\scause\sexcessive\sreprepares.
+D 2026-05-14T17:54:23.788
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -818,7 +818,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 7241a71725d8c193ddd9e69a299820fcd755943f3b5ac376a84b2716e2848401
+F src/where.c 53abef65858e20b3c7d9f23fa9d78ee385d7054b9e13a8c1886265167f39288c
 F src/whereInt.h 8d94cb116c9e06205c3d5ac87af065fc044f8cf08bfdccd94b6ea1c1308e65da
 F src/wherecode.c 4d573077652f79780d6b50840ab8cbb72053dbb4eb230780dd2a146ab034475d
 F src/whereexpr.c e9f7185fba366d9365aa7a97329609e4cf00b3dd0400d069fbaa5187350c17c6
@@ -856,7 +856,7 @@ F test/altertab3.test 575e771e2f02b13eb98798dc92eabacd187d6dbcf596e70f11d699b0b6
 F test/altertrig.test b1590647076add5a47aea0f2236c609ca0bc8a7a2462463edd3e5882c7894802
 F test/amatch1.test 8a9405f497a57705a368f242658e2aea900dd2efbc48a48024263b0df6fc1ea0
 F test/analyze.test 2fb21d7d64748636384e6cb8998dbf83968caf644c07fcb4f76c18f2e7ede94b
-F test/analyze3.test c5156cef33f04b90a6b9e9d5d0bbc273a0fb44147d4508407bf1080811e2c6c8
+F test/analyze3.test 42adfaedaddca1d93d9f4ac38465791e25a2e4b7a261a5278e92f554ac1e15f1
 F test/analyze4.test 68bd069f3ac7ac1e652ddd9f04f57d5606ddb4208450f5297005db7aa0dd707d
 F test/analyze5.test fa5131952303ac4146aba101b116b9c8cb89e2637531c334a6df7f7d19dddc0d
 F test/analyze6.test 028f5bdfc9e5b5294768fa9a7185b8cd1d019aa7aab5b2f8ee42d7271d9a3b28
@@ -1093,7 +1093,7 @@ F test/enc2.test 872afe58db772e7dfa1ad8e0759f8cc820e9efc8172d460fae83023101c2e43
 F test/enc3.test 55ef64416d72975c66167310a51dc9fc544ba3ae4858b8d5ab22f4cb6500b087
 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020
 F test/eqp.test 1d653fe8d2612cd6764e5ea2f16dcf5f13a9f50448b9233bb1573804bccd7579
-F test/eqp2.test 6e8996148de88f0e7670491e92e712a2920a369b4406f21a27c3c9b6a46b68dd
+F test/eqp2.test 950ca786db3e74cbca5105cfd160c84f81744275034b1e3cc3c75e3e3807a0cc
 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9
 F test/errofst1.test 6da78363739ba8991f498396ab331b5d64e7ab5c4172c12b5884683ef523ac53
 F test/eval.test 73969a2d43a511bf44080c44485a8c4d796b6a4f038d19e491867081155692c0
@@ -2205,8 +2205,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
 F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
 F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
-P 3ddc07110dacef98c14b852dcdc4f11d1c0f4061008bf3a61e2df707b0dc6c6b
-R 1dab4a7992096fd33a1b7a8bbcb2d58c
+P f81d6d7bc8943729f678a3b62921a96764b15b9cc11d8a5753e48210a1b59617
+R 8f8318379b196cd0991d680e07b8a844
+T *branch * reprepare-a=var
+T *sym-reprepare-a=var *
+T -sym-trunk *
 U dan
-Z 369ba48121df91d9d1fcfb40348f03a0
+Z 7fbfe875c8d4b7c99a11f0177adeb2df
 # Remove this line to create a well-formed Fossil manifest.
index bec971799ff1b8ee641c166c7aeb22d12c785393..ae3e10859bdada14e6cdc3d0e2dc441236f3fe70 100644 (file)
@@ -1,2 +1,2 @@
-branch trunk
-tag trunk
+branch reprepare-a=var
+tag reprepare-a=var
index b76ea3ae2f2dc6ef94f7dbcd42aa2ea15ce946fa..b47946bfa02b9e918e210b0ed9b9472b33be5c82 100644 (file)
@@ -1 +1 @@
-f81d6d7bc8943729f678a3b62921a96764b15b9cc11d8a5753e48210a1b59617
+224e827e87ac8aa4b18ff9b2193decbdcd832579bf6b6e0883c03db90ebd5319
index df835bf9fc57cf71710cc538597a02a4c91e9dbf..a3440591ef346f52978e9eec20806abe8ec934bd 100644 (file)
@@ -3088,9 +3088,10 @@ static void whereLoopOutputAdjust(
          && (pTerm->wtFlags & TERM_HIGHTRUTH)==0  /* tag-20200224-1 */
         ){
           Expr *pRight = pOpExpr->pRight;
+          Parse *pParse = pWC->pWInfo->pParse;
           int k = 0;
           testcase( pOpExpr->op==TK_IS );
-          if( sqlite3ExprIsInteger(pRight, &k, 0) && k>=(-1) && k<=1 ){
+          if( sqlite3ExprIsInteger(pRight, &k, pParse) && k>=(-1) && k<=1 ){
             k = 10;
           }else{
             k = 20;
index 033dfa5dff0c47aeccefea0ae8fdb2c406464246..dec79eac9b59e132ea06ae95349a0090de1354b8 100644 (file)
@@ -415,7 +415,7 @@ do_test analyze3-3.4.1 {
 do_test analyze3-3.4.2 {
   sqlite3_bind_text $S 1 "abc" 3
   sqlite3_expired $S
-} {0}
+} {1}
 do_test analyze3-3.4.3 {
   sqlite3_bind_text $S 2 "def" 3
   sqlite3_expired $S
index 3c634fc28a96f17b6374a34000d4f4ae2a2240b5..7ab2c706bc5166b0c04aa1b336418f4fc7a50309 100644 (file)
@@ -44,6 +44,40 @@ do_eqp_test 1.3 {
   `--USE TEMP B-TREE FOR LAST 2 TERMS OF ORDER BY
 }
 
+#-------------------------------------------------------------------------
+# Test that a bound value of 0 is handled in the same way as a literal
+# 0 when estimating the probability of (x=<some-integer>).
+#
+reset_db
+do_execsql_test 2.0 {
+  CREATE TABLE t1(a INT, b INT);
+  CREATE TABLE t2(x INT, y INT);
+  CREATE INDEX t1_a ON t1(a);
+  CREATE INDEX t1_b ON t1(b);
+  CREATE INDEX t2_x ON t2(x);
+
+  WITH s(i) AS ( SELECT 0 UNION ALL SELECT i+1 FROM s WHERE i<999)
+  INSERT INTO t1 SELECT i%33, i FROM s;
+
+  WITH s(i) AS ( SELECT 0 UNION ALL SELECT i+1 FROM s WHERE i<59)
+  INSERT INTO t2 SELECT i, i%3 FROM s;
+
+  ANALYZE;
+}
+
+set zero [expr 0]
+
+do_eqp_test 2.1 {
+  SELECT * FROM t1 JOIN t2 ON t1.b = t2.x
+  WHERE t1.a = 5 AND t2.y = $zero
+} {SEARCH t1 USING INDEX t1_a (a=?)*SEARCH t2 USING INDEX t2_x (x=?)}
+
+do_eqp_test 2.2 {
+  SELECT * FROM t1 JOIN t2 ON t1.b = t2.x
+  WHERE t1.a = 5 AND t2.y = 0
+} {SEARCH t1 USING INDEX t1_a (a=?)*SEARCH t2 USING INDEX t2_x (x=?)}
+
+
 finish_test