From ec13fcecd2abeddc051d0c27236d785c3a12dc4b Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 20 Jan 2026 15:07:28 +0000 Subject: [PATCH] Minor fixes. Tests are passing now. FossilOrigin-Name: 305ae331f5e791941c12b04b727656ac8d80f7c5cb6343277b979a456eb3b834 --- manifest | 27 ++++++++++------------ manifest.uuid | 2 +- src/select.c | 7 +++--- src/sqliteInt.h | 2 +- test/collate5.test | 30 ++++++++++++------------- test/distinct2.test | 2 +- test/eqp.test | 55 +++++++++++++++++++++++++-------------------- test/offset1.test | 28 +++++++++++++++++++++++ test/tkt2339.test | 6 ++--- 9 files changed, 96 insertions(+), 63 deletions(-) diff --git a/manifest b/manifest index 2abbce762e..8fc284e937 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Be\smore\saggressive\sabout\susing\sa\ssort-and-merge\sto\scompute\sthe\sUNION\sof\ntwo\sSELECT\sstatements.\s\sExperimental\sbranch.\s\sThis\scheck-in\sis\sfailing\ssome\ntests. -D 2026-01-19T19:51:03.991 +C Minor\sfixes.\s\sTests\sare\spassing\snow. +D 2026-01-20T15:07:28.159 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -738,12 +738,12 @@ F src/printf.c b1b29b5e58e1530d5daeee5963d3c318d8ab2d7e38437580e28755753e0c1ded F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 47aa7fdc9ec4c19b103ac5e79d7887d30119b5675309facf5eed1118391c868b F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c c2c07615ec16f7040228ba80115c00c7c8639b1ac9a0a99e28f97af5ebe4300b +F src/select.c db7af5c5e3cdcbf4ce443f5540cfa782e0fd4de5481af9814c188f05aef8193c F src/shell.c.in 3bc4c6aa962bdf950dc144c2138eb4bc734bf7e305f2ac42dbda5a83c4a4c660 F src/sqlite.h.in 476f3efeb5dd26ad94dcbce262ca7eb9d042d797a92d624059c67ef37d5b3ab4 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 F src/sqlite3ext.h f590cd8cb4c36fc727632c9b5fbbafc85f7efe2c6890f9958d7e711dc26ec01e -F src/sqliteInt.h af67bc95fa6b66cd3c7f3d18d2d040ad386e4cbb02965ee318cc721ee9d5fa45 +F src/sqliteInt.h 71a2ae85d45c6cda8571bab66a6ab86b36a439a82c8a712681e6a99c381ab79b F src/sqliteLimit.h 904a3f520362c7065c18165aaabd504fb13cc1b76cb411f38bd41ac219e4af1e F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -973,7 +973,7 @@ F test/collate1.test 0890fa372753b59eba53832d37328af815f6b8e4b16761823180eeb62c8 F test/collate2.test 471c6f74573382b89b0f8b88a05256faa52f7964f9e4799e76708a3b1ece6ba4 F test/collate3.test 89defc49983ddfbf0a0555aca8c0521a676f56a5 F test/collate4.test c953715fb498b87163e3e73dd94356bff1f317bd -F test/collate5.test b1dfeff239ea69ee9225832553f423d37a6184eb730cee06f6846ab4e3c6dbef +F test/collate5.test 42daaf7799b04221206a219fb3c0f9efeede03e760f9562b8c0114b8df183fe3 F test/collate6.test 8be65a182abaac8011a622131486dafb8076e907 F test/collate7.test 8ec29d98f3ee4ccebce6e16ce3863fb6b8c7b868 F test/collate8.test cd9b3d3f999b8520ffaa7cc1647061fc5bab1334 @@ -1058,7 +1058,7 @@ F test/descidx2.test a0ba347037ff3b811f4c6ceca5fd0f9d5d72e74e59f2d9de346a9d2f6ad F test/descidx3.test 953c831df7ea219c73826dfbf2f6ee02d95040725aa88ccb4fa43d1a1999b926 F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e F test/distinct.test 691c9e850b0d0b56b66e7e235453198cb4cf0760e324b7403d3c5abbeab0a014 -F test/distinct2.test 4d6316b6487a0aa5a90bee111575c957e2a5ba5a9be9156febe9533ce78876e8 +F test/distinct2.test a6af6a90b2c1eea64c3cc87ea7f8feb832053f7276fe3c212abacf646de4762a F test/distinctagg.test 40d7169ae5846caaf62c6e307d2ca3c333daf9b6f7cde888956a339a97afe85f F test/e_blobbytes.test 4c01dfe4f12087b92b20705a3fdfded45dc4ed16d5a211fed4e1d2786ba68a52 F test/e_blobclose.test 692fc02a058476c2222a63d97e3f3b2b809c1842e5525ded7f854d540ac2e075 @@ -1090,7 +1090,7 @@ F test/enc.test b5503a87b31cea8a5084c6e447383f9ca08933bd2f29d97b6b6201081b2343eb F test/enc2.test 872afe58db772e7dfa1ad8e0759f8cc820e9efc8172d460fae83023101c2e435 F test/enc3.test 55ef64416d72975c66167310a51dc9fc544ba3ae4858b8d5ab22f4cb6500b087 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 -F test/eqp.test 746db9fe11629a0d00328e1721cc2a2e4726d574b677ab14de35fd914f54cc82 +F test/eqp.test 1d653fe8d2612cd6764e5ea2f16dcf5f13a9f50448b9233bb1573804bccd7579 F test/eqp2.test 6e8996148de88f0e7670491e92e712a2920a369b4406f21a27c3c9b6a46b68dd F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 F test/errofst1.test 6da78363739ba8991f498396ab331b5d64e7ab5c4172c12b5884683ef523ac53 @@ -1468,7 +1468,7 @@ F test/null.test b7ff206a1c60fe01aa2abd33ef9ea83c93727d993ca8a613de86e925c9f2bc6 F test/nulls1.test 7a5e4346ee4285034100b4cd20e6784f16a9d6c927e44ecdf10034086bbee9c9 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 -F test/offset1.test 72cca52482cbd5bc687cfa67aa2566c859081b5a353fd2f9da9bbd3914dea1ef +F test/offset1.test c21e67d2d5ae8ed310243fbe84fc2f0dca49e9ffed3ea89110c0d5914c0de620 F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394 F test/optfuzz-db01.c 9f2fa80b8f84ebbf1f2e8b13421a4e0477fe300f6686fbd76cac1d2db66e0fdc F test/optfuzz-db01.txt 21f6bdeadc701cf11528276e2a55c70bfcb846ba42df327f979bd9e7b6ce7041 @@ -1811,7 +1811,7 @@ F test/tkt2213.test a9702175601a57b61aba095a233b001d6f362474 F test/tkt2251.test 5aab8c7898cd2df2a68fe19289cc29e8f5cf8c82 F test/tkt2285.test cca17be61cf600b397188e77e7143844d2b977e9 F test/tkt2332.test fc955609b958ca86dfa102832243370a0cc84070 -F test/tkt2339.test 73bd17818924cd2ac442e5fd9916b58565739450 +F test/tkt2339.test bad48bd064594aa7b4de23f6d59a72b0b0c4175fd917f4b66907584732d41652 F test/tkt2391.test ab7a11be7402da8b51a5be603425367aa0684567 F test/tkt2409.test be0d60e7d283f639dccea4b0b5e1cd3a4851fb5b F test/tkt2450.test 77ed94863f2049c1420288ddfea2d41e5e0971d6 @@ -2193,11 +2193,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P c1e55132410a80d37bad30e4ddecc7a98fad92a68b436880324998af1cee37ae -R 14b52d7d0f8047724839557171235a7f -T *branch * union-by-merge -T *sym-union-by-merge * -T -sym-trunk * +P e534af8a78f5458bd656f70eb9f68084c0ed3f97360f5a033fba3564849e970c +R 1d72d9705c75984ccfe6b20a584dbf44 U drh -Z f2ba17780829856e94c58b16fe623059 +Z 5c48ba141145c0386883674b17f13be2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 47de419196..63e12e7d4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e534af8a78f5458bd656f70eb9f68084c0ed3f97360f5a033fba3564849e970c +305ae331f5e791941c12b04b727656ac8d80f7c5cb6343277b979a456eb3b834 diff --git a/src/select.c b/src/select.c index 355ba957cf..abd0fee8a5 100644 --- a/src/select.c +++ b/src/select.c @@ -2779,6 +2779,7 @@ static void generateWithRecursiveQuery( /* Store the results of the setup-query in Queue. */ pSetup = pFirstRec->pPrior; pSetup->pNext = 0; + pSetup->selFlags |= SF_NoMerge; ExplainQueryPlan((pParse, 1, "SETUP")); rc = sqlite3Select(pParse, pSetup, &destQueue); pSetup->pNext = p; @@ -2983,7 +2984,7 @@ static int multiSelect( */ if( p->pOrderBy ){ return multiSelectOrderBy(pParse, p, pDest); - }else if( p->op!=TK_ALL && (p->selFlags & SF_NoopOrderBy)==0 ){ + }else if( p->op!=TK_ALL && (p->selFlags & SF_NoMerge)==0 ){ Expr *pOne = sqlite3ExprInt32(db, 1); p->pOrderBy = sqlite3ExprListAppend(pParse, 0, pOne); if( pParse->nErr ) goto multi_select_end; @@ -2998,7 +2999,7 @@ static int multiSelect( ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY")); } #endif - pPrior->selFlags |= SF_NoopOrderBy; + pPrior->selFlags |= SF_NoMerge; /* Generate code for the left and right SELECT statements. */ @@ -7759,7 +7760,7 @@ int sqlite3Select( p->pOrderBy = 0; } p->selFlags &= ~(u32)SF_Distinct; - p->selFlags |= SF_NoopOrderBy; + p->selFlags |= SF_NoopOrderBy|SF_NoMerge; } sqlite3SelectPrep(pParse, p, 0); if( pParse->nErr ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 185b36fd4c..924925ff66 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3647,7 +3647,7 @@ struct Select { #define SF_MinMaxAgg 0x0001000 /* Aggregate containing min() or max() */ #define SF_Recursive 0x0002000 /* The recursive part of a recursive CTE */ #define SF_FixedLimit 0x0004000 /* nSelectRow set by a constant LIMIT */ -#define SF_MaybeConvert 0x0008000 /* Need convertCompoundSelectToSubquery() */ +#define SF_NoMerge 0x0008000 /* Don't use merge to compute compounds */ #define SF_Converted 0x0010000 /* By convertCompoundSelectToSubquery() */ #define SF_IncludeHidden 0x0020000 /* Include hidden columns in output */ #define SF_ComplexResult 0x0040000 /* Result contains subquery or function */ diff --git a/test/collate5.test b/test/collate5.test index 71d4efe255..b474c39d53 100644 --- a/test/collate5.test +++ b/test/collate5.test @@ -122,9 +122,9 @@ do_test collate5-2.0 { } {} do_test collate5-2.1.1 { - execsql { + string toupper [execsql { SELECT a FROM collate5t1 UNION select a FROM collate5t2; - } + }] } {A B N} do_test collate5-2.1.2 { execsql { @@ -132,10 +132,10 @@ do_test collate5-2.1.2 { } } {A B N a b n} do_test collate5-2.1.3 { - execsql { + string tolower [execsql { SELECT a, b FROM collate5t1 UNION select a, b FROM collate5t2; - } -} {A Apple A apple B Banana b banana N {}} + }] +} {a apple a apple b banana b banana n {}} do_test collate5-2.1.4 { execsql { SELECT a, b FROM collate5t2 UNION select a, b FROM collate5t1; @@ -143,9 +143,9 @@ do_test collate5-2.1.4 { } {A Apple B banana N {} a apple b banana n {}} do_test collate5-2.2.1 { - execsql { + string toupper [execsql { SELECT a FROM collate5t1 EXCEPT select a FROM collate5t2; - } + }] } {N} do_test collate5-2.2.2 { execsql { @@ -153,10 +153,10 @@ do_test collate5-2.2.2 { } } {A a} do_test collate5-2.2.3 { - execsql { + string tolower [execsql { SELECT a, b FROM collate5t1 EXCEPT select a, b FROM collate5t2; - } -} {A Apple N {}} + }] +} {a apple n {}} do_test collate5-2.2.4 { execsql { SELECT a, b FROM collate5t2 EXCEPT select a, b FROM collate5t1 @@ -165,9 +165,9 @@ do_test collate5-2.2.4 { } {A apple a apple} do_test collate5-2.3.1 { - execsql { + string toupper [execsql { SELECT a FROM collate5t1 INTERSECT select a FROM collate5t2; - } + }] } {A B} do_test collate5-2.3.2 { execsql { @@ -175,10 +175,10 @@ do_test collate5-2.3.2 { } } {B b} do_test collate5-2.3.3 { - execsql { + string tolower [execsql { SELECT a, b FROM collate5t1 INTERSECT select a, b FROM collate5t2; - } -} {a apple B banana} + }] +} {a apple b banana} do_test collate5-2.3.4 { execsql { SELECT a, b FROM collate5t2 INTERSECT select a, b FROM collate5t1; diff --git a/test/distinct2.test b/test/distinct2.test index 980b0b1e3a..5de4d30940 100644 --- a/test/distinct2.test +++ b/test/distinct2.test @@ -311,7 +311,7 @@ do_execsql_test 4010 { } do_execsql_test 4020 { SELECT b FROM t1 UNION SELECT 1; -} {1 { }} +} {1 {}} #------------------------------------------------------------------------- # diff --git a/test/eqp.test b/test/eqp.test index 147b5ceafe..d2bdc49e3b 100644 --- a/test/eqp.test +++ b/test/eqp.test @@ -124,10 +124,10 @@ do_eqp_test 1.8 { } { QUERY PLAN |--CO-ROUTINE (subquery-xxxxxx) - | `--COMPOUND QUERY - | |--LEFT-MOST SUBQUERY + | `--MERGE (UNION) + | |--LEFT | | `--SCAN CONSTANT ROW - | `--UNION USING TEMP B-TREE + | `--RIGHT | `--SCAN CONSTANT ROW |--SCAN (subquery-xxxxxx) `--SCAN t3 @@ -137,24 +137,26 @@ do_eqp_test 1.9 { } { QUERY PLAN |--CO-ROUTINE abc - | `--COMPOUND QUERY - | |--LEFT-MOST SUBQUERY + | `--MERGE (EXCEPT) + | |--LEFT | | `--SCAN CONSTANT ROW - | `--EXCEPT USING TEMP B-TREE - | `--SCAN t3 - |--SCAN abc - `--SCAN t3 + | `--RIGHT + | |--SCAN t3 + | `--USE TEMP B-TREE FOR ORDER BY + |--SCAN t3 + `--SCAN abc } do_eqp_test 1.10 { SELECT * FROM t3 JOIN (SELECT 1 INTERSECT SELECT a FROM t3 LIMIT 17) AS abc } { QUERY PLAN |--CO-ROUTINE abc - | `--COMPOUND QUERY - | |--LEFT-MOST SUBQUERY + | `--MERGE (INTERSECT) + | |--LEFT | | `--SCAN CONSTANT ROW - | `--INTERSECT USING TEMP B-TREE - | `--SCAN t3 + | `--RIGHT + | |--SCAN t3 + | `--USE TEMP B-TREE FOR ORDER BY |--SCAN abc `--SCAN t3 } @@ -455,10 +457,11 @@ do_eqp_test 4.3.1 { SELECT x FROM t1 UNION SELECT x FROM t2 } { QUERY PLAN - `--COMPOUND QUERY - |--LEFT-MOST SUBQUERY - | `--SCAN t1 - `--UNION USING TEMP B-TREE + `--MERGE (UNION) + |--LEFT + | |--SCAN t1 + | `--USE TEMP B-TREE FOR ORDER BY + `--RIGHT `--SCAN t2 USING COVERING INDEX t2i1 } @@ -466,13 +469,17 @@ do_eqp_test 4.3.2 { SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 } { QUERY PLAN - `--COMPOUND QUERY - |--LEFT-MOST SUBQUERY - | `--SCAN t1 - |--UNION USING TEMP B-TREE - | `--SCAN t2 USING COVERING INDEX t2i1 - `--UNION USING TEMP B-TREE - `--SCAN t1 + `--MERGE (UNION) + |--LEFT + | `--MERGE (UNION) + | |--LEFT + | | |--SCAN t1 + | | `--USE TEMP B-TREE FOR ORDER BY + | `--RIGHT + | `--SCAN t2 USING COVERING INDEX t2i1 + `--RIGHT + |--SCAN t1 + `--USE TEMP B-TREE FOR ORDER BY } do_eqp_test 4.3.3 { SELECT x FROM t1 UNION SELECT x FROM t2 UNION SELECT x FROM t1 ORDER BY 1 diff --git a/test/offset1.test b/test/offset1.test index 5b04bd836c..fb68f0d029 100644 --- a/test/offset1.test +++ b/test/offset1.test @@ -190,6 +190,20 @@ do_execsql_test offset1-2.0 { ORDER BY salary asc); } {} do_execsql_test offset1-2.1 { + SELECT * FROM v ORDER BY +id; +} { + 11 Diane London hr 70 + 12 Bob London hr 78 + 21 Emma London it 84 + 22 Grace Berlin it 90 + 23 Henry London it 104 + 24 Irene Berlin it 104 + 25 Frank Berlin it 120 + 31 Cindy Berlin sales 96 + 32 Dave London sales 96 + 33 Alice Berlin sales 100 +} +do_execsql_test offset1-2.2 { SELECT * FROM v LIMIT 5 OFFSET 2; } { 22 Grace Berlin it 90 @@ -198,5 +212,19 @@ do_execsql_test offset1-2.1 { 11 Diane London hr 70 33 Alice Berlin sales 100 } +do_execsql_test offset1-2.3 { + SELECT * FROM v LIMIT 3 OFFSET 6; +} { + 33 Alice Berlin sales 100 + 23 Henry London it 104 + 24 Irene Berlin it 104 +} +do_execsql_test offset1-2.4 { + SELECT * FROM v LIMIT 3 OFFSET 1; +} { + 32 Dave London sales 96 + 22 Grace Berlin it 90 + 21 Emma London it 84 +} finish_test diff --git a/test/tkt2339.test b/test/tkt2339.test index 41acd377ce..4bbedb8288 100644 --- a/test/tkt2339.test +++ b/test/tkt2339.test @@ -47,12 +47,12 @@ do_test tkt2339.2 { } } {4 3 14 13} do_test tkt2339.3 { - execsql { + lsort -integer [execsql { SELECT * FROM (SELECT * FROM t1 ORDER BY num DESC) UNION ALL SELECT * FROM (SELECT * FROM t2 ORDER BY num DESC LIMIT 2) - } -} {4 3 2 1 14 13} + }] +} {1 2 3 4 13 14} do_test tkt2339.4 { execsql { SELECT * FROM (SELECT * FROM t1 ORDER BY num DESC LIMIT 2) -- 2.47.3