From: drh <> Date: Mon, 19 Jan 2026 19:51:03 +0000 (+0000) Subject: Be more aggressive about using a sort-and-merge to compute the UNION of X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0af76f6caa825fd18d414641454ac5906b26d1e7;p=thirdparty%2Fsqlite.git Be more aggressive about using a sort-and-merge to compute the UNION of two SELECT statements. Experimental branch. This check-in is failing some tests. FossilOrigin-Name: e534af8a78f5458bd656f70eb9f68084c0ed3f97360f5a033fba3564849e970c --- diff --git a/manifest b/manifest index 4b8a365f59..2abbce762e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stwo\snew\sJSON\sfunctions:\sjson_array_insert()\sand\sjsonb_array_insert().\nPatterned\safter\sthe\sjson_array_insert()\sfunction\sof\sMySQL.\n[forum:/forumpost/2026-01-17T10:40:39z|Forum\sthread\s2026-01-17T10:40:39z]. -D 2026-01-19T11:44:59.928 +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 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -738,7 +738,7 @@ F src/printf.c b1b29b5e58e1530d5daeee5963d3c318d8ab2d7e38437580e28755753e0c1ded F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 47aa7fdc9ec4c19b103ac5e79d7887d30119b5675309facf5eed1118391c868b F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 4d45a04431db072040d6625ee21c1dc483c9b2b64a5ab419f4a4e05aabed1204 +F src/select.c c2c07615ec16f7040228ba80115c00c7c8639b1ac9a0a99e28f97af5ebe4300b F src/shell.c.in 3bc4c6aa962bdf950dc144c2138eb4bc734bf7e305f2ac42dbda5a83c4a4c660 F src/sqlite.h.in 476f3efeb5dd26ad94dcbce262ca7eb9d042d797a92d624059c67ef37d5b3ab4 F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479 @@ -2193,9 +2193,11 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P f8f89d2e10f06b54acf58a3b0543aef749c3d2b65670d4cc71530dea7997651e 96b7d2c60a3f8a9f9d69313bad599a3a5ad335cb382263e4254e2d20929d5e55 -R 767eeb44449b6ebf81d3929fe2071be1 -T +closed 96b7d2c60a3f8a9f9d69313bad599a3a5ad335cb382263e4254e2d20929d5e55 +P c1e55132410a80d37bad30e4ddecc7a98fad92a68b436880324998af1cee37ae +R 14b52d7d0f8047724839557171235a7f +T *branch * union-by-merge +T *sym-union-by-merge * +T -sym-trunk * U drh -Z 7f5ed360d76676550283f8041ff9aae7 +Z f2ba17780829856e94c58b16fe623059 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.tags b/manifest.tags index bec971799f..d0a5d234e7 100644 --- a/manifest.tags +++ b/manifest.tags @@ -1,2 +1,2 @@ -branch trunk -tag trunk +branch union-by-merge +tag union-by-merge diff --git a/manifest.uuid b/manifest.uuid index 8c51781a4e..47de419196 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1e55132410a80d37bad30e4ddecc7a98fad92a68b436880324998af1cee37ae +e534af8a78f5458bd656f70eb9f68084c0ed3f97360f5a033fba3564849e970c diff --git a/src/select.c b/src/select.c index 8fff983901..355ba957cf 100644 --- a/src/select.c +++ b/src/select.c @@ -2983,6 +2983,13 @@ static int multiSelect( */ if( p->pOrderBy ){ return multiSelectOrderBy(pParse, p, pDest); + }else if( p->op!=TK_ALL && (p->selFlags & SF_NoopOrderBy)==0 ){ + Expr *pOne = sqlite3ExprInt32(db, 1); + p->pOrderBy = sqlite3ExprListAppend(pParse, 0, pOne); + if( pParse->nErr ) goto multi_select_end; + assert( p->pOrderBy!=0 ); + p->pOrderBy->a[0].u.x.iOrderByCol = 1; + return multiSelectOrderBy(pParse, p, pDest); }else{ #ifndef SQLITE_OMIT_EXPLAIN @@ -2991,6 +2998,7 @@ static int multiSelect( ExplainQueryPlan((pParse, 1, "LEFT-MOST SUBQUERY")); } #endif + pPrior->selFlags |= SF_NoopOrderBy; /* Generate code for the left and right SELECT statements. */