From: drh <> Date: Thu, 16 Feb 2023 19:04:40 +0000 (+0000) Subject: Back-port omit-unused-subquery-column enhancements into the 3.28 branch. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a524a7163929c9e66f9b4d2d1d72b167f233047c;p=thirdparty%2Fsqlite.git Back-port omit-unused-subquery-column enhancements into the 3.28 branch. FossilOrigin-Name: 57a4e91f4343b612c346a4d284c0354deee364f83951e64b009e79cd20aedb47 --- diff --git a/manifest b/manifest index 2badceaa7a..747cca412e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\scompute\sresult\scolumns\sof\ssubqueries\sthat\sare\snever\sused.\sMake\sthose\scolumns\sNULL\sinstead.\sThis\soptimization\spotentially\sresolves\sthe\senhancement\srequest\sdescribed\sby\s[baa5bb76c35a124c|ticket\sbaa5bb76c35a124c]. -D 2023-02-16T14:29:04.334 +C Back-port\somit-unused-subquery-column\senhancements\sinto\sthe\s3.28\sbranch. +D 2023-02-16T19:04:40.830 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -518,12 +518,12 @@ F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 567888ee3faec14dae06519b4306201771058364a37560186a3e0e755ebc4cb8 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 0af39e0071e014b7fa2193e7cb819e9480922f0f89e92881f2dd6843a18efff0 +F src/select.c 7549148775c8b881bb91aeecbc483c45708fefb1c565fc72805472246e2208ac F src/shell.c.in c1986496062f9dba4ed5b70db06b5e0f32e1954cdcfab0b30372c6c186796810 F src/sqlite.h.in 59f5e145b8d7a915ca29c6bf4a1f00e3112c1605c9ac5c627c45060110332ba2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h c3ee9809b0a1349608a9abd61b3ecf4f6258554f3b777a18457c99aab84eef6f +F src/sqliteInt.h 6b3d76b7d9a3e92c153f335fda01118b6775e334b3be8855325fba25d3e2c710 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1278,7 +1278,7 @@ F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95 F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25 -F test/selectC.test 2bbed4310ec03acfa7487c2536beeeb706b0a8d05e85a711290c95fa9eaf3063 +F test/selectC.test ef9eddcd89277fdfa8d97b35324110fcc8d9fa94337fe0c26b3321301b2d1c7c F test/selectD.test fc20452847a01775710090383cfb4423275d2f745fed61f34fbf37573ac0d214 F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3 @@ -1820,8 +1820,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3d1992de4733d4e155f2d6d5268323410d1104ab56db50f08a2bb26bf87d926b 77b220a7240425fa83e142ceef78505208e6e38d797070e146b9f7d255f753c7 -R b3790c5c75be15bad2ca8d7c8cee6787 +P 0163b697dd560b6ad78ae20b3ae495a051680b0faf1633827119db381869351f +Q +6b1a1f374d1372f11f5420d99645b218867100bf070bd3a8885bf5f00c189dff +Q +cc148503db8ef180bce984328da7e84959afadd6a9613c2d03bc1eafeb95dfad +R 6e43319432868c44861b20a58646f9d1 U drh -Z ce0e41ce709151b90d95961cc059402d +Z 8fcbd94b7296fd11258479522881477c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a008c7610a..f16f350651 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0163b697dd560b6ad78ae20b3ae495a051680b0faf1633827119db381869351f \ No newline at end of file +57a4e91f4343b612c346a4d284c0354deee364f83951e64b009e79cd20aedb47 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 8ea78d3d20..f4e3086430 100644 --- a/src/select.c +++ b/src/select.c @@ -4389,14 +4389,25 @@ static int disableUnusedSubqueryResultColumns(struct SrcList_item *pItem){ Table *pTab; /* The table that describes the subquery */ int j; /* Column number */ int nChng = 0; /* Number of columns converted to NULL */ + Bitmask colUsed; /* Columns that may not be NULLed out */ assert( pItem!=0 ); + if( pItem->fg.isCorrelated || pItem->fg.isCte ){ + return 0; + } assert( pItem->pTab!=0 ); pTab = pItem->pTab; - if( pTab->tabFlags & TF_Ephemeral ) return 0; assert( pItem->pSelect!=0 ); + if( pTab->tabFlags & TF_Ephemeral ){ + return 0; + } pSub = pItem->pSelect; assert( pSub->pEList->nExpr==pTab->nCol ); + if( (pSub->selFlags & (SF_Distinct|SF_Aggregate))!=0 ){ + testcase( pSub->selFlags & SF_Distinct ); + testcase( pSub->selFlags & SF_Aggregate ); + return 0; + } for(pX=pSub; pX; pX=pX->pPrior){ if( pX->pPrior && pX->op!=TK_ALL ){ /* This optimization does not work for compound subqueries that @@ -4409,11 +4420,22 @@ static int disableUnusedSubqueryResultColumns(struct SrcList_item *pItem){ return 0; } } + colUsed = pItem->colUsed; + if( pSub->pOrderBy ){ + ExprList *pList = pSub->pOrderBy; + for(j=0; jnExpr; j++){ + u16 iCol = pList->a[j].u.x.iOrderByCol; + if( iCol>0 ){ + iCol--; + colUsed |= ((Bitmask)1)<<(iCol>=BMS ? BMS-1 : iCol); + } + } + } nCol = pTab->nCol; for(j=0; jcolUsed)!=0 ) continue; + if( (m & colUsed)!=0 ) continue; for(pX=pSub; pX; pX=pX->pPrior) { Expr *pY = pX->pEList->a[j].pExpr; if( pY->op==TK_NULL ) continue; @@ -4719,6 +4741,7 @@ static int withExpand( pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0); if( db->mallocFailed ) return SQLITE_NOMEM_BKPT; assert( pFrom->pSelect ); + pFrom->fg.isCte = 1; /* Check if this is a recursive CTE. */ pSel = pFrom->pSelect; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 325785a03a..8d57c7ae06 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2677,6 +2677,7 @@ struct SrcList { unsigned isCorrelated :1; /* True if sub-query is correlated */ unsigned viaCoroutine :1; /* Implemented as a co-routine */ unsigned isRecursive :1; /* True for recursive reference in WITH */ + unsigned isCte :1; /* This is a CTE */ } fg; int iCursor; /* The VDBE cursor number used to access this table */ Expr *pOn; /* The ON clause of a join */ diff --git a/test/selectC.test b/test/selectC.test index 667b8f3f21..de3bb6498c 100644 --- a/test/selectC.test +++ b/test/selectC.test @@ -230,6 +230,11 @@ do_execsql_test selectC-4.2 { select a from (select distinct a, b from t_distinct_bug) } {1 1 1} +do_execsql_test selectC-4.2b { + CREATE VIEW v42b AS SELECT DISTINCT a, b FROM t_distinct_bug; + SELECT a FROM v42b; +} {1 1 1} + do_execsql_test selectC-4.3 { select a, udf() from (select distinct a, b from t_distinct_bug) } {1 1 1 2 1 3}