From: dan Date: Thu, 14 May 2026 17:54:23 +0000 (+0000) Subject: Handle constraints like "a=$var" where the value bound to $var is -1, 0 or 1 in the... X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=672b87d0d5502cad3a32e652613beaff891deac2;p=thirdparty%2Fsqlite.git Handle constraints like "a=$var" where the value bound to $var is -1, 0 or 1 in the same way as a literal -1, 0, 1. This might cause excessive reprepares. FossilOrigin-Name: 224e827e87ac8aa4b18ff9b2193decbdcd832579bf6b6e0883c03db90ebd5319 --- diff --git a/manifest b/manifest index b7e7b61d1b..adb26a09dc 100644 --- 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. diff --git a/manifest.tags b/manifest.tags index bec971799f..ae3e10859b 100644 --- a/manifest.tags +++ b/manifest.tags @@ -1,2 +1,2 @@ -branch trunk -tag trunk +branch reprepare-a=var +tag reprepare-a=var diff --git a/manifest.uuid b/manifest.uuid index b76ea3ae2f..b47946bfa0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f81d6d7bc8943729f678a3b62921a96764b15b9cc11d8a5753e48210a1b59617 +224e827e87ac8aa4b18ff9b2193decbdcd832579bf6b6e0883c03db90ebd5319 diff --git a/src/where.c b/src/where.c index df835bf9fc..a3440591ef 100644 --- a/src/where.c +++ b/src/where.c @@ -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; diff --git a/test/analyze3.test b/test/analyze3.test index 033dfa5dff..dec79eac9b 100644 --- a/test/analyze3.test +++ b/test/analyze3.test @@ -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 diff --git a/test/eqp2.test b/test/eqp2.test index 3c634fc28a..7ab2c706bc 100644 --- a/test/eqp2.test +++ b/test/eqp2.test @@ -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=). +# +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