From 896366282dae3789fb277c2dad8660784a0895a3 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 7 Jun 2020 17:33:18 +0000 Subject: [PATCH] Alternative fix to ticket [c8d3b9f0a750a529]: Prior to deleting or modifying an Expr not that is referenced by an AggInfo, modify the AggInfo to get its own copy of the original Expr. FossilOrigin-Name: 7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 --- manifest | 27 +++++---- manifest.uuid | 2 +- src/build.c | 13 ++++- src/expr.c | 62 ++++++++++++++++++++- src/select.c | 37 ++++++++++++- src/sqliteInt.h | 15 ++++- src/window.c | 5 +- test/fuzzdata8.db | Bin 1492992 -> 1495040 bytes test/window1.test | 136 ++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 275 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index ca4608031d..5c9f7982ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sdebugging\streeview\soutput,\schange\sthe\sname\sof\s"SELECT-expr"\sexpression\nnodes\sto\sbe\s"subquery-expr",\sso\sas\sto\snot\sconfuse\sthem\swith\sactual\sSELECT\nnodes. -D 2020-06-05T04:01:50.831 +C Alternative\sfix\sto\sticket\s[c8d3b9f0a750a529]:\s\sPrior\sto\sdeleting\sor\smodifying\nan\sExpr\snot\sthat\sis\sreferenced\sby\san\sAggInfo,\smodify\sthe\sAggInfo\sto\sget\sits\nown\scopy\sof\sthe\soriginal\sExpr. +D 2020-06-07T17:33:18.737 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 -F src/build.c 1c3dec6d36ddc697dbc1df04100687cdbbed65aacfda067d1e9632e4102e9999 +F src/build.c 02cff9bb5b3eaf437cbad3f0e1b6c9612e4d4f355c9a766b8ebf121d95cee6d2 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 4750c6b63419eefb24c8a6158b9287dea2a9714b4e6e297e25805505c9f73b6c +F src/expr.c 23434d32b9bf92638a61ea6a95845e163f388d6cfd4931b7774f8ad7561b7cfd F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -533,12 +533,12 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 +F src/select.c 6eb5d0c524ed986107bbcb5b5c5d177c705155bc5284b3006bbec9af66361f47 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h f5e422635c089adf60260e1947ecfaf68dd333bda20c2afdd60323357d8540a0 +F src/sqliteInt.h dda913aa727b7c01cae68259cafe6d26b5d8704c114d128585c1610d324d4d41 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -624,7 +624,7 @@ F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 -F src/window.c 66c5fd1e48af7581cf90b97700268294f4da4037f120f367715f912e1148d3f9 +F src/window.c 7d19c08b62b70d5dc2ef4c098cc5ba611fac246a111fa36ebb39505415124b90 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1029,7 +1029,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 209623791b0ad72ab39110c867af2080a79004e493c4da14ad661e790b5d1ed8 +F test/fuzzdata8.db 6acee588a3311994b57b226c9eac9e9e69f135cb8b000bd48fdb924e32041312 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1727,7 +1727,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 502a3e72fce895aaaa633bbe709f6de3c24eed3ecb8098ab9fb8b47584b4452c +F test/window1.test 30ec5cc344f5ad07bd50742a5dda580d3c6954d60879a440fecaee2ded27700a F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1866,7 +1866,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 2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e -R ee30fc3f51275fe44c86656d5c06c7d7 +P c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 +R 3e4eafa96401be2af64b22062bf801bb +T *branch * persist-agginfo +T *sym-persist-agginfo * +T -sym-trunk * U drh -Z bb7b42e3c07b2ab8975730fed03b093c +Z 6c6c52ade97d07f6efb7096e79fdc901 diff --git a/manifest.uuid b/manifest.uuid index 5c9bd2c32c..b331efaa0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 \ No newline at end of file +7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 877db05084..03081b9654 100644 --- a/src/build.c +++ b/src/build.c @@ -207,12 +207,21 @@ void sqlite3FinishCoding(Parse *pParse){ */ sqlite3AutoincrementBegin(pParse); - /* Code constant expressions that where factored out of inner loops */ + /* Code constant expressions that where factored out of inner loops. + ** + ** The pConstExpr list might also contain expressions that we simply + ** want to keep around until the Parse object is deleted. Such + ** expressions have iConstExprReg==0. Do not generate code for + ** those expressions, of course. + */ if( pParse->pConstExpr ){ ExprList *pEL = pParse->pConstExpr; pParse->okConstFactor = 0; for(i=0; inExpr; i++){ - sqlite3ExprCode(pParse, pEL->a[i].pExpr, pEL->a[i].u.iConstExprReg); + int iReg = pEL->a[i].u.iConstExprReg; + if( iReg>0 ){ + sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); + } } } diff --git a/src/expr.c b/src/expr.c index 496177a5c7..631d715685 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5709,6 +5709,66 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ return cnt.nThis>0 || cnt.nOther==0; } +/* +** This is a Walker expression node callback. +** +** For Expr nodes that contain pAggInfo pointers, make sure the AggInfo +** object that is referenced does not refer directly to the Expr. If +** it does, make a copy. This is done because the pExpr argument is +** subject to change. +** +** The copy is stored on pParse->pConstExpr with a register number of 0. +** This will cause the expression to be deleted automatically when the +** Parse object is destroyed, but the zero register number means that it +** will not generate any code in the preamble. +*/ +static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ + if( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) + && pExpr->pAggInfo!=0 + ){ + AggInfo *pAggInfo = pExpr->pAggInfo; + int iAgg = pExpr->iAgg; + Parse *pParse = pWalker->pParse; + sqlite3 *db = pParse->db; + assert( pAggInfo->iAggMagic==AggInfoMagic ); + assert( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN + || pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION ); + if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ + assert( iAgg>=0 && iAggnColumn ); + if( pAggInfo->aCol[iAgg].pExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aCol[iAgg].pExpr = pExpr; + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + } + } + }else{ + assert( iAgg>=0 && iAggnFunc ); + if( pAggInfo->aFunc[iAgg].pExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aFunc[iAgg].pExpr = pExpr; + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + } + } + } + } + return WRC_Continue; +} + +/* +** Initialize a Walker object so that will persist AggInfo entries referenced +** by the tree that is walked. +*/ +void sqlite3AggInfoPersistWalkerInit(Walker *pWalker, Parse *pParse){ + memset(pWalker, 0, sizeof(*pWalker)); + pWalker->pParse = pParse; + pWalker->xExprCallback = agginfoPersistExprCb; + pWalker->xSelectCallback = sqlite3SelectWalkNoop; +} + /* ** Add a new element to the pAggInfo->aCol[] array. Return the index of ** the new element. Return a negative number if malloc fails. @@ -5739,7 +5799,7 @@ static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ &i ); return i; -} +} /* ** This is the xExprCallback for a tree walker. It is used to diff --git a/src/select.c b/src/select.c index 7ff2b5d347..0e7a6ecd0f 100644 --- a/src/select.c +++ b/src/select.c @@ -3791,6 +3791,7 @@ static int flattenSubquery( Expr *pWhere; /* The WHERE clause */ struct SrcList_item *pSubitem; /* The subquery */ sqlite3 *db = pParse->db; + Walker w; /* Walker to persist agginfo data */ /* Check to see if flattening is permitted. Return 0 if not. */ @@ -4165,6 +4166,8 @@ static int flattenSubquery( /* Finially, delete what is left of the subquery and return ** success. */ + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w,pSub1); sqlite3SelectDelete(db, pSub1); #if SELECTTRACE_ENABLED @@ -5765,6 +5768,9 @@ int sqlite3Select( } if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; memset(&sAggInfo, 0, sizeof(sAggInfo)); +#ifdef SQLITE_DEBUG + sAggInfo.iAggMagic = AggInfoMagic; +#endif #if SELECTTRACE_ENABLED SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); if( sqlite3SelectTrace & 0x100 ){ @@ -5917,6 +5923,7 @@ int sqlite3Select( } #endif if( p->pNext==0 ) ExplainQueryPlanPop(pParse); + assert( sAggInfo.nFunc==0 && sAggInfo.nColumn==0 ); return rc; } #endif @@ -6789,8 +6796,34 @@ int sqlite3Select( */ select_end: sqlite3ExprListDelete(db, pMinMaxOrderBy); - sqlite3DbFree(db, sAggInfo.aCol); - sqlite3DbFree(db, sAggInfo.aFunc); + if( sAggInfo.aCol ){ +#ifdef SQLITE_DEBUG + for(i=0; idb->mallocFailed ); + if( pExpr==0 ) continue; + assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->iAgg==i ); + } +#endif + sqlite3DbFree(db, sAggInfo.aCol); + } + if( sAggInfo.aFunc ){ +#ifdef SQLITE_DEBUG + for(i=0; idb->mallocFailed ); + if( pExpr==0 ) continue; + assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->iAgg==i ); + } +#endif + sqlite3DbFree(db, sAggInfo.aFunc); + } +#ifdef SQLITE_DEBUG + sAggInfo.iAggMagic = 0; +#endif + #if SELECTTRACE_ENABLED SELECTTRACE(0x1,pParse,p,("end processing\n")); if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e37ed673af..52ff846966 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2506,11 +2506,11 @@ struct AggInfo { ExprList *pGroupBy; /* The group by clause */ struct AggInfo_col { /* For each column used in source tables */ Table *pTab; /* Source table */ + Expr *pExpr; /* The original expression */ int iTable; /* Cursor number of the source table */ - int iColumn; /* Column number within the source table */ - int iSorterColumn; /* Column number in the sorting index */ int iMem; /* Memory location that acts as accumulator */ - Expr *pExpr; /* The original expression */ + i16 iColumn; /* Column number within the source table */ + i16 iSorterColumn; /* Column number in the sorting index */ } *aCol; int nColumn; /* Number of used entries in aCol[] */ int nAccumulator; /* Number of columns that show through to the output. @@ -2523,8 +2523,16 @@ struct AggInfo { int iDistinct; /* Ephemeral table used to enforce DISTINCT */ } *aFunc; int nFunc; /* Number of entries in aFunc[] */ +#ifdef SQLITE_DEBUG + int iAggMagic; /* Magic number when valid */ +#endif }; +/* +** Value for AggInfo.iAggMagic when the structure is valid +*/ +#define AggInfoMagic 0x2059e99e + /* ** The datatype ynVar is a signed integer, either 16-bit or 32-bit. ** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater @@ -4287,6 +4295,7 @@ int sqlite3ExprCompareSkip(Expr*, Expr*, int); int sqlite3ExprListCompare(ExprList*, ExprList*, int); int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int); int sqlite3ExprImpliesNonNullRow(Expr*,int); +void sqlite3AggInfoPersistWalkerInit(Walker*,Parse*); void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); diff --git a/src/window.c b/src/window.c index 77ec8a02e0..8046e46274 100644 --- a/src/window.c +++ b/src/window.c @@ -956,12 +956,16 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ Window *pMWin = p->pWin; /* Master window object */ Window *pWin; /* Window object iterator */ Table *pTab; + Walker w; + u32 selFlags = p->selFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ){ return sqlite3ErrorToParser(db, SQLITE_NOMEM); } + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w, p); p->pSrc = 0; p->pWhere = 0; @@ -1042,7 +1046,6 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ Table *pTab2; - Walker w; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 350ffa26312c32b3452ebf103c8b7bb90ec69ce0..b1837460297bbe7aea0ea95aa6946c523c946fa4 100644 GIT binary patch delta 24027 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 +} {1 {misuse of window function sum()}} + +do_execsql_test 54.3 { + INSERT INTO t1 VALUES('2',5.0); + INSERT INTO t1 VALUES('3',15.0); +} + +do_catchsql_test 54.4 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} {1 {misuse of window function sum()}} + +# 2020-06-05 ticket c8d3b9f0a750a529 +reset_db +do_execsql_test 55.1 { + CREATE TABLE a(b); + SELECT + (SELECT b FROM a + GROUP BY b + HAVING (SELECT COUNT()OVER() + lead(b)OVER(ORDER BY SUM(DISTINCT b) + b)) + ) + FROM a + UNION + SELECT 99 + ORDER BY 1; +} {99} + +#------------------------------------------------------------------------ +reset_db +do_execsql_test 56.1 { + CREATE TABLE t1(a, b INTEGER); + CREATE TABLE t2(c, d); +} +do_catchsql_test 56.2 { + SELECT avg(b) FROM t1 + UNION ALL + SELECT min(c) OVER () FROM t2 + ORDER BY nosuchcolumn; +} {1 {1st ORDER BY term does not match any column in the result set}} + +reset_db +do_execsql_test 57.1 { + CREATE TABLE t4(a, b, c, d, e); +} + +do_catchsql_test 57.2 { + SELECT b FROM t4 + UNION + SELECT a FROM t4 + ORDER BY ( + SELECT sum(x) OVER() FROM ( + SELECT c AS x FROM t4 + UNION + SELECT d FROM t4 + ORDER BY (SELECT e FROM t4) + ) + ); +} {1 {1st ORDER BY term does not match any column in the result set}} + +# 2020-06-06 various dbsqlfuzz finds and +# ticket 0899cf62f597d7e7 +# +reset_db +do_execsql_test 57.1 { + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(NULL,NULL,NULL); + SELECT + sum(a), + min(b) OVER (), + count(c) OVER (ORDER BY b) + FROM t1; +} {{} {} 0} +do_execsql_test 57.2 { + CREATE TABLE v0 ( v1 INTEGER PRIMARY KEY ) ; + INSERT INTO v0 VALUES ( 10 ) ; + SELECT DISTINCT v1, lead(v1) OVER() FROM v0 GROUP BY v1 ORDER BY 2; +} {10 {}} +do_catchsql_test 57.3 { + DROP TABLE t1; + CREATE TABLE t1(a); + INSERT INTO t1(a) VALUES(22); + CREATE TABLE t3(y); + INSERT INTO t3(y) VALUES(5),(11),(-9); + SELECT ( + SELECT max(y) OVER( ORDER BY (SELECT x FROM (SELECT sum(y) AS x FROM t1))) + ) + FROM t3; +} {1 {misuse of aggregate: sum()}} + +# 2020-06-06 ticket 1f6f353b684fc708 +reset_db +do_execsql_test 58.1 { + CREATE TABLE a(a, b, c); + INSERT INTO a VALUES(1, 2, 3); + INSERT INTO a VALUES(4, 5, 6); + SELECT sum(345+b) OVER (ORDER BY b), + sum(avg(678)) OVER (ORDER BY c) FROM a; +} {347 678.0} + +# 2020-06-06 ticket e5504e987e419fb0 +do_catchsql_test 59.1 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES (123); + SELECT + ntile( (SELECT sum(x)) ) OVER(ORDER BY x), + min(x) OVER(ORDER BY x) + FROM t1; +} {1 {misuse of aggregate: sum()}} + +# 2020-06-07 ticket f7d890858f361402 +do_execsql_test 60.1 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1 (x INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES (99); + SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER()); +} {1} + +reset_db + finish_test -- 2.47.3