]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Always use the sort-and-merge algorithm for EXCEPT, INTERSECT, and UNION,
authordrh <>
Sun, 25 Jan 2026 23:28:42 +0000 (23:28 +0000)
committerdrh <>
Sun, 25 Jan 2026 23:28:42 +0000 (23:28 +0000)
even if there is no ORDER BY clause.

FossilOrigin-Name: 132ba781b031972c6ac564ff0d1d6b2dfaeee77fe503ad6e9e8647bb5ba28bd3

1  2 
manifest
manifest.uuid
src/select.c

diff --cc manifest
index 599e54a01b0ea506b14fb576fb006823def3d192,eed39d646a922f3c6ac6866d549e375722bd8282..8ee020e20e73303c7f7feec56d11f9654e866a58
+++ b/manifest
@@@ -1,5 -1,5 +1,5 @@@
- C Fix\sthe\sjsonb_group_array()\sand\sjsonb_group_object()\sfunctions\sso\sthat\sthey\sreturn\nJSONB\sas\sthey\sshould,\sand\snot\stext\sJSON,\swhen\sthe\sarray\sor\sobject\sis\sempty.\n[forum:/forumpost/2026-01-25T00:47:06z|Forum\spost\s2026-01-25T00:47:06z].
- D 2026-01-25T15:18:31.737
 -C The\sSelect.addrOpenEphm\sfield\sis\sno\slonger\sneeded.\s\sRemove\sit\sand\nsimplify\srelated\scode.
 -D 2026-01-25T20:15:00.758
++C Always\suse\sthe\ssort-and-merge\salgorithm\sfor\sEXCEPT,\sINTERSECT,\sand\sUNION,\neven\sif\sthere\sis\sno\sORDER\sBY\sclause.
++D 2026-01-25T23:28:42.931
  F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@@ -738,12 -738,12 +738,12 @@@ F src/printf.c b1b29b5e58e1530d5daeee59
  F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
  F src/resolve.c 47aa7fdc9ec4c19b103ac5e79d7887d30119b5675309facf5eed1118391c868b
  F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
- F src/select.c f6ab7ed61778798626c2655d67f43506545d75becb1736c1f0dbc6a2830bf644
 -F src/select.c 0b01aa2c1a53d46fd4bda0498e98fac7c8b998d549827d441bdb7c3e1bd214b7
++F src/select.c 003b15bdb8b7126e8710af32c592d922157f89f29c6c2080552fe92de4dd3118
  F src/shell.c.in e8818572acd50464bc00426fe0d755e98239f73d531437c3dc7721d1fecb1231
 -F src/sqlite.h.in d463dcdd67d4865991cd62dc8d3f678086b38365593861f77c09c3401551d59f
 +F src/sqlite.h.in 69eccc01b4c0ff8e8c830e1961971290f1b94d46dc59cfd40f82d26cb9331eb0
  F src/sqlite3.rc 015537e6ac1eec6c7050e17b616c2ffe6f70fca241835a84a4f0d5937383c479
  F src/sqlite3ext.h f590cd8cb4c36fc727632c9b5fbbafc85f7efe2c6890f9958d7e711dc26ec01e
- F src/sqliteInt.h af67bc95fa6b66cd3c7f3d18d2d040ad386e4cbb02965ee318cc721ee9d5fa45
+ F src/sqliteInt.h f4b50f8c287b858bb23dd51daee29ff424697be9a0753cf37df98fbe1806125b
  F src/sqliteLimit.h 904a3f520362c7065c18165aaabd504fb13cc1b76cb411f38bd41ac219e4af1e
  F src/status.c 7565d63a79aa2f326339a24a0461a60096d0bd2bce711fefb50b5c89335f3592
  F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@@ -805,10 -805,10 +805,10 @@@ F src/upsert.c 215328c3f91623c520ec8672
  F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
  F src/util.c 36fb1150062957280777655976f3f9a75db236cb8207a0770ceae8d5ec17fcd3
  F src/vacuum.c d3d35d8ae893d419ade5fa196d761a83bddcbb62137a1a157ae751ef38b26e82
- F src/vdbe.c b44c366e83412d3b8c190feb1f029b7d02e1bd69252a57b32f195107f0d03964
+ F src/vdbe.c fa28a8f740f3d94c4e6b6d42ba90c220472683486268e753017512a70ef715f5
  F src/vdbe.h 966d0677a540b7ea6549b7c4e1312fc0d830fce3a235a58c801f2cc31cf5ecf9
  F src/vdbeInt.h c45d0195dad0a9099132109e3b63697f4f119baddeb391c36ca226cee530a485
 -F src/vdbeapi.c cf69a8a230a271f0935f2e819828667e80f186a4cfa0e0002517ad017b3bd249
 +F src/vdbeapi.c 6cdcbe5c7afa754c998e73d2d5d2805556268362914b952811bdfb9c78a37cf1
  F src/vdbeaux.c 396d38a62a357b807eabae0cae441fc89d2767a57ab08026b7072bf7aa2dd00c
  F src/vdbeblob.c b3f0640db9642fbdc88bd6ebcc83d6009514cafc98f062f675f2c8d505d82692
  F src/vdbemem.c aeaef3bb000fd2599e9b0741a45fe9e306606ae9b06b3eb573d54847cec9847d
@@@ -2193,8 -2193,8 +2193,9 @@@ F tool/warnings-clang.sh bbf6a1e685e534
  F tool/warnings.sh d924598cf2f55a4ecbc2aeb055c10bd5f48114793e7ba25f9585435da29e7e98
  F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
  F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
- P 29d9132a768e0460e22e41abb8b6188181ba0fc6c4665161d3d0af28d7583e19
- R a2190275d4fd82c25baf2a871b5c8b0b
 -P 5b4c0a5e8609e16a4b08b7f95d55e513ee4300b22d044ac8f42e60b96cff5be6
 -R 4436094fd125f3cfae4fcd4df218545b
++P 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41 1fe5a1ca72892987716b71b9419265f25c8c426e52320acf56724fd64b838be6
++R 24b1fff6258b99aab1ec1e8d96bb13c7
++T +closed 1fe5a1ca72892987716b71b9419265f25c8c426e52320acf56724fd64b838be6
  U drh
- Z 097b5abf8d6625e3aeef0e93567c3ee6
 -Z 6d1da1c40ab70849b9cdb5b6a86c63ef
++Z 4395589489e05fdfc92eea4ff45b5f14
  # Remove this line to create a well-formed Fossil manifest.
diff --cc manifest.uuid
index 7aa29858062298e0ac2bd95c3976ec48bd61a641,480c476a7645a76cfc28fa12d794ce23c4ebd7f5..49a19597d7063f3e8f9a551430acb218e4bf3c61
@@@ -1,1 -1,1 +1,1 @@@
- 8b53b97833afe27c0c3782c5fbc0437976215b571579f73a94c33e28d3fedb41
 -1fe5a1ca72892987716b71b9419265f25c8c426e52320acf56724fd64b838be6
++132ba781b031972c6ac564ff0d1d6b2dfaeee77fe503ad6e9e8647bb5ba28bd3
diff --cc src/select.c
index 7ae793ed7d5b0a927d831029f6e24b4ec0a0e4d6,6a055064d74c3806b8af9f95e270ec0ad21681f8..97d8fbcb5a2ab2aee0d8fc5a9075183257803a43
@@@ -2753,8 -2728,28 +2728,27 @@@ static void generateWithRecursiveQuery
    }
    VdbeComment((v, "Queue table"));
    if( iDistinct ){
-     p->addrOpenEphm[0] = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iDistinct, 0);
-     p->selFlags |= SF_UsesEphemeral;
+     /* Generate an ephemeral table used to enforce distinctness on the
+     ** output of the recursive part of the CTE.
+     */
+     KeyInfo *pKeyInfo;            /* Collating sequence for the result set */
+     CollSeq **apColl;             /* For looping through pKeyInfo->aColl[] */
+     assert( p->pNext==0 );
+     assert( p->pEList!=0 );
+     nCol = p->pEList->nExpr;
+     pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nCol, 1);
+     if( !pKeyInfo ){
 -      rc = SQLITE_NOMEM_BKPT;
+       goto end_of_recursive_query;
+     }
+     for(i=0, apColl=pKeyInfo->aColl; i<nCol; i++, apColl++){
+       *apColl = multiSelectCollSeq(pParse, p, i);
+       if( 0==*apColl ){
+         *apColl = pParse->db->pDfltColl;
+       }
+     }
+     sqlite3VdbeAddOp4(v, OP_OpenEphemeral, iDistinct, nCol, 0,
+                          (void*)pKeyInfo, P4_KEYINFO);
    }
  
    /* Detach the ORDER BY clause from the compound SELECT */