-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
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
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
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
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
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
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
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.
-e534af8a78f5458bd656f70eb9f68084c0ed3f97360f5a033fba3564849e970c
+305ae331f5e791941c12b04b727656ac8d80f7c5cb6343277b979a456eb3b834
/* 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;
*/
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;
ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY"));
}
#endif
- pPrior->selFlags |= SF_NoopOrderBy;
+ pPrior->selFlags |= SF_NoMerge;
/* Generate code for the left and right SELECT statements.
*/
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 ){
#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 */
} {}
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 {
}
} {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;
} {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 {
}
} {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
} {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 {
}
} {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;
}
do_execsql_test 4020 {
SELECT b FROM t1 UNION SELECT 1;
-} {1 { }}
+} {1 {}}
#-------------------------------------------------------------------------
#
} {
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
} {
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
}
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
}
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
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
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
}
} {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)