]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
The cherry-pick merge at [371838562a675c1b] caused a performance regression
authordrh <>
Sat, 11 Mar 2023 23:29:34 +0000 (23:29 +0000)
committerdrh <>
Sat, 11 Mar 2023 23:29:34 +0000 (23:29 +0000)
for some queries, which is here fixed.

FossilOrigin-Name: 6d6d95fcedbc8758ab284d3014ae4a97af6247003bb3d0a7056f2e6bffa6cae4

manifest
manifest.uuid
src/select.c
test/join2.test
test/notnull2.test
test/tester.tcl

index c390011bee82465feb68449fafafeb033db80c3c..4aabce8c3ad0454de9a6647cda1adb1ad0f22f7f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Version\s3.41.1
-D 2023-03-10T12:13:52.703
+C The\scherry-pick\smerge\sat\s[371838562a675c1b]\scaused\sa\sperformance\sregression\nfor\ssome\squeries,\swhich\sis\shere\sfixed.
+D 2023-03-11T23:29:34.543
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -621,7 +621,7 @@ F src/printf.c ff4b05e38bf928ff1b80d3dda4f977b10fe39ecbfe69c018224c7e5594fb2455
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c 4233c3030341bf1a21cea90890e6b3d3531721acc62ede147e899d36ffad8238
 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92
-F src/select.c 316c9bd757700692400369568a38a8d87f830f9fa896539abcbc331c228cbd20
+F src/select.c 9c6f537469c54af6e5b981d68ac18714562c497e6ff57782f338bb17b3ec9777
 F src/shell.c.in 6f36f5ca05f1bebf74935a7fcf2dce983016e807a09cbd752a673583ad7da087
 F src/sqlite.h.in 662a2fa083d093896b92560c871dea6d86792b49dc4bf7b4e8dbeca8e7171488
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1215,7 +1215,7 @@ F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4
 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b
 F test/istrue.test e7f285bb70282625c258e866ce6337d4c762922f5a300e1b50f958aef6e7d9c9
 F test/join.test e32cb9b1491eed682489e2cde33a22a4eb7611fe5aa3b0aa4b275fe27ab3f3ac
-F test/join2.test c378a2c59db8da13a265481c9aeab08d854c524f56a0eda12fa7bc535bfbebb1
+F test/join2.test 8561fe82ce434ac96de91544072e578dc2cadddf2d9bc9cd802f866a9b92502e
 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0
 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916
 F test/join5.test 91f1f4c7d81fd87b58e9ba7cf4a2b5d39e3583b4f8e498a162722a60259c5208
@@ -1333,7 +1333,7 @@ F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf
 F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161
 F test/notify3.test 796c7b7157f55c93b4e672b724e9c923a6fc6aa72ac419379a623e2350472e22
 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18
-F test/notnull2.test 8e1aa4f311df37f9d2cd4f5563eea955b8028c692151404e9cc896420a01a3dc
+F test/notnull2.test 1ee4acbd614d3cf5f1c4a52f5af7fc771b82352f1a51a86afeaa02c9df1d82ef
 F test/notnullfault.test fc4bb7845582a2b3db376001ef49118393b1b11abe0d24adb03db057ee2b73d5
 F test/null.test b7ff206a1c60fe01aa2abd33ef9ea83c93727d993ca8a613de86e925c9f2bc6f
 F test/nulls1.test 7a5e4346ee4285034100b4cd20e6784f16a9d6c927e44ecdf10034086bbee9c9
@@ -1562,7 +1562,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
 F test/temptable2.test 76821347810ecc88203e6ef0dd6897b6036ac788e9dd3e6b04fd4d1631311a16
 F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637
 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc
-F test/tester.tcl 8d54d40a55e12554b4509bc12078b201b233c8e842a7543629094a21b1ba956d
+F test/tester.tcl 68454ef88508c196d19e8694daa27bff7107a91857799eaa12f417188ae53ede
 F test/testrunner.tcl e0b36a732956c69ce19370611b8dc69b44e627d5ea8ec2a5455ca3e8a170ddaa
 F test/testrunner_data.tcl 8169c68654ac8906833b8a6aadca973358a441ebf88270dd05c153e5f96f76b8
 F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899
@@ -2045,10 +2045,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P cc8a0ee40cfc83ab42a0ff452de0a53fe17784aefb944ea7ac2cb078a8310730
-R 36a17de70fdfc70a02115f278d762e2d
-T +sym-release *
-T +sym-version-3.41.1 *
+P 20399f3eda5ec249d147ba9e48da6e87f969d7966a9a896764ca437ff7e737ff
+Q +dc9f025dc43cb8008e7d8d644175d8b2d084e602a1513803c40c513d1e99fea4
+R 2f8f4d851a6e1e6e1df00137b0152c8b
 U drh
-Z 6594aef6b42302816d333b0c05d59faf
+Z 604e8487283a0732e6243f3c7d1d2399
 # Remove this line to create a well-formed Fossil manifest.
index f25dbe76af0c4344ce9c940aced7cf10a23817fa..d3c47e61f140a360911401c657fba02fb01a66df 100644 (file)
@@ -1 +1 @@
-20399f3eda5ec249d147ba9e48da6e87f969d7966a9a896764ca437ff7e737ff
\ No newline at end of file
+6d6d95fcedbc8758ab284d3014ae4a97af6247003bb3d0a7056f2e6bffa6cae4
\ No newline at end of file
index 0e692684bccee94d9ffd8404c76fbce149eac962..2a66c79e3ea58592cc9d186620790f1d8bcec9ca 100644 (file)
@@ -3862,7 +3862,9 @@ static Expr *substExpr(
         sqlite3VectorErrorMsg(pSubst->pParse, pCopy);
       }else{
         sqlite3 *db = pSubst->pParse->db;
-        if( pSubst->isOuterJoin ){
+        if( pSubst->isOuterJoin
+         && (pCopy->op!=TK_COLUMN || pCopy->iTable!=pSubst->iNewTable)
+        ){
           memset(&ifNullRow, 0, sizeof(ifNullRow));
           ifNullRow.op = TK_IF_NULL_ROW;
           ifNullRow.pLeft = pCopy;
index 39cabf880953cf4c6e0262c764c394ab9de453b1..15e76f965dbf1866376f96ff4ecc0ba3d2509130 100644 (file)
@@ -404,4 +404,28 @@ do_execsql_test 11.1 {
   SELECT * FROM t1 LEFT JOIN t3 ON y=z;
 } {NULL -2 -2 3 NULL 1 NULL NULL 0 2 2 3}
 
+# 2023-03-11 https://sqlite.org/forum/forumpost/b405033490fa56d9
+# The fix that test 11.1 above checks also caused a performance regression.
+# This test case verifies that the performance regression has been resolved.
+#
+do_execsql_test 12.1 {
+  DROP TABLE t1;
+  DROP TABLE t2;
+  DROP VIEW t3;
+  CREATE TABLE t1(a INTEGER PRIMARY KEY);
+  WITH RECURSIVE c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<100)
+    INSERT INTO t1(a) SELECT n FROM c;
+  CREATE VIEW t2(b) AS SELECT a FROM t1;
+}
+do_vmstep_test 12.2 {
+  SELECT * FROM t1 LEFT JOIN t2 ON a=b LIMIT 10 OFFSET 98;
+} 2000 {99 99 100 100}
+do_eqp_test 12.3 {
+  SELECT * FROM t1 LEFT JOIN t2 ON a=b LIMIT 10 OFFSET 98;
+} {
+  QUERY PLAN
+  |--SCAN t1
+  `--SEARCH t1 USING INTEGER PRIMARY KEY (rowid=?) LEFT-JOIN
+}
+
 finish_test
index 12fffe28ce32ce0f24c1bdf415104649ea1c735f..7f68086810731c52425686a3fed446ac9bf8b804 100644 (file)
@@ -28,24 +28,6 @@ do_execsql_test 1.0 {
   INSERT INTO t2 SELECT * FROM t1;
 }
 
-proc do_vmstep_test {tn sql nstep {res {}}} {
-  uplevel [list do_execsql_test $tn.0 $sql $res]
-
-  set vmstep [db status vmstep]
-  if {[string range $nstep 0 0]=="+"} {
-    set body "if {$vmstep<$nstep} {
-      error \"got $vmstep, expected more than [string range $nstep 1 end]\"
-    }"
-  } else {
-    set body "if {$vmstep>$nstep} {
-      error \"got $vmstep, expected less than $nstep\"
-    }"
-  }
-
-  # set name "$tn.vmstep=$vmstep,expect=$nstep"
-  set name "$tn.1"
-  uplevel [list do_test $name $body {}]
-}
 
 do_vmstep_test 1.1.1 {
   SELECT * FROM t1 LEFT JOIN t2 WHERE a=c AND d IS NULL;
index 4658590cf4b7318a393921a2fc668458e092b9ee..021830aa95c70878f1baf9aed359696fbba11434 100644 (file)
@@ -949,6 +949,29 @@ proc normalize_list {L} {
   set L2
 }
 
+# Run SQL and verify that the number of "vmsteps" required is greater
+# than or less than some constant.
+#
+proc do_vmstep_test {tn sql nstep {res {}}} {
+  uplevel [list do_execsql_test $tn.0 $sql $res]
+
+  set vmstep [db status vmstep]
+  if {[string range $nstep 0 0]=="+"} {
+    set body "if {$vmstep<$nstep} {
+      error \"got $vmstep, expected more than [string range $nstep 1 end]\"
+    }"
+  } else {
+    set body "if {$vmstep>$nstep} {
+      error \"got $vmstep, expected less than $nstep\"
+    }"
+  }
+
+  # set name "$tn.vmstep=$vmstep,expect=$nstep"
+  set name "$tn.1"
+  uplevel [list do_test $name $body {}]
+}
+
+
 # Either:
 #
 #   do_execsql_test TESTNAME SQL ?RES?