From 6ba7ab0d2524748479376e70043be9fc4cfbeccc Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 2 Jul 2019 11:56:47 +0000 Subject: [PATCH 001/221] Experimental implementation of FILTER clause for aggregate functions. FossilOrigin-Name: 1f1ae2d6ac8dcbb62e5aa3dc17bc67d559cb565fc0d0a8c00a596075d35f8130 --- manifest | 32 ++++++++++------- manifest.uuid | 2 +- src/expr.c | 27 +++++++++++--- src/parse.y | 23 ++++++------ src/resolve.c | 11 +++++- src/select.c | 24 ++++++++++--- src/sqliteInt.h | 8 +++-- src/walker.c | 3 ++ src/window.c | 12 ++++--- test/filter1.test | 90 +++++++++++++++++++++++++++++++++++++++++++++++ test/filter2.tcl | 73 ++++++++++++++++++++++++++++++++++++++ test/filter2.test | 82 ++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 342 insertions(+), 45 deletions(-) create mode 100644 test/filter1.test create mode 100644 test/filter2.tcl create mode 100644 test/filter2.test diff --git a/manifest b/manifest index a320ae1e91..e9ba34353b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\sOP_Sequence\sopcode\sfor\sgenerating\sunique\srowid\svalues\sfor\san\nautoindex\son\sa\sco-routine\simplementation\sof\sa\ssubquery. -D 2019-06-28T07:08:13.998 +C Experimental\simplementation\sof\sFILTER\sclause\sfor\saggregate\sfunctions. +D 2019-07-02T11:56:47.637 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 2756d2875ac5b7a7efcc54edea3c8a31f4126684ded18da6fb406f4d3780a5f5 +F src/expr.c 33267aaf04145af9f1f06c1f4c10f8e7a9acce1c681d75526e6a3fa7e58c1d79 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 026e3e6fff32432166a4eae0bdb78ad09a53c84eb49acb44dc32e49b4c0b8a48 +F src/parse.y 2902f393b08e33f4af42e2b63f943be62f5de096138461459de60084f598a056 F src/pcache.c fd2d0553b3222d6b9f7cb251079e5bca1299d1161da3027b525932d8bf46340a F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d @@ -520,14 +520,14 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 93b7bc7c45efa6322d92293361c51a873690daed50cf77eeff88a448246b0d5a +F src/resolve.c 65514625b68e79a4087d218107d51d489477509d55543e1be375d1e58f27c2f3 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 9187f2c65744e975b191ccee49946732ee922f8bf40da998b322aca1633405ea +F src/select.c 1774cc457eb0b6cd757a350fd9f5600c4d13f3e899d6615033aecaa4f00a5e7d F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb F src/sqlite.h.in bc4aa09a59dcf3c34b8e57ce9ade8ff6aed8ef7a7ddc59951f59f9b009fc7cc0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h bf65dfa6565fae2e0d501088fc9c5212244adc1429a543827a16b2f5eaf41982 +F src/sqliteInt.h 13fa73fd67968a4e3c58c84fbd655770989a82e0902880b0446747cd6711ad74 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -607,12 +607,12 @@ F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b09a2a9cab50efa08451a8c81d47052120ad5da174048c6d0b08d405384abdf2 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 +F src/walker.c 31844651eacdc408474c62df526f20d5ea7994b5b8ffcd23eed5dc8f688c26f5 F src/where.c 2f11eeb14335b7640f886b2fb441f54a94c35ab5cde8b53461a1074bfd587081 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 5be2cf7d8763cc97137fc44d015aed8a1a4a56fe9700d7933ed560172617c756 +F src/window.c c595e250528b0f5c31d26d96e0077d137aa3be2aec3b33ab30fbf3e7f69110c2 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -856,6 +856,9 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 +F test/filter1.test d706edd2c32c6b148143d885927e5cf4ea141106b803e243e5d1bfbdc7e2b5cf +F test/filter2.tcl 87e24fd0a2ab502bd4d0350c4eee17a50e2b4364a1b67230f82b8f2a5029f6bf +F test/filter2.test dfddced42a534e71a730aa3d4c6b148d9fbf29aa306f9cec6b51f31b8cf7e224 F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 F test/fkey2.test d35d1c81e7569bdd2b872e91750f7098117d2e8291369f70b7e3d50a0e523dc2 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 @@ -1830,7 +1833,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 5fd20e09a522b62a529cf4d76fbdf0a09426f67ffa30430cac6b81ebf32ba43e -R d8e38b1a6647f90f85dd30ba60740431 -U drh -Z 069759ad3085e2b5f17cc34ec369471a +P eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e +R 43e2b0402b61e905810368aafa77ca67 +T *branch * filter-clause +T *sym-filter-clause * +T -sym-trunk * +U dan +Z 9e8394b31320bbcccfabf9cff0d64121 diff --git a/manifest.uuid b/manifest.uuid index 82a0a5af46..959245f94c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e \ No newline at end of file +1f1ae2d6ac8dcbb62e5aa3dc17bc67d559cb565fc0d0a8c00a596075d35f8130 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c4f201a131..75d0dbe9da 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1027,7 +1027,7 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed ); assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced) - || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) ); + || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc|EP_Filter) ); #ifdef SQLITE_DEBUG if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ assert( p->pLeft==0 ); @@ -1046,10 +1046,15 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ }else{ sqlite3ExprListDelete(db, p->x.pList); } +#ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(p, EP_WinFunc) ){ - assert( p->op==TK_FUNCTION ); + assert( p->op==TK_FUNCTION && !ExprHasProperty(p, EP_Filter) ); sqlite3WindowDelete(db, p->y.pWin); + }else if( ExprHasProperty(p, EP_Filter) ){ + assert( p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION ); + sqlite3ExprDelete(db, p->y.pFilter); } +#endif } if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); if( !ExprHasProperty(p, EP_Static) ){ @@ -1264,7 +1269,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ } /* Fill in pNew->pLeft and pNew->pRight. */ - if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc) ){ + if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc|EP_Filter) ){ zAlloc += dupedExprNodeSize(p, dupFlags); if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ pNew->pLeft = p->pLeft ? @@ -1277,6 +1282,10 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin); assert( ExprHasProperty(pNew, EP_WinFunc) ); } + if( ExprHasProperty(p, EP_Filter) ){ + pNew->y.pFilter = sqlite3ExprDup(db, p->y.pFilter, 0); + assert( ExprHasProperty(pNew, EP_Filter) ); + } #endif /* SQLITE_OMIT_WINDOWFUNC */ if( pzBuffer ){ *pzBuffer = zAlloc; @@ -1332,8 +1341,8 @@ static With *withDup(sqlite3 *db, With *p){ ** objects found there, assembling them onto the linked list at Select->pWin. */ static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ - if( pExpr->op==TK_FUNCTION && pExpr->y.pWin!=0 ){ - assert( ExprHasProperty(pExpr, EP_WinFunc) ); + if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_WinFunc) ){ + assert( pExpr->y.pWin ); pExpr->y.pWin->pNextWin = pWalker->u.pSelect->pWin; pWalker->u.pSelect->pWin = pExpr->y.pWin; } @@ -4862,6 +4871,14 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( pA->op==TK_AGG_FUNCTION ){ + assert( ExprHasProperty(pA, EP_WinFunc)==0 ); + if( sqlite3ExprCompare(pParse, pA->y.pFilter, pB->y.pFilter, iTab) ){ + return 2; + } + } +#endif } if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; if( (combinedFlags & EP_TokenOnly)==0 ){ diff --git a/src/parse.y b/src/parse.y index fc5bff16dc..dda9f627aa 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1036,21 +1036,23 @@ expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. { %endif SQLITE_OMIT_CAST +%ifdef SQLITE_OMIT_WINDOWFUNC expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. { A = sqlite3ExprFunction(pParse, Y, &X, D); } expr(A) ::= id(X) LP STAR RP. { A = sqlite3ExprFunction(pParse, 0, &X, 0); } +%endif %ifndef SQLITE_OMIT_WINDOWFUNC -expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP over_clause(Z). { +expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_opt(F) over_opt(Z). { A = sqlite3ExprFunction(pParse, Y, &X, D); - sqlite3WindowAttach(pParse, A, Z); + sqlite3WindowAttach(pParse, A, F, Z); } -expr(A) ::= id(X) LP STAR RP over_clause(Z). { +expr(A) ::= id(X) LP STAR RP filter_opt(F) over_opt(Z). { A = sqlite3ExprFunction(pParse, 0, &X, 0); - sqlite3WindowAttach(pParse, A, Z); + sqlite3WindowAttach(pParse, A, F, Z); } %endif @@ -1724,20 +1726,17 @@ frame_exclude(A) ::= GROUP|TIES(X). {A = @X; /*A-overwrites-X*/} %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);} window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; } -%type over_clause {Window*} -%destructor over_clause {sqlite3WindowDelete(pParse->db, $$);} -over_clause(A) ::= filter_opt(W) OVER LP window(Z) RP. { +%type over_opt {Window*} +%destructor over_opt {sqlite3WindowDelete(pParse->db, $$);} +over_opt(A) ::= . { A=0; } +over_opt(A) ::= OVER LP window(Z) RP. { A = Z; assert( A!=0 ); - A->pFilter = W; } -over_clause(A) ::= filter_opt(W) OVER nm(Z). { +over_opt(A) ::= OVER nm(Z). { A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( A ){ A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n); - A->pFilter = W; - }else{ - sqlite3ExprDelete(pParse->db, W); } } diff --git a/src/resolve.c b/src/resolve.c index 8dac077eed..0a8aff5652 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -849,6 +849,12 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId); pNC->nErr++; is_agg = 0; + }else if( is_agg==0 && ExprHasProperty(pExpr, EP_Filter) ){ + sqlite3ErrorMsg(pParse, + "filter clause may not be used with non-aggregate %.*s()", + nId, zId + ); + pNC->nErr++; } #else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){ @@ -883,7 +889,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ sqlite3WalkExprList(pWalker, pList); if( is_agg ){ #ifndef SQLITE_OMIT_WINDOWFUNC - if( pExpr->y.pWin ){ + if( ExprHasProperty(pExpr, EP_WinFunc) ){ Select *pSel = pNC->pWinSelect; if( IN_RENAME_OBJECT==0 ){ sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); @@ -904,6 +910,9 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ NameContext *pNC2 = pNC; pExpr->op = TK_AGG_FUNCTION; pExpr->op2 = 0; +#ifndef SQLITE_OMIT_WINDOWFUNC + sqlite3WalkExpr(pWalker, pExpr->y.pFilter); +#endif while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){ pExpr->op2++; pNC2 = pNC2->pNext; diff --git a/src/select.c b/src/select.c index bd16acb027..e5f57fede6 100644 --- a/src/select.c +++ b/src/select.c @@ -4406,7 +4406,9 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ assert( *ppMinMax==0 ); assert( pFunc->op==TK_AGG_FUNCTION ); - if( pEList==0 || pEList->nExpr!=1 ) return eRet; + if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_Filter) ){ + return eRet; + } zFunc = pFunc->u.zToken; if( sqlite3StrICmp(zFunc, "min")==0 ){ eRet = WHERE_ORDERBY_MIN; @@ -4453,7 +4455,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ if( pExpr->op!=TK_AGG_FUNCTION ) return 0; if( NEVER(pAggInfo->nFunc==0) ) return 0; if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0; - if( pExpr->flags&EP_Distinct ) return 0; + if( ExprHasProperty(pExpr, EP_Distinct|EP_Filter) ) return 0; return pTab; } @@ -5333,6 +5335,11 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ int regAgg; ExprList *pList = pF->pExpr->x.pList; assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); + if( ExprHasProperty(pF->pExpr, EP_Filter) ){ + Expr *pFilter = pF->pExpr->y.pFilter; + addrNext = sqlite3VdbeMakeLabel(pParse); + sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL); + } if( pList ){ nArg = pList->nExpr; regAgg = sqlite3GetTempRange(pParse, nArg); @@ -5342,7 +5349,9 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ regAgg = 0; } if( pF->iDistinct>=0 ){ - addrNext = sqlite3VdbeMakeLabel(pParse); + if( addrNext==0 ){ + addrNext = sqlite3VdbeMakeLabel(pParse); + } testcase( nArg==0 ); /* Error condition */ testcase( nArg>1 ); /* Also an error */ codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); @@ -6225,9 +6234,14 @@ int sqlite3Select( minMaxFlag = WHERE_ORDERBY_NORMAL; } for(i=0; ix.pList); + sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); +#ifndef SQLITE_OMIT_WINDOWFUNC + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); + sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pFilter); +#endif sNC.ncFlags &= ~NC_InAggFunc; } sAggInfo.mxReg = pParse->nMem; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1c46183312..c0f2e0a186 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2491,7 +2491,8 @@ struct Expr { union { Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL ** for a column of an index on an expression */ - Window *pWin; /* TK_FUNCTION: Window definition for the func */ + Window *pWin; /* EP_WinFunc: Window definition for the func */ + Expr *pFilter; /* EP_Filter: Filter definition for the func */ struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ int iAddr; /* Subroutine entry address */ int regReturn; /* Register used to hold return address */ @@ -2536,6 +2537,7 @@ struct Expr { #define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ #define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ #define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ +#define EP_Filter 0x40000000 /* TK_[AGG_]FUNCTION with Expr.y.pFilter set */ /* ** The EP_Propagate mask is a set of properties that automatically propagate @@ -3602,7 +3604,7 @@ struct Window { void sqlite3WindowDelete(sqlite3*, Window*); void sqlite3WindowListDelete(sqlite3 *db, Window *p); Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); -void sqlite3WindowAttach(Parse*, Expr*, Window*); +void sqlite3WindowAttach(Parse*, Expr*, Expr*, Window*); int sqlite3WindowCompare(Parse*, Window*, Window*); void sqlite3WindowCodeInit(Parse*, Window*); void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); @@ -3617,7 +3619,7 @@ Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); #else # define sqlite3WindowDelete(a,b) # define sqlite3WindowFunctions() -# define sqlite3WindowAttach(a,b,c) +# define sqlite3WindowAttach(a,b,c,d) #endif /* diff --git a/src/walker.c b/src/walker.c index eff3585250..766a345add 100644 --- a/src/walker.c +++ b/src/walker.c @@ -74,6 +74,9 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ if( ExprHasProperty(pExpr, EP_WinFunc) ){ if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; } + if( ExprHasProperty(pExpr, EP_Filter) ){ + if( walkExpr(pWalker, pExpr->y.pFilter) ) return WRC_Abort; + } #endif } break; diff --git a/src/window.c b/src/window.c index 737261e85c..4d7ebf6086 100644 --- a/src/window.c +++ b/src/window.c @@ -1178,13 +1178,10 @@ void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pList){ /* ** Attach window object pWin to expression p. */ -void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ +void sqlite3WindowAttach(Parse *pParse, Expr *p, Expr *pFilter, Window *pWin){ if( p ){ assert( p->op==TK_FUNCTION ); - /* This routine is only called for the parser. If pWin was not - ** allocated due to an OOM, then the parser would fail before ever - ** invoking this routine */ - if( ALWAYS(pWin) ){ + if( pWin ){ p->y.pWin = pWin; ExprSetProperty(p, EP_WinFunc); pWin->pOwner = p; @@ -1192,9 +1189,14 @@ void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ sqlite3ErrorMsg(pParse, "DISTINCT is not supported for window functions"); } + pWin->pFilter = pFilter; + }else if( pFilter ){ + p->y.pFilter = pFilter; + ExprSetProperty(p, EP_Filter); } }else{ sqlite3WindowDelete(pParse->db, pWin); + sqlite3ExprDelete(pParse->db, pFilter); } } diff --git a/test/filter1.test b/test/filter1.test new file mode 100644 index 0000000000..2f5a5b56d4 --- /dev/null +++ b/test/filter1.test @@ -0,0 +1,90 @@ +# 2018 May 8 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix filter1 + +ifcapable !windowfunc { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a); + CREATE INDEX i1 ON t1(a); + INSERT INTO t1 VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9); +} + +do_execsql_test 1.1 { SELECT sum(a) FROM t1; } 45 +do_execsql_test 1.2 { SELECT sum(a) FILTER( WHERE a<5 ) FROM t1; } 10 + +do_execsql_test 1.3 { + SELECT sum(a) FILTER( WHERE a>9 ), + sum(a) FILTER( WHERE a>8 ), + sum(a) FILTER( WHERE a>7 ), + sum(a) FILTER( WHERE a>6 ), + sum(a) FILTER( WHERE a>5 ), + sum(a) FILTER( WHERE a>4 ), + sum(a) FILTER( WHERE a>3 ), + sum(a) FILTER( WHERE a>2 ), + sum(a) FILTER( WHERE a>1 ), + sum(a) FILTER( WHERE a>0 ) + FROM t1; +} {{} 9 17 24 30 35 39 42 44 45} + +do_execsql_test 1.4 { + SELECT max(a) FILTER (WHERE (a % 2)==0) FROM t1 +} {8} + +do_execsql_test 1.5 { + SELECT min(a) FILTER (WHERE a>4) FROM t1 +} {5} + +do_execsql_test 1.6 { + SELECT count(*) FILTER (WHERE a!=5) FROM t1 +} {8} + +do_execsql_test 1.6 { + SELECT min(a) FILTER (WHERE a>3) FROM t1 GROUP BY (a%2) ORDER BY 1; +} {4 5} + + +#------------------------------------------------------------------------- +# Test some errors: +# +# .1 FILTER on a non-aggregate function, +# .2 Window function in FILTER clause, +# .3 Aggregate function in FILTER clause, +# +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9); +} + +do_catchsql_test 2.1 { + SELECT upper(a) FILTER (WHERE a=1) FROM t1 +} {1 {filter clause may not be used with non-aggregate upper()}} + +do_catchsql_test 2.2 { + SELECT sum(a) FILTER (WHERE 1 - max(a) OVER () > 0) FROM t1 +} {1 {misuse of window function max()}} + +do_catchsql_test 2.3 { + SELECT sum(a) FILTER (WHERE 1 - count(a)) FROM t1 +} {1 {misuse of aggregate: count()}} + +finish_test + + diff --git a/test/filter2.tcl b/test/filter2.tcl new file mode 100644 index 0000000000..0a7e2a3dd0 --- /dev/null +++ b/test/filter2.tcl @@ -0,0 +1,73 @@ +# 2018 May 19 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +source [file join [file dirname $argv0] pg_common.tcl] + +#========================================================================= + + +start_test filter2 "2019 July 2" + +ifcapable !windowfunc + +execsql_test 1.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER); + INSERT INTO t1 VALUES + (1, 7), (2, 3), (3, 5), (4, 30), (5, 26), (6, 23), (7, 27), + (8, 3), (9, 17), (10, 26), (11, 33), (12, 25), (13, NULL), (14, 47), + (15, 36), (16, 13), (17, 45), (18, 31), (19, 11), (20, 36), (21, 37), + (22, 21), (23, 22), (24, 14), (25, 16), (26, 3), (27, 7), (28, 29), + (29, 50), (30, 38), (31, 3), (32, 36), (33, 12), (34, 4), (35, 46), + (36, 3), (37, 48), (38, 23), (39, NULL), (40, 24), (41, 5), (42, 46), + (43, 11), (44, NULL), (45, 18), (46, 25), (47, 15), (48, 18), (49, 23); +} + +execsql_test 1.1 { SELECT sum(b) FROM t1 } + +execsql_test 1.2 { SELECT sum(b) FILTER (WHERE a<10) FROM t1 } + +execsql_test 1.3 { SELECT count(DISTINCT b) FROM t1 } + +execsql_test 1.4 { SELECT count(DISTINCT b) FILTER (WHERE a!=19) FROM t1 } + +execsql_test 1.5 { + SELECT min(b) FILTER (WHERE a>19), + min(b) FILTER (WHERE a>0), + max(a+b) FILTER (WHERE a>19), + max(b+a) FILTER (WHERE a BETWEEN 10 AND 40) + FROM t1; +} + +execsql_test 1.6 { + SELECT min(b), + min(b), + max(a+b), + max(b+a) + FROM t1 + GROUP BY (a%10) + ORDER BY 1, 2, 3, 4; +} + +execsql_test 1.7 { + SELECT min(b) FILTER (WHERE a>19), + min(b) FILTER (WHERE a>0), + max(a+b) FILTER (WHERE a>19), + max(b+a) FILTER (WHERE a BETWEEN 10 AND 40) + FROM t1 + GROUP BY (a%10) + ORDER BY 1, 2, 3, 4; +} + +finish_test + + diff --git a/test/filter2.test b/test/filter2.test new file mode 100644 index 0000000000..5b98f2e38b --- /dev/null +++ b/test/filter2.test @@ -0,0 +1,82 @@ +# 2019 July 2 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +#################################################### +# DO NOT EDIT! THIS FILE IS AUTOMATICALLY GENERATED! +#################################################### + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix filter2 + +ifcapable !windowfunc { finish_test ; return } +do_execsql_test 1.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER); + INSERT INTO t1 VALUES + (1, 7), (2, 3), (3, 5), (4, 30), (5, 26), (6, 23), (7, 27), + (8, 3), (9, 17), (10, 26), (11, 33), (12, 25), (13, NULL), (14, 47), + (15, 36), (16, 13), (17, 45), (18, 31), (19, 11), (20, 36), (21, 37), + (22, 21), (23, 22), (24, 14), (25, 16), (26, 3), (27, 7), (28, 29), + (29, 50), (30, 38), (31, 3), (32, 36), (33, 12), (34, 4), (35, 46), + (36, 3), (37, 48), (38, 23), (39, NULL), (40, 24), (41, 5), (42, 46), + (43, 11), (44, NULL), (45, 18), (46, 25), (47, 15), (48, 18), (49, 23); +} {} + +do_execsql_test 1.1 { + SELECT sum(b) FROM t1 +} {1041} + +do_execsql_test 1.2 { + SELECT sum(b) FILTER (WHERE a<10) FROM t1 +} {141} + +do_execsql_test 1.3 { + SELECT count(DISTINCT b) FROM t1 +} {31} + +do_execsql_test 1.4 { + SELECT count(DISTINCT b) FILTER (WHERE a!=19) FROM t1 +} {31} + +do_execsql_test 1.5 { + SELECT min(b) FILTER (WHERE a>19), + min(b) FILTER (WHERE a>0), + max(a+b) FILTER (WHERE a>19), + max(b+a) FILTER (WHERE a BETWEEN 10 AND 40) + FROM t1; +} {3 3 88 85} + +do_execsql_test 1.6 { + SELECT min(b), + min(b), + max(a+b), + max(b+a) + FROM t1 + GROUP BY (a%10) + ORDER BY 1, 2, 3, 4; +} {3 3 58 58 3 3 66 66 3 3 71 71 3 3 88 88 4 4 61 61 5 5 54 54 + 7 7 85 85 11 11 79 79 16 16 81 81 24 24 68 68} + +do_execsql_test 1.7 { + SELECT min(b) FILTER (WHERE a>19), + min(b) FILTER (WHERE a>0), + max(a+b) FILTER (WHERE a>19), + max(b+a) FILTER (WHERE a BETWEEN 10 AND 40) + FROM t1 + GROUP BY (a%10) + ORDER BY 1, 2, 3, 4; +} {3 3 58 58 3 3 71 39 4 4 38 61 7 7 85 85 11 5 54 45 16 16 81 81 + 18 3 66 61 21 3 88 68 23 11 79 79 24 24 68 68} + +finish_test From 16e12c573dbf4afb49bb1f59b2634b4acfee168b Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 3 Jul 2019 18:31:20 +0000 Subject: [PATCH 002/221] Add tests for the FILTER clause. And a bugfix. FossilOrigin-Name: 28aa1702f7f0334abd1b30e7aa48ea3679539b11bfbba32bc9f0d6049cf18a7b --- manifest | 21 ++++++-------- manifest.uuid | 2 +- src/resolve.c | 11 +++---- test/filter1.test | 2 +- test/filter2.tcl | 59 +++++++++++++++++++++++++++++++++++++ test/filter2.test | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 150 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index e9ba34353b..53814fe073 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Experimental\simplementation\sof\sFILTER\sclause\sfor\saggregate\sfunctions. -D 2019-07-02T11:56:47.637 +C Add\stests\sfor\sthe\sFILTER\sclause.\sAnd\sa\sbugfix. +D 2019-07-03T18:31:20.108 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 65514625b68e79a4087d218107d51d489477509d55543e1be375d1e58f27c2f3 +F src/resolve.c 3c0dc44956a909e135b92e7691e77fb7cf65ab55f03f0439b4e9758b29841fda F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1774cc457eb0b6cd757a350fd9f5600c4d13f3e899d6615033aecaa4f00a5e7d F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb @@ -856,9 +856,9 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test d706edd2c32c6b148143d885927e5cf4ea141106b803e243e5d1bfbdc7e2b5cf -F test/filter2.tcl 87e24fd0a2ab502bd4d0350c4eee17a50e2b4364a1b67230f82b8f2a5029f6bf -F test/filter2.test dfddced42a534e71a730aa3d4c6b148d9fbf29aa306f9cec6b51f31b8cf7e224 +F test/filter1.test 8a0f541d2138a10b41c513a9b8193af09d5218ca4e670bc6fd9ed121db1b7bf3 +F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 +F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 F test/fkey2.test d35d1c81e7569bdd2b872e91750f7098117d2e8291369f70b7e3d50a0e523dc2 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 @@ -1833,10 +1833,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eab4297577e4d325fed4757867fc77860de7448998d86f098c8a50272e17d35e -R 43e2b0402b61e905810368aafa77ca67 -T *branch * filter-clause -T *sym-filter-clause * -T -sym-trunk * +P 1f1ae2d6ac8dcbb62e5aa3dc17bc67d559cb565fc0d0a8c00a596075d35f8130 +R 384c2722df91a465eadfc4c7f6abdf98 U dan -Z 9e8394b31320bbcccfabf9cff0d64121 +Z 0118bb47bb74c9177a9d95a1278bf2e1 diff --git a/manifest.uuid b/manifest.uuid index 959245f94c..9d6a593943 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1f1ae2d6ac8dcbb62e5aa3dc17bc67d559cb565fc0d0a8c00a596075d35f8130 \ No newline at end of file +28aa1702f7f0334abd1b30e7aa48ea3679539b11bfbba32bc9f0d6049cf18a7b \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 0a8aff5652..d65344e2a8 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -826,22 +826,23 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( 0==IN_RENAME_OBJECT ){ #ifndef SQLITE_OMIT_WINDOWFUNC + int is_win = ExprHasProperty(pExpr, EP_WinFunc); assert( is_agg==0 || (pDef->funcFlags & SQLITE_FUNC_MINMAX) || (pDef->xValue==0 && pDef->xInverse==0) || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) ); - if( pDef && pDef->xValue==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ + if( pDef && pDef->xValue==0 && is_win ){ sqlite3ErrorMsg(pParse, "%.*s() may not be used as a window function", nId, zId ); pNC->nErr++; }else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) - || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pExpr->y.pWin) - || (is_agg && pExpr->y.pWin && (pNC->ncFlags & NC_AllowWin)==0) + || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !is_win) + || (is_agg && is_win && (pNC->ncFlags & NC_AllowWin)==0) ){ const char *zType; - if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pExpr->y.pWin ){ + if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || is_win ){ zType = "window"; }else{ zType = "aggregate"; @@ -880,7 +881,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** Or arguments of other window functions. But aggregate functions ** may be arguments for window functions. */ #ifndef SQLITE_OMIT_WINDOWFUNC - pNC->ncFlags &= ~(NC_AllowWin | (!pExpr->y.pWin ? NC_AllowAgg : 0)); + pNC->ncFlags &= ~(NC_AllowWin | (!is_win ? NC_AllowAgg : 0)); #else pNC->ncFlags &= ~NC_AllowAgg; #endif diff --git a/test/filter1.test b/test/filter1.test index 2f5a5b56d4..8c0c14d87f 100644 --- a/test/filter1.test +++ b/test/filter1.test @@ -83,7 +83,7 @@ do_catchsql_test 2.2 { do_catchsql_test 2.3 { SELECT sum(a) FILTER (WHERE 1 - count(a)) FROM t1 -} {1 {misuse of aggregate: count()}} +} {1 {misuse of aggregate function count()}} finish_test diff --git a/test/filter2.tcl b/test/filter2.tcl index 0a7e2a3dd0..f3871f80bc 100644 --- a/test/filter2.tcl +++ b/test/filter2.tcl @@ -68,6 +68,65 @@ execsql_test 1.7 { ORDER BY 1, 2, 3, 4; } +execsql_test 1.8 { + SELECT sum(a+b) FILTER (WHERE a=NULL) FROM t1 +} + +execsql_test 1.9 { + SELECT (a%5) FROM t1 GROUP BY (a%5) + HAVING sum(b) FILTER (WHERE b<20) > 34 + ORDER BY 1 +} + +execsql_test 1.10 { + SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb + FROM t1 + GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34 + ORDER BY 1 +} + +execsql_test 1.11 { + SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb + FROM t1 + GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34 + ORDER BY 2 +} + +execsql_test 1.12 { + SELECT (a%5), + sum(b) FILTER (WHERE b<20) AS bbb, + count(distinct b) FILTER (WHERE b<20 OR a=13) AS ccc + FROM t1 GROUP BY (a%5) + ORDER BY 2 +} + +execsql_test 1.13 { + SELECT + string_agg(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=0), + string_agg(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=1), + count(*) FILTER (WHERE b%2!=0), + count(*) FILTER (WHERE b%2!=1) + FROM t1; +} + +execsql_float_test 1.14 { + SELECT + avg(b) FILTER (WHERE b>a), + avg(b) FILTER (WHERE b 34 + ORDER BY 1 +} {3 4} + +do_execsql_test 1.10 { + SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb + FROM t1 + GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34 + ORDER BY 1 +} {3 49 4 46} + +do_execsql_test 1.11 { + SELECT (a%5), sum(b) FILTER (WHERE b<20) AS bbb + FROM t1 + GROUP BY (a%5) HAVING sum(b) FILTER (WHERE b<20) >34 + ORDER BY 2 +} {4 46 3 49} + +do_execsql_test 1.12 { + SELECT (a%5), + sum(b) FILTER (WHERE b<20) AS bbb, + count(distinct b) FILTER (WHERE b<20 OR a=13) AS ccc + FROM t1 GROUP BY (a%5) + ORDER BY 2 +} {2 25 3 0 34 2 1 34 4 4 46 4 3 49 5} + +do_execsql_test 1.13 { + SELECT + group_concat(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=0), + group_concat(CAST(b AS TEXT), '_') FILTER (WHERE b%2!=1), + count(*) FILTER (WHERE b%2!=0), + count(*) FILTER (WHERE b%2!=1) + FROM t1; +} {7_3_5_23_27_3_17_33_25_47_13_45_31_11_37_21_3_7_29_3_3_23_5_11_25_15_23 30_26_26_36_36_22_14_16_50_38_36_12_4_46_48_24_46_18_18 27 19} + + +do_test 1.14 { + set myres {} + foreach r [db eval {SELECT + avg(b) FILTER (WHERE b>a), + avg(b) FILTER (WHERE b([set r2]+0.0001)} { + error "list element [set i] does not match: got=[set r] expected=[set r2]" + } + incr i + } + set {} {} +} {} + +do_execsql_test 1.15 { + SELECT + a/5, + sum(b) FILTER (WHERE a%5=0), + sum(b) FILTER (WHERE a%5=1), + sum(b) FILTER (WHERE a%5=2), + sum(b) FILTER (WHERE a%5=3), + sum(b) FILTER (WHERE a%5=4) + FROM t1 GROUP BY (a/5) ORDER BY 1; +} {0 {} 7 3 5 30 1 26 23 27 3 17 2 26 33 25 {} 47 3 36 13 45 31 11 + 4 36 37 21 22 14 5 16 3 7 29 50 6 38 3 36 12 4 7 46 3 48 23 {} + 8 24 5 46 11 {} 9 18 25 15 18 23} + finish_test From b28c4e564ab4ac8603f28e662a3a591a40a069b2 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 5 Jul 2019 17:38:55 +0000 Subject: [PATCH 003/221] Minor tweak to patch on this branch to reclaim some cycles. FossilOrigin-Name: 81eed055de856068109a7e332cca0c3ff1120ebe2bfa5ed6383b165c726e0a7c --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 4 +++- test/window2.tcl | 4 ++++ test/window2.test | 4 ++++ 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 53814fe073..5ba4ac2d79 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sfor\sthe\sFILTER\sclause.\sAnd\sa\sbugfix. -D 2019-07-03T18:31:20.108 +C Minor\stweak\sto\spatch\son\sthis\sbranch\sto\sreclaim\ssome\scycles. +D 2019-07-05T17:38:55.826 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -522,7 +522,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3c0dc44956a909e135b92e7691e77fb7cf65ab55f03f0439b4e9758b29841fda F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 1774cc457eb0b6cd757a350fd9f5600c4d13f3e899d6615033aecaa4f00a5e7d +F src/select.c 696107b0e89df923a1991fb638454767258bd67959249da09badfa6c94b4bd9e F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb F src/sqlite.h.in bc4aa09a59dcf3c34b8e57ce9ade8ff6aed8ef7a7ddc59951f59f9b009fc7cc0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1699,8 +1699,8 @@ F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc F test/window1.test 8d453bfaa3f8f0873ba16ca1270c7368f18445065a0003a1b5954ac4e95797b4 -F test/window2.tcl 0c2918ef2a1640553fd791972d458356808a608418c64c02a0a379cecfc7fb0d -F test/window2.test 96ef949f0197c025652f6c6e5812cdbfb948989bd40cf79cbb02104249a89513 +F test/window2.tcl a0de5e1e50538a9c491d894474d4708bbb2a3c043107ac5e05be7de99373a237 +F test/window2.test d7236a84c9104319fb0980a73565559d5470beb65d11136c5c1356d67de299c9 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb F test/window4.tcl 5fbaab489677914ee5686b2008426e336daf88a2f58be7df92757f780a5ebf91 @@ -1833,7 +1833,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1f1ae2d6ac8dcbb62e5aa3dc17bc67d559cb565fc0d0a8c00a596075d35f8130 -R 384c2722df91a465eadfc4c7f6abdf98 +P 28aa1702f7f0334abd1b30e7aa48ea3679539b11bfbba32bc9f0d6049cf18a7b +R 32352038f0215cf6311f9df6007b16f8 U dan -Z 0118bb47bb74c9177a9d95a1278bf2e1 +Z 0e8a7c5368f99c56c1c2d766fdc13e32 diff --git a/manifest.uuid b/manifest.uuid index 9d6a593943..4b6312c88e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28aa1702f7f0334abd1b30e7aa48ea3679539b11bfbba32bc9f0d6049cf18a7b \ No newline at end of file +81eed055de856068109a7e332cca0c3ff1120ebe2bfa5ed6383b165c726e0a7c \ No newline at end of file diff --git a/src/select.c b/src/select.c index e5f57fede6..e6471fb848 100644 --- a/src/select.c +++ b/src/select.c @@ -6240,7 +6240,9 @@ int sqlite3Select( sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); #ifndef SQLITE_OMIT_WINDOWFUNC assert( !ExprHasProperty(pExpr, EP_WinFunc) ); - sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pFilter); + if( pExpr->y.pFilter ){ + sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pFilter); + } #endif sNC.ncFlags &= ~NC_InAggFunc; } diff --git a/test/window2.tcl b/test/window2.tcl index 093d693b62..3f781a7252 100644 --- a/test/window2.tcl +++ b/test/window2.tcl @@ -424,6 +424,10 @@ execsql_float_test 4.9 { WINDOW win AS (ORDER BY 1); } +execsql_test 4.10 { + SELECT count(*) OVER (ORDER BY b) FROM t1 +} + finish_test diff --git a/test/window2.test b/test/window2.test index 4bed0cdcc9..26370e24d2 100644 --- a/test/window2.test +++ b/test/window2.test @@ -893,4 +893,8 @@ do_test 4.9 { set {} {} } {} +do_execsql_test 4.10 { + SELECT count(*) OVER (ORDER BY b) FROM t1 +} {3 3 3 6 6 6} + finish_test From 1efcc9dd965c5b48a1a9e27ce760b38f9d892cb4 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 5 Jul 2019 19:10:41 +0000 Subject: [PATCH 004/221] Another very small performance improvement. FossilOrigin-Name: 7a1e30a17f57ca006dd84b6f97b0c7811bf4c6da4b02903452ffc4bc363cab9b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/prepare.c | 6 +++--- test/window2.tcl | 3 +++ test/window2.test | 4 ++++ 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 5ba4ac2d79..3cf1f3b315 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\stweak\sto\spatch\son\sthis\sbranch\sto\sreclaim\ssome\scycles. -D 2019-07-05T17:38:55.826 +C Another\svery\ssmall\sperformance\simprovement. +D 2019-07-05T19:10:41.614 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 -F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 +F src/prepare.c d633c3610c23dc98239ea445803c2a6188c2b8ab647e3df4243f369516e6c8d1 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3c0dc44956a909e135b92e7691e77fb7cf65ab55f03f0439b4e9758b29841fda @@ -1699,8 +1699,8 @@ F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc F test/window1.test 8d453bfaa3f8f0873ba16ca1270c7368f18445065a0003a1b5954ac4e95797b4 -F test/window2.tcl a0de5e1e50538a9c491d894474d4708bbb2a3c043107ac5e05be7de99373a237 -F test/window2.test d7236a84c9104319fb0980a73565559d5470beb65d11136c5c1356d67de299c9 +F test/window2.tcl a44834af6267be6e14882311ef8790bf5047f1b9bc25685ee1762d48dc24f1e7 +F test/window2.test 2f3ae63e171dce7f2ac29a41020f4da413b1d7bdaba48ee124fd336b152e34c5 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb F test/window4.tcl 5fbaab489677914ee5686b2008426e336daf88a2f58be7df92757f780a5ebf91 @@ -1833,7 +1833,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 28aa1702f7f0334abd1b30e7aa48ea3679539b11bfbba32bc9f0d6049cf18a7b -R 32352038f0215cf6311f9df6007b16f8 +P 81eed055de856068109a7e332cca0c3ff1120ebe2bfa5ed6383b165c726e0a7c +R 46b156a94f9cfdf367fb299674af587d U dan -Z 0e8a7c5368f99c56c1c2d766fdc13e32 +Z 61e3b9e66b66516dc5ac189aabd81a74 diff --git a/manifest.uuid b/manifest.uuid index 4b6312c88e..9481a3b9f0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -81eed055de856068109a7e332cca0c3ff1120ebe2bfa5ed6383b165c726e0a7c \ No newline at end of file +7a1e30a17f57ca006dd84b6f97b0c7811bf4c6da4b02903452ffc4bc363cab9b \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index 3f1a79b14b..f385c1fc71 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -635,7 +635,7 @@ static int sqlite3Prepare( rc = sParse.rc; #ifndef SQLITE_OMIT_EXPLAIN - if( rc==SQLITE_OK && sParse.pVdbe && sParse.explain ){ + if( sParse.explain && rc==SQLITE_OK && sParse.pVdbe ){ static const char * const azColName[] = { "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", "id", "parent", "notused", "detail" @@ -660,8 +660,8 @@ static int sqlite3Prepare( if( db->init.busy==0 ){ sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail-zSql), prepFlags); } - if( sParse.pVdbe && (rc!=SQLITE_OK || db->mallocFailed) ){ - sqlite3VdbeFinalize(sParse.pVdbe); + if( rc!=SQLITE_OK || db->mallocFailed ){ + if( sParse.pVdbe ) sqlite3VdbeFinalize(sParse.pVdbe); assert(!(*ppStmt)); }else{ *ppStmt = (sqlite3_stmt*)sParse.pVdbe; diff --git a/test/window2.tcl b/test/window2.tcl index 3f781a7252..60bf68196c 100644 --- a/test/window2.tcl +++ b/test/window2.tcl @@ -428,6 +428,9 @@ execsql_test 4.10 { SELECT count(*) OVER (ORDER BY b) FROM t1 } +execsql_test 4.11 { + SELECT count(distinct a) FILTER (WHERE b='odd') FROM t1 +} finish_test diff --git a/test/window2.test b/test/window2.test index 26370e24d2..c4358ded74 100644 --- a/test/window2.test +++ b/test/window2.test @@ -897,4 +897,8 @@ do_execsql_test 4.10 { SELECT count(*) OVER (ORDER BY b) FROM t1 } {3 3 3 6 6 6} +do_execsql_test 4.11 { + SELECT count(distinct a) FILTER (WHERE b='odd') FROM t1 +} {3} + finish_test From 8117f113bc0468d4c955ffa3f04cea26a39a3bd3 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 10 Jul 2019 20:16:53 +0000 Subject: [PATCH 005/221] Minor performance improvement in sqlite3ExprDeleteNN(). FossilOrigin-Name: bcc8b38ac75b731a4cd2873ab83f423be036467a511b617c779869de9bbb5383 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 20 ++++++++++++-------- src/resolve.c | 12 ++++++------ src/walker.c | 23 ++++++++++++++--------- 5 files changed, 41 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index 3cf1f3b315..07f6d39ac5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Another\svery\ssmall\sperformance\simprovement. -D 2019-07-05T19:10:41.614 +C Minor\sperformance\simprovement\sin\ssqlite3ExprDeleteNN(). +D 2019-07-10T20:16:53.830 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 33267aaf04145af9f1f06c1f4c10f8e7a9acce1c681d75526e6a3fa7e58c1d79 +F src/expr.c 01bbd69f29936bba85dba6188a409c1e21a0c260bf04b9fc78d5e9702a77acb5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -520,7 +520,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c d633c3610c23dc98239ea445803c2a6188c2b8ab647e3df4243f369516e6c8d1 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 3c0dc44956a909e135b92e7691e77fb7cf65ab55f03f0439b4e9758b29841fda +F src/resolve.c 138c9e9d8828f199709bd7c970d98aaff47a21d33c6c42ffb6e1e809620fcc9e F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 696107b0e89df923a1991fb638454767258bd67959249da09badfa6c94b4bd9e F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb @@ -607,7 +607,7 @@ F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b09a2a9cab50efa08451a8c81d47052120ad5da174048c6d0b08d405384abdf2 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c 31844651eacdc408474c62df526f20d5ea7994b5b8ffcd23eed5dc8f688c26f5 +F src/walker.c 588e7f5faf30d2e68aa9b176258bb3225d0553171b998b06b69ed74a0528e986 F src/where.c 2f11eeb14335b7640f886b2fb441f54a94c35ab5cde8b53461a1074bfd587081 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a @@ -1833,7 +1833,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 81eed055de856068109a7e332cca0c3ff1120ebe2bfa5ed6383b165c726e0a7c -R 46b156a94f9cfdf367fb299674af587d +P 7a1e30a17f57ca006dd84b6f97b0c7811bf4c6da4b02903452ffc4bc363cab9b +R 6bd4ab9e9ad32527f5b65731f0494801 U dan -Z 61e3b9e66b66516dc5ac189aabd81a74 +Z 7ff155988343772e802f3ddf15426065 diff --git a/manifest.uuid b/manifest.uuid index 9481a3b9f0..5793e74a4c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7a1e30a17f57ca006dd84b6f97b0c7811bf4c6da4b02903452ffc4bc363cab9b \ No newline at end of file +bcc8b38ac75b731a4cd2873ab83f423be036467a511b617c779869de9bbb5383 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 75d0dbe9da..6fbeb827fb 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1040,21 +1040,25 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( p->x.pList==0 || p->pRight==0 ); if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); if( p->pRight ){ + assert( !ExprHasProperty(p, (EP_WinFunc|EP_Filter)) ); sqlite3ExprDeleteNN(db, p->pRight); }else if( ExprHasProperty(p, EP_xIsSelect) ){ + assert( !ExprHasProperty(p, (EP_WinFunc|EP_Filter)) ); sqlite3SelectDelete(db, p->x.pSelect); }else{ sqlite3ExprListDelete(db, p->x.pList); - } #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(p, EP_WinFunc) ){ - assert( p->op==TK_FUNCTION && !ExprHasProperty(p, EP_Filter) ); - sqlite3WindowDelete(db, p->y.pWin); - }else if( ExprHasProperty(p, EP_Filter) ){ - assert( p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION ); - sqlite3ExprDelete(db, p->y.pFilter); - } + if( ExprHasProperty(p, (EP_WinFunc|EP_Filter)) ){ + if( ExprHasProperty(p, EP_WinFunc) ){ + assert( p->op==TK_FUNCTION && !ExprHasProperty(p, EP_Filter) ); + sqlite3WindowDelete(db, p->y.pWin); + }else{ + assert( p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION ); + sqlite3ExprDeleteNN(db, p->y.pFilter); + } + } #endif + } } if( ExprHasProperty(p, EP_MemToken) ) sqlite3DbFree(db, p->u.zToken); if( !ExprHasProperty(p, EP_Static) ){ diff --git a/src/resolve.c b/src/resolve.c index d65344e2a8..37aaa92606 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -826,23 +826,23 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( 0==IN_RENAME_OBJECT ){ #ifndef SQLITE_OMIT_WINDOWFUNC - int is_win = ExprHasProperty(pExpr, EP_WinFunc); + Window *pWin = (ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0); assert( is_agg==0 || (pDef->funcFlags & SQLITE_FUNC_MINMAX) || (pDef->xValue==0 && pDef->xInverse==0) || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) ); - if( pDef && pDef->xValue==0 && is_win ){ + if( pDef && pDef->xValue==0 && pWin ){ sqlite3ErrorMsg(pParse, "%.*s() may not be used as a window function", nId, zId ); pNC->nErr++; }else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) - || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !is_win) - || (is_agg && is_win && (pNC->ncFlags & NC_AllowWin)==0) + || (is_agg && (pDef->funcFlags&SQLITE_FUNC_WINDOW) && !pWin) + || (is_agg && pWin && (pNC->ncFlags & NC_AllowWin)==0) ){ const char *zType; - if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || is_win ){ + if( (pDef->funcFlags & SQLITE_FUNC_WINDOW) || pWin ){ zType = "window"; }else{ zType = "aggregate"; @@ -881,7 +881,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** Or arguments of other window functions. But aggregate functions ** may be arguments for window functions. */ #ifndef SQLITE_OMIT_WINDOWFUNC - pNC->ncFlags &= ~(NC_AllowWin | (!is_win ? NC_AllowAgg : 0)); + pNC->ncFlags &= ~(NC_AllowWin | (!pWin ? NC_AllowAgg : 0)); #else pNC->ncFlags &= ~NC_AllowAgg; #endif diff --git a/src/walker.c b/src/walker.c index 766a345add..44e3d18363 100644 --- a/src/walker.c +++ b/src/walker.c @@ -63,21 +63,26 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; assert( pExpr->x.pList==0 || pExpr->pRight==0 ); if( pExpr->pRight ){ + assert( !ExprHasProperty(pExpr, EP_WinFunc|EP_Filter) ); pExpr = pExpr->pRight; continue; }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + assert( !ExprHasProperty(pExpr, EP_WinFunc|EP_Filter) ); if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; - }else if( pExpr->x.pList ){ - if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; - } + }else{ + if( pExpr->x.pList ){ + if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; + } #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pExpr, EP_WinFunc) ){ - if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; - } - if( ExprHasProperty(pExpr, EP_Filter) ){ - if( walkExpr(pWalker, pExpr->y.pFilter) ) return WRC_Abort; - } + if( ExprHasProperty(pExpr, EP_WinFunc|EP_Filter) ){ + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; + }else if( ExprHasProperty(pExpr, EP_Filter) ){ + if( walkExpr(pWalker, pExpr->y.pFilter) ) return WRC_Abort; + } + } #endif + } } break; } From 6488271f055df2c2f403883cb8eb6ad459da2222 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 11 Jul 2019 18:43:33 +0000 Subject: [PATCH 006/221] Change the parser on this branch to more closely match trunk. This saves a few more cycles. FossilOrigin-Name: be01b801fbc258f0ab9542130cec12a5ea5e2d0bf087684a9eda909ad459c211 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 52 +++++++++++++++++++++++++++++++++++---------------- 3 files changed, 43 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 07f6d39ac5..8bde9a3060 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sperformance\simprovement\sin\ssqlite3ExprDeleteNN(). -D 2019-07-10T20:16:53.830 +C Change\sthe\sparser\son\sthis\sbranch\sto\smore\sclosely\smatch\strunk.\sThis\ssaves\sa\sfew\smore\scycles. +D 2019-07-11T18:43:33.538 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 2902f393b08e33f4af42e2b63f943be62f5de096138461459de60084f598a056 +F src/parse.y 6f2e8ec7df1e4d4ab57c3c4f9e4815b13a78357685a917a512d6f3d949d8c435 F src/pcache.c fd2d0553b3222d6b9f7cb251079e5bca1299d1161da3027b525932d8bf46340a F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d @@ -1833,7 +1833,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7a1e30a17f57ca006dd84b6f97b0c7811bf4c6da4b02903452ffc4bc363cab9b -R 6bd4ab9e9ad32527f5b65731f0494801 +P bcc8b38ac75b731a4cd2873ab83f423be036467a511b617c779869de9bbb5383 +R 7366949ada14c091807ed4dad610ae76 U dan -Z 7ff155988343772e802f3ddf15426065 +Z 9f13574d0ae5d3c1b08c0a4ecde014da diff --git a/manifest.uuid b/manifest.uuid index 5793e74a4c..0fa6ef7732 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bcc8b38ac75b731a4cd2873ab83f423be036467a511b617c779869de9bbb5383 \ No newline at end of file +be01b801fbc258f0ab9542130cec12a5ea5e2d0bf087684a9eda909ad459c211 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index dda9f627aa..3cef3e5e6b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1036,23 +1036,31 @@ expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. { %endif SQLITE_OMIT_CAST -%ifdef SQLITE_OMIT_WINDOWFUNC expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. { A = sqlite3ExprFunction(pParse, Y, &X, D); } expr(A) ::= id(X) LP STAR RP. { A = sqlite3ExprFunction(pParse, 0, &X, 0); } -%endif %ifndef SQLITE_OMIT_WINDOWFUNC -expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_opt(F) over_opt(Z). { - A = sqlite3ExprFunction(pParse, Y, &X, D); - sqlite3WindowAttach(pParse, A, F, Z); +%type filter_over { + struct FunctionTail { + Window *pWin; + Expr *pFilter; + } } -expr(A) ::= id(X) LP STAR RP filter_opt(F) over_opt(Z). { +%destructor filter_over { + sqlite3WindowDelete(pParse->db, $$.pWin); + sqlite3ExprDelete(pParse->db, $$.pFilter); +} +expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_over(F). { + A = sqlite3ExprFunction(pParse, Y, &X, D); + sqlite3WindowAttach(pParse, A, F.pFilter, F.pWin); +} +expr(A) ::= id(X) LP STAR RP filter_over(F). { A = sqlite3ExprFunction(pParse, 0, &X, 0); - sqlite3WindowAttach(pParse, A, F, Z); + sqlite3WindowAttach(pParse, A, F.pFilter, F.pWin); } %endif @@ -1659,8 +1667,11 @@ windowdefn(A) ::= nm(X) AS LP window(Y) RP. { %type part_opt {ExprList*} %destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);} -%type filter_opt {Expr*} -%destructor filter_opt {sqlite3ExprDelete(pParse->db, $$);} +%type filter_clause {Expr*} +%destructor filter_clause {sqlite3ExprDelete(pParse->db, $$);} + +%type over_clause {Window*} +%destructor over_clause {sqlite3WindowDelete(pParse->db, $$);} %type range_or_rows {int} @@ -1726,22 +1737,31 @@ frame_exclude(A) ::= GROUP|TIES(X). {A = @X; /*A-overwrites-X*/} %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);} window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; } -%type over_opt {Window*} -%destructor over_opt {sqlite3WindowDelete(pParse->db, $$);} -over_opt(A) ::= . { A=0; } -over_opt(A) ::= OVER LP window(Z) RP. { +filter_over(F) ::= filter_clause(A) over_clause(B). { + F.pFilter = A; + F.pWin = B; +} +filter_over(F) ::= over_clause(B). { + F.pFilter = 0; + F.pWin = B; +} +filter_over(F) ::= filter_clause(A). { + F.pFilter = A; + F.pWin = 0; +} + +over_clause(A) ::= OVER LP window(Z) RP. { A = Z; assert( A!=0 ); } -over_opt(A) ::= OVER nm(Z). { +over_clause(A) ::= OVER nm(Z). { A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( A ){ A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n); } } -filter_opt(A) ::= . { A = 0; } -filter_opt(A) ::= FILTER LP WHERE expr(X) RP. { A = X; } +filter_clause(A) ::= FILTER LP WHERE expr(X) RP. { A = X; } %endif /* SQLITE_OMIT_WINDOWFUNC */ /* From c1da4397d6920ebdefbf4eeaf35c780f5478c6fb Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 11 Jul 2019 19:22:36 +0000 Subject: [PATCH 007/221] Move the sqlite3VdbeSerialType() routine in-line in the OP_MakeRecord opcode. Optimizing compilers were doing this already. By doing it manually, we can omit some redundant tests and make the whole thing run a million cycles faster and use about 80 bytes less code space. FossilOrigin-Name: d837ab0da52632699abc09320980606aef020df5020c253f99c97e24bf3c6d00 --- manifest | 19 +++++------- manifest.uuid | 2 +- src/vdbe.c | 84 +++++++++++++++++++++++++++++++++++++++++++-------- src/vdbeInt.h | 2 ++ src/vdbeaux.c | 7 +++++ 5 files changed, 89 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index fcf4a4f733..7f528c7134 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.29.0 -D 2019-07-10T17:32:03.802 +C Move\sthe\ssqlite3VdbeSerialType()\sroutine\sin-line\sin\sthe\sOP_MakeRecord\sopcode.\nOptimizing\scompilers\swere\sdoing\sthis\salready.\s\sBy\sdoing\sit\smanually,\swe\scan\nomit\ssome\sredundant\stests\sand\smake\sthe\swhole\sthing\srun\sa\smillion\scycles\sfaster\nand\suse\sabout\s80\sbytes\sless\scode\sspace. +D 2019-07-11T19:22:36.389 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -594,11 +594,11 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c aaa36d1ac7d55baf007e9c03ee7c826834a51dfe7a56ba4c386318695dd87c99 +F src/vdbe.c 6747c7db45059c04b29dbf4ac2d942fc64eb9be630e6b57e5383b14963d54d74 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 -F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 +F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da -F src/vdbeaux.c 3a803d75875031309204df90977059b12ffb706d16b4baa5e2d99f4353962582 +F src/vdbeaux.c a2da4e67d337d128ec91b295fbd747bb45b4fd3bed0c658af5d7d3000f202fa5 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c f6f277d17d50972571d1394535d4c3d156fdea871d8f327f5b9479984054015a F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 @@ -1831,10 +1831,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6f328c35947d6b3a0741514757b8944692203e89bdb2e7f9bbce8ad9288be344 -R 3dc95c8af87e7b557da20a5426ebc03a -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.29.0 * +P fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6 +R e260e19892adbd2f0708577d483baea9 U drh -Z 4d356946c4c6edd871b6d6986b095a05 +Z d46113f7ae5239b50bcbe10562e19614 diff --git a/manifest.uuid b/manifest.uuid index 0a078bf4da..704f2eb637 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6 \ No newline at end of file +d837ab0da52632699abc09320980606aef020df5020c253f99c97e24bf3c6d00 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index d697d6b1e0..6c34fb0203 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2932,9 +2932,8 @@ case OP_MakeRecord: { pRec = pLast; do{ assert( memIsValid(pRec) ); - serial_type = sqlite3VdbeSerialType(pRec, file_format, &len); - if( pRec->flags & MEM_Zero ){ - if( serial_type==0 ){ + if( pRec->flags & MEM_Null ){ + if( pRec->flags & MEM_Zero ){ /* Values with MEM_Null and MEM_Zero are created by xColumn virtual ** table methods that never invoke sqlite3_result_xxxxx() while ** computing an unchanging column value in an UPDATE statement. @@ -2942,19 +2941,78 @@ case OP_MakeRecord: { ** so that they can be passed through to xUpdate and have ** a true sqlite3_value_nochange(). */ assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB ); - serial_type = 10; - }else if( nData ){ - if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; + pRec->uTemp = 10; }else{ - nZero += pRec->u.nZero; - len -= pRec->u.nZero; + pRec->uTemp = 0; /* Serial-type 0 means NULL */ } + nHdr++; + }else if( pRec->flags & (MEM_Int|MEM_IntReal) ){ + /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ + i64 i = pRec->u.i; + u64 u; + testcase( pRec->flags & MEM_Int ); + testcase( pRec->flags & MEM_IntReal ); + if( i<0 ){ + u = ~i; + }else{ + u = i; + } + nHdr++; + if( u<=127 ){ + if( (i&1)==i && file_format>=4 ){ + pRec->uTemp = 8+(u32)u; + }else{ + nData++; + pRec->uTemp = 1; + } + }else if( u<=32767 ){ + nData += 2; + pRec->uTemp = 2; + }else if( u<=8388607 ){ + nData += 3; + pRec->uTemp = 3; + }else if( u<=2147483647 ){ + nData += 4; + pRec->uTemp = 4; + }else if( u<=140737488355327LL ){ + nData += 6; + pRec->uTemp = 5; + }else{ + nData += 8; + if( pRec->flags & MEM_IntReal ){ + /* If the value is IntReal and is going to take up 8 bytes to store + ** as an integer, then we might as well make it an 8-byte floating + ** point value */ + pRec->u.r = (double)pRec->u.i; + pRec->flags &= ~MEM_IntReal; + pRec->flags |= MEM_Real; + pRec->uTemp = 7; + }else{ + pRec->uTemp = 6; + } + } + }else if( pRec->flags & MEM_Real ){ + nHdr++; + nData += 8; + pRec->uTemp = 7; + }else{ + assert( db->mallocFailed || pRec->flags&(MEM_Str|MEM_Blob) ); + assert( pRec->n>=0 ); + len = (u32)pRec->n; + serial_type = (len*2) + 12 + ((pRec->flags & MEM_Str)!=0); + if( pRec->flags & MEM_Zero ){ + serial_type += pRec->u.nZero*2; + if( nData ){ + if( sqlite3VdbeMemExpandBlob(pRec) ) goto no_mem; + len += pRec->u.nZero; + }else{ + nZero += pRec->u.nZero; + } + } + nData += len; + nHdr += sqlite3VarintLen(serial_type); + pRec->uTemp = serial_type; } - nData += len; - testcase( serial_type==127 ); - testcase( serial_type==128 ); - nHdr += serial_type<=127 ? 1 : sqlite3VarintLen(serial_type); - pRec->uTemp = serial_type; if( pRec==pData0 ) break; pRec--; }while(1); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 17e057b188..3332b4838f 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -486,7 +486,9 @@ int sqlite3VdbeCursorMoveto(VdbeCursor**, int*); int sqlite3VdbeCursorRestore(VdbeCursor*); u32 sqlite3VdbeSerialTypeLen(u32); u8 sqlite3VdbeOneByteSerialTypeLen(u8); +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 u32 sqlite3VdbeSerialType(Mem*, int, u32*); +#endif u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 8dd2b421aa..c21d7db40a 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3430,10 +3430,16 @@ int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ ** of SQLite will not understand those serial types. */ +#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 /* ** Return the serial-type for the value stored in pMem. ** ** This routine might convert a large MEM_IntReal value into MEM_Real. +** +** 2019-07-11: The primary user of this subroutine was the OP_MakeRecord +** opcode in the byte-code engine. But by moving this routine in-line, we +** can omit some redundant tests and make that opcode a lot faster. So +** this routine is now only used by the STAT3/4 logic. */ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ int flags = pMem->flags; @@ -3494,6 +3500,7 @@ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ *pLen = n; return ((n*2) + 12 + ((flags&MEM_Str)!=0)); } +#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ /* ** The sizes for serial types less than 128 From 7f88a24dc63ee8b5323c2236769517ad03d13926 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 11 Jul 2019 19:27:02 +0000 Subject: [PATCH 008/221] Increase the version number to 3.30.0 for the next release cycle. FossilOrigin-Name: 2578e3c64b0a92ab92143f18d107a1a180bd6fa87243661930771c4c080f8098 --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/VERSION b/VERSION index c7c9773262..1cfe511a3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.29.0 +3.30.0 diff --git a/configure b/configure index a8b1214943..d2806c20c4 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.29.0. +# Generated by GNU Autoconf 2.69 for sqlite 3.30.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.29.0' -PACKAGE_STRING='sqlite 3.29.0' +PACKAGE_VERSION='3.30.0' +PACKAGE_STRING='sqlite 3.30.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1466,7 +1466,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.29.0 to adapt to many kinds of systems. +\`configure' configures sqlite 3.30.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1531,7 +1531,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.29.0:";; + short | recursive ) echo "Configuration of sqlite 3.30.0:";; esac cat <<\_ACEOF @@ -1657,7 +1657,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.29.0 +sqlite configure 3.30.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2076,7 +2076,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.29.0, which was +It was created by sqlite $as_me 3.30.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12232,7 +12232,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.29.0, which was +This file was extended by sqlite $as_me 3.30.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12298,7 +12298,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.29.0 +sqlite config.status 3.30.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index 7f528c7134..8246ba53cc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\sthe\ssqlite3VdbeSerialType()\sroutine\sin-line\sin\sthe\sOP_MakeRecord\sopcode.\nOptimizing\scompilers\swere\sdoing\sthis\salready.\s\sBy\sdoing\sit\smanually,\swe\scan\nomit\ssome\sredundant\stests\sand\smake\sthe\swhole\sthing\srun\sa\smillion\scycles\sfaster\nand\suse\sabout\s80\sbytes\sless\scode\sspace. -D 2019-07-11T19:22:36.389 +C Increase\sthe\sversion\snumber\sto\s3.30.0\sfor\sthe\snext\srelease\scycle. +D 2019-07-11T19:27:02.876 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -7,7 +7,7 @@ F Makefile.in 4640daf826b80947a924ac44275c451ffc13007c7c866a5730c8ce5cf9e1dc74 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 26957950b2b4f3b26e311eeea70437f85a77765f71d3a06489466d66ee321100 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION cc8cd90333c65cdf4cb346f356a2ce1eb0f5b7fa1d17a34d7350103e7320af1f +F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -34,7 +34,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 4a97fb6ccce582ebb3dc5a7e281e5e2823574dad851b8ccf814aa6de9f4c7ad2 x +F configure 6f5136d2574d7aa08370021ab63be3ef8a8bf32af60594de08393b01feeb4bab x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -1831,7 +1831,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6 -R e260e19892adbd2f0708577d483baea9 +P d837ab0da52632699abc09320980606aef020df5020c253f99c97e24bf3c6d00 +R 6833cc22c98f4349178f2938814a212d U drh -Z d46113f7ae5239b50bcbe10562e19614 +Z a695838ee167bf93e6ec909adf5a647f diff --git a/manifest.uuid b/manifest.uuid index 704f2eb637..18890a82e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d837ab0da52632699abc09320980606aef020df5020c253f99c97e24bf3c6d00 \ No newline at end of file +2578e3c64b0a92ab92143f18d107a1a180bd6fa87243661930771c4c080f8098 \ No newline at end of file From 76fd7be3a31d466202bc6ee9026d02150fcc12da Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 11 Jul 2019 19:50:18 +0000 Subject: [PATCH 009/221] Improved comments and extra testcase() macros on the serial-type computation logic in the OP_MakeRecord opcode. FossilOrigin-Name: 18bfb2179ce2c60cec8f5859a84b737731a5e53b28e35072cbb249f18b94262b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8246ba53cc..d80704c8a3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Increase\sthe\sversion\snumber\sto\s3.30.0\sfor\sthe\snext\srelease\scycle. -D 2019-07-11T19:27:02.876 +C Improved\scomments\sand\sextra\stestcase()\smacros\son\sthe\sserial-type\scomputation\nlogic\sin\sthe\sOP_MakeRecord\sopcode. +D 2019-07-11T19:50:18.474 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -594,7 +594,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 6747c7db45059c04b29dbf4ac2d942fc64eb9be630e6b57e5383b14963d54d74 +F src/vdbe.c 0f2927b83545c544b6804ce46a1f5f9b6f135a4dab71287269c8f95fe73a8437 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -1831,7 +1831,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d837ab0da52632699abc09320980606aef020df5020c253f99c97e24bf3c6d00 -R 6833cc22c98f4349178f2938814a212d +P 2578e3c64b0a92ab92143f18d107a1a180bd6fa87243661930771c4c080f8098 +R a67b0a32f751a8da1c645dcd2a8e0e61 U drh -Z a695838ee167bf93e6ec909adf5a647f +Z 7bf344500406ecbc140109ce4e156421 diff --git a/manifest.uuid b/manifest.uuid index 18890a82e0..97170210e1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2578e3c64b0a92ab92143f18d107a1a180bd6fa87243661930771c4c080f8098 \ No newline at end of file +18bfb2179ce2c60cec8f5859a84b737731a5e53b28e35072cbb249f18b94262b \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 6c34fb0203..018ba97d32 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2927,7 +2927,30 @@ case OP_MakeRecord: { #endif /* Loop through the elements that will make up the record to figure - ** out how much space is required for the new record. + ** out how much space is required for the new record. After this loop, + ** the Mem.uTemp field of each term should hold the serial-type that will + ** be used for that term in the generated record: + ** + ** Mem.uTemp value type + ** --------------- --------------- + ** 0 NULL + ** 1 1-byte signed integer + ** 2 2-byte signed integer + ** 3 3-byte signed integer + ** 4 4-byte signed integer + ** 5 6-byte signed integer + ** 6 8-byte signed integer + ** 7 IEEE float + ** 8 Integer constant 0 + ** 9 Integer constant 1 + ** 10,11 reserved for expansion + ** N>=12 and even BLOB + ** N>=13 and odd text + ** + ** The following additional values are computed: + ** nHdr Number of bytes needed for the record header + ** nData Number of bytes of data space needed for the record + ** nZero Zero bytes at the end of the record */ pRec = pLast; do{ @@ -2943,7 +2966,7 @@ case OP_MakeRecord: { assert( pOp->p5==OPFLAG_NOCHNG_MAGIC || CORRUPT_DB ); pRec->uTemp = 10; }else{ - pRec->uTemp = 0; /* Serial-type 0 means NULL */ + pRec->uTemp = 0; } nHdr++; }else if( pRec->flags & (MEM_Int|MEM_IntReal) ){ @@ -2958,6 +2981,11 @@ case OP_MakeRecord: { u = i; } nHdr++; + testcase( u==127 ); testcase( u==128 ); + testcase( u==32767 ); testcase( u==32768 ); + testcase( u==8388607 ); testcase( u==8388608 ); + testcase( u==2147483647 ); testcase( u==2147483648 ); + testcase( u==140737488355327LL ); testcase( u==140737488355328LL ); if( u<=127 ){ if( (i&1)==i && file_format>=4 ){ pRec->uTemp = 8+(u32)u; From 52d9a3c2137bac76a826a24d2c466d06f3ac49d4 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 12 Jul 2019 15:15:43 +0000 Subject: [PATCH 010/221] Minor performance improvement in vdbeRecordCompareString(). FossilOrigin-Name: 777fec84a5db968e033883920586ec0afef65578be0c1eb3021fce525111edde --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 8bde9a3060..5625d1bf81 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sparser\son\sthis\sbranch\sto\smore\sclosely\smatch\strunk.\sThis\ssaves\sa\sfew\smore\scycles. -D 2019-07-11T18:43:33.538 +C Minor\sperformance\simprovement\sin\svdbeRecordCompareString(). +D 2019-07-12T15:15:43.883 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -598,7 +598,7 @@ F src/vdbe.c aaa36d1ac7d55baf007e9c03ee7c826834a51dfe7a56ba4c386318695dd87c99 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da -F src/vdbeaux.c 3a803d75875031309204df90977059b12ffb706d16b4baa5e2d99f4353962582 +F src/vdbeaux.c 6e690cf78b75cb30a35498be14d86656eda2a350e21b7f34723bac6fb4b06504 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 F src/vdbemem.c 9ee3c0373bfc05dc8bf5307a4a92be6bea3055928c4846fdced7e708993b2d6d F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 @@ -1833,7 +1833,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bcc8b38ac75b731a4cd2873ab83f423be036467a511b617c779869de9bbb5383 -R 7366949ada14c091807ed4dad610ae76 +P be01b801fbc258f0ab9542130cec12a5ea5e2d0bf087684a9eda909ad459c211 +R 2db1f8ff35294de6464c20bf61e9dedc U dan -Z 9f13574d0ae5d3c1b08c0a4ecde014da +Z ac0afc3f61428d63511d6d358e65ee50 diff --git a/manifest.uuid b/manifest.uuid index 0fa6ef7732..2466c0473c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -be01b801fbc258f0ab9542130cec12a5ea5e2d0bf087684a9eda909ad459c211 \ No newline at end of file +777fec84a5db968e033883920586ec0afef65578be0c1eb3021fce525111edde \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 8dd2b421aa..70f56c3a53 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -4600,7 +4600,11 @@ static int vdbeRecordCompareString( nCmp = MIN( pPKey2->aMem[0].n, nStr ); res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp); - if( res==0 ){ + if( res>0 ){ + res = pPKey2->r2; + }else if( res<0 ){ + res = pPKey2->r1; + }else{ res = nStr - pPKey2->aMem[0].n; if( res==0 ){ if( pPKey2->nField>1 ){ @@ -4614,10 +4618,6 @@ static int vdbeRecordCompareString( }else{ res = pPKey2->r1; } - }else if( res>0 ){ - res = pPKey2->r2; - }else{ - res = pPKey2->r1; } } From 01fd42beef1c16b8998ca8dba0bbc43e97efe9fd Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Jul 2019 09:55:33 +0000 Subject: [PATCH 011/221] Trivial performance improvement for balance(). FossilOrigin-Name: c7920f5569022f645ec4dbfce8c228880263785c708c2c0ac065e770c438b1d9 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 5625d1bf81..b5cdca5d5d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sperformance\simprovement\sin\svdbeRecordCompareString(). -D 2019-07-12T15:15:43.883 +C Trivial\sperformance\simprovement\sfor\sbalance(). +D 2019-07-13T09:55:33.596 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -463,7 +463,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c b1d37f6f7f5913944583733ed0f9e182f3ece0d42c27f46701142141a6e6fd33 F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 1dbc191e5c1d9bca84a956fed5d73924c574ae5390855009f067bd0f6422e462 +F src/btree.c 0e30c98649796a91a889c2ab1c2f032da9918ac5244a3688ed97e8b5779b61fa F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c c5b97d3518c13081169027f291ff84b12661d526deb605031d413223ff2e0f03 @@ -1833,7 +1833,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P be01b801fbc258f0ab9542130cec12a5ea5e2d0bf087684a9eda909ad459c211 -R 2db1f8ff35294de6464c20bf61e9dedc +P 777fec84a5db968e033883920586ec0afef65578be0c1eb3021fce525111edde +R 6059011e317373b890b2b02abcd3b80f U dan -Z ac0afc3f61428d63511d6d358e65ee50 +Z d0830bba5f797d712713acf5cb732357 diff --git a/manifest.uuid b/manifest.uuid index 2466c0473c..fcfc1efc2b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -777fec84a5db968e033883920586ec0afef65578be0c1eb3021fce525111edde \ No newline at end of file +c7920f5569022f645ec4dbfce8c228880263785c708c2c0ac065e770c438b1d9 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 6c73a94223..5f82f1cc0a 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8307,11 +8307,13 @@ static int balance(BtCursor *pCur){ VVA_ONLY( int balance_deeper_called = 0 ); do { - int iPage = pCur->iPage; + int iPage; MemPage *pPage = pCur->pPage; if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; - if( iPage==0 ){ + if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ + break; + }else if( (iPage = pCur->iPage)==0 ){ if( pPage->nOverflow ){ /* The root page of the b-tree is overfull. In this case call the ** balance_deeper() function to create a new child for the root-page @@ -8332,8 +8334,6 @@ static int balance(BtCursor *pCur){ }else{ break; } - }else if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ - break; }else{ MemPage * const pParent = pCur->apPage[iPage-1]; int const iIdx = pCur->aiIdx[iPage-1]; From 8616cff6c8541e2837ccb7a2bc5792de5aba962f Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 13 Jul 2019 16:15:23 +0000 Subject: [PATCH 012/221] Remove unreachable "break" statements to silence harmless compiler warnings from ICC. FossilOrigin-Name: 0d7287e1bfdd5a392bf2fb17699e7cfd0b08bf61fab6cbf4b4bb347b3c4b4610 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 2 +- src/vdbe.c | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index d80704c8a3..2bdd0f5c02 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\scomments\sand\sextra\stestcase()\smacros\son\sthe\sserial-type\scomputation\nlogic\sin\sthe\sOP_MakeRecord\sopcode. -D 2019-07-11T19:50:18.474 +C Remove\sunreachable\s"break"\sstatements\sto\ssilence\sharmless\scompiler\swarnings\nfrom\sICC. +D 2019-07-13T16:15:23.170 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -506,7 +506,7 @@ F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0 +F src/os_unix.c 94576efb914859d235b879a4c784da3121bf1f5514e4cad972652d2c60db195d F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b @@ -594,7 +594,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 0f2927b83545c544b6804ce46a1f5f9b6f135a4dab71287269c8f95fe73a8437 +F src/vdbe.c e9493a767fafd71bb9b10462a39b3af36d029d4e47e8cc4f531f89175dadf7f4 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -1831,7 +1831,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2578e3c64b0a92ab92143f18d107a1a180bd6fa87243661930771c4c080f8098 -R a67b0a32f751a8da1c645dcd2a8e0e61 +P 18bfb2179ce2c60cec8f5859a84b737731a5e53b28e35072cbb249f18b94262b +R f8c803745189eeccce948a3e0c8a7622 U drh -Z 7bf344500406ecbc140109ce4e156421 +Z 30db5a05339ca75cff828d9d142b8bbe diff --git a/manifest.uuid b/manifest.uuid index 97170210e1..2539d44dde 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -18bfb2179ce2c60cec8f5859a84b737731a5e53b28e35072cbb249f18b94262b \ No newline at end of file +0d7287e1bfdd5a392bf2fb17699e7cfd0b08bf61fab6cbf4b4bb347b3c4b4610 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index f20763e5b0..103df1d199 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -7603,7 +7603,7 @@ static int proxyFileControl(sqlite3_file *id, int op, void *pArg){ assert( 0 ); /* The call assures that only valid opcodes are sent */ } } - /*NOTREACHED*/ + /*NOTREACHED*/ assert(0); return SQLITE_ERROR; } diff --git a/src/vdbe.c b/src/vdbe.c index 018ba97d32..8dead8cdfe 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3376,7 +3376,7 @@ case OP_AutoCommit: { rc = SQLITE_ERROR; goto abort_due_to_error; } - break; + /*NOTREACHED*/ assert(0); } /* Opcode: Transaction P1 P2 P3 P4 P5 @@ -4132,8 +4132,8 @@ case OP_SeekGT: { /* jump, in3, group */ if( (pIn3->flags & (MEM_Int|MEM_IntReal))==0 ){ if( (pIn3->flags & MEM_Real)==0 ){ if( (pIn3->flags & MEM_Null) || oc>=OP_SeekGE ){ - VdbeBranchTaken(1,2); goto jump_to_p2; - break; + VdbeBranchTaken(1,2); + goto jump_to_p2; }else{ rc = sqlite3BtreeLast(pC->uc.pCursor, &res); if( rc!=SQLITE_OK ) goto abort_due_to_error; From 4f9adee289fcc8de83054332212c90f389609d4a Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Jul 2019 16:22:50 +0000 Subject: [PATCH 013/221] Rework the FILTER clause implementation to share more code with window functions. FossilOrigin-Name: 5dac8c38dfc3f41c5c8fb49ca35de7fd1b21f269d72e8ba6ba59ed0a4030a54d --- manifest | 26 ++++++++++++------------ manifest.uuid | 2 +- src/expr.c | 50 ++++++++++++++--------------------------------- src/parse.y | 41 +++++++++++++++++--------------------- src/resolve.c | 24 +++++++++++++---------- src/select.c | 16 ++++++++------- src/sqliteInt.h | 18 +++++++++++------ src/walker.c | 12 ++++-------- src/window.c | 28 ++++++++++++-------------- test/filter1.test | 18 ++++++++++++++++- 10 files changed, 116 insertions(+), 119 deletions(-) diff --git a/manifest b/manifest index 89b26fe6de..66070b23b5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schanges\sinto\sthis\sbranch. -D 2019-07-13T09:56:56.654 +C Rework\sthe\sFILTER\sclause\simplementation\sto\sshare\smore\scode\swith\swindow\sfunctions. +D 2019-07-13T16:22:50.675 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 01bbd69f29936bba85dba6188a409c1e21a0c260bf04b9fc78d5e9702a77acb5 +F src/expr.c 896c4576cd88a0dc5b5ae0abd236b507b778105b58744bd8974fac98fc432b4c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 6f2e8ec7df1e4d4ab57c3c4f9e4815b13a78357685a917a512d6f3d949d8c435 +F src/parse.y ef494825aa4d633b601af10f936fe50a630bd4c4a6ceb4d941ecfb6756e06c56 F src/pcache.c fd2d0553b3222d6b9f7cb251079e5bca1299d1161da3027b525932d8bf46340a F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c e6373934cdafea272d94feb224344f9fd93ff94318221b64ccabd72d98b4672e @@ -520,14 +520,14 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c d633c3610c23dc98239ea445803c2a6188c2b8ab647e3df4243f369516e6c8d1 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 138c9e9d8828f199709bd7c970d98aaff47a21d33c6c42ffb6e1e809620fcc9e +F src/resolve.c 6d96d5c1cfa48e49df160aee6032dbb1f79e1d04163c34f9be5625828ac9a2ec F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 98362f190fd6f70f8f612f38a898da4e30b086f13f4c5dab8c04c21ae5a61804 +F src/select.c 1ac359aed1a83239ce3434c0620e488ad9cf25dee829b86c89f7fe4b5cd366c5 F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 13fa73fd67968a4e3c58c84fbd655770989a82e0902880b0446747cd6711ad74 +F src/sqliteInt.h e989d94d02e4389480e7abf4d86dbdd23d94f3e15db77c1424b67c75f8d97428 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -607,12 +607,12 @@ F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c b09a2a9cab50efa08451a8c81d47052120ad5da174048c6d0b08d405384abdf2 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c 588e7f5faf30d2e68aa9b176258bb3225d0553171b998b06b69ed74a0528e986 +F src/walker.c ccbe57a6eeedce5826510c509cebb547e0c877d53f14b3118698643057d4b597 F src/where.c 2f11eeb14335b7640f886b2fb441f54a94c35ab5cde8b53461a1074bfd587081 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 1d78310e655ce2a697a54cf28b713ae9dff9d1d6c5d370233499e0efbf96c699 +F src/window.c 6cfb1b3c821a4cb2c6f262c6a61cd400a2803b390370e3d45d7e59b9f38e61da F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -856,7 +856,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test 8a0f541d2138a10b41c513a9b8193af09d5218ca4e670bc6fd9ed121db1b7bf3 +F test/filter1.test 5830d6214399abb874f2c0293d299b8cbd02d56b8e529e509befd322f1bc2003 F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 @@ -1834,7 +1834,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c7920f5569022f645ec4dbfce8c228880263785c708c2c0ac065e770c438b1d9 18bfb2179ce2c60cec8f5859a84b737731a5e53b28e35072cbb249f18b94262b -R 7c05f3663f5bc895dff508dc36c38a46 +P 86ab963cc5743867e0535b78a5776e18c13835aa44bf2009f77642df8407cb3f +R 7f5ccdaf1d791cabe4704b7e56f0cde3 U dan -Z b8ee1e32a67789f7b92523a517ccd572 +Z d18b0c3413514388f116d5ed56fe7aa4 diff --git a/manifest.uuid b/manifest.uuid index f67e4b02d9..a886df556a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -86ab963cc5743867e0535b78a5776e18c13835aa44bf2009f77642df8407cb3f \ No newline at end of file +5dac8c38dfc3f41c5c8fb49ca35de7fd1b21f269d72e8ba6ba59ed0a4030a54d \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6fbeb827fb..9ba81a8455 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1027,7 +1027,7 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( !ExprHasProperty(p, EP_WinFunc) || p->y.pWin!=0 || db->mallocFailed ); assert( p->op!=TK_FUNCTION || ExprHasProperty(p, EP_TokenOnly|EP_Reduced) - || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc|EP_Filter) ); + || p->y.pWin==0 || ExprHasProperty(p, EP_WinFunc) ); #ifdef SQLITE_DEBUG if( ExprHasProperty(p, EP_Leaf) && !ExprHasProperty(p, EP_TokenOnly) ){ assert( p->pLeft==0 ); @@ -1040,22 +1040,16 @@ static SQLITE_NOINLINE void sqlite3ExprDeleteNN(sqlite3 *db, Expr *p){ assert( p->x.pList==0 || p->pRight==0 ); if( p->pLeft && p->op!=TK_SELECT_COLUMN ) sqlite3ExprDeleteNN(db, p->pLeft); if( p->pRight ){ - assert( !ExprHasProperty(p, (EP_WinFunc|EP_Filter)) ); + assert( !ExprHasProperty(p, EP_WinFunc) ); sqlite3ExprDeleteNN(db, p->pRight); }else if( ExprHasProperty(p, EP_xIsSelect) ){ - assert( !ExprHasProperty(p, (EP_WinFunc|EP_Filter)) ); + assert( !ExprHasProperty(p, EP_WinFunc) ); sqlite3SelectDelete(db, p->x.pSelect); }else{ sqlite3ExprListDelete(db, p->x.pList); #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(p, (EP_WinFunc|EP_Filter)) ){ - if( ExprHasProperty(p, EP_WinFunc) ){ - assert( p->op==TK_FUNCTION && !ExprHasProperty(p, EP_Filter) ); - sqlite3WindowDelete(db, p->y.pWin); - }else{ - assert( p->op==TK_FUNCTION || p->op==TK_AGG_FUNCTION ); - sqlite3ExprDeleteNN(db, p->y.pFilter); - } + if( ExprHasProperty(p, EP_WinFunc) ){ + sqlite3WindowDelete(db, p->y.pWin); } #endif } @@ -1273,7 +1267,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ } /* Fill in pNew->pLeft and pNew->pRight. */ - if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc|EP_Filter) ){ + if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly|EP_WinFunc) ){ zAlloc += dupedExprNodeSize(p, dupFlags); if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){ pNew->pLeft = p->pLeft ? @@ -1286,10 +1280,6 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ pNew->y.pWin = sqlite3WindowDup(db, pNew, p->y.pWin); assert( ExprHasProperty(pNew, EP_WinFunc) ); } - if( ExprHasProperty(p, EP_Filter) ){ - pNew->y.pFilter = sqlite3ExprDup(db, p->y.pFilter, 0); - assert( ExprHasProperty(pNew, EP_Filter) ); - } #endif /* SQLITE_OMIT_WINDOWFUNC */ if( pzBuffer ){ *pzBuffer = zAlloc; @@ -1347,6 +1337,7 @@ static With *withDup(sqlite3 *db, With *p){ static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_WinFunc) ){ assert( pExpr->y.pWin ); + assert( IsWindowFunc(pExpr) ); pExpr->y.pWin->pNextWin = pWalker->u.pSelect->pWin; pWalker->u.pSelect->pWin = pExpr->y.pWin; } @@ -4852,20 +4843,17 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ return 2; } if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ - if( pA->op==TK_FUNCTION ){ + if( pA->op==TK_FUNCTION || pA->op==TK_AGG_FUNCTION ){ if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; #ifndef SQLITE_OMIT_WINDOWFUNC - /* Justification for the assert(): - ** window functions have p->op==TK_FUNCTION but aggregate functions - ** have p->op==TK_AGG_FUNCTION. So any comparison between an aggregate - ** function and a window function should have failed before reaching - ** this point. And, it is not possible to have a window function and - ** a scalar function with the same name and number of arguments. So - ** if we reach this point, either A and B both window functions or - ** neither are a window functions. */ - assert( ExprHasProperty(pA,EP_WinFunc)==ExprHasProperty(pB,EP_WinFunc) ); + assert( pA->op==pB->op ); + if( ExprHasProperty(pA,EP_WinFunc)!=ExprHasProperty(pB,EP_WinFunc) ){ + return 2; + } if( ExprHasProperty(pA,EP_WinFunc) ){ - if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2; + if( sqlite3WindowCompare(pParse, pA->y.pWin, pB->y.pWin, 1)!=0 ){ + return 2; + } } #endif }else if( pA->op==TK_NULL ){ @@ -4875,14 +4863,6 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } -#ifndef SQLITE_OMIT_WINDOWFUNC - else if( pA->op==TK_AGG_FUNCTION ){ - assert( ExprHasProperty(pA, EP_WinFunc)==0 ); - if( sqlite3ExprCompare(pParse, pA->y.pFilter, pB->y.pFilter, iTab) ){ - return 2; - } - } -#endif } if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; if( (combinedFlags & EP_TokenOnly)==0 ){ diff --git a/src/parse.y b/src/parse.y index 3cef3e5e6b..7a3835a627 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1044,23 +1044,13 @@ expr(A) ::= id(X) LP STAR RP. { } %ifndef SQLITE_OMIT_WINDOWFUNC -%type filter_over { - struct FunctionTail { - Window *pWin; - Expr *pFilter; - } -} -%destructor filter_over { - sqlite3WindowDelete(pParse->db, $$.pWin); - sqlite3ExprDelete(pParse->db, $$.pFilter); -} -expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_over(F). { +expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP filter_over(Z). { A = sqlite3ExprFunction(pParse, Y, &X, D); - sqlite3WindowAttach(pParse, A, F.pFilter, F.pWin); + sqlite3WindowAttach(pParse, A, Z); } -expr(A) ::= id(X) LP STAR RP filter_over(F). { +expr(A) ::= id(X) LP STAR RP filter_over(Z). { A = sqlite3ExprFunction(pParse, 0, &X, 0); - sqlite3WindowAttach(pParse, A, F.pFilter, F.pWin); + sqlite3WindowAttach(pParse, A, Z); } %endif @@ -1673,6 +1663,9 @@ windowdefn(A) ::= nm(X) AS LP window(Y) RP. { %type over_clause {Window*} %destructor over_clause {sqlite3WindowDelete(pParse->db, $$);} +%type filter_over {Window*} +%destructor filter_over {sqlite3WindowDelete(pParse->db, $$);} + %type range_or_rows {int} %type frame_bound {struct FrameBound} @@ -1737,17 +1730,19 @@ frame_exclude(A) ::= GROUP|TIES(X). {A = @X; /*A-overwrites-X*/} %destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);} window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; } -filter_over(F) ::= filter_clause(A) over_clause(B). { - F.pFilter = A; - F.pWin = B; +filter_over(A) ::= filter_clause(F) over_clause(O). { + O->pFilter = F; + A = O; } -filter_over(F) ::= over_clause(B). { - F.pFilter = 0; - F.pWin = B; +filter_over(A) ::= over_clause(O). { + A = O; } -filter_over(F) ::= filter_clause(A). { - F.pFilter = A; - F.pWin = 0; +filter_over(A) ::= filter_clause(F). { + A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); + if( A ){ + A->eFrmType = TK_FILTER; + A->pFilter = F; + } } over_clause(A) ::= OVER LP window(Z) RP. { diff --git a/src/resolve.c b/src/resolve.c index 37aaa92606..872d04f57a 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -749,7 +749,9 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ FuncDef *pDef; /* Information about the function */ u8 enc = ENC(pParse->db); /* The database encoding */ int savedAllowFlags = (pNC->ncFlags & (NC_AllowAgg | NC_AllowWin)); - +#ifndef SQLITE_OMIT_WINDOWFUNC + Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); +#endif assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); zId = pExpr->u.zToken; nId = sqlite3Strlen30(zId); @@ -826,7 +828,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( 0==IN_RENAME_OBJECT ){ #ifndef SQLITE_OMIT_WINDOWFUNC - Window *pWin = (ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0); assert( is_agg==0 || (pDef->funcFlags & SQLITE_FUNC_MINMAX) || (pDef->xValue==0 && pDef->xInverse==0) || (pDef->xValue && pDef->xInverse && pDef->xSFunc && pDef->xFinalize) @@ -850,7 +851,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId); pNC->nErr++; is_agg = 0; - }else if( is_agg==0 && ExprHasProperty(pExpr, EP_Filter) ){ + }else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ + assert( !IsWindowFunc(pExpr) ); sqlite3ErrorMsg(pParse, "filter clause may not be used with non-aggregate %.*s()", nId, zId @@ -890,16 +892,16 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ sqlite3WalkExprList(pWalker, pList); if( is_agg ){ #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( pWin ){ Select *pSel = pNC->pWinSelect; if( IN_RENAME_OBJECT==0 ){ - sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); + sqlite3WindowUpdate(pParse, pSel->pWinDefn, pWin, pDef); } - sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition); - sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy); - sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); + sqlite3WalkExprList(pWalker, pWin->pPartition); + sqlite3WalkExprList(pWalker, pWin->pOrderBy); + sqlite3WalkExpr(pWalker, pWin->pFilter); if( 0==pSel->pWin - || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin) + || 0==sqlite3WindowCompare(pParse, pSel->pWin, pWin, 0) ){ pExpr->y.pWin->pNextWin = pSel->pWin; pSel->pWin = pExpr->y.pWin; @@ -912,7 +914,9 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pExpr->op = TK_AGG_FUNCTION; pExpr->op2 = 0; #ifndef SQLITE_OMIT_WINDOWFUNC - sqlite3WalkExpr(pWalker, pExpr->y.pFilter); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); + } #endif while( pNC2 && !sqlite3FunctionUsesThisSrc(pExpr, pNC2->pSrcList) ){ pExpr->op2++; diff --git a/src/select.c b/src/select.c index 8b18e20d05..dc388b1f79 100644 --- a/src/select.c +++ b/src/select.c @@ -4403,7 +4403,8 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ assert( *ppMinMax==0 ); assert( pFunc->op==TK_AGG_FUNCTION ); - if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_Filter) ){ + assert( !IsWindowFunc(pFunc) ); + if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_WinFunc) ){ return eRet; } zFunc = pFunc->u.zToken; @@ -4452,7 +4453,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ if( pExpr->op!=TK_AGG_FUNCTION ) return 0; if( NEVER(pAggInfo->nFunc==0) ) return 0; if( (pAggInfo->aFunc[0].pFunc->funcFlags&SQLITE_FUNC_COUNT)==0 ) return 0; - if( ExprHasProperty(pExpr, EP_Distinct|EP_Filter) ) return 0; + if( ExprHasProperty(pExpr, EP_Distinct|EP_WinFunc) ) return 0; return pTab; } @@ -5332,8 +5333,9 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ int regAgg; ExprList *pList = pF->pExpr->x.pList; assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); - if( ExprHasProperty(pF->pExpr, EP_Filter) ){ - Expr *pFilter = pF->pExpr->y.pFilter; + assert( !IsWindowFunc(pF->pExpr) ); + if( ExprHasProperty(pF->pExpr, EP_WinFunc) ){ + Expr *pFilter = pF->pExpr->y.pWin->pFilter; addrNext = sqlite3VdbeMakeLabel(pParse); sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL); } @@ -6236,9 +6238,9 @@ int sqlite3Select( sNC.ncFlags |= NC_InAggFunc; sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); #ifndef SQLITE_OMIT_WINDOWFUNC - assert( !ExprHasProperty(pExpr, EP_WinFunc) ); - if( pExpr->y.pFilter ){ - sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pFilter); + assert( !IsWindowFunc(pExpr) ); + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3ExprAnalyzeAggregates(&sNC, pExpr->y.pWin->pFilter); } #endif sNC.ncFlags &= ~NC_InAggFunc; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c0f2e0a186..037d09e420 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2491,8 +2491,7 @@ struct Expr { union { Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL ** for a column of an index on an expression */ - Window *pWin; /* EP_WinFunc: Window definition for the func */ - Expr *pFilter; /* EP_Filter: Filter definition for the func */ + Window *pWin; /* EP_WinFunc: Window/Filter defn for a function */ struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ int iAddr; /* Subroutine entry address */ int regReturn; /* Register used to hold return address */ @@ -2537,7 +2536,6 @@ struct Expr { #define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ #define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ #define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ -#define EP_Filter 0x40000000 /* TK_[AGG_]FUNCTION with Expr.y.pFilter set */ /* ** The EP_Propagate mask is a set of properties that automatically propagate @@ -2581,6 +2579,14 @@ struct Expr { */ #define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ +/* +** True if the expression passed as an argument was a function with +** an OVER() clause (a window function). +*/ +#define IsWindowFunc(p) ( \ + ExprHasProperty((p), EP_WinFunc) && p->y.pWin->eFrmType!=TK_FILTER \ +) + /* ** A list of expressions. Each expression may optionally have a ** name. An expr/name combination can be used in several ways, such @@ -3604,8 +3610,8 @@ struct Window { void sqlite3WindowDelete(sqlite3*, Window*); void sqlite3WindowListDelete(sqlite3 *db, Window *p); Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); -void sqlite3WindowAttach(Parse*, Expr*, Expr*, Window*); -int sqlite3WindowCompare(Parse*, Window*, Window*); +void sqlite3WindowAttach(Parse*, Expr*, Window*); +int sqlite3WindowCompare(Parse*, Window*, Window*, int); void sqlite3WindowCodeInit(Parse*, Window*); void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); int sqlite3WindowRewrite(Parse*, Select*); @@ -3619,7 +3625,7 @@ Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); #else # define sqlite3WindowDelete(a,b) # define sqlite3WindowFunctions() -# define sqlite3WindowAttach(a,b,c,d) +# define sqlite3WindowAttach(a,b,c) #endif /* diff --git a/src/walker.c b/src/walker.c index 44e3d18363..b976886c5f 100644 --- a/src/walker.c +++ b/src/walker.c @@ -63,23 +63,19 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ if( pExpr->pLeft && walkExpr(pWalker, pExpr->pLeft) ) return WRC_Abort; assert( pExpr->x.pList==0 || pExpr->pRight==0 ); if( pExpr->pRight ){ - assert( !ExprHasProperty(pExpr, EP_WinFunc|EP_Filter) ); + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); pExpr = pExpr->pRight; continue; }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - assert( !ExprHasProperty(pExpr, EP_WinFunc|EP_Filter) ); + assert( !ExprHasProperty(pExpr, EP_WinFunc) ); if( sqlite3WalkSelect(pWalker, pExpr->x.pSelect) ) return WRC_Abort; }else{ if( pExpr->x.pList ){ if( sqlite3WalkExprList(pWalker, pExpr->x.pList) ) return WRC_Abort; } #ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pExpr, EP_WinFunc|EP_Filter) ){ - if( ExprHasProperty(pExpr, EP_WinFunc) ){ - if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; - }else if( ExprHasProperty(pExpr, EP_Filter) ){ - if( walkExpr(pWalker, pExpr->y.pFilter) ) return WRC_Abort; - } + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; } #endif } diff --git a/src/window.c b/src/window.c index b91b0f0504..ed39107b92 100644 --- a/src/window.c +++ b/src/window.c @@ -1193,25 +1193,20 @@ void sqlite3WindowChain(Parse *pParse, Window *pWin, Window *pList){ /* ** Attach window object pWin to expression p. */ -void sqlite3WindowAttach(Parse *pParse, Expr *p, Expr *pFilter, Window *pWin){ +void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ if( p ){ assert( p->op==TK_FUNCTION ); - if( pWin ){ - p->y.pWin = pWin; - ExprSetProperty(p, EP_WinFunc); - pWin->pOwner = p; - if( p->flags & EP_Distinct ){ - sqlite3ErrorMsg(pParse, - "DISTINCT is not supported for window functions"); - } - pWin->pFilter = pFilter; - }else if( pFilter ){ - p->y.pFilter = pFilter; - ExprSetProperty(p, EP_Filter); + assert( pWin ); + p->y.pWin = pWin; + ExprSetProperty(p, EP_WinFunc); + pWin->pOwner = p; + if( (p->flags & EP_Distinct) && pWin->eFrmType!=TK_FILTER ){ + sqlite3ErrorMsg(pParse, + "DISTINCT is not supported for window functions" + ); } }else{ sqlite3WindowDelete(pParse->db, pWin); - sqlite3ExprDelete(pParse->db, pFilter); } } @@ -1219,7 +1214,7 @@ void sqlite3WindowAttach(Parse *pParse, Expr *p, Expr *pFilter, Window *pWin){ ** Return 0 if the two window objects are identical, or non-zero otherwise. ** Identical window objects can be processed in a single scan. */ -int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){ +int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ if( p1->eFrmType!=p2->eFrmType ) return 1; if( p1->eStart!=p2->eStart ) return 1; if( p1->eEnd!=p2->eEnd ) return 1; @@ -1228,6 +1223,9 @@ int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2){ if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1; if( sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1) ) return 1; if( sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1) ) return 1; + if( bFilter ){ + if( sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1) ) return 1; + } return 0; } diff --git a/test/filter1.test b/test/filter1.test index 8c0c14d87f..f0667c91cb 100644 --- a/test/filter1.test +++ b/test/filter1.test @@ -55,10 +55,26 @@ do_execsql_test 1.6 { SELECT count(*) FILTER (WHERE a!=5) FROM t1 } {8} -do_execsql_test 1.6 { +do_execsql_test 1.7 { SELECT min(a) FILTER (WHERE a>3) FROM t1 GROUP BY (a%2) ORDER BY 1; } {4 5} +do_execsql_test 1.8 { + CREATE VIEW vv AS + SELECT sum(a) FILTER( WHERE a>9 ), + sum(a) FILTER( WHERE a>8 ), + sum(a) FILTER( WHERE a>7 ), + sum(a) FILTER( WHERE a>6 ), + sum(a) FILTER( WHERE a>5 ), + sum(a) FILTER( WHERE a>4 ), + sum(a) FILTER( WHERE a>3 ), + sum(a) FILTER( WHERE a>2 ), + sum(a) FILTER( WHERE a>1 ), + sum(a) FILTER( WHERE a>0 ) + FROM t1; + SELECT * FROM vv; +} {{} 9 17 24 30 35 39 42 44 45} + #------------------------------------------------------------------------- # Test some errors: From ea38f4f4ccd5354fd47f5419c84ddef4d2f0c2c6 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 13 Jul 2019 17:21:47 +0000 Subject: [PATCH 014/221] Fix a double-quoted string literal used in the ".schema" command of the CLI. FossilOrigin-Name: fcd937d9786a82ef4147e657d54ea0beb6ac87e2eb1677186b318493d473077b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 30d81a3518..517bd8c1ef 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssupport\sfor\sattaching\sa\sFILTER\sclause\sto\san\saggregate\sfunction. -D 2019-07-13T16:39:38.075 +C Fix\sa\sdouble-quoted\sstring\sliteral\sused\sin\sthe\s".schema"\scommand\sof\sthe\sCLI. +D 2019-07-13T17:21:47.833 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 6d96d5c1cfa48e49df160aee6032dbb1f79e1d04163c34f9be5625828ac9a2ec F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1ac359aed1a83239ce3434c0620e488ad9cf25dee829b86c89f7fe4b5cd366c5 -F src/shell.c.in 82f8a473c01662f52233c6c75b9bf88d0d2cab276086d5d4ca6f2ff57a3e48eb +F src/shell.c.in 5c0171b66ee0aa4be9d5ca112f1ef50aec33dd48e8cbcb36779b9ddba068854a F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1834,7 +1834,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0d7287e1bfdd5a392bf2fb17699e7cfd0b08bf61fab6cbf4b4bb347b3c4b4610 5dac8c38dfc3f41c5c8fb49ca35de7fd1b21f269d72e8ba6ba59ed0a4030a54d -R 561c885d15821daa82f4a82578c1b361 -U dan -Z 16d98d754e52d40d038f719e1b555d93 +P ee293e5aeac0b05a8b809095610fd8b4fdaf8e68cd368de90ec0d45e3582ffe5 +R 8c50384212355af59289eabe0add16fd +U drh +Z 03a48f8a632fec3742ab8189dd22e077 diff --git a/manifest.uuid b/manifest.uuid index 7b0590fec8..34ecc147f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ee293e5aeac0b05a8b809095610fd8b4fdaf8e68cd368de90ec0d45e3582ffe5 \ No newline at end of file +fcd937d9786a82ef4147e657d54ea0beb6ac87e2eb1677186b318493d473077b \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f3edee22d9..28022204c6 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8388,7 +8388,7 @@ static int do_meta_command(char *zLine, ShellState *p){ zDiv = " UNION ALL "; appendText(&sSelect, "SELECT shell_add_schema(sql,", 0); if( sqlite3_stricmp(zDb, "main")!=0 ){ - appendText(&sSelect, zDb, '"'); + appendText(&sSelect, zDb, '\''); }else{ appendText(&sSelect, "NULL", 0); } @@ -8397,7 +8397,7 @@ static int do_meta_command(char *zLine, ShellState *p){ appendText(&sSelect, " AS snum, ", 0); appendText(&sSelect, zDb, '\''); appendText(&sSelect, " AS sname FROM ", 0); - appendText(&sSelect, zDb, '"'); + appendText(&sSelect, zDb, quoteChar(zDb)); appendText(&sSelect, ".sqlite_master", 0); } sqlite3_finalize(pStmt); From 5e61c1b741b3bf6f93445f30454925e430c3ebea Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Jul 2019 17:45:25 +0000 Subject: [PATCH 015/221] Fix error handling for the case where a window function is passed the wrong number of arguments. FossilOrigin-Name: 871796bb19e61c1282d8ac97a82d8b57bde50f2a2a08004ab53136d77c138df4 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/resolve.c | 16 +++++++++------- test/filter1.test | 2 +- test/window1.test | 3 +++ test/windowerr.tcl | 3 +++ test/windowerr.test | 5 +++++ 7 files changed, 33 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 517bd8c1ef..5968007643 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sdouble-quoted\sstring\sliteral\sused\sin\sthe\s".schema"\scommand\sof\sthe\sCLI. -D 2019-07-13T17:21:47.833 +C Fix\serror\shandling\sfor\sthe\scase\swhere\sa\swindow\sfunction\sis\spassed\sthe\swrong\snumber\sof\sarguments. +D 2019-07-13T17:45:25.999 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c d633c3610c23dc98239ea445803c2a6188c2b8ab647e3df4243f369516e6c8d1 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 6d96d5c1cfa48e49df160aee6032dbb1f79e1d04163c34f9be5625828ac9a2ec +F src/resolve.c 17d61645b0782809aa2cc68225e93c3ed6a55ca59edcdbf599b5b4a828cec9fb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1ac359aed1a83239ce3434c0620e488ad9cf25dee829b86c89f7fe4b5cd366c5 F src/shell.c.in 5c0171b66ee0aa4be9d5ca112f1ef50aec33dd48e8cbcb36779b9ddba068854a @@ -856,7 +856,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test 5830d6214399abb874f2c0293d299b8cbd02d56b8e529e509befd322f1bc2003 +F test/filter1.test b6d80d882bc2dfc8f5e6eff3799a2b24f23681cae18a5dc7c1770929cd5bc47e F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 @@ -1698,7 +1698,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 8d453bfaa3f8f0873ba16ca1270c7368f18445065a0003a1b5954ac4e95797b4 +F test/window1.test 18ec9bbd5b01a21504817b278fffa1678d9a2339d7fbe8548a1822eb19f94b15 F test/window2.tcl a44834af6267be6e14882311ef8790bf5047f1b9bc25685ee1762d48dc24f1e7 F test/window2.test 2f3ae63e171dce7f2ac29a41020f4da413b1d7bdaba48ee124fd336b152e34c5 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1712,8 +1712,8 @@ F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f6 F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f F test/window9.test 06495ac733843849b1fca8a79d13ba330d04aba02099703198af2ba7e231f90c -F test/windowerr.tcl abf4d6d0c6d360213af98ed7d538295d905689e83692106f3ece0e3afb9d7f36 -F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9b8e6e4 +F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 +F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5 F test/with1.test d32792084dcb5f6c047d77bb8a032822ef9fe050ade07d0aeffa37753a05e3c9 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab @@ -1834,7 +1834,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ee293e5aeac0b05a8b809095610fd8b4fdaf8e68cd368de90ec0d45e3582ffe5 -R 8c50384212355af59289eabe0add16fd -U drh -Z 03a48f8a632fec3742ab8189dd22e077 +P fcd937d9786a82ef4147e657d54ea0beb6ac87e2eb1677186b318493d473077b +R d26f001a613609b213ec4312466e7422 +U dan +Z b3f894d87d1da0039bf83bf1734fe28d diff --git a/manifest.uuid b/manifest.uuid index 34ecc147f1..80e79c0a7b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fcd937d9786a82ef4147e657d54ea0beb6ac87e2eb1677186b318493d473077b \ No newline at end of file +871796bb19e61c1282d8ac97a82d8b57bde50f2a2a08004ab53136d77c138df4 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 872d04f57a..54475f6d03 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -851,13 +851,6 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ sqlite3ErrorMsg(pParse, "misuse of %s function %.*s()",zType,nId,zId); pNC->nErr++; is_agg = 0; - }else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ - assert( !IsWindowFunc(pExpr) ); - sqlite3ErrorMsg(pParse, - "filter clause may not be used with non-aggregate %.*s()", - nId, zId - ); - pNC->nErr++; } #else if( (is_agg && (pNC->ncFlags & NC_AllowAgg)==0) ){ @@ -878,6 +871,15 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ nId, zId); pNC->nErr++; } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( is_agg==0 && ExprHasProperty(pExpr, EP_WinFunc) ){ + sqlite3ErrorMsg(pParse, + "FILTER may not be used with non-aggregate %.*s()", + nId, zId + ); + pNC->nErr++; + } +#endif if( is_agg ){ /* Window functions may not be arguments of aggregate functions. ** Or arguments of other window functions. But aggregate functions diff --git a/test/filter1.test b/test/filter1.test index f0667c91cb..b4a7ba8e6b 100644 --- a/test/filter1.test +++ b/test/filter1.test @@ -91,7 +91,7 @@ do_execsql_test 2.0 { do_catchsql_test 2.1 { SELECT upper(a) FILTER (WHERE a=1) FROM t1 -} {1 {filter clause may not be used with non-aggregate upper()}} +} {1 {FILTER may not be used with non-aggregate upper()}} do_catchsql_test 2.2 { SELECT sum(a) FILTER (WHERE 1 - max(a) OVER () > 0) FROM t1 diff --git a/test/window1.test b/test/window1.test index 681573896c..3f11df1575 100644 --- a/test/window1.test +++ b/test/window1.test @@ -257,6 +257,9 @@ do_catchsql_test 7.1.6 { do_catchsql_test 7.1.7 { SELECT max(x) OVER abc FROM t1 WINDOW def AS (ORDER BY y); } {1 {no such window: abc}} +do_catchsql_test 7.1.8 { + SELECT row_number(x) OVER () FROM t1 +} {1 {wrong number of arguments to function row_number}} do_execsql_test 7.2 { SELECT diff --git a/test/windowerr.tcl b/test/windowerr.tcl index 272ce6bae7..294e68dc18 100644 --- a/test/windowerr.tcl +++ b/test/windowerr.tcl @@ -64,6 +64,9 @@ errorsql_test 3.2 { WINDOW win AS (ROWS BETWEEN 10 PRECEDING AND x'ABCD' FOLLOWING) } +errorsql_test 3.3 { + SELECT row_number(a) OVER () FROM t1; +} finish_test diff --git a/test/windowerr.test b/test/windowerr.test index 9a4f0a6464..40d994de85 100644 --- a/test/windowerr.test +++ b/test/windowerr.test @@ -108,4 +108,9 @@ do_test 3.2 { catch { execsql { WINDOW win AS (ROWS BETWEEN 10 PRECEDING AND x'ABCD' FOLLOWING) } } } 1 +# PG says ERROR: function row_number(integer) does not exist +do_test 3.3 { catch { execsql { + SELECT row_number(a) OVER () FROM t1; +} } } 1 + finish_test From 8f245174a3fd67a23b248c260942133f54b34b9b Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Jul 2019 17:54:24 +0000 Subject: [PATCH 016/221] Fix a typo in test file window1.test. FossilOrigin-Name: 8c80e81d01abde9a5032cdc1a492d0fccd8db139f78d2db9413a60cfdc8e0f64 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/window1.test | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5968007643..841f7ed4fd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\serror\shandling\sfor\sthe\scase\swhere\sa\swindow\sfunction\sis\spassed\sthe\swrong\snumber\sof\sarguments. -D 2019-07-13T17:45:25.999 +C Fix\sa\stypo\sin\stest\sfile\swindow1.test. +D 2019-07-13T17:54:24.708 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1698,7 +1698,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 18ec9bbd5b01a21504817b278fffa1678d9a2339d7fbe8548a1822eb19f94b15 +F test/window1.test 82202e139647e3797d5257cd896bc957275906c2d2ee1486980f64a5f34f0c3b F test/window2.tcl a44834af6267be6e14882311ef8790bf5047f1b9bc25685ee1762d48dc24f1e7 F test/window2.test 2f3ae63e171dce7f2ac29a41020f4da413b1d7bdaba48ee124fd336b152e34c5 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1834,7 +1834,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fcd937d9786a82ef4147e657d54ea0beb6ac87e2eb1677186b318493d473077b -R d26f001a613609b213ec4312466e7422 +P 871796bb19e61c1282d8ac97a82d8b57bde50f2a2a08004ab53136d77c138df4 +R 921a4617e136cc52806c1f24ca187b4c U dan -Z b3f894d87d1da0039bf83bf1734fe28d +Z 5c7ca9588a550e989ef1f517b9b8df16 diff --git a/manifest.uuid b/manifest.uuid index 80e79c0a7b..1bd2b6690b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -871796bb19e61c1282d8ac97a82d8b57bde50f2a2a08004ab53136d77c138df4 \ No newline at end of file +8c80e81d01abde9a5032cdc1a492d0fccd8db139f78d2db9413a60cfdc8e0f64 \ No newline at end of file diff --git a/test/window1.test b/test/window1.test index 3f11df1575..ccc6b48114 100644 --- a/test/window1.test +++ b/test/window1.test @@ -259,7 +259,7 @@ do_catchsql_test 7.1.7 { } {1 {no such window: abc}} do_catchsql_test 7.1.8 { SELECT row_number(x) OVER () FROM t1 -} {1 {wrong number of arguments to function row_number}} +} {1 {wrong number of arguments to function row_number()}} do_execsql_test 7.2 { SELECT From 00885742712b5f54866b74c167b3cb9597850789 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Jul 2019 18:27:54 +0000 Subject: [PATCH 017/221] Fix a memory leak that could follow an OOM in the new FILTER code. FossilOrigin-Name: 85fd70fead834aed16cffbea892b2255b4e10dd677f4dbbb96062d5ff42efdeb --- manifest | 13 +++++++------ manifest.uuid | 2 +- src/parse.y | 2 ++ test/filterfault.test | 44 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 test/filterfault.test diff --git a/manifest b/manifest index 841f7ed4fd..c83d009764 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\stest\sfile\swindow1.test. -D 2019-07-13T17:54:24.708 +C Fix\sa\smemory\sleak\sthat\scould\sfollow\san\sOOM\sin\sthe\snew\sFILTER\scode. +D 2019-07-13T18:27:54.869 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -511,7 +511,7 @@ F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y ef494825aa4d633b601af10f936fe50a630bd4c4a6ceb4d941ecfb6756e06c56 +F src/parse.y 8ec5ce13db0499d4f18303a535b176ba1606da9dad59ed340fa4ce54d13261a9 F src/pcache.c fd2d0553b3222d6b9f7cb251079e5bca1299d1161da3027b525932d8bf46340a F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c e6373934cdafea272d94feb224344f9fd93ff94318221b64ccabd72d98b4672e @@ -859,6 +859,7 @@ F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2 F test/filter1.test b6d80d882bc2dfc8f5e6eff3799a2b24f23681cae18a5dc7c1770929cd5bc47e F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a +F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 F test/fkey2.test d35d1c81e7569bdd2b872e91750f7098117d2e8291369f70b7e3d50a0e523dc2 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 @@ -1834,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 871796bb19e61c1282d8ac97a82d8b57bde50f2a2a08004ab53136d77c138df4 -R 921a4617e136cc52806c1f24ca187b4c +P 8c80e81d01abde9a5032cdc1a492d0fccd8db139f78d2db9413a60cfdc8e0f64 +R 992785f29513ad28163364a115438b27 U dan -Z 5c7ca9588a550e989ef1f517b9b8df16 +Z a79c487a88edbd1089ddc303df479f2f diff --git a/manifest.uuid b/manifest.uuid index 1bd2b6690b..cf8fb215f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c80e81d01abde9a5032cdc1a492d0fccd8db139f78d2db9413a60cfdc8e0f64 \ No newline at end of file +85fd70fead834aed16cffbea892b2255b4e10dd677f4dbbb96062d5ff42efdeb \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 7a3835a627..fce4c00cdd 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1742,6 +1742,8 @@ filter_over(A) ::= filter_clause(F). { if( A ){ A->eFrmType = TK_FILTER; A->pFilter = F; + }else{ + sqlite3ExprDelete(pParse->db, F); } } diff --git a/test/filterfault.test b/test/filterfault.test new file mode 100644 index 0000000000..a8cde1f555 --- /dev/null +++ b/test/filterfault.test @@ -0,0 +1,44 @@ +# 2018 May 8 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix filterfault + +ifcapable !windowfunc { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b, c, d); + INSERT INTO t1 VALUES(1, 2, 3, 4); + INSERT INTO t1 VALUES(5, 6, 7, 8); + INSERT INTO t1 VALUES(9, 10, 11, 12); +} +faultsim_save_and_close + +do_faultsim_test 1 -faults oom-t* -prep { + faultsim_restore_and_reopen +} -body { + execsql { + SELECT sum(a) FILTER (WHERE b<5), + count() FILTER (WHERE d!=c) + FROM t1 GROUP BY c ORDER BY 1; + } +} -test { + faultsim_test_result {0 {{} 1 {} 1 1 1}} +} + + +finish_test From 08e2e8e680147a52909b292d4c0628a94f928207 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 14 Jul 2019 00:15:07 +0000 Subject: [PATCH 018/221] Mark an unreachable branch using ALWAYS(). FossilOrigin-Name: 0fff105a3e501fd91877d67761459eb0323e6cf79916242027cce0d05697f554 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/prepare.c | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c83d009764..fac0eaf63c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sthat\scould\sfollow\san\sOOM\sin\sthe\snew\sFILTER\scode. -D 2019-07-13T18:27:54.869 +C Mark\san\sunreachable\sbranch\susing\sALWAYS(). +D 2019-07-14T00:15:07.292 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c e6373934cdafea272d94feb224344f9fd93ff94318221b64ccabd72d98b4672e F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 -F src/prepare.c d633c3610c23dc98239ea445803c2a6188c2b8ab647e3df4243f369516e6c8d1 +F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 17d61645b0782809aa2cc68225e93c3ed6a55ca59edcdbf599b5b4a828cec9fb @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8c80e81d01abde9a5032cdc1a492d0fccd8db139f78d2db9413a60cfdc8e0f64 -R 992785f29513ad28163364a115438b27 -U dan -Z a79c487a88edbd1089ddc303df479f2f +P 85fd70fead834aed16cffbea892b2255b4e10dd677f4dbbb96062d5ff42efdeb +R 2916789ca16bd517dcf20e2c1512a43b +U drh +Z 6e17128a6889867592c726db142aced4 diff --git a/manifest.uuid b/manifest.uuid index cf8fb215f4..d859b76fec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -85fd70fead834aed16cffbea892b2255b4e10dd677f4dbbb96062d5ff42efdeb \ No newline at end of file +0fff105a3e501fd91877d67761459eb0323e6cf79916242027cce0d05697f554 \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index f385c1fc71..396df7bda2 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -635,7 +635,10 @@ static int sqlite3Prepare( rc = sParse.rc; #ifndef SQLITE_OMIT_EXPLAIN - if( sParse.explain && rc==SQLITE_OK && sParse.pVdbe ){ + /* Justification for the ALWAYS(): The only way for rc to be SQLITE_OK and + ** sParse.pVdbe to be NULL is if the input SQL is an empty string, but in + ** that case, sParse.explain will be false. */ + if( sParse.explain && rc==SQLITE_OK && ALWAYS(sParse.pVdbe) ){ static const char * const azColName[] = { "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", "id", "parent", "notused", "detail" From ec9b2a132b7bd9d8e8d4890161d7ddbc79877729 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 15 Jul 2019 07:58:28 +0000 Subject: [PATCH 019/221] Call ioctl() with the correct signature on both Android and stock Linux. FossilOrigin-Name: 68e12e063fe41bcd65cf8a120f838b9b1723ed803ea85240fe0f2145b78df2d7 --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- src/os_unix.c | 3 ++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index fac0eaf63c..d80dbd466c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\san\sunreachable\sbranch\susing\sALWAYS(). -D 2019-07-14T00:15:07.292 +C Call\sioctl()\swith\sthe\scorrect\ssignature\son\sboth\sAndroid\sand\sstock\sLinux. +D 2019-07-15T07:58:28.770 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -506,7 +506,7 @@ F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 94576efb914859d235b879a4c784da3121bf1f5514e4cad972652d2c60db195d +F src/os_unix.c 7a2e00cf63588096f356451b7405bf9c7316e1cd8543a7cfbe64e8ffed2e3f34 F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b @@ -1835,7 +1835,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 85fd70fead834aed16cffbea892b2255b4e10dd677f4dbbb96062d5ff42efdeb -R 2916789ca16bd517dcf20e2c1512a43b -U drh -Z 6e17128a6889867592c726db142aced4 +P 0fff105a3e501fd91877d67761459eb0323e6cf79916242027cce0d05697f554 +R 5a921a0dc3c6d4350628adbba51b0e1c +T *branch * ioctl-signature +T *sym-ioctl-signature * +T -sym-trunk * +U dan +Z fc3c9b67572fed9c7fe911b501f0eb15 diff --git a/manifest.uuid b/manifest.uuid index d859b76fec..7be488c813 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0fff105a3e501fd91877d67761459eb0323e6cf79916242027cce0d05697f554 \ No newline at end of file +68e12e063fe41bcd65cf8a120f838b9b1723ed803ea85240fe0f2145b78df2d7 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index 103df1d199..0a7c4bb467 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -521,13 +521,14 @@ static struct unix_syscall { #if defined(__linux__) && defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) # ifdef __ANDROID__ { "ioctl", (sqlite3_syscall_ptr)(int(*)(int, int, ...))ioctl, 0 }, +#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) # else { "ioctl", (sqlite3_syscall_ptr)ioctl, 0 }, +#define osIoctl ((int(*)(int,unsigned long,...))aSyscall[28].pCurrent) # endif #else { "ioctl", (sqlite3_syscall_ptr)0, 0 }, #endif -#define osIoctl ((int(*)(int,int,...))aSyscall[28].pCurrent) }; /* End of the overrideable system calls */ From e464802d49013ea759c30be7106976cbc2cde1e5 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 15 Jul 2019 13:58:28 +0000 Subject: [PATCH 020/221] Fix a problem that could cause a crash if a blob handle were closed after the associated database handle was closed using sqlite3_close_v2(). FossilOrigin-Name: 52f463d29407fad691c42b13462880e7605603c9be9f480d18e953a0ef78149a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbeblob.c | 3 ++- test/close.test | 7 +++++++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index fac0eaf63c..c2c48a1761 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\san\sunreachable\sbranch\susing\sALWAYS(). -D 2019-07-14T00:15:07.292 +C Fix\sa\sproblem\sthat\scould\scause\sa\scrash\sif\sa\sblob\shandle\swere\sclosed\safter\sthe\sassociated\sdatabase\shandle\swas\sclosed\susing\ssqlite3_close_v2(). +D 2019-07-15T13:58:28.470 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da F src/vdbeaux.c eb2b67dcf65e71fd11d977961220f9d1888fb60bbf3730eb60ff971c68dc7dd5 -F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 +F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c f6f277d17d50972571d1394535d4c3d156fdea871d8f327f5b9479984054015a F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 @@ -727,7 +727,7 @@ F test/cast.test 3619f0c58c2e4b2a94aa86e75607e497d34ef40ab74418e71aef7b4ca515589 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 -F test/close.test 799ea4599d2f5704b0a30f477d17c2c760d8523fa5d0c8be4a7df2a8cad787d8 +F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 F test/collate1.test f9b653f515ef3324a0c4e3c6adbf136bb1903622af678d482a60c11c9c054e6c @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 85fd70fead834aed16cffbea892b2255b4e10dd677f4dbbb96062d5ff42efdeb -R 2916789ca16bd517dcf20e2c1512a43b -U drh -Z 6e17128a6889867592c726db142aced4 +P 0fff105a3e501fd91877d67761459eb0323e6cf79916242027cce0d05697f554 +R 3e1676b4ed91442ef96f61576ecdb210 +U dan +Z a9ed82eb59dfd0268931c636761499e0 diff --git a/manifest.uuid b/manifest.uuid index d859b76fec..83ce398524 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0fff105a3e501fd91877d67761459eb0323e6cf79916242027cce0d05697f554 \ No newline at end of file +52f463d29407fad691c42b13462880e7605603c9be9f480d18e953a0ef78149a \ No newline at end of file diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 4279792696..d34e3cf9f4 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -355,11 +355,12 @@ int sqlite3_blob_close(sqlite3_blob *pBlob){ sqlite3 *db; if( p ){ + sqlite3_stmt *pStmt = p->pStmt; db = p->db; sqlite3_mutex_enter(db->mutex); - rc = sqlite3_finalize(p->pStmt); sqlite3DbFree(db, p); sqlite3_mutex_leave(db->mutex); + rc = sqlite3_finalize(pStmt); }else{ rc = SQLITE_OK; } diff --git a/test/close.test b/test/close.test index 99bc7255e2..107c7a782e 100644 --- a/test/close.test +++ b/test/close.test @@ -79,4 +79,11 @@ do_test 1.4.4 { sqlite3_finalize $STMT } {SQLITE_OK} +do_test 1.5 { + set DB [sqlite3_open test.db] + sqlite3_blob_open $DB main t1 x 2 0 BLOB + sqlite3_close_v2 $DB + sqlite3_blob_close $BLOB +} {} + finish_test From 2cd02a5d2a4ea33cd40a3032a2041447adc4d772 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 16 Jul 2019 18:27:07 +0000 Subject: [PATCH 021/221] Add assert()s in os_win.c in an effort to silence false-positives from static analyzers. FossilOrigin-Name: 22a7c15b262376fb0ce4dd3d044373380d86c5ccd96e2f24576cf04318597c33 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/os_win.c | 2 ++ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f4503d9b6f..061ebee2ca 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Call\sioctl()\swith\sthe\scorrect\ssignature\son\sboth\sAndroid\sand\sstock\sLinux. -D 2019-07-16T05:11:16.359 +C Add\sassert()s\sin\sos_win.c\sin\san\seffort\sto\ssilence\sfalse-positives\sfrom\nstatic\sanalyzers. +D 2019-07-16T18:27:07.355 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -507,7 +507,7 @@ F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 7a2e00cf63588096f356451b7405bf9c7316e1cd8543a7cfbe64e8ffed2e3f34 -F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 +F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 @@ -1835,8 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 52f463d29407fad691c42b13462880e7605603c9be9f480d18e953a0ef78149a 68e12e063fe41bcd65cf8a120f838b9b1723ed803ea85240fe0f2145b78df2d7 -R 1ddfb5d9b3cc78b453237f27b05e7d9c -T +closed 68e12e063fe41bcd65cf8a120f838b9b1723ed803ea85240fe0f2145b78df2d7 -U dan -Z 1d45fd94302d6b447ec50d51f5de73a4 +P 2422534908a85a4cd11784e4c23a74ad121404f73dade587bf27efde1e2b982b +R 8000b05148840a2c9c085068b80fffe6 +U drh +Z 2e7e9ebbdbaa32c1a82b9d9066c825bb diff --git a/manifest.uuid b/manifest.uuid index efe24d558e..ca294703cb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2422534908a85a4cd11784e4c23a74ad121404f73dade587bf27efde1e2b982b \ No newline at end of file +22a7c15b262376fb0ce4dd3d044373380d86c5ccd96e2f24576cf04318597c33 \ No newline at end of file diff --git a/src/os_win.c b/src/os_win.c index aafc89f7d2..32758ab760 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -4215,6 +4215,7 @@ static int winShmMap( rc = winOpenSharedMemory(pDbFd); if( rc!=SQLITE_OK ) return rc; pShm = pDbFd->pShm; + assert( pShm!=0 ); } pShmNode = pShm->pShmNode; @@ -4517,6 +4518,7 @@ static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){ } } if( pFd->mmapSize >= iOff+nAmt ){ + assert( pFd->pMapRegion!=0 ); *pp = &((u8 *)pFd->pMapRegion)[iOff]; pFd->nFetchOut++; } From 55f66b341a55f418fac2e6ce4554dc9702309616 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 16 Jul 2019 19:44:32 +0000 Subject: [PATCH 022/221] Add new assert() statements in an attempt to help static analyzers avoid false-positives. FossilOrigin-Name: 9e66458592d40fbd96ea5f21339573110ca1cfe328238a020c9420a87d35dd72 --- manifest | 40 ++++++++++++++++++++-------------------- manifest.uuid | 2 +- src/backup.c | 2 ++ src/btree.c | 2 ++ src/build.c | 1 + src/fkey.c | 1 + src/parse.y | 1 + src/pcache.c | 1 + src/pcache1.c | 1 + src/select.c | 1 + src/trigger.c | 1 + src/vdbeaux.c | 3 +++ src/vdbesort.c | 7 +++++-- src/wal.c | 2 ++ src/where.c | 1 + src/window.c | 7 ++++++- tool/lempar.c | 1 + 17 files changed, 50 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 061ebee2ca..04b7868ed4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sassert()s\sin\sos_win.c\sin\san\seffort\sto\ssilence\sfalse-positives\sfrom\nstatic\sanalyzers. -D 2019-07-16T18:27:07.355 +C Add\snew\sassert()\sstatements\sin\san\sattempt\sto\shelp\sstatic\sanalyzers\savoid\nfalse-positives. +D 2019-07-16T19:44:32.038 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -460,13 +460,13 @@ F src/alter.c c1b5e5639b88dcc146db326315f2dea4f7f1c599e524eeb421d544927a0b1e86 F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df -F src/backup.c b1d37f6f7f5913944583733ed0f9e182f3ece0d42c27f46701142141a6e6fd33 +F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 0e30c98649796a91a889c2ab1c2f032da9918ac5244a3688ed97e8b5779b61fa +F src/btree.c 83a4b1b744fad3ff675f68bc4de73834ed0e31edb412097f54e33cf181bba1ee F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 23a0253ab53e62feadcc0c6f31e7e418ef9d4b92c82a1398e98433776b920a4e +F src/build.c cd19eb05c63ccaeee5e659e6e708a97d905b62f639de71af0c2c007062371a75 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 37f3d21193c4f7d141d0691cced5b39c99951bfef78df9887faf9167b9c42f37 @@ -476,7 +476,7 @@ F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c 896c4576cd88a0dc5b5ae0abd236b507b778105b58744bd8974fac98fc432b4c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 0e14d4bef8eac2d87bbd517e492d9084c65008d117823f8922c5e7b2b599bd33 +F src/fkey.c ab1971900477e93b6aaabf160d2d1c79c06edd9227441ccfaf0de7e7431d7f48 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 F src/global.c 1e942b1e6fb6a2a15e6015bda72be0abefc4b1339a8640a47b1b71b7f317917b F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -511,10 +511,10 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 8ec5ce13db0499d4f18303a535b176ba1606da9dad59ed340fa4ce54d13261a9 -F src/pcache.c fd2d0553b3222d6b9f7cb251079e5bca1299d1161da3027b525932d8bf46340a +F src/parse.y 22889d25bbab20b3fbff5eca1208a1f098ce9cf3ebc309f0dd0753dda79cc864 +F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c e6373934cdafea272d94feb224344f9fd93ff94318221b64ccabd72d98b4672e +F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 @@ -522,7 +522,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 17d61645b0782809aa2cc68225e93c3ed6a55ca59edcdbf599b5b4a828cec9fb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 1ac359aed1a83239ce3434c0620e488ad9cf25dee829b86c89f7fe4b5cd366c5 +F src/select.c c4b4fe44df6bcf32b693267ae9ec68e1c25f9a29d4a17afebd287d4af2f5fb51 F src/shell.c.in 5c0171b66ee0aa4be9d5ca112f1ef50aec33dd48e8cbcb36779b9ddba068854a F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -588,7 +588,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c cf03f9f6efb93288c7b9f17374ea48e4ce9111b0bc7e428d6850c3eee532b461 -F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 +F src/trigger.c 563df58084fa50aaf22b13ac5b71fdb02c9ffc6f0bf5d262cfe07aade4e20b3f F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 @@ -598,21 +598,21 @@ F src/vdbe.c e9493a767fafd71bb9b10462a39b3af36d029d4e47e8cc4f531f89175dadf7f4 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da -F src/vdbeaux.c eb2b67dcf65e71fd11d977961220f9d1888fb60bbf3730eb60ff971c68dc7dd5 +F src/vdbeaux.c ffcdaf1ce887f00cc43c7fd74508ae6b9d287a65e87febc234c5cecdefeced00 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c f6f277d17d50972571d1394535d4c3d156fdea871d8f327f5b9479984054015a -F src/vdbesort.c 66592d478dbb46f19aed0b42222325eadb84deb40a90eebe25c6e7c1d8468f47 +F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c b09a2a9cab50efa08451a8c81d47052120ad5da174048c6d0b08d405384abdf2 +F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c ccbe57a6eeedce5826510c509cebb547e0c877d53f14b3118698643057d4b597 -F src/where.c 2f11eeb14335b7640f886b2fb441f54a94c35ab5cde8b53461a1074bfd587081 +F src/where.c 2f508c9a6dd2a42ad2b692105e77eb92cdec201d32916962ccdeff71836acb52 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 6cfb1b3c821a4cb2c6f262c6a61cd400a2803b390370e3d45d7e59b9f38e61da +F src/window.c e0b821aa2867661d36f4673208e0afa0a57b47575c28fd6281996b6513d8e0d0 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1755,7 +1755,7 @@ F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c cc43148d2793ab93668e74a6a6319bb71c2e65c1ffcd6deeaa59e12be9362a43 -F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc +F tool/lempar.c 4b868d0a5eb9a67cd1b546274227c0d449dad073c663b331b686fa2253e1c86f F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2422534908a85a4cd11784e4c23a74ad121404f73dade587bf27efde1e2b982b -R 8000b05148840a2c9c085068b80fffe6 +P 22a7c15b262376fb0ce4dd3d044373380d86c5ccd96e2f24576cf04318597c33 +R af7ed786fd26f08c6e74a9cdd64afe47 U drh -Z 2e7e9ebbdbaa32c1a82b9d9066c825bb +Z 0311542e0816de566884848aca80984c diff --git a/manifest.uuid b/manifest.uuid index ca294703cb..274ba1afea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -22a7c15b262376fb0ce4dd3d044373380d86c5ccd96e2f24576cf04318597c33 \ No newline at end of file +9e66458592d40fbd96ea5f21339573110ca1cfe328238a020c9420a87d35dd72 \ No newline at end of file diff --git a/src/backup.c b/src/backup.c index 2090b49782..5e9c974ae1 100644 --- a/src/backup.c +++ b/src/backup.c @@ -619,8 +619,10 @@ int sqlite3_backup_finish(sqlite3_backup *p){ } if( p->isAttached ){ pp = sqlite3PagerBackupPtr(sqlite3BtreePager(p->pSrc)); + assert( pp!=0 ); while( *pp!=p ){ pp = &(*pp)->pNext; + assert( pp!=0 ); } *pp = p->pNext; } diff --git a/src/btree.c b/src/btree.c index 5f82f1cc0a..db3b279233 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7962,6 +7962,8 @@ static int balance_nonroot( )); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); + assert( nNew>=1 && nNew<=ArraySize(apNew) ); + assert( apNew[nNew-1]!=0 ); put4byte(pRight, apNew[nNew-1]->pgno); /* If the sibling pages are not leaves, ensure that the right-child pointer diff --git a/src/build.c b/src/build.c index 53314593bd..aa5a6f6a1e 100644 --- a/src/build.c +++ b/src/build.c @@ -3629,6 +3629,7 @@ void sqlite3CreateIndex( /* Gather the complete text of the CREATE INDEX statement into ** the zStmt variable */ + assert( pName!=0 || pStart==0 ); if( pStart ){ int n = (int)(pParse->sLastToken.z - pName->z) + pParse->sLastToken.n; if( pName->z[n-1]==';' ) n--; diff --git a/src/fkey.c b/src/fkey.c index 14ee983c55..67da6e6c79 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -1332,6 +1332,7 @@ static Trigger *fkActionTrigger( return 0; } assert( pStep!=0 ); + assert( pTrigger!=0 ); switch( action ){ case OE_Restrict: diff --git a/src/parse.y b/src/parse.y index fce4c00cdd..f5727ade2c 100644 --- a/src/parse.y +++ b/src/parse.y @@ -458,6 +458,7 @@ cmd ::= select(X). { ** SQLITE_LIMIT_COMPOUND_SELECT. */ static void parserDoubleLinkSelect(Parse *pParse, Select *p){ + assert( p!=0 ); if( p->pPrior ){ Select *pNext = 0, *pLoop; int mxSelect, cnt = 0; diff --git a/src/pcache.c b/src/pcache.c index 9125d5de3f..36829be415 100644 --- a/src/pcache.c +++ b/src/pcache.c @@ -262,6 +262,7 @@ int sqlite3PcacheInitialize(void){ ** built-in default page cache is used instead of the application defined ** page cache. */ sqlite3PCacheSetDefault(); + assert( sqlite3GlobalConfig.pcache2.xInit!=0 ); } return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg); } diff --git a/src/pcache1.c b/src/pcache1.c index c9d55866ee..d0051433de 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -424,6 +424,7 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); if( pCache->pFree || (pCache->nPage==0 && pcache1InitBulk(pCache)) ){ + assert( pCache->pFree!=0 ); p = pCache->pFree; pCache->pFree = p->pNext; p->pNext = 0; diff --git a/src/select.c b/src/select.c index dc388b1f79..397037b17f 100644 --- a/src/select.c +++ b/src/select.c @@ -3949,6 +3949,7 @@ static int flattenSubquery( for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ int nSubSrc; u8 jointype = 0; + assert( pSub!=0 ); pSubSrc = pSub->pSrc; /* FROM clause of subquery */ nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ pSrc = pParent->pSrc; /* FROM clause of the outer query */ diff --git a/src/trigger.c b/src/trigger.c index c37f76da72..638d53dace 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -340,6 +340,7 @@ void sqlite3FinishTrigger( Trigger *pLink = pTrig; Hash *pHash = &db->aDb[iDb].pSchema->trigHash; assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + assert( pLink!=0 ); pTrig = sqlite3HashInsert(pHash, zName, pTrig); if( pTrig ){ sqlite3OomFault(db); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 5781d8f213..4417cc63a1 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1907,8 +1907,11 @@ int sqlite3VdbeList( ** pick up the appropriate opcode. */ int j; i -= p->nOp; + assert( apSub!=0 ); + assert( nSub>0 ); for(j=0; i>=apSub[j]->nOp; j++){ i -= apSub[j]->nOp; + assert( inOp || j+1aOp[i]; } diff --git a/src/vdbesort.c b/src/vdbesort.c index f909f812d6..05590da7ee 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -1728,13 +1728,16 @@ static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ rc = vdbeSorterListToPMA(&pSorter->aTask[nWorker], &pSorter->list); }else{ /* Launch a background thread for this operation */ - u8 *aMem = pTask->list.aMemory; - void *pCtx = (void*)pTask; + u8 *aMem; + void *pCtx; + assert( pTask!=0 ); assert( pTask->pThread==0 && pTask->bDone==0 ); assert( pTask->list.pList==0 ); assert( pTask->list.aMemory==0 || pSorter->list.aMemory!=0 ); + aMem = pTask->list.aMemory; + pCtx = (void*)pTask; pSorter->iPrev = (u8)(pTask - pSorter->aTask); pTask->list = pSorter->list; pSorter->list.pList = 0; diff --git a/src/wal.c b/src/wal.c index 53a9e508b8..669be95208 100644 --- a/src/wal.c +++ b/src/wal.c @@ -3478,6 +3478,7 @@ int sqlite3WalFrames( if( rc ) return rc; iOffset += szFrame; nExtra++; + assert( pLast!=0 ); } } if( bSync ){ @@ -3510,6 +3511,7 @@ int sqlite3WalFrames( iFrame++; rc = walIndexAppend(pWal, iFrame, p->pgno); } + assert( pLast!=0 || nExtra==0 ); while( rc==SQLITE_OK && nExtra>0 ){ iFrame++; nExtra--; diff --git a/src/where.c b/src/where.c index f2ab125d2d..f83f285b98 100644 --- a/src/where.c +++ b/src/where.c @@ -2270,6 +2270,7 @@ static void whereLoopOutputAdjust( assert( (pLoop->wsFlags & WHERE_AUTO_INDEX)==0 ); for(i=pWC->nTerm, pTerm=pWC->a; i>0; i--, pTerm++){ + assert( pTerm!=0 ); if( (pTerm->wtFlags & TERM_VIRTUAL)!=0 ) break; if( (pTerm->prereqAll & pLoop->maskSelf)==0 ) continue; if( (pTerm->prereqAll & notAllowed)!=0 ) continue; diff --git a/src/window.c b/src/window.c index ed39107b92..ff05aefb5d 100644 --- a/src/window.c +++ b/src/window.c @@ -748,6 +748,8 @@ struct WindowRewrite { static int selectWindowRewriteExprCb(Walker *pWalker, Expr *pExpr){ struct WindowRewrite *p = pWalker->u.pRewrite; Parse *pParse = pWalker->pParse; + assert( p!=0 ); + assert( p->pWin!=0 ); /* If this function is being called from within a scalar sub-select ** that used by the SELECT statement being processed, only process @@ -847,6 +849,7 @@ static void selectWindowRewriteEList( Walker sWalker; WindowRewrite sRewrite; + assert( pWin!=0 ); memset(&sWalker, 0, sizeof(Walker)); memset(&sRewrite, 0, sizeof(WindowRewrite)); @@ -1567,8 +1570,10 @@ static void windowFullScan(WindowCodeArg *p){ int lblNext; int lblBrk; int addrNext; - int csr = pMWin->csrApp; + int csr; + assert( pMWin!=0 ); + csr = pMWin->csrApp; nPeer = (pMWin->pOrderBy ? pMWin->pOrderBy->nExpr : 0); lblNext = sqlite3VdbeMakeLabel(pParse); diff --git a/tool/lempar.c b/tool/lempar.c index 94c0a3162a..1c088080d4 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -567,6 +567,7 @@ static YYACTIONTYPE yy_find_shift_action( #endif /* YYWILDCARD */ return yy_default[stateno]; }else{ + assert( i>=0 && i Date: Wed, 17 Jul 2019 07:23:06 +0000 Subject: [PATCH 023/221] Add casts to shell.c.in to avoid warnings on systems where size_t is 32 bits. FossilOrigin-Name: fe014288ac03cdf0dc5410b7d45cad4768759b52746c0a22bce2fc03779c5d5a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 04b7868ed4..a8092147c6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\sassert()\sstatements\sin\san\sattempt\sto\shelp\sstatic\sanalyzers\savoid\nfalse-positives. -D 2019-07-16T19:44:32.038 +C Add\scasts\sto\sshell.c.in\sto\savoid\swarnings\son\ssystems\swhere\ssize_t\sis\s32\sbits. +D 2019-07-17T07:23:06.341 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 17d61645b0782809aa2cc68225e93c3ed6a55ca59edcdbf599b5b4a828cec9fb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c4b4fe44df6bcf32b693267ae9ec68e1c25f9a29d4a17afebd287d4af2f5fb51 -F src/shell.c.in 5c0171b66ee0aa4be9d5ca112f1ef50aec33dd48e8cbcb36779b9ddba068854a +F src/shell.c.in 360607dce532811befb43946e10697833cadac8f8924aaeab56014c9e93c68a7 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 22a7c15b262376fb0ce4dd3d044373380d86c5ccd96e2f24576cf04318597c33 -R af7ed786fd26f08c6e74a9cdd64afe47 -U drh -Z 0311542e0816de566884848aca80984c +P 9e66458592d40fbd96ea5f21339573110ca1cfe328238a020c9420a87d35dd72 +R e10a56ffab89aeb6c132764d41933ce5 +U dan +Z 0a446b49c5cd11f0249e04708e61ac08 diff --git a/manifest.uuid b/manifest.uuid index 274ba1afea..3b782b72f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e66458592d40fbd96ea5f21339573110ca1cfe328238a020c9420a87d35dd72 \ No newline at end of file +fe014288ac03cdf0dc5410b7d45cad4768759b52746c0a22bce2fc03779c5d5a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 28022204c6..c63e9bcd68 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1256,12 +1256,12 @@ static void editFunc( } sz = sqlite3_value_bytes(argv[0]); if( bBin ){ - x = fwrite(sqlite3_value_blob(argv[0]), 1, sz, f); + x = fwrite(sqlite3_value_blob(argv[0]), 1, (size_t)sz, f); }else{ const char *z = (const char*)sqlite3_value_text(argv[0]); /* Remember whether or not the value originally contained \r\n */ if( z && strstr(z,"\r\n")!=0 ) hasCRNL = 1; - x = fwrite(sqlite3_value_text(argv[0]), 1, sz, f); + x = fwrite(sqlite3_value_text(argv[0]), 1, (size_t)sz, f); } fclose(f); f = 0; @@ -1294,7 +1294,7 @@ static void editFunc( sqlite3_result_error_nomem(context); goto edit_func_end; } - x = fread(p, 1, sz, f); + x = fread(p, 1, (size_t)sz, f); fclose(f); f = 0; if( x!=sz ){ From 1ff9407198073f488d41782d3a97176018ded973 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 17 Jul 2019 09:18:06 +0000 Subject: [PATCH 024/221] Fix problems with duplicate fields in the PRIMARY KEYs of WITHOUT ROWID tables. FossilOrigin-Name: bd9a47a3a2997bfbf9c8a11c5b7196e362974054e58a2fe701778b1580264de8 --- manifest | 16 ++++++++++------ manifest.uuid | 2 +- src/build.c | 34 +++++++++++++++++++--------------- test/without_rowid7.test | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 test/without_rowid7.test diff --git a/manifest b/manifest index a8092147c6..435310d091 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\scasts\sto\sshell.c.in\sto\savoid\swarnings\son\ssystems\swhere\ssize_t\sis\s32\sbits. -D 2019-07-17T07:23:06.341 +C Fix\sproblems\swith\sduplicate\sfields\sin\sthe\sPRIMARY\sKEYs\sof\sWITHOUT\sROWID\stables. +D 2019-07-17T09:18:06.336 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 83a4b1b744fad3ff675f68bc4de73834ed0e31edb412097f54e33cf181bba1ee F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c cd19eb05c63ccaeee5e659e6e708a97d905b62f639de71af0c2c007062371a75 +F src/build.c 48f22e7c3b80550eb9c0cc3a3738f9117109b87d5f5fdba027009b7f2917df4a F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 37f3d21193c4f7d141d0691cced5b39c99951bfef78df9887faf9167b9c42f37 @@ -1727,6 +1727,7 @@ F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e +F test/without_rowid7.test 7b47cd85b0b64bc0f373e9a0fff687f13de84b8e3eb61e65d63f8c1f0ca9da18 F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 @@ -1835,7 +1836,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 9e66458592d40fbd96ea5f21339573110ca1cfe328238a020c9420a87d35dd72 -R e10a56ffab89aeb6c132764d41933ce5 +P fe014288ac03cdf0dc5410b7d45cad4768759b52746c0a22bce2fc03779c5d5a +R 52845c43e6ecf22392d569b0697bd36c +T *branch * wor-pk-dups +T *sym-wor-pk-dups * +T -sym-trunk * U dan -Z 0a446b49c5cd11f0249e04708e61ac08 +Z aece81be789a779a58eb3b9812c06233 diff --git a/manifest.uuid b/manifest.uuid index 3b782b72f6..50e4bc2da0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fe014288ac03cdf0dc5410b7d45cad4768759b52746c0a22bce2fc03779c5d5a \ No newline at end of file +bd9a47a3a2997bfbf9c8a11c5b7196e362974054e58a2fe701778b1580264de8 \ No newline at end of file diff --git a/src/build.c b/src/build.c index aa5a6f6a1e..80bc4eb0d0 100644 --- a/src/build.c +++ b/src/build.c @@ -1831,6 +1831,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ Index *pIdx; Index *pPk; int nPk; + int nExtra; int i, j; sqlite3 *db = pParse->db; Vdbe *v = pParse->pVdbe; @@ -1873,6 +1874,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ SQLITE_IDXTYPE_PRIMARYKEY); if( db->mallocFailed || pParse->nErr ) return; pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk->nKeyCol==1 ); }else{ pPk = sqlite3PrimaryKeyIndex(pTab); assert( pPk!=0 ); @@ -1887,6 +1889,8 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ pPk->nColumn--; }else{ testcase( hasColumn(pPk->aiColumn, j, pPk->aiColumn[i]) ); + pPk->azColl[j] = pPk->azColl[i]; + pPk->aSortOrder[j] = pPk->aSortOrder[i]; pPk->aiColumn[j++] = pPk->aiColumn[i]; } } @@ -1895,7 +1899,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ assert( pPk!=0 ); pPk->isCovering = 1; if( !db->init.imposterTable ) pPk->uniqNotNull = 1; - nPk = pPk->nKeyCol; + nPk = pPk->nColumn = pPk->nKeyCol; /* Bypass the creation of the PRIMARY KEY btree and the sqlite_master ** table entry. This is only required if currently generating VDBE @@ -1945,21 +1949,21 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ /* Add all table columns to the PRIMARY KEY index */ - if( nPknCol ){ - if( resizeIndexObject(db, pPk, pTab->nCol) ) return; - for(i=0, j=nPk; inCol; i++){ - if( !hasColumn(pPk->aiColumn, j, i) ){ - assert( jnColumn ); - pPk->aiColumn[j] = i; - pPk->azColl[j] = sqlite3StrBINARY; - j++; - } - } - assert( pPk->nColumn==j ); - assert( pTab->nCol==j ); - }else{ - pPk->nColumn = pTab->nCol; + nExtra = 0; + for(i=0; inCol; i++){ + if( !hasColumn(pPk->aiColumn, nPk, i) ) nExtra++; } + if( resizeIndexObject(db, pPk, nPk+nExtra) ) return; + for(i=0, j=nPk; inCol; i++){ + if( !hasColumn(pPk->aiColumn, j, i) ){ + assert( jnColumn ); + pPk->aiColumn[j] = i; + pPk->azColl[j] = sqlite3StrBINARY; + j++; + } + } + assert( pPk->nColumn==j ); + assert( pTab->nCol<=j ); recomputeColumnsNotIndexed(pPk); } diff --git a/test/without_rowid7.test b/test/without_rowid7.test new file mode 100644 index 0000000000..500f2bd157 --- /dev/null +++ b/test/without_rowid7.test @@ -0,0 +1,38 @@ +# 2019 July 17 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix without_rowid7 + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b COLLATE nocase, PRIMARY KEY(a, a, b)) WITHOUT ROWID; +} + +do_catchsql_test 1.1 { + INSERT INTO t1 VALUES(1, 'one'), (1, 'ONE'); +} {1 {UNIQUE constraint failed: t1.a, t1.b}} + + +do_execsql_test 2.0 { + CREATE TABLE t2(a, b, PRIMARY KEY(a, a COLLATE nocase, a)) WITHOUT ROWID; +} + +do_execsql_test 2.1 { + INSERT INTO t2 VALUES(1, 'one'); + SELECT b FROM t2; +} {one} + + +finish_test + From 7b1904e35da41683dbb2dc71b3c55f68726a5008 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jul 2019 11:01:11 +0000 Subject: [PATCH 025/221] Enhance the "PRAGMA index_info()" and "PRAGMA index_xinfo()" statements so that they allow a WITHOUT ROWID table as their argument, and in that case show the structure of the underlying index used to implement the WITHOUT ROWID table. FossilOrigin-Name: 62274ff683ba077d8b0fa34ad653ce235a8c5cbfdb7ab8558469af7333d03698 --- manifest | 19 ++++++++----------- manifest.uuid | 2 +- src/pragma.c | 9 +++++++++ test/without_rowid7.test | 22 ++++++++++++++++++++-- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 435310d091..6262ff21a7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\swith\sduplicate\sfields\sin\sthe\sPRIMARY\sKEYs\sof\sWITHOUT\sROWID\stables. -D 2019-07-17T09:18:06.336 +C Enhance\sthe\s"PRAGMA\sindex_info()"\sand\s"PRAGMA\sindex_xinfo()"\sstatements\sso\sthat\nthey\sallow\sa\sWITHOUT\sROWID\stable\sas\stheir\sargument,\sand\sin\sthat\scase\sshow\nthe\sstructure\sof\sthe\sunderlying\sindex\sused\sto\simplement\sthe\sWITHOUT\sROWID\ntable. +D 2019-07-17T11:01:11.853 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/parse.y 22889d25bbab20b3fbff5eca1208a1f098ce9cf3ebc309f0dd0753dda79cc864 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c 925bcac0afd98a0d4255c7524b93239ab4d83893d96f7f8fdccd78d4929a39bb +F src/pragma.c a42d4c6040893a59b69a0c987e5ed0402730c444ee451fde9bbe6203e7f73b1d F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 @@ -1727,7 +1727,7 @@ F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e -F test/without_rowid7.test 7b47cd85b0b64bc0f373e9a0fff687f13de84b8e3eb61e65d63f8c1f0ca9da18 +F test/without_rowid7.test 0e0d7be00f05f54898e20e07bcc947cd97b42d7106021fa0d2897324bc6d330e F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 @@ -1836,10 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fe014288ac03cdf0dc5410b7d45cad4768759b52746c0a22bce2fc03779c5d5a -R 52845c43e6ecf22392d569b0697bd36c -T *branch * wor-pk-dups -T *sym-wor-pk-dups * -T -sym-trunk * -U dan -Z aece81be789a779a58eb3b9812c06233 +P bd9a47a3a2997bfbf9c8a11c5b7196e362974054e58a2fe701778b1580264de8 +R d99bb907d59b9a4c8d12aec0ee12fc91 +U drh +Z 747b66d40e91b5de4396e1abb78ac5c8 diff --git a/manifest.uuid b/manifest.uuid index 50e4bc2da0..7032a03735 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd9a47a3a2997bfbf9c8a11c5b7196e362974054e58a2fe701778b1580264de8 \ No newline at end of file +62274ff683ba077d8b0fa34ad653ce235a8c5cbfdb7ab8558469af7333d03698 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index a62fc9997b..6899bad6be 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1157,6 +1157,15 @@ void sqlite3Pragma( Index *pIdx; Table *pTab; pIdx = sqlite3FindIndex(db, zRight, zDb); + if( pIdx==0 ){ + /* If there is no index named zRight, check to see if there is a + ** WITHOUT ROWID table named zRight, and if there is, show the + ** structure of the PRIMARY KEY index for that table. */ + pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb); + if( pTab && !HasRowid(pTab) ){ + pIdx = sqlite3PrimaryKeyIndex(pTab); + } + } if( pIdx ){ int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema); int i; diff --git a/test/without_rowid7.test b/test/without_rowid7.test index 500f2bd157..c75ceff35b 100644 --- a/test/without_rowid7.test +++ b/test/without_rowid7.test @@ -25,7 +25,7 @@ do_catchsql_test 1.1 { do_execsql_test 2.0 { - CREATE TABLE t2(a, b, PRIMARY KEY(a, a COLLATE nocase, a)) WITHOUT ROWID; + CREATE TABLE t2(a, b, PRIMARY KEY(a COLLATE nocase, a)) WITHOUT ROWID; } do_execsql_test 2.1 { @@ -33,6 +33,24 @@ do_execsql_test 2.1 { SELECT b FROM t2; } {one} +do_execsql_test 2.2a { + PRAGMA index_info(t2); +} {0 0 a 1 0 a} +do_execsql_test 2.2b { + SELECT *, '|' FROM pragma_index_info('t2'); +} {0 0 a | 1 0 a |} +do_execsql_test 2.3a { + PRAGMA index_xinfo(t2); +} {0 0 a 0 nocase 1 1 0 a 0 BINARY 1 2 1 b 0 BINARY 0} +do_execsql_test 2.3b { + SELECT *, '|' FROM pragma_index_xinfo('t2'); +} {0 0 a 0 nocase 1 | 1 0 a 0 BINARY 1 | 2 1 b 0 BINARY 0 |} + +do_execsql_test 2.4 { + CREATE TABLE t3(a, b, PRIMARY KEY(a COLLATE nocase, a)); + PRAGMA index_info(t3); +} {} + + finish_test - From 19d9a3ca6ce3d0f8ee0d6c249faf4e972af47e00 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jul 2019 12:42:15 +0000 Subject: [PATCH 026/221] New test cases for PRAGMA index_xinfo on a WITHOUT ROWID table. And new testcases using index_xinfo to verify that WITHOUT ROWID tables are constructed correctly. FossilOrigin-Name: 340378c1e60da80263523776f4b6366a9d332a7ee25986637e8b157f4e8e4bd3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/vtab1.test | 8 ++++++++ test/without_rowid1.test | 22 ++++++++++++++++++++++ test/without_rowid6.test | 9 +++++++++ 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 6262ff21a7..6997d73f69 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\s"PRAGMA\sindex_info()"\sand\s"PRAGMA\sindex_xinfo()"\sstatements\sso\sthat\nthey\sallow\sa\sWITHOUT\sROWID\stable\sas\stheir\sargument,\sand\sin\sthat\scase\sshow\nthe\sstructure\sof\sthe\sunderlying\sindex\sused\sto\simplement\sthe\sWITHOUT\sROWID\ntable. -D 2019-07-17T11:01:11.853 +C New\stest\scases\sfor\sPRAGMA\sindex_xinfo\son\sa\sWITHOUT\sROWID\stable.\s\sAnd\snew\ntestcases\susing\sindex_xinfo\sto\sverify\sthat\sWITHOUT\sROWID\stables\sare\nconstructed\scorrectly. +D 2019-07-17T12:42:15.670 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1610,7 +1610,7 @@ F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 F test/view.test 40d54c9ddf5b9fdee692bf936d3352159fe467838f92742aa1d08c7c7d1eac73 -F test/vtab1.test 47b935205d7b6290765973abd6fce0e13e94e040017099170f43f81886efa5ba +F test/vtab1.test fa6baded08fdadd6f416a9c54956c049ae327b9bdd05d25bf8163f65e65e849c F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 @@ -1721,12 +1721,12 @@ F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1 F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 89d101a7c6e0802882002cf3713f405319ddb6b9f08449dcc08c6082c995cab1 +F test/without_rowid1.test edfccaea4c7d15d9f8ca1c6d7e58df5a7e64969140bcb4598a95edfe1bfd7e7e F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591dba765a3691 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a -F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e +F test/without_rowid6.test 3c1bbf0eb81c672115933158b62b009e67cf1a7f8c2c612bbce63a7385efa18e F test/without_rowid7.test 0e0d7be00f05f54898e20e07bcc947cd97b42d7106021fa0d2897324bc6d330e F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bd9a47a3a2997bfbf9c8a11c5b7196e362974054e58a2fe701778b1580264de8 -R d99bb907d59b9a4c8d12aec0ee12fc91 +P 62274ff683ba077d8b0fa34ad653ce235a8c5cbfdb7ab8558469af7333d03698 +R 5f5f2ffbc62c0e7052c26dec78f9d9ee U drh -Z 747b66d40e91b5de4396e1abb78ac5c8 +Z 9fdc925cff7a2aeb5d3ee2a9b3931134 diff --git a/manifest.uuid b/manifest.uuid index 7032a03735..1d1b25efef 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -62274ff683ba077d8b0fa34ad653ce235a8c5cbfdb7ab8558469af7333d03698 \ No newline at end of file +340378c1e60da80263523776f4b6366a9d332a7ee25986637e8b157f4e8e4bd3 \ No newline at end of file diff --git a/test/vtab1.test b/test/vtab1.test index 8280715cdc..fd7c1fd41d 100644 --- a/test/vtab1.test +++ b/test/vtab1.test @@ -875,6 +875,14 @@ do_test vtab1.7-13 { } } {} +# PRAGMA index_info and index_xinfo are no-ops on a virtual table +do_test vtab1.7-14 { + execsql { + PRAGMA index_info('echo_abc'); + PRAGMA index_xinfo('echo_abc'); + } +} {} + ifcapable attach { do_test vtab1.8-1 { set echo_module "" diff --git a/test/without_rowid1.test b/test/without_rowid1.test index 3832239a41..6c04e87ca4 100644 --- a/test/without_rowid1.test +++ b/test/without_rowid1.test @@ -31,6 +31,10 @@ do_execsql_test without_rowid1-1.0 { integrity_check without_rowid1-1.0ic +do_execsql_test without_rowid1-1.0ixi { + SELECT name, key FROM pragma_index_xinfo('t1'); +} {c 1 a 1 b 0 d 0} + do_execsql_test without_rowid1-1.1 { SELECT *, '|' FROM t1 ORDER BY +c, a; } {arctic sleep ammonia helena | journal sherman ammonia helena | dynamic juliet flipper command | journal sherman gamma patriot |} @@ -120,6 +124,9 @@ do_execsql_test 2.1.2 { UPDATE t4 SET a = 'ABC'; SELECT * FROM t4; } {ABC def} +do_execsql_test 2.1.3 { + SELECT name, coll, key FROM pragma_index_xinfo('t4'); +} {a nocase 1 b BINARY 0} do_execsql_test 2.2.1 { DROP TABLE t4; @@ -133,12 +140,22 @@ do_execsql_test 2.2.2 { SELECT * FROM t4; } {xyz ABC} +do_execsql_test 2.2.3 { + SELECT name, coll, key FROM pragma_index_xinfo('t4'); +} {a nocase 1 b BINARY 0} + + do_execsql_test 2.3.1 { CREATE TABLE t5 (a, b, PRIMARY KEY(b, a)) WITHOUT ROWID; INSERT INTO t5(a, b) VALUES('abc', 'def'); UPDATE t5 SET a='abc', b='def'; } {} +do_execsql_test 2.3.2 { + SELECT name, coll, key FROM pragma_index_xinfo('t5'); +} {b BINARY 1 a BINARY 1} + + do_execsql_test 2.4.1 { CREATE TABLE t6 ( a COLLATE nocase, b, c UNIQUE, PRIMARY KEY(b, a) @@ -153,6 +170,11 @@ do_execsql_test 2.4.2 { SELECT * FROM t6 ORDER BY c; } {ABC def ghi ABC def ghi} +do_execsql_test 2.4.3 { + SELECT name, coll, key FROM pragma_index_xinfo('t6'); +} {b BINARY 1 a nocase 1 c BINARY 0} + + #------------------------------------------------------------------------- # Unless the destination table is completely empty, the xfer optimization # is disabled for WITHOUT ROWID tables. The following tests check for diff --git a/test/without_rowid6.test b/test/without_rowid6.test index 3f9fe415d8..4ad4d84576 100644 --- a/test/without_rowid6.test +++ b/test/without_rowid6.test @@ -24,6 +24,9 @@ do_execsql_test without_rowid6-100 { INSERT INTO t1(a,b,c,d,e) SELECT i, i+1000, printf('x%dy',i), 0, 0 FROM c; ANALYZE; } {} +do_execsql_test without_rowid6-101 { + SELECT name, key FROM pragma_index_xinfo('t1'); +} {a 1 b 1 c 1 d 1 e 0} do_execsql_test without_rowid6-110 { SELECT c FROM t1 WHERE a=123; } {x123y} @@ -51,6 +54,9 @@ do_execsql_test without_rowid6-200 { INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9); SELECT a FROM t1 WHERE b>3 ORDER BY b; } {4 1} +do_execsql_test without_rowid6-201 { + SELECT name, key FROM pragma_index_xinfo('t1'); +} {b 1 a 0 c 0} do_execsql_test without_rowid6-210 { EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b>3 ORDER BY b; @@ -105,6 +111,9 @@ do_execsql_test without_rowid6-500 { INSERT INTO t1(a,b,c) VALUES(1,8,3),(4,5,6),(7,2,9); SELECT a FROM t1 WHERE b>3 ORDER BY b; } {4 1} +do_execsql_test without_rowid6-501 { + SELECT name, key FROM pragma_index_xinfo('t1'); +} {b 1 c 1 a 0} do_execsql_test without_rowid6-510 { EXPLAIN QUERY PLAN SELECT a FROM t1 WHERE b>3 ORDER BY b; From 8b65e5919d3f36d807d9f50e5ef649eacc77e0fe Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 17 Jul 2019 14:34:17 +0000 Subject: [PATCH 027/221] When processing a BETWEEN or CASE expression, avoid transforming a node of the original expression into a TK_REGISTER node. Instead, take a copy and use it instead. Fix for [1be72aab9]. FossilOrigin-Name: 7ef7b23cbb1b9ace9f853238d9133320c153e6c3417e6823ab6394ee1fe56358 --- manifest | 18 +++++------ manifest.uuid | 2 +- src/expr.c | 75 ++++++++++++++++++++++---------------------- test/check.test | 30 ++++++++++++++++++ test/checkfault.test | 41 ++++++++++++++++++++++++ 5 files changed, 119 insertions(+), 47 deletions(-) create mode 100644 test/checkfault.test diff --git a/manifest b/manifest index 8e7cfbf9d6..35d331730a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sWITHOUT\sROWID\stable\slogic\sso\sthat\sit\sgenerates\sa\scorrect\sKeyInfo\nobject\sfor\stables\sthat\shave\sa\sPRIMARY\sKEY\scontaining\sthe\ssame\scolumn\sused\nmore\sthan\sonce\swith\sdifferent\scollating\ssequences.\s\sEnhance\sthe\sindex_xinfo\npragma\sto\sassist\sin\stesting\sthe\sabove.\sFix\sfor\sticket\s[fd3aec0c7e3e2998]. -D 2019-07-17T12:49:16.424 +C When\sprocessing\sa\sBETWEEN\sor\sCASE\sexpression,\savoid\stransforming\sa\snode\sof\sthe\soriginal\sexpression\sinto\sa\sTK_REGISTER\snode.\sInstead,\stake\sa\scopy\sand\suse\sit\sinstead.\sFix\sfor\s[1be72aab9]. +D 2019-07-17T14:34:17.365 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 896c4576cd88a0dc5b5ae0abd236b507b778105b58744bd8974fac98fc432b4c +F src/expr.c f1d87bc9f2d0f14df97b768d5a3d4e4e606fbe45372bc9a0cb6a2623d1933e6d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c ab1971900477e93b6aaabf160d2d1c79c06edd9227441ccfaf0de7e7431d7f48 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -725,7 +725,8 @@ F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bc F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 3619f0c58c2e4b2a94aa86e75607e497d34ef40ab74418e71aef7b4ca5155895 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test dcc952a127c394ce0de2aa634d26c78207e855327cc63a24d3638ca8fbfa641e +F test/check.test e6527bed2b5557ffdbf5680765c4ae6fe61e9b68b7ee69a7f776787a4527b5da +F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 @@ -1836,8 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fe014288ac03cdf0dc5410b7d45cad4768759b52746c0a22bce2fc03779c5d5a 340378c1e60da80263523776f4b6366a9d332a7ee25986637e8b157f4e8e4bd3 -R 5f5f2ffbc62c0e7052c26dec78f9d9ee -T +closed 340378c1e60da80263523776f4b6366a9d332a7ee25986637e8b157f4e8e4bd3 -U drh -Z a8a117274901c94c5f21fbb39eeada13 +P 84a51a755c18ac8253080db6eec505df894ee3b1e97cfa8e61039ac38001e270 +R b1d6ad05577abecc48e59e3ebea1a6ed +U dan +Z f2c9fb7d68d7563adaf07df958f5d837 diff --git a/manifest.uuid b/manifest.uuid index f902dda7df..02af7a70e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -84a51a755c18ac8253080db6eec505df894ee3b1e97cfa8e61039ac38001e270 \ No newline at end of file +7ef7b23cbb1b9ace9f853238d9133320c153e6c3417e6823ab6394ee1fe56358 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 9ba81a8455..56b3148ede 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1086,16 +1086,6 @@ static int exprStructSize(Expr *p){ return EXPR_FULLSIZE; } -/* -** Copy the complete content of an Expr node, taking care not to read -** past the end of the structure for a reduced-size version of the source -** Expr. -*/ -static void exprNodeCopy(Expr *pDest, Expr *pSrc){ - memset(pDest, 0, sizeof(Expr)); - memcpy(pDest, pSrc, exprStructSize(pSrc)); -} - /* ** The dupedExpr*Size() routines each return the number of bytes required ** to store a copy of an expression or expression tree. They differ in @@ -4048,6 +4038,8 @@ expr_code_doover: Expr opCompare; /* The X==Ei expression */ Expr *pX; /* The X expression */ Expr *pTest = 0; /* X==Ei (form A) or just Ei (form B) */ + Expr *pDel = 0; + sqlite3 *db = pParse->db; assert( !ExprHasProperty(pExpr, EP_xIsSelect) && pExpr->x.pList ); assert(pExpr->x.pList->nExpr > 0); @@ -4056,13 +4048,17 @@ expr_code_doover: nExpr = pEList->nExpr; endLabel = sqlite3VdbeMakeLabel(pParse); if( (pX = pExpr->pLeft)!=0 ){ - exprNodeCopy(&tempX, pX); + pDel = sqlite3ExprDup(db, pX, 0); + if( db->mallocFailed ){ + sqlite3ExprDelete(db, pDel); + break; + } testcase( pX->op==TK_COLUMN ); - exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); testcase( regFree1==0 ); memset(&opCompare, 0, sizeof(opCompare)); opCompare.op = TK_EQ; - opCompare.pLeft = &tempX; + opCompare.pLeft = pDel; pTest = &opCompare; /* Ticket b351d95f9cd5ef17e9d9dbae18f5ca8611190001: ** The value in regFree1 might get SCopy-ed into the file result. @@ -4090,6 +4086,7 @@ expr_code_doover: }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, target); } + sqlite3ExprDelete(db, pDel); sqlite3VdbeResolveLabel(v, endLabel); break; } @@ -4371,40 +4368,44 @@ static void exprCodeBetween( void (*xJump)(Parse*,Expr*,int,int), /* Action to take */ int jumpIfNull /* Take the jump if the BETWEEN is NULL */ ){ - Expr exprAnd; /* The AND operator in x>=y AND x<=z */ + Expr exprAnd; /* The AND operator in x>=y AND x<=z */ Expr compLeft; /* The x>=y term */ Expr compRight; /* The x<=z term */ - Expr exprX; /* The x subexpression */ int regFree1 = 0; /* Temporary use register */ + Expr *pDel = 0; + sqlite3 *db = pParse->db; memset(&compLeft, 0, sizeof(Expr)); memset(&compRight, 0, sizeof(Expr)); memset(&exprAnd, 0, sizeof(Expr)); assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - exprNodeCopy(&exprX, pExpr->pLeft); - exprAnd.op = TK_AND; - exprAnd.pLeft = &compLeft; - exprAnd.pRight = &compRight; - compLeft.op = TK_GE; - compLeft.pLeft = &exprX; - compLeft.pRight = pExpr->x.pList->a[0].pExpr; - compRight.op = TK_LE; - compRight.pLeft = &exprX; - compRight.pRight = pExpr->x.pList->a[1].pExpr; - exprToRegister(&exprX, exprCodeVector(pParse, &exprX, ®Free1)); - if( xJump ){ - xJump(pParse, &exprAnd, dest, jumpIfNull); - }else{ - /* Mark the expression is being from the ON or USING clause of a join - ** so that the sqlite3ExprCodeTarget() routine will not attempt to move - ** it into the Parse.pConstExpr list. We should use a new bit for this, - ** for clarity, but we are out of bits in the Expr.flags field so we - ** have to reuse the EP_FromJoin bit. Bummer. */ - exprX.flags |= EP_FromJoin; - sqlite3ExprCodeTarget(pParse, &exprAnd, dest); + pDel = sqlite3ExprDup(db, pExpr->pLeft, 0); + if( db->mallocFailed==0 ){ + exprAnd.op = TK_AND; + exprAnd.pLeft = &compLeft; + exprAnd.pRight = &compRight; + compLeft.op = TK_GE; + compLeft.pLeft = pDel; + compLeft.pRight = pExpr->x.pList->a[0].pExpr; + compRight.op = TK_LE; + compRight.pLeft = pDel; + compRight.pRight = pExpr->x.pList->a[1].pExpr; + exprToRegister(pDel, exprCodeVector(pParse, pDel, ®Free1)); + if( xJump ){ + xJump(pParse, &exprAnd, dest, jumpIfNull); + }else{ + /* Mark the expression is being from the ON or USING clause of a join + ** so that the sqlite3ExprCodeTarget() routine will not attempt to move + ** it into the Parse.pConstExpr list. We should use a new bit for this, + ** for clarity, but we are out of bits in the Expr.flags field so we + ** have to reuse the EP_FromJoin bit. Bummer. */ + pDel->flags |= EP_FromJoin; + sqlite3ExprCodeTarget(pParse, &exprAnd, dest); + } + sqlite3ReleaseTempReg(pParse, regFree1); } - sqlite3ReleaseTempReg(pParse, regFree1); + sqlite3ExprDelete(db, pDel); /* Ensure adequate test coverage */ testcase( xJump==sqlite3ExprIfTrue && jumpIfNull==0 && regFree1==0 ); diff --git a/test/check.test b/test/check.test index dcd3c186cb..b703c75b00 100644 --- a/test/check.test +++ b/test/check.test @@ -495,4 +495,34 @@ do_execsql_test 10.1 { PRAGMA integrity_check; } {ok} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 11.0 { + CREATE TABLE t1 (Col0 CHECK(1 COLLATE BINARY BETWEEN 1 AND 1) ) ; +} +do_execsql_test 11.1 { + INSERT INTO t1 VALUES (NULL); +} +do_execsql_test 11.2 { + INSERT INTO t1 VALUES (NULL); +} + +do_execsql_test 11.3 { + CREATE TABLE t2(b, a CHECK( + CASE 'abc' COLLATE nocase WHEN a THEN 1 ELSE 0 END) + ); +} +do_execsql_test 11.4 { + INSERT INTO t2(a) VALUES('abc'); +} +do_execsql_test 11.5 { + INSERT INTO t2(b, a) VALUES(1, 'abc'||''); +} +do_execsql_test 11.6 { + INSERT INTO t2(b, a) VALUES(2, 'abc'); +} + +finish_test + + finish_test diff --git a/test/checkfault.test b/test/checkfault.test new file mode 100644 index 0000000000..3b18a64660 --- /dev/null +++ b/test/checkfault.test @@ -0,0 +1,41 @@ +# 2019 July 17 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file contains fault-injection test cases for the +# sqlite3_db_cacheflush API. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix cffault +source $testdir/malloc_common.tcl + +do_execsql_test 1.0 { + CREATE TABLE t1 (Col0 CHECK(1 COLLATE BINARY BETWEEN 1 AND 1) ) ; + CREATE TABLE t2(b, a CHECK( + CASE 'abc' COLLATE nocase WHEN a THEN 1 ELSE 0 END) + ); +} + +do_faultsim_test 1.1 -faults oom* -body { + execsql { INSERT INTO t1 VALUES ('ABCDEFG') } +} -test { + faultsim_test_result {0 {}} +} + +do_faultsim_test 1.2 -faults oom* -body { + execsql { INSERT INTO t2(a) VALUES('abc') } +} -test { + faultsim_test_result {0 {}} +} + + +finish_test From 09ea1256ecc31185dbc61ef61ee6be8fad5c9e02 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jul 2019 15:05:16 +0000 Subject: [PATCH 028/221] Improvement to the hexdb interpreter built into the CLI and into the TCL test harness: Round the "size" up to the next multiple of the "pagesize". FossilOrigin-Name: 9ec92939cb2d2c96ae15bc496feed233ce31424c25a6bf86ace7e0ef3eedec5b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 2 ++ src/test1.c | 5 +++++ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 35d331730a..5db234d5eb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sprocessing\sa\sBETWEEN\sor\sCASE\sexpression,\savoid\stransforming\sa\snode\sof\sthe\soriginal\sexpression\sinto\sa\sTK_REGISTER\snode.\sInstead,\stake\sa\scopy\sand\suse\sit\sinstead.\sFix\sfor\s[1be72aab9]. -D 2019-07-17T14:34:17.365 +C Improvement\sto\sthe\shexdb\sinterpreter\sbuilt\sinto\sthe\sCLI\sand\sinto\sthe\nTCL\stest\sharness:\sRound\sthe\s"size"\sup\sto\sthe\snext\smultiple\sof\sthe\s"pagesize". +D 2019-07-17T15:05:16.339 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 17d61645b0782809aa2cc68225e93c3ed6a55ca59edcdbf599b5b4a828cec9fb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c4b4fe44df6bcf32b693267ae9ec68e1c25f9a29d4a17afebd287d4af2f5fb51 -F src/shell.c.in 360607dce532811befb43946e10697833cadac8f8924aaeab56014c9e93c68a7 +F src/shell.c.in a571d51dd7605b34796e9942dce0e895156d1860383faf6aaca3c88b08fe2a43 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -532,7 +532,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c f57c229ad7878215d0b3bb5d59ffe94772c099ce5b5e147a4a59d3157923a988 +F src/test1.c 118945bc3c2aabe4528ef2ddb412868e29f5addfb76252b77d441e7b0d67043c F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 84a51a755c18ac8253080db6eec505df894ee3b1e97cfa8e61039ac38001e270 -R b1d6ad05577abecc48e59e3ebea1a6ed -U dan -Z f2c9fb7d68d7563adaf07df958f5d837 +P 7ef7b23cbb1b9ace9f853238d9133320c153e6c3417e6823ab6394ee1fe56358 +R 6e2985f89ff68a775ef455242410e4b1 +U drh +Z b432616aa5b09e1a9089723afa4c0f9c diff --git a/manifest.uuid b/manifest.uuid index 02af7a70e7..c537def954 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ef7b23cbb1b9ace9f853238d9133320c153e6c3417e6823ab6394ee1fe56358 \ No newline at end of file +9ec92939cb2d2c96ae15bc496feed233ce31424c25a6bf86ace7e0ef3eedec5b \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index c63e9bcd68..b51df8194b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3891,6 +3891,8 @@ static unsigned char *readHexDb(ShellState *p, int *pnData){ rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); if( rc!=2 ) goto readHexDb_error; if( n<0 ) goto readHexDb_error; + if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ) goto readHexDb_error; + n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ a = sqlite3_malloc( n ? n : 1 ); if( a==0 ){ utf8_printf(stderr, "Out of memory!\n"); diff --git a/src/test1.c b/src/test1.c index 9aaf79261e..02a7aad9fa 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7740,6 +7740,11 @@ static int SQLITE_TCLAPI test_decode_hexdb( int pgsz; rc = sscanf(zIn+i, "| size %d pagesize %d", &n, &pgsz); if( rc!=2 ) continue; + if( pgsz<512 || pgsz>65536 || (pgsz&(pgsz-1))!=0 ){ + Tcl_AppendResult(interp, "bad 'pagesize' field", (void*)0); + return TCL_ERROR; + } + n = (n+pgsz-1)&~(pgsz-1); /* Round n up to the next multiple of pgsz */ if( n<512 ){ Tcl_AppendResult(interp, "bad 'size' field", (void*)0); return TCL_ERROR; From 996f5ccb3328b12e8b8c65b0f536e1f717a60067 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jul 2019 16:18:01 +0000 Subject: [PATCH 029/221] Fix an incorrect assert() in balance_nonroot(). FossilOrigin-Name: 59c9e73f86b89ee17b0bce47bcb93f5b5ace5b7985678287195002afb9d40cd8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 7 +------ 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 5db234d5eb..f1a0625edc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvement\sto\sthe\shexdb\sinterpreter\sbuilt\sinto\sthe\sCLI\sand\sinto\sthe\nTCL\stest\sharness:\sRound\sthe\s"size"\sup\sto\sthe\snext\smultiple\sof\sthe\s"pagesize". -D 2019-07-17T15:05:16.339 +C Fix\san\sincorrect\sassert()\sin\sbalance_nonroot(). +D 2019-07-17T16:18:01.065 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -463,7 +463,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 83a4b1b744fad3ff675f68bc4de73834ed0e31edb412097f54e33cf181bba1ee +F src/btree.c 4508402e266bebfd0043fbbdfb95bbe632e0000f0bb36e72e84a4185572bce03 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 48f22e7c3b80550eb9c0cc3a3738f9117109b87d5f5fdba027009b7f2917df4a @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7ef7b23cbb1b9ace9f853238d9133320c153e6c3417e6823ab6394ee1fe56358 -R 6e2985f89ff68a775ef455242410e4b1 +P 9ec92939cb2d2c96ae15bc496feed233ce31424c25a6bf86ace7e0ef3eedec5b +R 3702a3106595b5f6d6a04730cae30997 U drh -Z b432616aa5b09e1a9089723afa4c0f9c +Z a30b17f39cdaae09fa64dd6ac4e1155d diff --git a/manifest.uuid b/manifest.uuid index c537def954..d3e618bf2d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ec92939cb2d2c96ae15bc496feed233ce31424c25a6bf86ace7e0ef3eedec5b \ No newline at end of file +59c9e73f86b89ee17b0bce47bcb93f5b5ace5b7985678287195002afb9d40cd8 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index db3b279233..02d21a6521 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6664,12 +6664,7 @@ static void insertCell( assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) ); assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) ); assert( sqlite3_mutex_held(pPage->pBt->mutex) ); - /* The cell should normally be sized correctly. However, when moving a - ** malformed cell from a leaf page to an interior page, if the cell size - ** wanted to be less than 4 but got rounded up to 4 on the leaf, then size - ** might be less than 8 (leaf-size + pointer) on the interior node. Hence - ** the term after the || in the following assert(). */ - assert( sz==pPage->xCellSize(pPage, pCell) || (sz==8 && iChild>0) ); + assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB ); assert( pPage->nFree>=0 ); if( pPage->nOverflow || sz+2>pPage->nFree ){ if( pTemp ){ From 4509ffa3621d1e44a3d4ba5fbf90dd9a629a9053 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 17 Jul 2019 19:57:55 +0000 Subject: [PATCH 030/221] Always use the stdlib.h intptr_t type for pointer-integer conversions, when it is available. FossilOrigin-Name: c0d932449db3deed42a99bd948aab61e56b2d8441d7de5243688695ff04e8177 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index f1a0625edc..34dc47d840 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\sassert()\sin\sbalance_nonroot(). -D 2019-07-17T16:18:01.065 +C Always\suse\sthe\sstdlib.h\sintptr_t\stype\sfor\spointer-integer\sconversions,\swhen\nit\sis\savailable. +D 2019-07-17T19:57:55.606 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/shell.c.in a571d51dd7605b34796e9942dce0e895156d1860383faf6aaca3c88b08fe2a4 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h c13c4abe0d245b6b2a4b4a1f9f2b6c4f7347b30b22f61b3fdfd4652b2b328906 +F src/sqliteInt.h 30dc455dd9591fd9cb31a64ff8a35decfb20fd96a936812459b1cd4eef1748f7 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9ec92939cb2d2c96ae15bc496feed233ce31424c25a6bf86ace7e0ef3eedec5b -R 3702a3106595b5f6d6a04730cae30997 +P 59c9e73f86b89ee17b0bce47bcb93f5b5ace5b7985678287195002afb9d40cd8 +R b55a72bb4aeab4322edd31e7f5a01d77 U drh -Z a30b17f39cdaae09fa64dd6ac4e1155d +Z 6a8453233a61053a41bb22e402d7e5e6 diff --git a/manifest.uuid b/manifest.uuid index d3e618bf2d..6c38018fcc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -59c9e73f86b89ee17b0bce47bcb93f5b5ace5b7985678287195002afb9d40cd8 \ No newline at end of file +c0d932449db3deed42a99bd948aab61e56b2d8441d7de5243688695ff04e8177 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c123dfffbf..837e056cf1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -212,15 +212,15 @@ ** So we have to define the macros in different ways depending on the ** compiler. */ -#if defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ +#if defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ +# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) +# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) +#elif defined(__PTRDIFF_TYPE__) /* This case should work for GCC */ # define SQLITE_INT_TO_PTR(X) ((void*)(__PTRDIFF_TYPE__)(X)) # define SQLITE_PTR_TO_INT(X) ((int)(__PTRDIFF_TYPE__)(X)) #elif !defined(__GNUC__) /* Works for compilers other than LLVM */ # define SQLITE_INT_TO_PTR(X) ((void*)&((char*)0)[X]) # define SQLITE_PTR_TO_INT(X) ((int)(((char*)X)-(char*)0)) -#elif defined(HAVE_STDINT_H) /* Use this case if we have ANSI headers */ -# define SQLITE_INT_TO_PTR(X) ((void*)(intptr_t)(X)) -# define SQLITE_PTR_TO_INT(X) ((int)(intptr_t)(X)) #else /* Generates a warning - but it always works */ # define SQLITE_INT_TO_PTR(X) ((void*)(X)) # define SQLITE_PTR_TO_INT(X) ((int)(X)) From b555b0806e5ded813f9a78c3f287fde1d12f5068 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jul 2019 01:11:27 +0000 Subject: [PATCH 031/221] Fix a new problem in the BETWEEN operator when applied to a window function. The problem was introduced yesterday by check-in [7ef7b23cbb1b9ace]. FossilOrigin-Name: 47e23064ba0205148f89e12803a62d5a4d6d2054f593f60c031e815112170b9b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/window.c | 1 + test/window1.test | 22 ++++++++++++++++++++-- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 34dc47d840..063f917cb4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\suse\sthe\sstdlib.h\sintptr_t\stype\sfor\spointer-integer\sconversions,\swhen\nit\sis\savailable. -D 2019-07-17T19:57:55.606 +C Fix\sa\snew\sproblem\sin\sthe\sBETWEEN\soperator\swhen\sapplied\sto\sa\swindow\sfunction.\nThe\sproblem\swas\sintroduced\syesterday\sby\scheck-in\s[7ef7b23cbb1b9ace]. +D 2019-07-19T01:11:27.778 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -612,7 +612,7 @@ F src/where.c 2f508c9a6dd2a42ad2b692105e77eb92cdec201d32916962ccdeff71836acb52 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c e0b821aa2867661d36f4673208e0afa0a57b47575c28fd6281996b6513d8e0d0 +F src/window.c cdce0114be495ceb97b92abfb437e75fa4a56cfae84895579af1374e2025d0cd F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1700,7 +1700,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 82202e139647e3797d5257cd896bc957275906c2d2ee1486980f64a5f34f0c3b +F test/window1.test 376a7c9c5b9df9868d92a6d9d455262e1b769f4410b19006f5f8c5507c2a7ed7 F test/window2.tcl a44834af6267be6e14882311ef8790bf5047f1b9bc25685ee1762d48dc24f1e7 F test/window2.test 2f3ae63e171dce7f2ac29a41020f4da413b1d7bdaba48ee124fd336b152e34c5 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 59c9e73f86b89ee17b0bce47bcb93f5b5ace5b7985678287195002afb9d40cd8 -R b55a72bb4aeab4322edd31e7f5a01d77 +P c0d932449db3deed42a99bd948aab61e56b2d8441d7de5243688695ff04e8177 +R 9abe58133bf0c1ae1a769c617adc4cd3 U drh -Z 6a8453233a61053a41bb22e402d7e5e6 +Z b575a9fb6c490182280eead5f3b52973 diff --git a/manifest.uuid b/manifest.uuid index 6c38018fcc..2126231e94 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c0d932449db3deed42a99bd948aab61e56b2d8441d7de5243688695ff04e8177 \ No newline at end of file +47e23064ba0205148f89e12803a62d5a4d6d2054f593f60c031e815112170b9b \ No newline at end of file diff --git a/src/window.c b/src/window.c index ff05aefb5d..d769b0bb7a 100644 --- a/src/window.c +++ b/src/window.c @@ -2022,6 +2022,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ pNew->eEnd = p->eEnd; pNew->eStart = p->eStart; pNew->eExclude = p->eExclude; + pNew->regResult = p->regResult; pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); pNew->pOwner = pOwner; diff --git a/test/window1.test b/test/window1.test index ccc6b48114..778bd861ba 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1170,6 +1170,24 @@ do_execsql_test 29.2 { 11 K cc 'xyz' K | } +# 2019-07-18 +# Check-in [7ef7b23cbb1b9ace] (which was itself a fix for ticket +# https://www.sqlite.org/src/info/1be72aab9) introduced a new problem +# if the LHS of a BETWEEN operator is a WINDOW function. The problem +# was found by (the recently enhanced) dbsqlfuzz. +# +do_execsql_test 30.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES('BB','aa',399); + SELECT + count () OVER win1 NOT BETWEEN 'a' AND 'mmm', + count () OVER win3 + FROM t1 + WINDOW win1 AS (ORDER BY a GROUPS BETWEEN 4 PRECEDING AND 1 FOLLOWING + EXCLUDE CURRENT ROW), + win2 AS (PARTITION BY b ORDER BY a), + win3 AS (win2 RANGE BETWEEN 5.2 PRECEDING AND true PRECEDING ); +} {1 1} + finish_test - - From a1ac03590baf0fffea9437436adeaf4a1db64a65 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 19 Jul 2019 10:31:29 +0000 Subject: [PATCH 032/221] Fix a faulty assert() in walker.c that could fail when processing an ALTER TABLE statement on a schema containing invalid table references that are part of a WINDOW definition. FossilOrigin-Name: ee076c28d8ee0f5b099cdef83ae6cea6ef5aa209ab528d7c49949dd653ce019c --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/walker.c | 3 ++- test/altertab3.test | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 063f917cb4..5631dae865 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\snew\sproblem\sin\sthe\sBETWEEN\soperator\swhen\sapplied\sto\sa\swindow\sfunction.\nThe\sproblem\swas\sintroduced\syesterday\sby\scheck-in\s[7ef7b23cbb1b9ace]. -D 2019-07-19T01:11:27.778 +C Fix\sa\sfaulty\sassert()\sin\swalker.c\sthat\scould\sfail\swhen\sprocessing\san\sALTER\sTABLE\sstatement\son\sa\sschema\scontaining\sinvalid\stable\sreferences\sthat\sare\spart\sof\sa\sWINDOW\sdefinition. +D 2019-07-19T10:31:29.400 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,7 +607,7 @@ F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c ccbe57a6eeedce5826510c509cebb547e0c877d53f14b3118698643057d4b597 +F src/walker.c 8fb08ed58d7dc8fc144ca6eab82bcb2e0f20b9824dc4279dd7a1fe75951dc2bc F src/where.c 2f508c9a6dd2a42ad2b692105e77eb92cdec201d32916962ccdeff71836acb52 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 7a2419829b2b908985b2c83d680388ef2eb9a74e446b68cee7b9b1551ae69078 +F test/altertab3.test 4f9dbe767c0f8892d0026b89f7b645b2b2fcd64d4940d9323fbd187955280637 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c0d932449db3deed42a99bd948aab61e56b2d8441d7de5243688695ff04e8177 -R 9abe58133bf0c1ae1a769c617adc4cd3 -U drh -Z b575a9fb6c490182280eead5f3b52973 +P 47e23064ba0205148f89e12803a62d5a4d6d2054f593f60c031e815112170b9b +R e89233ca9746832ca908e8f9e9b030aa +U dan +Z 89e5bf4fbbc31e53338b8409286bf1a6 diff --git a/manifest.uuid b/manifest.uuid index 2126231e94..97365947dd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -47e23064ba0205148f89e12803a62d5a4d6d2054f593f60c031e815112170b9b \ No newline at end of file +ee076c28d8ee0f5b099cdef83ae6cea6ef5aa209ab528d7c49949dd653ce019c \ No newline at end of file diff --git a/src/walker.c b/src/walker.c index b976886c5f..ee7d0ca9c0 100644 --- a/src/walker.c +++ b/src/walker.c @@ -120,8 +120,9 @@ int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ { Parse *pParse = pWalker->pParse; if( pParse && IN_RENAME_OBJECT ){ + /* The following may return WRC_Abort if there are unresolvable + ** symbols (e.g. a table that does not exist) in a window definition. */ int rc = walkWindowList(pWalker, p->pWinDefn); - assert( rc==WRC_Continue ); return rc; } } diff --git a/test/altertab3.test b/test/altertab3.test index 863da729c1..445df2c0b7 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -237,5 +237,40 @@ do_execsql_test 10.2 { ) IN () OR t1.a=5} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 11.1 { + CREATE TABLE t1( + a,b,c,d,e,f,g,h,j,jj,jjb,k,aa,bb,cc,dd,ee DEFAULT 3.14, + ff DEFAULT('hiccup'),Wg NOD NULL DEFAULT(false) + ); + + CREATE TRIGGER b AFTER INSERT ON t1 WHEN new.a BEGIN + SELECT a, sum() w3 FROM t1 + WINDOW b AS (ORDER BY NOT EXISTS(SELECT 1 FROM abc)); + END; +} + +do_catchsql_test 11.2 { + ALTER TABLE t1 RENAME TO t1x; +} {1 {error in trigger b: no such table: abc}} + +do_execsql_test 11.3 { + DROP TRIGGER b; + CREATE TRIGGER b AFTER INSERT ON t1 WHEN new.a BEGIN + SELECT a, sum() w3 FROM t1 + WINDOW b AS (ORDER BY NOT EXISTS(SELECT 1 FROM t1)); + END; +} {} + +do_execsql_test 11.4 { + ALTER TABLE t1 RENAME TO t1x; + SELECT sql FROM sqlite_master WHERE name = 'b'; +} { +{CREATE TRIGGER b AFTER INSERT ON "t1x" WHEN new.a BEGIN + SELECT a, sum() w3 FROM "t1x" + WINDOW b AS (ORDER BY NOT EXISTS(SELECT 1 FROM "t1x")); + END} +} finish_test From 750c6ba5e5ab75e15f660d82d5428c78a44eda4e Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 19 Jul 2019 11:20:42 +0000 Subject: [PATCH 033/221] Fix a problem with renaming tables when the schema contains WINDOW definitions with (illegal) non-numeric expressions as part of a PRECEDING or FOLLOWING clause. FossilOrigin-Name: 348e7f193a963390a0595183d603541f85c5d1a911c98ed2e06599691ffe98f5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/walker.c | 2 ++ test/altertab3.test | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5631dae865..a78f9113d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfaulty\sassert()\sin\swalker.c\sthat\scould\sfail\swhen\sprocessing\san\sALTER\sTABLE\sstatement\son\sa\sschema\scontaining\sinvalid\stable\sreferences\sthat\sare\spart\sof\sa\sWINDOW\sdefinition. -D 2019-07-19T10:31:29.400 +C Fix\sa\sproblem\swith\srenaming\stables\swhen\sthe\sschema\scontains\sWINDOW\sdefinitions\swith\s(illegal)\snon-numeric\sexpressions\sas\spart\sof\sa\sPRECEDING\sor\sFOLLOWING\sclause. +D 2019-07-19T11:20:42.298 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,7 +607,7 @@ F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c 8fb08ed58d7dc8fc144ca6eab82bcb2e0f20b9824dc4279dd7a1fe75951dc2bc +F src/walker.c 20a8455cfd5ccd9ebbf9efe434b828b890ae71574a5659a95848d6f55cecd602 F src/where.c 2f508c9a6dd2a42ad2b692105e77eb92cdec201d32916962ccdeff71836acb52 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 4f9dbe767c0f8892d0026b89f7b645b2b2fcd64d4940d9323fbd187955280637 +F test/altertab3.test 45b866733bb526d642484744ba41e974ce65e8563f57168bac82affdf7b991c8 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 47e23064ba0205148f89e12803a62d5a4d6d2054f593f60c031e815112170b9b -R e89233ca9746832ca908e8f9e9b030aa +P ee076c28d8ee0f5b099cdef83ae6cea6ef5aa209ab528d7c49949dd653ce019c +R 0b60d24c884cd826c60ea99ee8676ab8 U dan -Z 89e5bf4fbbc31e53338b8409286bf1a6 +Z de3c59a233ee09a2ce4ce825f6d983b0 diff --git a/manifest.uuid b/manifest.uuid index 97365947dd..59892e5244 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ee076c28d8ee0f5b099cdef83ae6cea6ef5aa209ab528d7c49949dd653ce019c \ No newline at end of file +348e7f193a963390a0595183d603541f85c5d1a911c98ed2e06599691ffe98f5 \ No newline at end of file diff --git a/src/walker.c b/src/walker.c index ee7d0ca9c0..e1ceaacfe3 100644 --- a/src/walker.c +++ b/src/walker.c @@ -28,6 +28,8 @@ static int walkWindowList(Walker *pWalker, Window *pList){ if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, pWin->pStart) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, pWin->pEnd) ) return WRC_Abort; } return WRC_Continue; } diff --git a/test/altertab3.test b/test/altertab3.test index 445df2c0b7..5085d6fa94 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -20,6 +20,7 @@ ifcapable !altertable { return } + ifcapable windowfunc { do_execsql_test 1.0 { CREATE TABLE t1(a, b); @@ -273,4 +274,48 @@ do_execsql_test 11.4 { END} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 12.1 { +CREATE TABLE t1(a,b,c,d,e,f,g,h,j,jj,Zjj,k,aQ,bb,cc,dd,ee DEFAULT 3.14, +ff DEFAULT('hiccup'),gg NOD NULL DEFAULT(false)); +CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + +SELECT b () OVER , dense_rank() OVER d, d () OVER w1 +FROM t1 +WINDOW +w1 AS +( w1 ORDER BY d +ROWS BETWEEN 2 NOT IN(SELECT a, sum(d) w2,max(d)OVER FROM t1 +WINDOW +w1 AS +(PARTITION BY d +ROWS BETWEEN '' PRECEDING AND false FOLLOWING), +d AS +(PARTITION BY b ORDER BY d +ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +) PRECEDING AND 1 FOLLOWING), +w2 AS +(PARTITION BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), +w3 AS +(PARTITION BY b ORDER BY d +ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) +; +SELECT a, sum(d) w2,max(d)OVER FROM t1 +WINDOW +w1 AS +(PARTITION BY d +ROWS BETWEEN '' PRECEDING AND false FOLLOWING), +d AS +(PARTITION BY b ORDER BY d +ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +; + +END; +} + +do_execsql_test 12.2 { + ALTER TABLE t1 RENAME TO t1x; +} + finish_test From 9bf022d57cd13c02976ce64d546cc2f12d0a0496 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 19 Jul 2019 14:32:42 +0000 Subject: [PATCH 034/221] Fix a problem with renaming a table when the schema contains an invocation of a window function that is not currently registered. FossilOrigin-Name: ff290feb97f689cf6ce4162d6aa36f9f9dcf1bff3096847d53a85f39f728d2de --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 5 +++++ test/altertab3.test | 13 +++++++++++++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a78f9113d9..78752a8440 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srenaming\stables\swhen\sthe\sschema\scontains\sWINDOW\sdefinitions\swith\s(illegal)\snon-numeric\sexpressions\sas\spart\sof\sa\sPRECEDING\sor\sFOLLOWING\sclause. -D 2019-07-19T11:20:42.298 +C Fix\sa\sproblem\swith\srenaming\sa\stable\swhen\sthe\sschema\scontains\san\sinvocation\sof\sa\swindow\sfunction\sthat\sis\snot\scurrently\sregistered. +D 2019-07-19T14:32:42.623 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 17d61645b0782809aa2cc68225e93c3ed6a55ca59edcdbf599b5b4a828cec9fb +F src/resolve.c df149546faab3dca0549d3c16abb07fae57126e1394f40ec7cd9129becee6b4e F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c4b4fe44df6bcf32b693267ae9ec68e1c25f9a29d4a17afebd287d4af2f5fb51 F src/shell.c.in a571d51dd7605b34796e9942dce0e895156d1860383faf6aaca3c88b08fe2a43 @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 45b866733bb526d642484744ba41e974ce65e8563f57168bac82affdf7b991c8 +F test/altertab3.test b20c9c42316d478817878acc9954b67b539ef444059a8acfa52ae6238b6fee29 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ee076c28d8ee0f5b099cdef83ae6cea6ef5aa209ab528d7c49949dd653ce019c -R 0b60d24c884cd826c60ea99ee8676ab8 +P 348e7f193a963390a0595183d603541f85c5d1a911c98ed2e06599691ffe98f5 +R 2caa2651096f2a30c0266bd0880e783b U dan -Z de3c59a233ee09a2ce4ce825f6d983b0 +Z 31de9586c7ae48f0b0e62ceaa957aebc diff --git a/manifest.uuid b/manifest.uuid index 59892e5244..d0a89447e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -348e7f193a963390a0595183d603541f85c5d1a911c98ed2e06599691ffe98f5 \ No newline at end of file +ff290feb97f689cf6ce4162d6aa36f9f9dcf1bff3096847d53a85f39f728d2de \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 54475f6d03..87020486ea 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -891,6 +891,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #endif } } +#ifndef SQLITE_OMIT_WINDOWFUNC + else if( pWin ){ + is_agg = 1; + } +#endif sqlite3WalkExprList(pWalker, pList); if( is_agg ){ #ifndef SQLITE_OMIT_WINDOWFUNC diff --git a/test/altertab3.test b/test/altertab3.test index 5085d6fa94..7db3d35ea4 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -318,4 +318,17 @@ do_execsql_test 12.2 { ALTER TABLE t1 RENAME TO t1x; } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 13.1 { + CREATE TABLE t1(a); + CREATE TRIGGER r1 INSERT ON t1 BEGIN + SELECT a(*) OVER (ORDER BY (SELECT 1)) FROM t1; + END; +} + +do_execsql_test 13.2 { + ALTER TABLE t1 RENAME TO t1x; +} + finish_test From c5cc870ef88c76ff6f234eb542700a54354bd3ae Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jul 2019 15:00:32 +0000 Subject: [PATCH 035/221] Refinement to check-in [348e7f193a963390] that avoids unreachable branches. FossilOrigin-Name: bbfb2908ecd113c88e69a0984cbe2550463cdd3a67648b0e4e3578e80630136e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/walker.c | 21 ++++++++++++++++----- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 78752a8440..1ba5fd894e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srenaming\sa\stable\swhen\sthe\sschema\scontains\san\sinvocation\sof\sa\swindow\sfunction\sthat\sis\snot\scurrently\sregistered. -D 2019-07-19T14:32:42.623 +C Refinement\sto\scheck-in\s[348e7f193a963390]\sthat\savoids\sunreachable\sbranches. +D 2019-07-19T15:00:32.611 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -607,7 +607,7 @@ F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c 20a8455cfd5ccd9ebbf9efe434b828b890ae71574a5659a95848d6f55cecd602 +F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 2f508c9a6dd2a42ad2b692105e77eb92cdec201d32916962ccdeff71836acb52 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 348e7f193a963390a0595183d603541f85c5d1a911c98ed2e06599691ffe98f5 -R 2caa2651096f2a30c0266bd0880e783b -U dan -Z 31de9586c7ae48f0b0e62ceaa957aebc +P ff290feb97f689cf6ce4162d6aa36f9f9dcf1bff3096847d53a85f39f728d2de +R 6535622f80dc0d9ebf53ef790422b635 +U drh +Z e57ea86f45822a56c5c84129128f3a39 diff --git a/manifest.uuid b/manifest.uuid index d0a89447e0..de2654ef1f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ff290feb97f689cf6ce4162d6aa36f9f9dcf1bff3096847d53a85f39f728d2de \ No newline at end of file +bbfb2908ecd113c88e69a0984cbe2550463cdd3a67648b0e4e3578e80630136e \ No newline at end of file diff --git a/src/walker.c b/src/walker.c index e1ceaacfe3..67ecd8a809 100644 --- a/src/walker.c +++ b/src/walker.c @@ -25,11 +25,22 @@ static int walkWindowList(Walker *pWalker, Window *pList){ Window *pWin; for(pWin=pList; pWin; pWin=pWin->pNextWin){ - if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; - if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, pWin->pStart) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, pWin->pEnd) ) return WRC_Abort; + int rc; + rc = sqlite3WalkExprList(pWalker, pWin->pOrderBy); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExprList(pWalker, pWin->pPartition); + if( rc ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pFilter); + if( rc ) return WRC_Abort; + + /* The next two are purely for calls to sqlite3RenameExprUnmap() + ** within sqlite3WindowOffsetExpr(). Because of constraints imposed + ** by sqlite3WindowOffsetExpr(), they can never fail. The results do + ** not matter anyhow. */ + rc = sqlite3WalkExpr(pWalker, pWin->pStart); + if( NEVER(rc) ) return WRC_Abort; + rc = sqlite3WalkExpr(pWalker, pWin->pEnd); + if( NEVER(rc) ) return WRC_Abort; } return WRC_Continue; } From e04c1ec52aa2d6bbd1f6d9b815219a75abe965b1 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jul 2019 15:03:54 +0000 Subject: [PATCH 036/221] New test cases added to test/fuzzdata8.db. FossilOrigin-Name: 39be3c61bd809cc89bdfdba90afc391ac9c2f81dfd8bb68a9b085b0ca8cd1fba --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1239040 -> 1248256 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 1ba5fd894e..4ef208b17e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refinement\sto\scheck-in\s[348e7f193a963390]\sthat\savoids\sunreachable\sbranches. -D 2019-07-19T15:00:32.611 +C New\stest\scases\sadded\sto\stest/fuzzdata8.db. +D 2019-07-19T15:03:54.627 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1011,7 +1011,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 -F test/fuzzdata8.db c69ca6d4bf1b25fd56ab432e9b96f2db0da752cfc6aa32700867f3a2d8a0514a +F test/fuzzdata8.db 8aa701701db4c374f45edd60a9649ab0043378c2d374f1cc21c81738888cf440 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ff290feb97f689cf6ce4162d6aa36f9f9dcf1bff3096847d53a85f39f728d2de -R 6535622f80dc0d9ebf53ef790422b635 +P bbfb2908ecd113c88e69a0984cbe2550463cdd3a67648b0e4e3578e80630136e +R 5a85ae3ae1027e3f5ee069edd22aa979 U drh -Z e57ea86f45822a56c5c84129128f3a39 +Z f717511e26c039f3661c75c518b1037a diff --git a/manifest.uuid b/manifest.uuid index de2654ef1f..88a3cda56a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bbfb2908ecd113c88e69a0984cbe2550463cdd3a67648b0e4e3578e80630136e \ No newline at end of file +39be3c61bd809cc89bdfdba90afc391ac9c2f81dfd8bb68a9b085b0ca8cd1fba \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 4452d295b8f141d6fc93bee6249dc969fc1467af..7eb434c38953e992d29d7e715dff448adac8126f 100644 GIT binary patch delta 25899 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%0A#18$lR3Lv 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 M+ZX?@fo#|X06)M^RsaA1 delta 21974 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≈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 Date: Sat, 20 Jul 2019 17:43:28 +0000 Subject: [PATCH 037/221] Performance optimizations in the rtreeStepToLeaf() routine of RTree. FossilOrigin-Name: 4e34e3615ff31f4a6432033797b2e1a6604007ea0e501d714ecb362632776150 --- ext/rtree/rtree.c | 11 ++++++++--- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index ea5e737aa3..6c208b5bdc 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1564,13 +1564,14 @@ static int rtreeStepToLeaf(RtreeCursor *pCur){ eInt = pRtree->eCoordType==RTREE_COORD_INT32; while( (p = rtreeSearchPointFirst(pCur))!=0 && p->iLevel>0 ){ + u8 *pCellData; pNode = rtreeNodeOfFirstSearchPoint(pCur, &rc); if( rc ) return rc; nCell = NCELL(pNode); assert( nCell<200 ); + pCellData = pNode->zData + (4+pRtree->nBytesPerCell*p->iCell); while( p->iCellzData + (4+pRtree->nBytesPerCell*p->iCell); eWithin = FULLY_WITHIN; for(ii=0; iiaConstraint + ii; @@ -1583,10 +1584,14 @@ static int rtreeStepToLeaf(RtreeCursor *pCur){ }else{ rtreeNonleafConstraint(pConstraint, eInt, pCellData, &eWithin); } - if( eWithin==NOT_WITHIN ) break; + if( eWithin==NOT_WITHIN ){ + p->iCell++; + pCellData += pRtree->nBytesPerCell; + break; + } } - p->iCell++; if( eWithin==NOT_WITHIN ) continue; + p->iCell++; x.iLevel = p->iLevel - 1; if( x.iLevel ){ x.id = readInt64(pCellData); diff --git a/manifest b/manifest index 4ef208b17e..9bbee3d359 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sadded\sto\stest/fuzzdata8.db. -D 2019-07-19T15:03:54.627 +C Performance\soptimizations\sin\sthe\srtreeStepToLeaf()\sroutine\sof\sRTree. +D 2019-07-20T17:43:28.746 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -376,7 +376,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c c591164125808f8bba9659e92665b78412cd263e654b6f05294f3a8da7cdd9fb -F ext/rtree/rtree.c 78c0d989c32e5baac471f0463e83cda5006c7e71ded39d633b5fc001a301a26e +F ext/rtree/rtree.c f3ec2d1e2c0612f8141238db27cf31cf7cf580b732df7e434b05017534982a67 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 7573134f1b4f59df36c1b0a6de51268fd3b9c714d91f3811482263e734e416ea F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bbfb2908ecd113c88e69a0984cbe2550463cdd3a67648b0e4e3578e80630136e -R 5a85ae3ae1027e3f5ee069edd22aa979 +P 39be3c61bd809cc89bdfdba90afc391ac9c2f81dfd8bb68a9b085b0ca8cd1fba +R de7d7098bb99bd8f8735d10910c84616 U drh -Z f717511e26c039f3661c75c518b1037a +Z 8667389b078bb1f50542b3cd2f653cd6 diff --git a/manifest.uuid b/manifest.uuid index 88a3cda56a..201d8a0d66 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -39be3c61bd809cc89bdfdba90afc391ac9c2f81dfd8bb68a9b085b0ca8cd1fba \ No newline at end of file +4e34e3615ff31f4a6432033797b2e1a6604007ea0e501d714ecb362632776150 \ No newline at end of file From 7fc296aa662e02fc715facf50b6fb095794d7641 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 20 Jul 2019 18:00:46 +0000 Subject: [PATCH 038/221] Early detection of a corrupt R-Tree in the R-Tree search algorithm. FossilOrigin-Name: 2bf5a4c16457562dc942bcc6ec06d9b4e795ef3ea8e31550e18857bbebd08a76 --- ext/rtree/rtree.c | 6 ++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 6c208b5bdc..a3dfa9b5ca 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -1595,6 +1595,12 @@ static int rtreeStepToLeaf(RtreeCursor *pCur){ x.iLevel = p->iLevel - 1; if( x.iLevel ){ x.id = readInt64(pCellData); + for(ii=0; iinPoint; ii++){ + if( pCur->aPoint[ii].id==x.id ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } + } x.iCell = 0; }else{ x.id = p->id; diff --git a/manifest b/manifest index 9bbee3d359..51512e1885 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimizations\sin\sthe\srtreeStepToLeaf()\sroutine\sof\sRTree. -D 2019-07-20T17:43:28.746 +C Early\sdetection\sof\sa\scorrupt\sR-Tree\sin\sthe\sR-Tree\ssearch\salgorithm. +D 2019-07-20T18:00:46.010 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -376,7 +376,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c c591164125808f8bba9659e92665b78412cd263e654b6f05294f3a8da7cdd9fb -F ext/rtree/rtree.c f3ec2d1e2c0612f8141238db27cf31cf7cf580b732df7e434b05017534982a67 +F ext/rtree/rtree.c 2bc0cec6c2570d48717472d317dbbe602e296336909c011fb70eab60800325f2 F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 7573134f1b4f59df36c1b0a6de51268fd3b9c714d91f3811482263e734e416ea F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 39be3c61bd809cc89bdfdba90afc391ac9c2f81dfd8bb68a9b085b0ca8cd1fba -R de7d7098bb99bd8f8735d10910c84616 +P 4e34e3615ff31f4a6432033797b2e1a6604007ea0e501d714ecb362632776150 +R d8a423d78b6859d967916f59be3f03d7 U drh -Z 8667389b078bb1f50542b3cd2f653cd6 +Z df8d1caa448f0c0227a80eae9d88cd51 diff --git a/manifest.uuid b/manifest.uuid index 201d8a0d66..71f68e41c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4e34e3615ff31f4a6432033797b2e1a6604007ea0e501d714ecb362632776150 \ No newline at end of file +2bf5a4c16457562dc942bcc6ec06d9b4e795ef3ea8e31550e18857bbebd08a76 \ No newline at end of file From fd15e18d7fe9bea571c52324a6eae25f3e2b4ebc Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 20 Jul 2019 21:12:31 +0000 Subject: [PATCH 039/221] Make sure any window definitions in an ORDER BY clause are removed from the SELECT statement if the ORDER BY clause gets optimized out. FossilOrigin-Name: 23b119671f0be3c6b72cf2dc5f7707a0626766db7aa56529ab00d33d1a0a1bee --- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/resolve.c | 40 +++++++++++++++++++++++++++++----------- src/select.c | 1 + src/sqliteInt.h | 4 ++++ 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 51512e1885..529dd7cfe5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Early\sdetection\sof\sa\scorrupt\sR-Tree\sin\sthe\sR-Tree\ssearch\salgorithm. -D 2019-07-20T18:00:46.010 +C Make\ssure\sany\swindow\sdefinitions\sin\san\sORDER\sBY\sclause\sare\sremoved\sfrom\nthe\sSELECT\sstatement\sif\sthe\sORDER\sBY\sclause\sgets\soptimized\sout. +D 2019-07-20T21:12:31.257 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,14 +520,14 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c df149546faab3dca0549d3c16abb07fae57126e1394f40ec7cd9129becee6b4e +F src/resolve.c 78066ab31d1bef84ee08867afc861759a590dcfe87e1096e31bbf094f7e5faf8 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c c4b4fe44df6bcf32b693267ae9ec68e1c25f9a29d4a17afebd287d4af2f5fb51 +F src/select.c 2890d92d5d8a4b00092a34dfe03d0acf752972c2ec3443ee519d54f3b18e286b F src/shell.c.in a571d51dd7605b34796e9942dce0e895156d1860383faf6aaca3c88b08fe2a43 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 30dc455dd9591fd9cb31a64ff8a35decfb20fd96a936812459b1cd4eef1748f7 +F src/sqliteInt.h 4d078408e4abf88bee4c620e010bfa06f547df824b28b70cac8bc85d5fcb515f F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1837,7 +1837,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 4e34e3615ff31f4a6432033797b2e1a6604007ea0e501d714ecb362632776150 -R d8a423d78b6859d967916f59be3f03d7 +P 2bf5a4c16457562dc942bcc6ec06d9b4e795ef3ea8e31550e18857bbebd08a76 +R 6add6e706621c6ad32ed71a1edb66a9a +T *branch * winfunc-in-orderby +T *sym-winfunc-in-orderby * +T -sym-trunk * U drh -Z df8d1caa448f0c0227a80eae9d88cd51 +Z ed84c88ba9a0094fa58af4bcbfad001d diff --git a/manifest.uuid b/manifest.uuid index 71f68e41c1..e6dccde7f7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2bf5a4c16457562dc942bcc6ec06d9b4e795ef3ea8e31550e18857bbebd08a76 \ No newline at end of file +23b119671f0be3c6b72cf2dc5f7707a0626766db7aa56529ab00d33d1a0a1bee \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 87020486ea..cf3d9c339f 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1295,7 +1295,8 @@ int sqlite3ResolveOrderGroupBy( #ifndef SQLITE_OMIT_WINDOWFUNC /* -** Walker callback for resolveRemoveWindows(). +** Walker callback for sqlite3WindowRemoveExprFromSelect() and +** sqlite3WindowRemoveExprListFromSelect() */ static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ if( ExprHasProperty(pExpr, EP_WinFunc) ){ @@ -1314,16 +1315,33 @@ static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ ** Remove any Window objects owned by the expression pExpr from the ** Select.pWin list of Select object pSelect. */ -static void resolveRemoveWindows(Select *pSelect, Expr *pExpr){ - Walker sWalker; - memset(&sWalker, 0, sizeof(Walker)); - sWalker.xExprCallback = resolveRemoveWindowsCb; - sWalker.u.pSelect = pSelect; - sqlite3WalkExpr(&sWalker, pExpr); +void sqlite3WindowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ + if( pSelect->pWin ){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); + } } -#else -# define resolveRemoveWindows(x,y) -#endif + +/* +** Remove any Window objects owned by the expression list from the +** Select.pWin list of Select object pSelect. +*/ +void sqlite3WindowRemoveExprListFromSelect(Select *pSelect, ExprList *pList){ + if( pList && pSelect->pWin ){ + int i; + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + for(i=0; inExpr; i++){ + sqlite3WalkExpr(&sWalker, pList->a[i].pExpr); + } + } +} +#endif /* SQLITE_OMIT_WINDOWFUNC */ /* ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. @@ -1394,7 +1412,7 @@ static int resolveOrderGroupBy( /* Since this expresion is being changed into a reference ** to an identical expression in the result set, remove all Window ** objects belonging to the expression from the Select.pWin list. */ - resolveRemoveWindows(pSelect, pE); + sqlite3WindowRemoveExprFromSelect(pSelect, pE); pItem->u.x.iOrderByCol = j+1; } } diff --git a/src/select.c b/src/select.c index 397037b17f..824583c8f4 100644 --- a/src/select.c +++ b/src/select.c @@ -5661,6 +5661,7 @@ int sqlite3Select( pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_Fifo); /* If ORDER BY makes no difference in the output then neither does ** DISTINCT so it can be removed too. */ + sqlite3WindowRemoveExprListFromSelect(p, p->pOrderBy); sqlite3ExprListDelete(db, p->pOrderBy); p->pOrderBy = 0; p->selFlags &= ~SF_Distinct; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 837e056cf1..0d3e19efc4 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3627,10 +3627,14 @@ Window *sqlite3WindowListDup(sqlite3 *db, Window *p); void sqlite3WindowFunctions(void); void sqlite3WindowChain(Parse*, Window*, Window*); Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); +void sqlite3WindowRemoveExprFromSelect(Select*,Expr*); +void sqlite3WindowRemoveExprListFromSelect(Select*,ExprList*); #else # define sqlite3WindowDelete(a,b) # define sqlite3WindowFunctions() # define sqlite3WindowAttach(a,b,c) +# define sqlite3WindowRemoveExprFromSelect(Select*,Expr*); +# define sqlite3WindowRemoveExprListFromSelect(Select*,ExprList*); #endif /* From 1e60261cfbc34cdad2625241ba6e5bedfb2e6716 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 22 Jul 2019 11:38:43 +0000 Subject: [PATCH 040/221] Fix a problem with renaming tables when the schema contains an invocation of a currently unregistered aggregate with a FILTER clause. FossilOrigin-Name: bd37ce3fb8dee8d538f6afc0bfc13cdc3ebdd504e6461f0130c6ecc8af585f68 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 2 +- test/altertab3.test | 15 +++++++++++++++ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 51512e1885..fc679ee5de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Early\sdetection\sof\sa\scorrupt\sR-Tree\sin\sthe\sR-Tree\ssearch\salgorithm. -D 2019-07-20T18:00:46.010 +C Fix\sa\sproblem\swith\srenaming\stables\swhen\sthe\sschema\scontains\san\sinvocation\sof\sa\scurrently\sunregistered\saggregate\swith\sa\sFILTER\sclause. +D 2019-07-22T11:38:43.410 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c df149546faab3dca0549d3c16abb07fae57126e1394f40ec7cd9129becee6b4e +F src/resolve.c 844e5d127f2a3f3e1992b3571b0c710cdbcdccdd7e216930f3cf2e685675e4fe F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c4b4fe44df6bcf32b693267ae9ec68e1c25f9a29d4a17afebd287d4af2f5fb51 F src/shell.c.in a571d51dd7605b34796e9942dce0e895156d1860383faf6aaca3c88b08fe2a43 @@ -632,7 +632,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test b20c9c42316d478817878acc9954b67b539ef444059a8acfa52ae6238b6fee29 +F test/altertab3.test 8e6db08ed61aab2ca2d2f19608ba9d4dcade669b057e581588d3aa0a6d642e27 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4e34e3615ff31f4a6432033797b2e1a6604007ea0e501d714ecb362632776150 -R d8a423d78b6859d967916f59be3f03d7 -U drh -Z df8d1caa448f0c0227a80eae9d88cd51 +P 2bf5a4c16457562dc942bcc6ec06d9b4e795ef3ea8e31550e18857bbebd08a76 +R e8003e9b2b1103083ec3c473a6e857e0 +U dan +Z 52b0d7cc4076423a4b21fd3826ccf54b diff --git a/manifest.uuid b/manifest.uuid index 71f68e41c1..0274e91384 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2bf5a4c16457562dc942bcc6ec06d9b4e795ef3ea8e31550e18857bbebd08a76 \ No newline at end of file +bd37ce3fb8dee8d538f6afc0bfc13cdc3ebdd504e6461f0130c6ecc8af585f68 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 87020486ea..be6430debd 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -892,7 +892,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } } #ifndef SQLITE_OMIT_WINDOWFUNC - else if( pWin ){ + else if( ExprHasProperty(pExpr, EP_WinFunc) ){ is_agg = 1; } #endif diff --git a/test/altertab3.test b/test/altertab3.test index 7db3d35ea4..8a275ebc31 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -331,4 +331,19 @@ do_execsql_test 13.2 { ALTER TABLE t1 RENAME TO t1x; } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 14.1 { + CREATE TABLE t1(a); + CREATE TABLE t2(b); + CREATE TRIGGER AFTER INSERT ON t1 BEGIN + SELECT sum() FILTER (WHERE (SELECT sum() FILTER (WHERE 0)) AND a); + END; +} + +do_catchsql_test 14.2 { + ALTER TABLE t1 RENAME TO t1x; +} {1 {error in trigger AFTER: no such column: a}} + finish_test + From 75b0821e999cb14d4081a6ff8090e28e49e5bc7e Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 22 Jul 2019 16:20:03 +0000 Subject: [PATCH 041/221] Remove Window objects from the corresponding Select.pWin list when they are deleted. FossilOrigin-Name: d23f33168222dfa40a67dc7de58057418151989e81429e4af47617e86db04667 --- manifest | 27 ++++++++++++--------------- manifest.uuid | 2 +- src/expr.c | 13 ++++++++++--- src/resolve.c | 46 +++++++++++++++++----------------------------- src/select.c | 2 +- src/sqliteInt.h | 5 +---- src/window.c | 4 ++++ test/window9.test | 24 ++++++++++++++++++++++++ 8 files changed, 70 insertions(+), 53 deletions(-) diff --git a/manifest b/manifest index 529dd7cfe5..4d2185e45e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sany\swindow\sdefinitions\sin\san\sORDER\sBY\sclause\sare\sremoved\sfrom\nthe\sSELECT\sstatement\sif\sthe\sORDER\sBY\sclause\sgets\soptimized\sout. -D 2019-07-20T21:12:31.257 +C Remove\sWindow\sobjects\sfrom\sthe\scorresponding\sSelect.pWin\slist\swhen\sthey\sare\sdeleted. +D 2019-07-22T16:20:03.092 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c f1d87bc9f2d0f14df97b768d5a3d4e4e606fbe45372bc9a0cb6a2623d1933e6d +F src/expr.c 3dba8ac22b89b6af10cff7d672f8cab4a71c7ee75abb4cbc0a6a79d32f752a4a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c ab1971900477e93b6aaabf160d2d1c79c06edd9227441ccfaf0de7e7431d7f48 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -520,14 +520,14 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 78066ab31d1bef84ee08867afc861759a590dcfe87e1096e31bbf094f7e5faf8 +F src/resolve.c b65e59bb9ab798daa269988978a4457e09688b2b14ccca1283df312dff09e176 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 2890d92d5d8a4b00092a34dfe03d0acf752972c2ec3443ee519d54f3b18e286b +F src/select.c 9817d812b13c956ac28d27390602751a8add217f87224d2636fb3ef7e4d646a7 F src/shell.c.in a571d51dd7605b34796e9942dce0e895156d1860383faf6aaca3c88b08fe2a43 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 4d078408e4abf88bee4c620e010bfa06f547df824b28b70cac8bc85d5fcb515f +F src/sqliteInt.h 01af0390cccdf0ea1c3057923afe7370a1f24a6e3363d802dd2e15fe66b0ea88 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -612,7 +612,7 @@ F src/where.c 2f508c9a6dd2a42ad2b692105e77eb92cdec201d32916962ccdeff71836acb52 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c cdce0114be495ceb97b92abfb437e75fa4a56cfae84895579af1374e2025d0cd +F src/window.c 2c958b4bdccbd5a7450621541563d4263e50953a4454d97d44171aab2c549d30 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1713,7 +1713,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f -F test/window9.test 06495ac733843849b1fca8a79d13ba330d04aba02099703198af2ba7e231f90c +F test/window9.test 4329f463a151eb12ede2a73bbcf67abf0b9f781c8a1346f4138249f228a02b7e F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5 @@ -1837,10 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2bf5a4c16457562dc942bcc6ec06d9b4e795ef3ea8e31550e18857bbebd08a76 -R 6add6e706621c6ad32ed71a1edb66a9a -T *branch * winfunc-in-orderby -T *sym-winfunc-in-orderby * -T -sym-trunk * -U drh -Z ed84c88ba9a0094fa58af4bcbfad001d +P 23b119671f0be3c6b72cf2dc5f7707a0626766db7aa56529ab00d33d1a0a1bee +R 13a07fa9ef49fc058e474311b2df66d2 +U dan +Z fdd41db124ff7febe0dc66dbeefcc10c diff --git a/manifest.uuid b/manifest.uuid index e6dccde7f7..698e86eae3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23b119671f0be3c6b72cf2dc5f7707a0626766db7aa56529ab00d33d1a0a1bee \ No newline at end of file +d23f33168222dfa40a67dc7de58057418151989e81429e4af47617e86db04667 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 56b3148ede..571e9e494b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1326,10 +1326,17 @@ static With *withDup(sqlite3 *db, With *p){ */ static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_FUNCTION && ExprHasProperty(pExpr, EP_WinFunc) ){ - assert( pExpr->y.pWin ); + Select *pSelect = pWalker->u.pSelect; + Window *pWin = pExpr->y.pWin; + assert( pWin ); assert( IsWindowFunc(pExpr) ); - pExpr->y.pWin->pNextWin = pWalker->u.pSelect->pWin; - pWalker->u.pSelect->pWin = pExpr->y.pWin; + if( pSelect->pWin ){ + *pSelect->pWin->ppThis = pSelect->pWin->pNextWin; + pSelect->pWin->ppThis = &pWin->pNextWin; + } + pWin->pNextWin = pSelect->pWin; + pWin->ppThis = &pSelect->pWin; + pSelect->pWin = pWin; } return WRC_Continue; } diff --git a/src/resolve.c b/src/resolve.c index cf3d9c339f..2fd98ef0b6 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -901,6 +901,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #ifndef SQLITE_OMIT_WINDOWFUNC if( pWin ){ Select *pSel = pNC->pWinSelect; + assert( pWin==pExpr->y.pWin ); if( IN_RENAME_OBJECT==0 ){ sqlite3WindowUpdate(pParse, pSel->pWinDefn, pWin, pDef); } @@ -910,8 +911,12 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( 0==pSel->pWin || 0==sqlite3WindowCompare(pParse, pSel->pWin, pWin, 0) ){ - pExpr->y.pWin->pNextWin = pSel->pWin; - pSel->pWin = pExpr->y.pWin; + pWin->pNextWin = pSel->pWin; + if( pSel->pWin ){ + pSel->pWin->ppThis = &pWin->pNextWin; + } + pSel->pWin = pWin; + pWin->ppThis = &pSel->pWin; } pNC->ncFlags |= NC_HasWin; }else @@ -1295,17 +1300,15 @@ int sqlite3ResolveOrderGroupBy( #ifndef SQLITE_OMIT_WINDOWFUNC /* -** Walker callback for sqlite3WindowRemoveExprFromSelect() and -** sqlite3WindowRemoveExprListFromSelect() +** Walker callback for windowRemoveExprFromSelect(). */ static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ if( ExprHasProperty(pExpr, EP_WinFunc) ){ - Window **pp; - for(pp=&pWalker->u.pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ - if( *pp==pExpr->y.pWin ){ - *pp = (*pp)->pNextWin; - break; - } + Window *pWin = pExpr->y.pWin; + if( pWin->ppThis ){ + *pWin->ppThis = pWin->pNextWin; + if( pWin->pNextWin ) pWin->pNextWin->ppThis = pWin->ppThis; + pWin->ppThis = 0; } } return WRC_Continue; @@ -1315,7 +1318,7 @@ static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ ** Remove any Window objects owned by the expression pExpr from the ** Select.pWin list of Select object pSelect. */ -void sqlite3WindowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ +static void windowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ if( pSelect->pWin ){ Walker sWalker; memset(&sWalker, 0, sizeof(Walker)); @@ -1324,23 +1327,8 @@ void sqlite3WindowRemoveExprFromSelect(Select *pSelect, Expr *pExpr){ sqlite3WalkExpr(&sWalker, pExpr); } } - -/* -** Remove any Window objects owned by the expression list from the -** Select.pWin list of Select object pSelect. -*/ -void sqlite3WindowRemoveExprListFromSelect(Select *pSelect, ExprList *pList){ - if( pList && pSelect->pWin ){ - int i; - Walker sWalker; - memset(&sWalker, 0, sizeof(Walker)); - sWalker.xExprCallback = resolveRemoveWindowsCb; - sWalker.u.pSelect = pSelect; - for(i=0; inExpr; i++){ - sqlite3WalkExpr(&sWalker, pList->a[i].pExpr); - } - } -} +#else +# define windowRemoveExprFromSelect(a, b) #endif /* SQLITE_OMIT_WINDOWFUNC */ /* @@ -1412,7 +1400,7 @@ static int resolveOrderGroupBy( /* Since this expresion is being changed into a reference ** to an identical expression in the result set, remove all Window ** objects belonging to the expression from the Select.pWin list. */ - sqlite3WindowRemoveExprFromSelect(pSelect, pE); + windowRemoveExprFromSelect(pSelect, pE); pItem->u.x.iOrderByCol = j+1; } } diff --git a/src/select.c b/src/select.c index 824583c8f4..6e0eeb2f4e 100644 --- a/src/select.c +++ b/src/select.c @@ -102,6 +102,7 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){ } #endif if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); + assert( p->pWin==0 ); if( bFree ) sqlite3DbFreeNN(db, p); p = pPrior; bFree = 1; @@ -5661,7 +5662,6 @@ int sqlite3Select( pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_Fifo); /* If ORDER BY makes no difference in the output then neither does ** DISTINCT so it can be removed too. */ - sqlite3WindowRemoveExprListFromSelect(p, p->pOrderBy); sqlite3ExprListDelete(db, p->pOrderBy); p->pOrderBy = 0; p->selFlags &= ~SF_Distinct; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0d3e19efc4..e55eadea67 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3594,6 +3594,7 @@ struct Window { u8 eExclude; /* TK_NO, TK_CURRENT, TK_TIES, TK_GROUP, or 0 */ Expr *pStart; /* Expression for " PRECEDING" */ Expr *pEnd; /* Expression for " FOLLOWING" */ + Window **ppThis; /* Pointer to this object in Select.pWin list */ Window *pNextWin; /* Next window function belonging to this SELECT */ Expr *pFilter; /* The FILTER expression */ FuncDef *pFunc; /* The function */ @@ -3627,14 +3628,10 @@ Window *sqlite3WindowListDup(sqlite3 *db, Window *p); void sqlite3WindowFunctions(void); void sqlite3WindowChain(Parse*, Window*, Window*); Window *sqlite3WindowAssemble(Parse*, Window*, ExprList*, ExprList*, Token*); -void sqlite3WindowRemoveExprFromSelect(Select*,Expr*); -void sqlite3WindowRemoveExprListFromSelect(Select*,ExprList*); #else # define sqlite3WindowDelete(a,b) # define sqlite3WindowFunctions() # define sqlite3WindowAttach(a,b,c) -# define sqlite3WindowRemoveExprFromSelect(Select*,Expr*); -# define sqlite3WindowRemoveExprListFromSelect(Select*,ExprList*); #endif /* diff --git a/src/window.c b/src/window.c index d769b0bb7a..f94370a497 100644 --- a/src/window.c +++ b/src/window.c @@ -1022,6 +1022,10 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ */ void sqlite3WindowDelete(sqlite3 *db, Window *p){ if( p ){ + if( p->ppThis ){ + *p->ppThis = p->pNextWin; + if( p->pNextWin ) p->pNextWin->ppThis = p->ppThis; + } sqlite3ExprDelete(db, p->pFilter); sqlite3ExprListDelete(db, p->pPartition); sqlite3ExprListDelete(db, p->pOrderBy); diff --git a/test/window9.test b/test/window9.test index 5a32a75378..602a7bdfb3 100644 --- a/test/window9.test +++ b/test/window9.test @@ -98,5 +98,29 @@ do_execsql_test 2.2.2 { SELECT b=='2', rank() OVER (ORDER BY a) FROM t1 } {1 1 0 2} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 3.0 { + CREATE TABLE t1(a); + CREATE TABLE t2(a,b,c); +} + +do_execsql_test 3.1 { + SELECT EXISTS(SELECT 1 FROM t1 ORDER BY sum(a) OVER ()) FROM t1; +} + +do_execsql_test 3.2 { + SELECT sum(a) OVER () FROM t2 + ORDER BY EXISTS(SELECT 1 FROM t2 ORDER BY sum(a) OVER ()); +} + +do_catchsql_test 3.3 { + SELECT a, sum(a) OVER (ORDER BY a DESC) FROM t2 + ORDER BY EXISTS( + SELECT 1 FROM t2 ORDER BY sum(a) OVER (ORDER BY a) + ) OVER (ORDER BY a); +} {1 {near "OVER": syntax error}} + + finish_test From cda50737f4be40a02bf786f99cdcc5cb87bb568e Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 22 Jul 2019 16:57:13 +0000 Subject: [PATCH 042/221] New test cases added to test/fuzzdata8.db FossilOrigin-Name: 25fec62ac5a23382a54eee78d3705885eb4065826d7e8da098816d03ae9dc639 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1248256 -> 1256448 bytes 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 25bdd00639..6566c1bd39 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sWindow\sobjects\sfrom\sthe\scorresponding\sSelect.pWin\slist\swhen\sthey\sare\sdeleted,\sas\sthey\sare,\sfor\sexample,\swhen\sthe\sORDER\sBY\sclause\sis\soptimized\sout. -D 2019-07-22T16:33:02.936 +C New\stest\scases\sadded\sto\stest/fuzzdata8.db +D 2019-07-22T16:57:13.538 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1011,7 +1011,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 -F test/fuzzdata8.db 8aa701701db4c374f45edd60a9649ab0043378c2d374f1cc21c81738888cf440 +F test/fuzzdata8.db 5142ecb1f8dae2ba6c6e3098c7b1a1bff635e2e6c3232bfe22c8d3b39b8a5e23 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1837,8 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bd37ce3fb8dee8d538f6afc0bfc13cdc3ebdd504e6461f0130c6ecc8af585f68 d23f33168222dfa40a67dc7de58057418151989e81429e4af47617e86db04667 -R a453e99f9348decd797862fc4bdc9e7c -T +closed d23f33168222dfa40a67dc7de58057418151989e81429e4af47617e86db04667 -U dan -Z 969d210cbdfb355e385521e5fc73fac7 +P fd7316cda0fdfe86985f41a97dff3beba188606ec9bc6fef38a686a6976a6e01 +R 45d11109e6708bf4627af9528a656ade +U drh +Z ea733881a87798cdb6121c0f61beb864 diff --git a/manifest.uuid b/manifest.uuid index 41542cea9f..476559d5b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fd7316cda0fdfe86985f41a97dff3beba188606ec9bc6fef38a686a6976a6e01 \ No newline at end of file +25fec62ac5a23382a54eee78d3705885eb4065826d7e8da098816d03ae9dc639 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 7eb434c38953e992d29d7e715dff448adac8126f..00ab95ef5ae875bc69f56479a8cf72d429200a65 100644 GIT binary patch delta 23920 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�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 V@>_|XvjJ3;k)3NiZ}#xs{{`Lbbg=*c delta 21611 zcmc(HcYIV;^Y@;6Zr{7RcazXd5(vFy7eW(45=4r$gx-XNCQ=icASGFvAP5No1`Ci# zmzGd6bP_>9MMw~RP!NKmA~it-RLVPdks|uMfBqgnpB>CC=ggUzGiT0s=G>Ii?NgSu zPc7$u-DVRH*`EGaBdvCQ_Ih^wMulzNZm4Bg@;kmLdS;=oIni0ZNTOqW&4>>5y+E{| zuL;qvzQ#mf_BA5f($|n^BVPleUSEBpm3{SyhWP3d4f53?YWQl}Z2W<*2GQHTYDBO2 zsuKOlSDEMqUnQd7_(F-EO7?}&KPP;_M34F^68*?mf#^YBd7^uK<%n+al_k2ySDNU1 zzLG@27esWSFOcYLpPOj1&qefgpOfflpM&U7pFy;j&rUSXrx9)IQ;ELdQ;62{Nkpso zl12K*?GuRV$wc@xn@zYkmB_6rL@rJy^3^0F2T7E|u5m;%#}b*BNaW3tL}rX2GIBVP zgrP)w42* zNU5xUQzG3+nXE18lC>sPvKL8{$t;F6$(oWPStBozx*j66NSCZ;Z6aZ{h*TtXveKkY z7EqmtK^kQ;DU{i&kZJuEM&vr_)OLwfYP%3ZBm{q-D(C|H0MeQ&!y&P`Tn^uwBTV9K z6?m@8b+O)jp^k$EV*ES8NVK?YYZS1=CG z5f(GHHfNWxO_WNAw&gDW6G%^(oNdU-6*5JsBwhDDd9zZ^$HGH_ZOl0;ydg@Z=w9;E zdyo|=t5B4|?GU>`?uyZ02nPjeGx3rI1y$AQV7{gd!=ij4kh5&KF-V<(Z=MpSaJCI@ z3{@xMl+(hSoNb4K*=iX$I8JE|okps4Fzu|6t4O6q+qtKF$WU>Xl8RwJ3TFgqEA@~A zapmpb;CGjVs+=Ljh1h#zzpKI;&UQi4LcKP6ii9sY+YM>Wc^Qb#*A)!AC7kDM53m(> zV&tyyv%<>m9L+0nbzfGaGNP?;?4zO0{Xnk*p0>J7GtIV>e*3}u8w{In=lAl55e zte4{utBRt<{}=Q-h3;d<9R>$}<3Z>ez;7}36=V+=8(@<`{4>tJhKfh{_pow~*m&v3 znuwKN;}-<>A4pqkEXT|de5A@MqH8=a5~MGwxo;uq1$$G7?_`$3?i2ZD&dxyGb)g&f zn!-Qi>@39H6iQ&36n>er@1VJ4R>o>G`B~1+0o%^U!}%JfioQAgvML3OwqM566s?CJ zr14h-_D#kW(Y*Tryqo@T4qOlXD2VONTH(b zYJ$}hP){n@+v-)Z?0){EAbn4LUdEW&juKA=SIi(+;kBSspwS8z9^&KJ6-X-2gW!)r zJRT<==JPna3VDH!D7aVKQ5}aL<;ys`2JUf26O25@uPIU`nu^I!I>gsb@ugh)h59N2 z-;c)YIQcZ6!&xz~GQ1pQd|?c=v^D^LIm^p(b`!j_#OjbSmRGaVNF#BHGT_F}sL=DOl|PNh^;4 zakY$%ka&idz}#EBnbk6*xS$-5K##`=e{LXStbs5QE^ucs1V@YCSe+`INf5Wl@ePcA z+q`RaSWC$9h!rJP6@wdyg@VNBCH3!uV%mQd6x02JLK@U3etzu#XuXYCR$|pG1^pn% zOrhqTQ1C6UXi4jw{~Z_lLYzIGV}F{TeG`0P&bn6f$Ni7GpI5>wVt^`ECt*QmjM@Mr zKNhnsfiVh)SP-z^Sdi6EA%}d0tCm1YV9Z)ahvzy=VGw`H@ZT?KIj1nI$9xVMFPQ#| zrJ$g|{0Z{o3}Y=5ITTgndd@^qmBboW*IuUhyWZ>Xn$~kx77K=08Y#SDl)>n1afhXB zRt|g$8Q{MtYX)QGEf#1Ynj_LeQ~|P^@-k1&Viv>Lg<`J6YNC6IcwLanP;()eaN6v~ zuv50U&fk70q?NOH|EDpeFxg{;I+ehT7O!GahDeKS<>!UDMs%vI7P>ZzetD8G>3&XBq!AWRJ^6sp3$w2XnWIAag_fuPX0`s z!&n_itLh>@d`v8-N*>YnQ7w8g3bt01qu{b8g<8fIK07oV&z};*IP<{u2Vx)We_CA4 znHSu{Tv3qfHXGvTU&J&4Vt*1_(z}uY3j?Jj2sfn$7F+eeUCHq>b}STkDl7t`Tv8r< zeuh>S*8`EfW%3{5Y{&|b7Fy3Xc)k%=nrk;syC%*OSVM^U*zq}@C=zEVl2^1HZ}fy& zBxVBy*m^^(2yL9w9m|00)2|7*59$?>F70AZ`lO}p1&I4zdTl8&DxFkY%nytZZOfjhqCMuH6<=boyRy`ZMdyS` zWhAMgXqy-J_>~IyMh$7Mz+M7(ZK*AU)Rr9BySB7}vsNg2q~n^@NVM&Wdi;19Fkhtb zs^1GzCSxsgnn_=aQe)Bferx{&A*#C!)HvpHVa*TC3Jm+VkTRImh6dOUw$^aBfRM7R z271OzlLfroN-D!xdps~vYQbUXI5q+HwUb)24j4L~oflwvvNRA{b&~e8j>z6{{>kuR zoFodY6L=Rp%V5Y(XQ6=iyGt@-v5+=d9gc}(oT>CwFYBo|JTTvCH@B5@52yZdf2#B% zhlh)#4RB+i6vVo~$^@w<)*U2$#aUNKsvwlc@xcTL8=f? z63UK~Hd^Lk?S^_lOg<}#bm-A(@E%Cq<=_Ss3 zTSMBDp1UOs7DhM+;H)ErL>Xe6Yr&Xu zOq#*jD0uBd)*XB2Ta#imtXRZvFRc<72Ocq?3MPIfr3)+((mHBhsCbpdj+K0?xiEO=awL6mMCAo0wiOsti`REB&OfH=y7xVyVa@ z_kkuZ*}gMH&Q(}*j8WwSTp}ofO$BFjc`_y&@=VUAVKXKl79eVx?1t+R@*CJCP(CKH zXbdSMUtns=JHw+y+x9*dGs7WEmFHM9hOiChgYx0-hWJ8x`BToO!-XLCn>a5-p2*n@ zI2Y<}g;6!+JOQ$5x`!_vNveshE7ydL)#RRRCToCYF>2_LA9hTW_@aD;5Apf9H z8&aL}25je*cM0rG3~eP3VDPpm(;5~i%lKgfd6F!(AmP=pSQ-!ceVhRh`?DMdyCUWK z)+#l3`M?--M9Mb>X%_wY7Noo_*MR1l+yXLY3q2sdw>$`&>T(_fbCEn2`n@QxVe{a) zORfhbjII#fU+w|9^<)#ywNXmJjX=eXWnPjm3v50Vv{S;Ne{aRWs5bIpg)IQzDqa(| z{^B&Td8|BDm0lEWo5ug0w;{N>mrM$Lo7hRiqzUpo8vG^s9jx9@KEv1|2)!cH)QFeg z)1;QoUMg| zD{?r5bGhJ&>9@u3YjQ_2wo*!W7%j;qp>PagKlQiE;ga;SXuH|^@BP-Z!hrS5+qM;L zdrSTO)+3gXSgPPx+iH4p1H{b|qM*}kp(Lg>QJm!cOhsductB2P>_c$xm3=rXSDwb% zMsTl?gR#>TIat6JpOB@pO%OU=j)n(@qQcuJ%gqTIdhkfthubUJMIAmAQcNS7eZ+_M&a$)c+=dPE6WP?;)JfWODAe z8%l$mdvYC#VuQL&smsJY@6onBUQkvtDTm(Oi+LMlH-nI7 z$`CBfl_d&v6=eq72T7Hcg^-ae$dBw9$etsyzpkv7*a6HtEyoB;5@iXJFFQwCuMC26 zfyyOz5WM~6(qPt?*I~+c@;-*iC6yzR6f4?t68>!*@UVg+sd?`W?Ihapxrz3d`Q-*H zQPO^5_9JBb<wNc*16}6SYoP7eB zhvfc1Drf*BmN6AGJW8=5btW)zq{UHJyxdq>$CRV*_K6d1JFQ*0f8}WS$N`2lRnAL? zsrOF_TjHS*?T{02b~9zF!am3NCL~kK+GYr_v$fKZ9mAy0SGCa{ui4a&mt%5QE3O$tt z4zU}Bs$fRS?J;bKa)wC-^v)^BDj6Zq0prGp}M7j5^0E%u}FKQoo;+(M$*S@bgX4~7rsDw050(^g5P z4bOaqfTwe?Ra0ZJYpSx9v-7ysp-K$3CCVQHD}*oHYCH~FrmW=b0*db|9#!fg+8*?Q z%==0lzO`Bz&!sce{zWM6s=d5D{%i(MPgzY6vyEV;;-1>+?fKI@Z2R#Xkyf0o%CGDv z^nIw1`JWr32@Gd#Q>HNscG^O={P07q5}FgV*=&2(^jMajn>gNT=hF5qH9NEPbJq^Q z`8~|Ned_-0EPYzt>ejtqAn~GBYJ2LOM4rC~ZQO1KIq z7T75)KC1j|p-gdquu@p=m~x4;>yZ7W(g~8682NDGYh^a3o-?BubU0(yhM+H%8|(&{ zg~krtbxLW+SrNE*N}&+G&{YQ_cE?N=*6#tbzcI*wFE;=#*GOU8bKgR87Z zM_Z5nM+k)Yp{j_%*OZF_yA21|(Y@R&ii)1Y>N$qBZYrl4y8{O|TJOBBw1R`()PZ>Y zma;`R(`Wq=^vB%c0&<7<_aoio*GTws49!JiN4f9^rI1xhehR@L+L*L~==Nck1- z7^MJsBGgic? z5lqqd=zT=nE%0s-ykJgJzk!V{)H1Y03IhG?=n7MdIi##m?N$c{x~i*hQG{|*h`|$W zRhs4wa1T)l>S(VL)Zs*z$N&6?kDhmddz9K9W4o%`IWy5cMt%D)Hh|d3h45yoJ*Tfq zt4;tEPjObp)M;uWgO0B$b1`Iq`U9g}%E3ztE&Ac7gq~m?Q0L+O!KzF-8#s7XX^hRt zJ8%M<4i+hdFit!xl))(@)i(uJ5)R%{zJ%z7)Jw-nN;Awa6oxXW+lw^5Vyrq%q%Bm1 ziRxapbdLH8LANEIs^w8qtfl!gb@Zri5 z%$crsU<5j))lz8@o2k+wRvz4I)ioF%t9lsJDpE`&uT@qcyeX}|8i=Llt5-RzNP(1k z4Vu28G=Z$1>H^%ArnVDUFnF6H~}0Vinb@yu9&-7?iJ z0^v(fCIHd|*uj9jWp&J1Yq1pukz=jd@t32V2mQOKnXvT}H4e{ys8(aF%G0R;G!-K7 z!X|Z`D)kp_mqVY*1S!!&&|za#k4PaTlj_J4oQVwct6C!@^GJn=z3K_t^M_ti3K)L1 zU#%;!nh<(bIf-BAs&zO4UZF*bF8CQhVxTKywK4RTlEj{B38GWgY>2v}ti_|Bt6zz< z?Oc(s4pSQ*?3*Ck9!6RW4W!sgsJmlWJR$zQ{?6eYE20vr(J$P;m9@BTAfP$MS&sp+ znq=9q2eOjYSj)zq)#4LZ)6;s!3o*6S5tw*ZP3MG6<*iYFdsdlEzE?kEtUhGTvl<$& zRDe&<3Ip-@c%_~I{mu&-#5PoGLQ0}~#A+=9^ERuI>={j~m(@QR!B{a(Et9#b{-Cf% zv|&>pDg;Iq&(cU{_bi#c0C}Z^8W6ov$pu;w#$f`}J`h+_l9M(W6DMdb86J5>Tg1{A zUfpPQ)hs=GeKU+!wL_esrs!qbRJJ`eZw{!HI$PiYrQC8qQbNI1QK$^pDr+U#i`Zwi zRK)OB70o5EmT*v0Q*d(=?JUFin%XKxcvYtA>WO`8YwHNAg1BH8ZJIqAZJJx77@^VX z)dt1J*1v6`_7*7=t2EQjarQFgzAu!5IwJ_4c<>234)@wfHUHbjyeb}v(V7VaUL|cN z+c^=T?ou{cTlnBk|rv==Pos(8G1$ge=^x-%3{qPUGz zr(?%>Z6_z-s(7k)Xx))Pnl23{#YJw<9^&y^IHl}`?%Sh><mnTAAUKf4YRKI1edH8Z7&D03QPA)JC5NCv{Q`rOAo1rxHna6!&(3IkXonk^kR*&vGM64 z;e~MGM@>%O+V@M`|BkjxmWGP9Zw7*|vECoQ$6x7g9XP8Ia5g4AFR?6EEYyA^I0+YKYe@o*|4CaQ zvGI7Jn3WSSv7dnp(xw@7K*NGiy?8ZmI|?g-UYIL zl}bQr9eplLS9Bkn0!e~i@5$ATcw5ySoIodEWq|@KLoX!I2||PIgzx`H%1V!oRSAC} zjO%(CU1zW&G%yM_+?VV)DnMVtSTbZD(W*eMONidtQE*T`q$(vzq93pU))-QtAXG2H zTcvduXFl|n&`%JaS%WahEx)r!2q~wxg&U=H35rfp@G<#K+KGcQh48dvu4&M&i`Q`gAVMq*v!cS~tBlMmNygkrnUND97-u%o1T`9pZCx zls<=WD(@hD3{HsF>!?y9!3}PRNwW6=-d1lVET38?T@7&-(>fd{+x(@L5m2IXt|jZOrMcQv|yZ z^vR4q zv09{^kWEO(&|cQXkr&;O81kzAgGeY^?%@%*oLvgxK4_v^AVCwWIoANc>rE zf`26H8fO5$WBRWUTba929dGrz41D=I1=*?iEnb$q0vxo@TSPik$+OgOUu1$y|ou ze)dEtI(v6V9EQ# zJntB~GJUXhK&}V*I-8Zm#@XR>h|3N?%$@jVr(7N^_WSJ(!;2Q z89VfWoUO-bk3E;lJe+1-h(D`az@4xGF1%_6L;nbS5H{MUA5#cS$_%B=^kX*L;;6&= z5>9|p(j@*7Je**kir=i)_xtx2o6&n&r`Y^&EKxpn3wW>VnGoC3ZbI$}M<~QcQlF{1 z{XC3pZq~pXHSFaW5ToB%JZuFvi#LFW@7vGgmL2*ff74l*?6$WTF!o!0yM;Khw|QSA zu2(5+J7zbrccQ#WM@>u57$IW(Ph@n2G-XHHRR*!Y+Oy!`eU}|pOtLEwGFC6dkiPcL ze%sy&*)jIbk2IR1+V5e7>-tZO<$${z6&Mu0WS@i&Cg}npRm=Z+12L_q5y!w4ZZ8JU z4o;Dj$KH_Pt~+{NSsEwWeonR&yB4Ac8vD|7Ln^`OhkB~CjRv*{-McC2VVQ6b%oFS_ z7~2ck6YV7L4n_(_pR$)1ApVM;0jZ@NZb($@>4Z^5#~B&mTBO&9#6w09zjueFab^r(KGLt!YVav_^=2t$wQUD(t4WNy)WLq?nt z{r?>yrD$!!VGPaJWe(^1G6fD8_8Zp4k0DVuH$O4!Fsm{__~gmh4k_#?#8r~YJjWe{ z3-sKlkk`W=1uG`l&sjEn-hc5k$m>HF6F+yT7#n8Kq9x-Jm#oJ>2k!|-S)_`zpGk** zap9NnF~}QeH8kD+0g%OZ#*k%XGm!t#UIC(e8(|g+fP??hV}PuflEF6N3&?xb9)&Nq zx92M2i9rbwSdhkR306w$xL=F;P|WQ4FzR*tA}l&-HyLb6w|9ob>p~xh?P$CNL;Kj@ zV+B|&*&gmj!C$U)bUq2*;E$wGEgw%~j2@LVs{k0szmssquZYSQ=t3%?; zb}wYrwIBO83xSaLbpLvPilRFEw=|u;)w^TFFuSUVlSJDc$eb@nV@i^p>Q}zr?V1R2 zW9?g{<21tmq+fWg6eM;uiy+mdm&4@CLO8>26YN_U!EZFAW0*hDUf+V>;$AR!Z7w^K#FGXiQ)U~Hy8xGXD=o+FSCl7Nh^cp zRP&eH>kI6A$gE+~-Xp_KdygM5e~<1VFykosA#AqR{=F3m1#cq%{NsTxZ{XXT>|?m} z9rgSZ^WC2^H}C zkh1<8`&7DN6Mg}jNK_EG&rSt_m#qo39De@Jz6d_PPYy8rBRhrSSF9;iYUgHyHe;iX z*q0FcS8$&)5Ai?JVv2h{v$vH9_KPlK5-iu$p8CZ1LdGPXjyDSIK?0$Eq3fw|CPlPI z36{*)F~a^5nwphh)E(;W|0m&j{=pT)miNfy3;Qw&X~NHENNkoDs4y-2ciMhWeQ2Kn zqYl|+B&SB%^j{(SzL1akzf-V*eSfllD2ZonwzKK(mM8fEHU-aLwTE!&8cEDtT&sE0FG(ax zMhdF%hu2fj;6W+2auT}?t$R8ybr8QvzLJ2@SWeES!spErD4uM{+>glWud(Z1X) z79coQoN2LqpI(rxBB@VlzFajfS)8`BVZr<2pZ?eBh4KlkrZd#n_JSWIFx^@;xB+o*5_rCK5vP(ga>G^eowmj>3%txMwv(#c z8y5(?grv!K+Cjw{w1aX%aY>O-xUL2v;wD@hWcOf1PotG8k@^1g3S_Qft>Jo#qY7S$ zH+nFw4375^e>X-GFz_NQ7+_S^0=Cul*=S3bU@_DNgn$uV9sSWkSO0$g%Rymw+ z2)~Pk^Bq)o6Cyb^zmO|Hdr5aQ%5Q5&HjL*qwwdPguhVF2) zrN3(xz_ZGc59c+}3N(2r6uc(JV6?+AjY8JpVj`v-c6`KKjXc(zspqNhq2mE$u>~W= zb&yJBZBX^)*E&z0;Kq>onP=sf?v$iv)Yxn zkk|mM?voQzes)SI30u z=1N*E%2BB&+2}Fa^l5yGb*ly>2u@1+>@&7jbX4RGUhvmOGqVSDxjk%2K>{z(? z5DKGsh*i`cN|+okkMZ9bqZIP6CoUQuF4m@|F;R7-lD{IIWnD44um+f9INFg6Zc{Cmw1?tN zcQ^LQw8tI)$1 zz8kyIy3Ryxva$L6f3B)5+9nGky4hkO9M#OJ@g>4)m9L!Gq4Vc#6VO59mm#kuD zD&HTfYdgyx%m-coCL40fOfUB?5L=AU3N$;LF9h2apPb`P|tsM2Kzz@;}@+vTT zhFIgNtdV5BmLZwZKDM;BqZD|)=dU6SaTcd)sDjUF{5Jx`mH2|kQP=OOJ3+w-M>s|o zo0Q%19Fp>JTAJyPnt3d+Ycwe0JPzV3)5a-xi;;lD_dG??MB5)@pYaV4l49Jl%!Ug1 zco&TM$tcUP;$X**0+j$>cun+TNL{0lbmDRpLTo95v{So@lnAr&Zg63w2v6Kn8@xWk zQGyeO7kZIKmo>>=f|BN(V!l>Mj{O1^2eL0Iz>Qt(I7$1vH*^_p9Fp8XO!u~0>-kjh zK!QJw_DK#P=9@HQoB!hY+G3?YCXI7ci4DmM|6_%t*V$LqdI$5HE=v$9mf#vlzzf=;auVD}$&LjW6 z1jS))9ElHNyjfDDV9LJ>BsG}q- zn&mLbE^hN)IP#ohDOLSha$Ll4=>^9~fy(|uub5RJdbH66r(ATr$=NuJ^Eh5$NLu?? zAmlbK!a=#K$2wbq)vi0vGByF-ON~H=rHUP86w11K?>dfiDUrIIgh|JYcgY=17neZ& zhmL%z`b)|;7VTW>9LX)L_LT9%Gtn1CgX{6EOb4APh)$@&sq$ck=1dXTR4f?J%hBpI z#c79>a9-i>lJ*7d6)j%Cd1t2~}_J6}^JmuS1)z%LbR5#9{Z<(vnliNu@_ zLVqP^)vmmgFu3X9n;|A6#j{iWGk*s7-V|G6n=t2I&Spa1k350`MsXSDS9j7*au%e; z+v}jWwzI4%xv2=<>n~xY+S(!7n>&a3Oi~4<1OE!kH0;>GnJq{u)a#sQYHyKhZ$lV# z+UcayMH`9}sIq}6sZLs3OEh<0XY4I3{>|y4n&UzzrQm~KbY2wMe4IMhNp9XM z;C=l z1S^tB%`D-g+K`VP6@Svb0hSM#N53@8?<~<|PV_yhh~Dm>pNlZRyLHv-56#`qL;kDj zkl$OP0`Gm!8aQE)^KFGKu_~$=K>~lh{k`ABmqKV2wFJbEaJnJCKb6x)b(ivoXbe+TmxIHTxj#7+`6P>nXtRvUj8^A^!n$bX5_rhm?r zYB2~~>Rg^P(>c_Ck}>zC$EvexlKJ~9O8ZKPwtWpAU-cJD`vhqj-CX`Ck((GRr4pP; z`~%g4TRVEb0=!3@C$M6UlTa?|n&9Hca`)?YC3rt~o`9@)wdx}#keE0xvCJneHYVtA zg_GdK53Hsrn9gw0vb4&2?*M+Z+8M*yYQlw_)uHa&5^e5>IJ@D!_0Ea@W01!lmG?iE z36;H#+vY6Kw6*KQeRLu-f8gWMgjqVwpx-+5_H~}1%I@xxwO8ls!5i-k0r@j$JkH$Z zOs2!0kZ{3CMb`VA-7Rp|`Ihq&{Oqu^i3Q1?*u+ZXwOLXV!dX6bQrdqrBqY#br`)Ql zX^pQx!?|BLCn;9O^`}SW-4<^^b?1wq>DSKL+SU)M`shIA;YTL|9^Xv0*!z%vS>T@R zEP>%|odp7nKH^LR674LD(QL>Z?d*>ayID5$*w)hhHna^g$6B{~No7g=`NEc@z zOgrJ64z2^v#n$WFG2<0t4?N49(_m_U$-rwrI!g*{2i364Ug*EV;UxHzj)J~?$+=r$ zIT*LVxz#^MFTjr(P9JO??TiEJy(8@S)!B(5#w~JEW={LfNi|rzAa1RbPOaW`lJ}&8 zr3KC+2;nXj@7;5@Q>{ao-##%nD)y0FZb72sqkJEDSG&eTcnoWZlDgn+4ZaQ#gx-?a!?CJ?Bp>wst@ugjFacM8Ll80h>SCA$WaJA8z(NU1` zfy<2}s<_exDVH8NjAC^c<)%Nzlo;1J2Iqft1w;HgR|iP3ySxzcrOS(1bzNN;rA$&@ za`k}1NI}Cv9@k3FjzCIVS3O94!QBW}x?LS{Z-lG9PA4dDG8illG1yw(Jp^bFR3Np<<%5M$?s)9i)LS!XM+4aN&2Ty_Cx^ma{Qj!&uU0t%7o zzj|JXE9cq>(KTHf=Js{H$c2*)A*rsbBy4$+hWU7ec804HT>S<1rIpd7^0Gm$Je7su zcOzVtxRg%~ehsm^T;W(h(Us4swl6f;Wo>p{wAnpP7%UwkGV5yo_b8u`wTXmhjRR;L zU7v_(1_n)bDYA7K^Ybbe$7lTzz*p4z8OUzoegT`$bbV}{EM?8zw4tBlI$@nGO$wHS zu=IS_6{_}2&n!vtP^yaxbk0L^JPqUi+pccld6kNIk{7$EF20aZW07jQmbpxwRlxaRU1kdxF$fMLRAB!TexcCfdbb| z|1`RYnRQ(>MY2LwoeDHv-SN*;uFoiHuOx{;l4=5bb6pLs$@C)@=elCaw`NNcoFDAk zfsQS%wz626PC8l3hTi~RMmm~9r%e)PQAviUmPXl*)@~8DqAS)qjmj@U(rDK_T)4|M zjR_`^;fIImhZ>^^5*zx_1q-3TUAz>gh7A8{b-0g#}JGm1yR>&U3;N z)5epS5>L6P*ro{5CegGzp65!!w@$kzDTD~p+oYaCQjhkl$J5Y{yFpr#D;nEhbfH3J zfN?q{nwx(oPQpc3U8OX!nrPeb7!GjYmET-Jf^>^Gxts1DMxf4J*H2vFzhm!)CS@>> zRWKt2IP=g|P2hh(Qe#TQP8C&!cu%W5h0}@mC28g|`>-dUbu3-ZI6Ox)y z08Oc`bcQL#`d9`P6!S-c-^1Q5%(b+A|4o-MOEWtQ0>6*BJ9#t(5yPn*V1?7%CrNa$ z@wRmYsR1qyGJQaI>;JIBY~WB%x3)?a5g2#@(II044;RD%H{`jm^E`c?JTczGXU}nbjosx zW)iKgvw2N2F+$F>f7NS2d<(N1&a7_Ix+EbJ42>#Or|WYt(P1Vrl*7&YB2(6`qr`mT zJiVutz%4nZ!jojXpxFk~>PGkD?j_jhUxolQgev$-H*>8( z^^3(7O&7B)rOFfTpOdf!xQT8ku4E=cGj1M!GLrdLXeLsXV^xz7%^pU`-$#@2)KJR% z#~g^oHLcG4W1~Y%CT-`2m=_f*bogK_*@g#tjxrahr4}anYKyj&)@-Z?A*0O(T8Z7V zkBS*?x-AQ`U!V!?wO}#&Uzs+lrMMHLUNg*SIl6&lU($$uOI$Qau{tcp6U_ zEM9N6&}wAX_EF;SqgUusRggBAOQb6E!h9ZFxxtz*VQE!-bcB4PnZ-hLHkpLRRK=LG z0&UujZ1avl=WBhl9dyv`0viVh_L!X^QKiG-rFNQE1*#y)yQk&jsaJG% zPXh?ur3FGtu)7Mj%ry@xtTtq>G^xtxs7X~mbs#j*=!x-{%oQ{nM~WsoFPk^XecSzC zSrF@j?|Tad&o>DM56262oxwDjO7a7E;VZL}z&wx?&gao#1xF)DR>h)c)ZzHdoQqq( zHG9e`-bt+$+-Re_EgYVT%a(s{4q#F(5?y`BOLCS%&uP;_q;%21wLh7! zFgj10`OrZQ{gSzgQ`uo+C;k>LxN45)g!4r$FvB0^!1Al`0yK-w`3gO={H{4nYP`9x zF9MC<&0htn9<|>Dm`|d^Xn&m$9B5T27Mzj7VPQNKDW4xM1@G+P-o#l`^j&a;k!P6Y zQZQU{pAuLzLVH*^cs9`DMg_w}^))nhuz4Gn?Zg0^jqDe$VgMkDrLt1e_P1vxQ4PRPO zdmp1h-G>D#E)>JuBQ=?p&fgOnfV)Ou3+qhXqmvPs?_+;jTNyEueyt#;uPgjXB((`k zdfnFq0{IKmT_IK=@HyUya0gMfAysX<4^n8R4S~c+cVkRw;-;F+wvY*GStxAaYHwYB z1&=gyZ&q|VQ~TZU1`p{!NJ`^g+}hF|%O(1%j@TX&a@0E8vx4YoxxdIPXMjG?KleL8 z!uM<_jvnVuZL*sn3XKH7SlOc%)718&M!L7?XM3J zd!@%zuKI+Z9P0pV@ilES6t#7?f%k&~saU6%dzHZG(>hOi>iZ9#UU``e2KNuZA74RB;k|x7ll@6{x&*Y$gFuB2E za`3ZEQt13ta9Nh%UVWCy9qwOM_5$wP?|xB``V()%w)=u+KGkW0U#G(%>3YCnTv-@! zl#bSY;vUPWHZbP4`#6v~7hwFSR<|RcXK&O$*z?P9^t0?GKFgk8uSw6cch;I^&9M1J z_e7?TJyyZjlnRvoCQm}D#Bty~=>B|rN)V+p9#=eCX-088U^SwSqAE_^bx6+u!lPoY6b>= z4W1M?K*k%249IN1fUGvG9>(9dr1J)C?g$?v+okg>Cs}}3 zAUrFssy+cSUUQECvf!?C5LBl^yuoC{Icfm;{i*-OPNx0CPLiKD=#=M`;rn-G(D~M< z22Hu&zidUtm%{>fTS(S3ldO6G*-GSJwn8UmMeAb=|7OQ?{=whe=lOfHRlPw)UT%Y~4RR+4_I?WE-CGWXLlD7D;e`1q4BIg+MCd_w%qOptlH# z_o>P(Q4UC@{8K5JUw)yE#UwYN<6i%>FVvN^1^&wy>R@N1fKKX* z!gR7z@emk|17@T9qI{Dji@SZ4k`p)kVu-HtMHBtM{KjJPzkFoT7xI5+!O1=gs{H#$ z7HJLoKl{caw~5(U{IX6+R_a~%tBm5cxBP4SHed(L7%MQUB;c#x2fWYd^LZBzYQak@ z>K);{JFtnhECRzljzBK~Ee|N_&H6c@3*X_b0T*u4C%7t_foH5Fh`1Achcw!brntLe z^3?!Bo9L5z_uSv%nbLv5{wHu}T);?%iTfb*DtSk@+njP!T@w3|20znIo=oKCX zn2_I1SAoja3Ffhh2O+bqdmIpt`>{cZz~chT#kzgnC%Lu2_+f-RtefTD$Z%_gz^(%O s2&g``tQBke*`#E(P$^JU Date: Mon, 22 Jul 2019 17:28:43 +0000 Subject: [PATCH 043/221] Fix a bug in the linked-list handling code added by commit [fd7316cd]. FossilOrigin-Name: 05080344dceafcfb670fbf01f7d69a1d713a54b6845f968a9cfe941fb53b13af --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 2 +- test/window9.test | 10 ++++++++++ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6566c1bd39..203c680812 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sadded\sto\stest/fuzzdata8.db -D 2019-07-22T16:57:13.538 +C Fix\sa\sbug\sin\sthe\slinked-list\shandling\scode\sadded\sby\scommit\s[fd7316cd]. +D 2019-07-22T17:28:43.613 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,7 +474,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 3dba8ac22b89b6af10cff7d672f8cab4a71c7ee75abb4cbc0a6a79d32f752a4a +F src/expr.c b49492392bf93b62dc508b31e0ec32186118df439cde9e2f9ebc98aab54e9fa7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c ab1971900477e93b6aaabf160d2d1c79c06edd9227441ccfaf0de7e7431d7f48 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -1713,7 +1713,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f -F test/window9.test 4329f463a151eb12ede2a73bbcf67abf0b9f781c8a1346f4138249f228a02b7e +F test/window9.test 7bbefbb188cd95d96382d4f72dc418dd3104a9c509fb5b70d91f7f78255d67da F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fd7316cda0fdfe86985f41a97dff3beba188606ec9bc6fef38a686a6976a6e01 -R 45d11109e6708bf4627af9528a656ade -U drh -Z ea733881a87798cdb6121c0f61beb864 +P 25fec62ac5a23382a54eee78d3705885eb4065826d7e8da098816d03ae9dc639 +R 5cbae4427975359f2ddc6c8d60a43a9b +U dan +Z 8c151ed28bc28c3158076ee41a997089 diff --git a/manifest.uuid b/manifest.uuid index 476559d5b4..895b0c0e00 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25fec62ac5a23382a54eee78d3705885eb4065826d7e8da098816d03ae9dc639 \ No newline at end of file +05080344dceafcfb670fbf01f7d69a1d713a54b6845f968a9cfe941fb53b13af \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 571e9e494b..5d8fdea55f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1330,8 +1330,8 @@ static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ Window *pWin = pExpr->y.pWin; assert( pWin ); assert( IsWindowFunc(pExpr) ); + assert( pWin->ppThis==0 ); if( pSelect->pWin ){ - *pSelect->pWin->ppThis = pSelect->pWin->pNextWin; pSelect->pWin->ppThis = &pWin->pNextWin; } pWin->pNextWin = pSelect->pWin; diff --git a/test/window9.test b/test/window9.test index 602a7bdfb3..748c412f8e 100644 --- a/test/window9.test +++ b/test/window9.test @@ -121,6 +121,16 @@ do_catchsql_test 3.3 { ) OVER (ORDER BY a); } {1 {near "OVER": syntax error}} +do_catchsql_test 3.4 { + SELECT y, y+1, y+2 FROM ( + SELECT c IN ( + SELECT min(a) OVER (), + (abs(row_number() OVER())+22)/19, + max(a) OVER () FROM t1 + ) AS y FROM t2 + ); +} {1 {sub-select returns 3 columns - expected 1}} + finish_test From e20945729559e42520d786652c09b00cc9e414f2 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 22 Jul 2019 19:01:38 +0000 Subject: [PATCH 044/221] Consolidate the removal of Window objects from the Select.pWin list into a single subroutine. FossilOrigin-Name: e46b2afc99329c43de08d4a2e6ade4d2239d7409c5d5626bf272a3e0dd24d1b4 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/resolve.c | 6 +----- src/sqliteInt.h | 1 + src/window.c | 17 +++++++++++++---- 5 files changed, 25 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 203c680812..93a074cf6a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sin\sthe\slinked-list\shandling\scode\sadded\sby\scommit\s[fd7316cd]. -D 2019-07-22T17:28:43.613 +C Consolidate\sthe\sremoval\sof\sWindow\sobjects\sfrom\sthe\sSelect.pWin\slist\sinto\na\ssingle\ssubroutine. +D 2019-07-22T19:01:38.804 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,14 +520,14 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 63f353113a133810388e45c222ed512ea8d2371a4a9e9ec54001e84072a3df5c +F src/resolve.c edf29463177e9fa9dad5346e9adf482f24db9f180c693d0ba993e25dc797f6b7 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9817d812b13c956ac28d27390602751a8add217f87224d2636fb3ef7e4d646a7 F src/shell.c.in a571d51dd7605b34796e9942dce0e895156d1860383faf6aaca3c88b08fe2a43 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 01af0390cccdf0ea1c3057923afe7370a1f24a6e3363d802dd2e15fe66b0ea88 +F src/sqliteInt.h 122621557d07c6102d5a41897fe50eabe9767ca7db8ded6746de0446225d03d3 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -612,7 +612,7 @@ F src/where.c 2f508c9a6dd2a42ad2b692105e77eb92cdec201d32916962ccdeff71836acb52 F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 2c958b4bdccbd5a7450621541563d4263e50953a4454d97d44171aab2c549d30 +F src/window.c 7728ba7a3d44084a44eefb60464a88fb2ff035eb20cdeb1160ae65ac3c0be6b9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 25fec62ac5a23382a54eee78d3705885eb4065826d7e8da098816d03ae9dc639 -R 5cbae4427975359f2ddc6c8d60a43a9b -U dan -Z 8c151ed28bc28c3158076ee41a997089 +P 05080344dceafcfb670fbf01f7d69a1d713a54b6845f968a9cfe941fb53b13af +R 68f2a6c5bb2074234576113e077b07ec +U drh +Z 439cda0a805b8a43919b98d5efe84140 diff --git a/manifest.uuid b/manifest.uuid index 895b0c0e00..bc1cb2f076 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -05080344dceafcfb670fbf01f7d69a1d713a54b6845f968a9cfe941fb53b13af \ No newline at end of file +e46b2afc99329c43de08d4a2e6ade4d2239d7409c5d5626bf272a3e0dd24d1b4 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 48d8fcb9b6..672f1356d8 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1305,11 +1305,7 @@ int sqlite3ResolveOrderGroupBy( static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ if( ExprHasProperty(pExpr, EP_WinFunc) ){ Window *pWin = pExpr->y.pWin; - if( pWin->ppThis ){ - *pWin->ppThis = pWin->pNextWin; - if( pWin->pNextWin ) pWin->pNextWin->ppThis = pWin->ppThis; - pWin->ppThis = 0; - } + sqlite3WindowUnlinkFromSelect(pWin); } return WRC_Continue; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e55eadea67..b41ba4ed8f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3614,6 +3614,7 @@ struct Window { #ifndef SQLITE_OMIT_WINDOWFUNC void sqlite3WindowDelete(sqlite3*, Window*); +void sqlite3WindowUnlinkFromSelect(Window*); void sqlite3WindowListDelete(sqlite3 *db, Window *p); Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); void sqlite3WindowAttach(Parse*, Expr*, Window*); diff --git a/src/window.c b/src/window.c index f94370a497..199185013e 100644 --- a/src/window.c +++ b/src/window.c @@ -1017,15 +1017,24 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ return rc; } +/* +** Unlink the Window object from the Select to which it is attached, +** if it is attached. +*/ +void sqlite3WindowUnlinkFromSelect(Window *p){ + if( p->ppThis ){ + *p->ppThis = p->pNextWin; + if( p->pNextWin ) p->pNextWin->ppThis = p->ppThis; + p->ppThis = 0; + } +} + /* ** Free the Window object passed as the second argument. */ void sqlite3WindowDelete(sqlite3 *db, Window *p){ if( p ){ - if( p->ppThis ){ - *p->ppThis = p->pNextWin; - if( p->pNextWin ) p->pNextWin->ppThis = p->ppThis; - } + sqlite3WindowUnlinkFromSelect(p); sqlite3ExprDelete(db, p->pFilter); sqlite3ExprListDelete(db, p->pPartition); sqlite3ExprListDelete(db, p->pOrderBy); From 9378818d898c09aa1eb075a337c1d3b12388baac Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 22 Jul 2019 23:24:01 +0000 Subject: [PATCH 045/221] Do not use the insert-overwrite optimization if the cell might overwrite the page header. FossilOrigin-Name: f60a83069168899dcfd706b4d0901084c7ce92d85277950317e962a8a98ec668 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 7 ++++++- test/fuzzdata7.db | Bin 16811008 -> 16819200 bytes 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 93a074cf6a..3866a9c7bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Consolidate\sthe\sremoval\sof\sWindow\sobjects\sfrom\sthe\sSelect.pWin\slist\sinto\na\ssingle\ssubroutine. -D 2019-07-22T19:01:38.804 +C Do\snot\suse\sthe\sinsert-overwrite\soptimization\sif\sthe\scell\smight\soverwrite\sthe\npage\sheader. +D 2019-07-22T23:24:01.858 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -463,7 +463,7 @@ F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 4508402e266bebfd0043fbbdfb95bbe632e0000f0bb36e72e84a4185572bce03 +F src/btree.c 58d002f711c41a50a1183b5880b2e30fcd2363962df1ecf25731d011a796ee94 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 48f22e7c3b80550eb9c0cc3a3738f9117109b87d5f5fdba027009b7f2917df4a @@ -1010,7 +1010,7 @@ F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db babb1c560fef766171972c119c1bc3b7be20b134e2f46ae0c52390cd3059b6f4 +F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 F test/fuzzdata8.db 5142ecb1f8dae2ba6c6e3098c7b1a1bff635e2e6c3232bfe22c8d3b39b8a5e23 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 05080344dceafcfb670fbf01f7d69a1d713a54b6845f968a9cfe941fb53b13af -R 68f2a6c5bb2074234576113e077b07ec +P e46b2afc99329c43de08d4a2e6ade4d2239d7409c5d5626bf272a3e0dd24d1b4 +R f02547e04f9016efb71b5df78bb77dee U drh -Z 439cda0a805b8a43919b98d5efe84140 +Z 2c31e583b3a3e231570279d810b3f5f0 diff --git a/manifest.uuid b/manifest.uuid index bc1cb2f076..c0e4baa1b3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e46b2afc99329c43de08d4a2e6ade4d2239d7409c5d5626bf272a3e0dd24d1b4 \ No newline at end of file +f60a83069168899dcfd706b4d0901084c7ce92d85277950317e962a8a98ec668 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 02d21a6521..a943078a12 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8726,7 +8726,12 @@ int sqlite3BtreeInsert( ** new entry uses overflow pages, as the insertCell() call below is ** necessary to add the PTRMAP_OVERFLOW1 pointer-map entry. */ assert( rc==SQLITE_OK ); /* clearCell never fails when nLocal==nPayload */ - if( oldCell+szNew > pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT; + if( oldCell < pPage->aData+pPage->hdrOffset+10 ){ + return SQLITE_CORRUPT_BKPT; + } + if( oldCell+szNew > pPage->aDataEnd ){ + return SQLITE_CORRUPT_BKPT; + } memcpy(oldCell, newCell, szNew); return SQLITE_OK; } diff --git a/test/fuzzdata7.db b/test/fuzzdata7.db index 262a22107f442158de0bee9e54b860e1b80f6b22..8706be40d11d54231c2e2098f76172e4b59ef494 100644 GIT binary patch delta 121219 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

A<&ae-?*+Vyt-lMK0mi) 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%0AI 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Η-JRnI|Xuhvg+2^hf%y`vxs&LYn*vJLGxksiyL?cfYYrM2y4*3$Z0mWtQ z0H@**w(FN8s{zICZkgIW6Hy9Z|2F^*_3|Nt;B7|>5H!rpqD5#3Dqj1Fv+;pPFhU>^@=p=?j1|{F~eC8?%rNizIQVj&nz`-dY^Tm@Xp~IX8dhqyL zH1^NmnUpQqQVuQPR9cW%czjU~ZXvm&Fk@>DQkDTK|J@mhixOvSHR|4+c zC*YRtXsC0}WJedc?6{wCr}Kh>JjTxHgpYdl>HH4BeY9Wc&gDEK!A29ab28Yj*zwy1&nk z_Rs9b(gvzd@|?8H9@r$%G!wCf@qa9tUkGaCP;4Qy2`(8;QuBxfP@s(1p|3Fi0*_dR zmS4h9dy|fJ1zVPp`3K0&9xZc(04b3KDJv6kl_2w4+HkZ%%n7t(=k8yi-rMq$A2OLc zm7&^ZHDX~Pt)+zM*L>KuUo)>M{9N7sa6SH8uQarwI@xxv`=@@Lp|y1<|Av85j7%*k zf8#*;Zzg{S#)7^N62c01C?w>Nf9%ahh}ws&YH8hLw&P**{^k9#$!EwRk9n|q$Q?VM zgWP3hzvS)t9InT{8){$en+Dc0Ir2d8g7BywC zaLIa0rB)oQYw$-9@QawHrCC*w&Ee)=yyg5K z;dn686{v8#tcjwPA5O>$vbq5a_oN|Ni1l#J0#0qU_d$&Txe6Rp=g}}J#?YR&k+6(~ z56`-&tc&*={kOp)15s8pNNI%Fm+<@OR5-W`_TC? z>w8Ga0)b~`SwemuF2X+kX|qG1^`vx23j|BgS13)Zkyz0^L*I~Cfb4krF#br&F=n@MFdxaYc36(AMfUC3X z`(5GA?fswJ3s9!VWerwIZC#H%HNSjo=2@}1M*RyTwVifdto)JiV`=Get5s@0VBOx? z=?O^w>Og)uDC?*j&BFB5R>19(QT6MRsMg1n#g$Qo~9Yx>+Ex z+=>LL^r2yfI5wVM?wmR)TP1UqDXUmgAj1_ZV8DQ$n(gtCl$fe&qf&PS=x#3K;_|61 zt6%2;0(eT|Z(Yn9u0oMGalW_=fC656)fhk!%~ul`d)8!qmztI}Lm~C#GqbXiBxUbI zD-1nsD@wsLeYkhZko#^d=*Jui15!iJI?S&MR*qjAis5W>TwHN7v}0e~%j(C2+T;hy zJo)QZ!PfhMtk%@%U+e7uG)J4Sl&I&oulpiY@RD+dC_{lnFB=kIP3pda0o#e@8zLIG z*#AcR;SYgDZwEfF(wI&=@Mt2ll*d^UqyaS$7-%OLWp;lL)CsVXFck3Wh#GGWvcK7s z-t29A6H0dVP3N@Ab)^!o1(?IG>1PFH!qQK1iK?StX5j62W2iU08N2azF3y6hzwncOqB2&XP*RQvm3z4x2Dj^?~Tlc z4jmCq>d7upu#J#O?XFmHFB&F;W6Zwnr9voT0P+oK*+XpyVrCWuqczzf3OEm@x`+=f zc3`{tG}@_Hj9QQyJ(yXJN&Li#*UJBd%@pSO2uzlI?savuk z7m-`~I>F&;TiX4gU3*QKlTHE__Yml+Fr5Ahso&GEnysH~KvKzmFWAUx2Jo2UoS|g) z!=dcvjMA;yRU97wLJlnU^{fPGp0oX{?B>br5Rqby+P`X-W?YuM|I<*L3shoif`SRh zA;yn|5}^k}#{3f6qDS~!A7>9&@%0C2r4c%(Ug~VTl3lu*J(v{TGpysV4Z@1Y``KY0 zN`zynU!)ejaRDMd(zgfJHe!zlse-_8C$O8j+2B;k3*aJ%4RrCzuBUoP%M&ZJ|2 z-jm<;DHeGvdo>ESgc#tph~yDSkVxO3WyoR=1AwcqJ1e`B-H!64KSk)#6UO}|XhyPU z&@u5Fjbo*lPlvwARpgP?YxhO8AOuzteby>S=`o5FkWavSTBt85T!(1s(!68L>Kth*|s@yzA4G-S6D=4 z>j36I^~0A52ntWz8aH)=bl`A3^(Ad5JOSYTzkns5G<9d2ljeEw{FXUgC20#fiDV}~ zA2*crY3O1@Z9Yp;G{?3IF>ec(vD9C}rellG)7DLGpW~*KUgwI=Imr0#J-PQ{ju^T( zaIx{vd4a}hJ(IJ9MvWnq_W*!JT&wD7rDMXpC)R6%17CPrTe|;AN}7vo{bvnZGRuvI zBCo;lci@d~_2diB*=O_Q6Cnc7DvsptgL3|ml-n`gdwA6JXJGR|#-2aOU=Yhb9-cFT zxrG2B(8n83M&yjnX{L~%e0d2zssJ{EPZ^&xgK7<`_Z?Omgs&d?T04GwM^f&_kNf$# z`rY1ecCw)&8H;(2%gEdAd1uS`OIY0lqOZXD&L=o`N=2(;6!=6R6Z8 zj2Z&R;XGygyHjQM?anbGRo_->UB$zuX9J zc68}JcwNO9sxmC{ z?4`ZiER4JF&iO-@-b{_p86iT_;O0j!Hu}Ct z3l`tAsmfFR!IoAAB)h`hpK>Uo!AE4G7T}f&6c|v5lGUfNt-o+6&QGEWv(4vwii={K zbmnl<9LEv(rc_8NObSySt)b+N1D`p^mKQYFaIdDhR!h-3Y}f4!ob}JttejGXG=p3q z2eUoAZBxoXOqi1f3MadDqM!QyAMfj{wq``?fy z02+z*?9jcO1ym^IGU18RW>2CGdqY=#>`~5a1*(i4>*wB5_#x7M>4Fo$?!~eayDqBH zBO`r3RGf!)=NgaP*-GT#ifj@iD4{6}8lF4cQ+)|635mUI>O;_QQ{J&*ZoZ_vfEm3^ zTYNT)Z(O$*L!rPZe%mV-#j-x*ar1IFfw~?Ie-?eeoO{uJgLFrP@B#>i{!}w2<>S9a zw&NRCLFfv*ztH19)`SKuzF+Q(G}H++R5MAQFRWhUy!N!FB0zIUkol8!_^A6%msX@@ zzcf3yn8$X?Z6-;x83>>si*532PU2nPF|>=X9(FU#q9KVWAR3bRnMUvdTQoX%JV~dY z!>Y;@9w@K>^a}c|M{0`!EEbmR_H~8Tui~3zTpHR}fNoh5<-@lFy5kb;6N*MHgF5A;R zx49R7%z_)KEt7?IF0Vf#7nv+FOwH=l(VjOo!qaGi#!hQ6;S!=fXM)SO_AL|qShYut z8}LjtBENxlzY&s{c8_rlp069>DxqC(T!rV0Mr1kA&NU*ZfmSj`)v2R-XvAerbH|9g zpQh3{9M4kYFg%NlgYhghM&Mbn$%qTDCeIj#=S|}PJU=sr;`yl&*K^HB#y)tSH6nms zbH>;U&-aYb9cbP$!UIrq+z1VXMsMtb=T0N^7@8eMC`vTjjsAFUGq%O^btBX)n%9hN z@Z4%_jpsTeQb}l58=K>~!ng^e*Tfi`;<>=s7|;1e_?&89Fk-$m&lxc*nlVOfEls!) z)2j(GVs13u4V&=nXxNBnTf=%hn;O>Q>21J#Xc`z^!qd}$S3gs8&=?1YFLbC zu30Sl^LU?A>}u+g|M?)8kog8v?8LR>e zR*h$g5p00Z%I4fwPqM5*3f?a%_bVA0<{Y|E!G3PJvY)qdAwb-*gAL-qY$6p;x;U@b zueCA0SFJpc<9O8IsML@3oeVFs((AbkRqDTz<{6eFCj5l+jq@t?fAoHaSa$It>hImQ9Di6{o9vJEum{d6}C2|mxz2ihLbz#5Yj2krsJ=-RS-c9n@I$B0x!Lt z8z_mabm9!O1Gd}L`VyXczVFA}7gfy7lIx2Ma2`aqC-~KexyT2vW@Qh$EvmJ98-)b@ zotuI4^l$rAEHVF(*Nhr^Puhr_sGUZhp+5R^wKDHp6$_t>GE_Hvc&HL9MouKPn3=b1 zkat&R=bjs0RJ|JrybYS<{pJSOp=yM!Q4nE!%3MDn?}3!+pZAwiS}8UihgkJ0%>6q& zs7|Ry#vi|&{rXHHa0=b~JxRm8KWyI^x{|GV)7(hx>`I8ira!Rs6x?JTG^az9qUjxm-SwS%cMi zzcG8gp|$MLfV|fH%$mGsp$=J`S4Fe7mTnJS>BV2^<2+h$F9`st{tzvOEavgJy8>m- z434|&+yqO=a8Hf@;TZ;$Q$y0l6~&N9|7?n6`}PGtqtuX`z>b}4+1iF{V90ENQ**XS zm46Q0Gtb4-1DgA-dAnWi0bnzIsrHkOdo{@KDzPQTOOsjbio9n<3Xu)pob+bNgWGhc z!SBlTAyvxDPO`!-%+FixuIW&xPMyb(xur~ls?ZpYzhm2PVi2Ag3p3>z=n}Q*`_*;% zBU9dMvUOUpSEsU=z)lfl@f>J%v^|v1%I3BEz&1An~*7ZTxDL~!oEtZxWxYq@y|Y}TPmI-2oMi6_nH(fN5NRFb+{qtR?>Zu@x3+Jn$3JGm}k z1y_FcrIsZwOsXagrTqjilki1;-B|xmbLyvlpNE7CItOr`*7Vn&GG&4ms06qlA4dRP z)c(%fjmzrUa=DO)5dj0fKz{3GaPYu;s2C0}<~_3Y=&vuxRb@FtG^g3F_aHNlcNAHi&p z&H7?X&qme?p_<`I-HqUNrh(isG z$a$J-P4FauV+;Jv4*BH2prnfj)XfjGzvAIuLp5&Lo9W7vgJ}YWyR1^}6F_f~!-SLb zw_rg#yR`Pi7Osy!@RIb5N!_fx1mIh_$r==1xZwU4KNXli)m<84UyJi(*cs!p#fWO! zvHiXBm$Lwa{$1*6j0--A(|&?~O44fgV$lyft68Hj8u)WuO*=_cAH!?TJ_T#ow-X#BFL;k(4eK=y zW8Z!iSeNx%*1?D08JvG#LXuW&se!Edu>9`ID7~k#t}U%^cr%dI@LYGcV_1G?kFf_s zjqsl|i7e%blQLU5enW!O_ZkYBVh(M-QTQ8IZALy4PJA3=1m|(=Bdk$WOD=N8E@s$+ z+xaVF^5aw@r zLH-L06f?AzYarT7UYx&HIYaMjY{=R!$&XP^)web_uogoXB!=I+)1W4U-_#fUhMEXN zLr=O_jAC7u<>ydPk7i1>F%RP#m*;PlMMMu_8|JcrSa#0*4}MudauXtxug~k%!zNin zb0}-3IUtcM1gzQ`CQbTLXyEdkVElNaSMwjDVA;z2U5n-^ou5zWE{{#IG z7NpM}$NcPLEy;K0;j>m{Wr_pE?v4jn&Mv8k z^L`BM(q z(?VQwnR+{@`M~LNsdAYlYvv}VH}-q z$6^OI@*le+(8ikjRD^iJFzyJlfll`#kM}DWCOPcX z|Dg)e2Z&z0DbfPLxP|%ksCXoNH~JFNxs+Y;F`*TUzg3(J8RA@)VM=)!`O7e;wro>I zJNz$jY3ed;Zpq@+Q6g)?^3--)Tf=d$MvwRMQ857-Z$Gjo?4>#3@lB_UlU16P z=<{WMf5bs=H^T8Gnc7gqrjBMUpOySvCpU)C0^w(tmNQ~^M5dNAM(a{t_1ea4&{x)y~4mYt@5;-;Qv6k_zwG9#MX5Oo3L5v$Y zMxxIfxmud2?y0>CPP<9|)+!e9x*MpGWc@Z4e(pEg_~UBUz|S^5ZNVrw2?p(eX5aB< zV()?rETCTjD$4rCpuTx%K|?8kKMpOJ37g+BZKp)v!Xe82`ew!sqQ05~9gk6l|P8sRTztBT`wu;52hZN9|3z9|^X;=&4E5yhS|*~e!KBY4pF%0I|>{R{E3 zfgiUf^EC(+!rNS)JhWhrO4Mv}zKjGa{%;q43m&kK9gEHT6GjWD{l)8+Hwym)@~=+^ zm{Sn1Dj&EwO8XG8?I1*3*ME&xZH;Rz z5&ZCwBMjf30=>Hg*hJB6cVbDK3Od7}iF#161@4k0e9Uy1E@CTb4g?_f3j;1!4f*oy@ZL=G!LVbuSISd4VU#<(ad z9s^8Ih=>1|J^nb@)qO-{w5Ym`{c(3^K}#vQdPDESM}!c)(C#&Y147L!6AIi_Qdi<^ zHHUl@qj`%TQ>f?ITTrwTg#$E_HE&a#?|izci(s6kwc^3=o-Bxy;PXZ$_%Lq~bO2H6 zQO(K23L|n(KH2FB{CJ9&-3@9Zm_l*t^u7vE)Vn-jN})!qA+o*3-h^in!lafuqXSUP z(BigK$yoc}oASH7V6udou=eFrzQ1Lh5kd3k3&zWApRVA2V&5-uQ2h=8a<+AekfG`@ zEfETVIpfekJ9E)ltGMCxQ)2A|bhY4TMK7wABFxB_zM_rZo5i6po7ja$Y|3EAru0bJ z8e$A0BQtrh(6k`qc0nlI-_1PYdaujkRDdgOj*?sgHK{yeNQjT%ob`C*!-BuWn0Oy}O-=!JlG{&J&|QNOFXX8mTY$dmGZkRd>u;npQ{i1&<0W^hB)N_jQ%b zbA9Jl3295_a{aS~F)G;5Jv3LXE%|+E>N<&U?NYc=mcBZPHey3fr2Xs3x+JJJu$%GC z`cgrJ4k!)}Yp|thOBOVwaBpf*p_{_}n_9qJqpm+dj+)TI2`cv+)!&FfN0coJY4R;i z>vI1gh5bCJ#3Gaul=#;_u5d2d_=%ts*A^aSm$npM@YH0-k2a#*;xRJ9soA9sRz{ks zZ(!^vl)hpb)3AT~I`&V!>zIXf$NVISnc&AG3un1W8SI?Ovnh)XEd2Ay30kC*vK*U+ zaNxkfBDO%XeR_({k);D9<6Eq?#@QU zzb`L5D@(blD+`q(uij3oCjy0SdJw{a-@d3Rxq(z3Iq zaR{HWr|_7hECD)XtZ*K!IxF{9vbaA^3C`k2GGLJ7jJN$R@(}90GpXQF zVshaaX*eI7TxfQaZu4`2RGt;5{4egf8_!(xdPimnE)t5#pY-dEqmTl8Jic0A{DMkz zPv6rx(iUQ8d*{3TD~uy}+?m3SlJXW1y$eLoa$`ziq#L7f9h!?zU6^kwG8BO=Ml?j= zUi#;utm;bPD%*VR`WzXAb3XS^NY(_hy{VtS#FIZNoFlQa>)T$X@zp1=;{+!Rz^NHL zE-?G)fH?sBxJf^|pyNHI$xP~s)z+##3*&!5JUfu_GleX+lBHi_!i3h!KO0NG(f(HknwBYk({SQb6GREvzSRY62lf9OXT$FNH+ zP;|xXOc4c7YJLS5Ls3Ip-W5!9TPY!Sjt{%p`Mp47R-dh4Jv+TUfa+mPBnbEM_Z!A^ zzs3tZZQGDjbe+9_r?-ekp6@b9TV8AgEp%tVHIye;U7sfytS4*pbK!02KmP`C--t^K zXxjGt3q%Hp4~P$hFw2qCC2ZWZ(=FMJM}=wx_Y@AYmA#70Ml{mM$A#w!&A&FiNuP!!8Eens7M0yT%0 z1jmX%)qg}$r5jf?DT zg5c3#INmT2f?XXMaA(m+Z^uUzk@M*9%c745Hn(c2!`nlK4JtB9NIrgP!CgT(quuLh zJr9K$$MfLcMc+zFI4@}H^7~OU8pt$>&k0q~L102@un0b?0NC&oy|*Cj5VX<2RhrbY zh~-m|H(ewYuRfF4l+r{Y*l|#Ho&+6(7TP=H?RWbbA`V*2vq}h#*!XeidsgB40d&?{ zlLJ}TWe4HWE_HIzX(jYZXQmfL$qFxmG%I_CRhd7=6%sN}E#q=z5q!PTNmJ+gLbWxb zXfdwCR=JTP)*+Ms{93z?Z0fqAt#m69Dt?h`W-;0$8`_>FMayMn6ZD20S1W(mYrosu zY5_1BuBar1(WAuoAS-egC$9&Z2^#NNOay%6XbKqcvZAd zfJE7DJ8_Ch=$g8%=xrr=?!jJ#`v%QyLqRExm0B2Cw3PB{Iqp|V*9k$|ftg(1T(n8R z?BNQt+JulGJ(u*79eMP@q5*Ew6#nLsqFJ)iACO%N#vmnEe9>wF>{S8=8$k6udZ|VE zNWA;J%i@CxX#?@sr5f$U-z@gg$D$=r9H~@VD5bR3a$phj z=JKVYXn|ppD~5SR2$h{)3xiO=qd?2NpZDlMTLNOEkbxZt#)87F>8}to>4IcGmC`sv zENbI$+)9a^6PHvHIj~czgjNF_(n-7OnsU65KpQ;)zK#JTOSX~@feyJYCekx=cYTK~b zA}Qd30zP4@R{@Rblf$&vs~AX|&6?JK9jvv*DLnS~qVWpCxP=wViM~id-n#gbVzw|W zCKvW+u^WBjJhej(&oM&22B|+WE8)~XQfG}J?!FEbFfS1K;v-u?4l?-ovLoC_Xl#0; za7FQXmlFsQ+$HDkwI(tyhbB?NH#g`NOsP0Cy@I` zmpm4e(-N?bQ;wn-vL6~#LyF@R(mWO)-q#@tX`_+`80WJ4y5j4~vHBLq7bu-Fr2P#= zq$JQj17mF+aF|)cV>fJZ@SNT!(@41v(hIvB~RJw_=;`LP36MMe$(i zc^*(!JYD$y+31dg?*3FrG1f}lB&R}#($0hdWuc1!r3G=*1`?f7(+({(Qp&bTaK9)T zDY5T&6`!INBR8(;Z1g5jaq`0Q$7N-KCyH?jEoGvTAB4)?D(zx@XX6qo z{t=^Gm^8$=m{q-9oar&|U}xhZnk2YKs1r{XKUR7t}IeBIAO$#Nroq8-avovQ~s4=^aqU9r*TCKeqYu+Qz)} zqvAj%bNiqeVw0_7M{|(DSa$yN;!zS}laimi2pQ0ZL8XGbeOUbDNkKd7df#Z8ybu>g z>?Q;=)DO2MW`)JZK4(myTYQ01r9st4m5aeh#}gU7l;mfOCC+7ceek6XzOt@%#o>j< zW%fg+GXgA66(e4@s%s#)`Z6@!w|tfuiS-A|!{T{>RfXA7hRp>Y7+_HGp5 zbh{Ri<5kisp=!3@3AL|6{jrkNA2G_!5TRF)2p#XSLBGg|tZZ=P?=f0TXcTQS@`n|s zf(TE6~7EZ_2~W+fhi*^T88Y8oKf&(HBq6Q_0F zOovRktc?TBeO?=^QL^?G9=D+14^UM#EAdf^*rTVtxs^%tnnv->%{%lEosqTxeYY!F zR2Q?p^lm4?`*E-CQPRs}+pa((T#NL=u0RK`0^ItePZ~3?UL`*(U&AoB^X0SC;GmrH zz48z-^0oY}-X$|7s#$?ZhR7E4=*o*=vlgc&v#^Xm;0=Gl{TadA6UUWYrg#Gp<`Qb7 zU^=LE{PVsg;gYoLNgm9R(yNI;8N(q~_ zt5w>)0RIM$_-a_FEGc>1nCQ>MfqQ_@I_T31+T3cW;;g-p`a;Q81=6<7dS|$pZ-M7z za=y{BL&J@0$;v4zvD(KFPnvse0{-+oJuvtLHshN12WW;Xq30;6kdjzLpDNr(7Kg&O zqI!oePWl(gqi+_CCrF$>C{795!uY8y1&!ZO9d0?hlv6s4h41pw%G$$DMN;?bUC=Z^ z6tTkIT=Jzt0rw$$;Vi5I!(0W@;NCo3-w5w35prH*8a-876v@xFeZ2?d7Fkp)bA6-37zDa^E|lGYeEv2j_f>0@PI${?|n$I$d0c5K8AsCC`dNCwMG z70zWdzzY$a<<#z#&^vseMyw8iIBC(M^^R=WI2?A z`;RPZQ&`o^(&vbN_J|s5u0`yeij7bRq{tshuf-5&uDxVlR!K(%M2p=H)2xqUO4A7A zUM%HZuK13NnXN9$@p<{&l)FXqZ%d`|7Wo;_Gg-mq*r5-}vVb>Wk=(mRQjdx25>cSDl z``U6RA@)&T*AFr^WRW)KWI>&Mlwa#TO${6_Ihae3xaXI8e-jddr3iP1KH@vY=lX#r z7C&fPCkJWwQC`vyHq}L_-VWDpK1ph5LMYP4_ncpfO`!JFezdKw32Ex$>AG*-P11*n zl_gzi-A2_m=BHA#TGn3J7t!1{1CZ6Ac!1Vyjzap>R^!fpPY(PYun(X=V4v>1;>ic7 zO23qlX3b8`9=Iwa+>Ao9s%9Q-$WvB@trcfavc!uUly;P*%l`$|XAW3qH*!pPxpY7? z8cQp>5?G;hpiX4%m8V1U16J(V@OnLHFq!Vs)qj6g`ij=RI}hqkFMs2FxjRdngS>gY z9{lnO;o!@{e_ZpB+_X2-j(AVjUSkmj*9Y^x14`>kJSw!*pptIOg=2)c>u_bA8KmMQs|%A@$*dH zEPe6AHWZ}_KNY}gPOxm1O93)d-^B!`kTQw9c&ucvyov9#nD^-pUq6*a3idjdVfDV| zUb9Lc$WjhN;l{^oS!^lNxje~_tqfH(U}$iVss30LKx;OI4k=V_Z=U`NMa-&reoSfC z2F&e+(sY*m2%2N6=ggzW41~)%g1%9xNXwRM);kM~tdptmRC|eQ<4Ui~QVAuOEhXRh zN)8(M3KH9m8!KdOsq^#}S-z4Z9_tC^ksLVAn5{s+B+M+n8Eg4L*)9J$~5jW}X->3nC6g>wsa^sCp+3FZ+kaa)U(SLrrHu!vWcP2T!{+WiUWZ?>XUjy7bt<#U;wLHE)AU3%82aS&*zjbL7cF6u zmg-mowj|x$Ar(kRw&r=u*iks&^t$Zmn_(zdb64m3_mTrwfCjSmz-W0kMbD7mVI zWuv4()!C%l`Y3E^36vBtufsIIysw7V(Xl8yXc9f;)BsDOf-2d*OPOifagY(>O2b=p zYLA3bKFyRmH)dMCrv!qB;eHQn@jc^`5!ZOlB(VemrNFBZwGw{2VaA~R94!%Iv zHAQhc7U{o0bqZBTnl9i;Lw8g`zi21nq1B(MMM4ns4(o1+&QHuA^&`8f}>(v$pb|%LsmZcH~=&SwLmy=U9YekB_8d z_ciT?+80CYP$w}glG)l7mhBW=<5=+;uVA&|<6@&1AU6oe`J(eSY!93%5gU9!}xY=^LEP#kG2V;P4HGZ$pQjD6$3p>b~GJKJvx@Y&V4ADzvUPU zl3Qbo+t!*0xUb7r1p(vI|CF^)eZz83flU_hVVHB)+V5^-f)~m`E5Ty`n`C7GdJIHP zTT3FD$)4<$=9wpK_c&&0Ru9EC+kRlNxUpG(b`7i1o_6;c zcC_K2O$kc8V_|TK+ve4d{qU`29xah7)nw`JMoFR)$dn;i)(2Ru;7#7i)CTm}7#<%3 zGkKWghr!Hjn=H{l;u3LoNbO$ zy^7WgnB}bfU>Ww}MJFY%<05Eu)( z?6tL<3BE4Yy>b#Qumi>^NAWAyEMY3eKuWz4e6F)VJ6=kx_pkw55_zN(e9y{!QnM_` zR08)CIE_tNQ{$DrL9FUewoaI zdbQe+T59=HRt%zq9NFj@kf65d(4p)n<~pXNimeLkIO|CI{f?t`>F3k*sjNUDtO8-mPn~S4AZu#`p_f1 z{tu{Ow+YVGq2HL1N-FdVa}1uJnit@C!8{jFZhiqzqj?sd1~Y=PL(iEJlpT87j5zGj zcg;}RhaNY>bP#&Xj6m*7p{@my|#W4ms?34_r+Z^B@7lT6d`eAYA-QRTXc zCd8BLCYTUUu8TBbOu8|qNq7!7A(C7-%!C+n-B1(8ryF9z_;iC!7@uyCX&jyrCIq$X z!c7Qj*M*rz<2lgu44wl_hz-&8H;u%zpJ@c1eN8Y#=|WAz@YI@y;;AtWK~%X;Z5oUZ zA*Mli_Ay1^+1nJ3XRs*@&mhx4JbRiD_M_`zLSVYCo2f6JT}%j1*L5<%&Zui=LXf)7 z&xGi7T`N-`O!ymSAQYNl1}dTZ%|Ie_pBYGm#+!je=w36B2;E}_5}}*cnt?^=EHmtm zq0gCN6AhhY4#snwIS9`|W(1gp_A__EQ)}*oXCHG%JUf~@ptGhX1i|ZkOug`IZ0d=p zmkHM)T?11$JnNazO6OtfjHl9swmR8_wz@hdwAKD&3dHlTO{Vtv-+xT)@chLDlF{BX zfsceHnK8ZEJ0=j0)?#Xb=l{p_4-K#lBq^#6{^Ru?;&7&_msXZhW8X0Bn+oVso7lL> z?-rCegE4m-MGS~dmPgm5`iZT|;u5^Z_|x{U$FX69Wf(gz{cU;dCXM8mq_W3u{Nmph zWGla}D!U~qkicoTLwJ6hF13PnPf7GC`;7Pjcp(lQV&A9u!+K>X2Lqp^9pcy^3~RI? zlLduwv4H~`4`$JI_crGLG%7nPNn`k%-epiIA^p;Jm&PdZ*M}!JE1M(|F<~t6(PAu1 z`Hq%l-QA=}=D+WhIJG9C5OG<8D3us_O?)$uE$UciWY-#&=~?8MuSMit3x2$P*<4vM zp4cnA?gX%b94~$^Q}U%9jvGJ|zPC%+dv4OR?A(xW0ndlMIi!qSG<74kJZG9H5Y=B1 z5SlQ&+?4;`qpZFxQMSl`xgO|5rbwtagmh@T9%#!F6zqQbCs$}nSBYPOMwMNFo`p>0 z&g(#yA2eq}%4RAiDe9bYEQ=2ZX7G1>CNZRJ8AlVX_3Q_TAeA(k&5A6GQAQ;Onx5ln zk!463J~nk?nUALe>6#9aVWJ&xHLJ`dBrtDTH$E}C>{qH`w~GZo#JP#zs@xP)DL4Wy z%Hp#GYx~TyBka-yKTj4vSk*akL0MmNhS)CT7S!%3n<^{dU9pwzBLNSeVVJqQsH`O` z^S?Tt!C-#{Nv9Xgr+Wb^mA2dJ&Bm@OTgi4UD_hNwHd4dv6~B*j|2E+b5Hz=}Y&|KS zU~E6^_;D!dp>D9qJH9=jct$OkHDxHeGmFjoF{uMP^m5q>&lpNDn8F}epVnuhmKv&oCP%B3mnCdt}lB5bubo}{m(e{l65m-j}Q8S z#m?=uod+H$OF_V?BNFT+iF}(`%A=m$`P;k8W+1|UGdjWYg_36zb$R%X}!&Pc3D{N3p~cWlJc$YZC!j3ne#|adCgA?4n9~ zf$|7;U_X3NHdMJNshw#Kn|UKbd>+K&x33+k(k+1MVm5ilJY%Nc*rd~72BG^E$98a5TV z{eo66JMWw;s;4qNvHm>lpsX@KX(2-j+YT&wV7Z`*b^2kZ1r#J}{ff5v8huL>oDx#l z^4Om3#EbOpszdIkc_Q$Mq$ZYKwp>!am^8;Um&J$t+?H-+taonN4JDoGD|o=PscT_G zkyG5^C#~Bc$vT)om-dZC-pA0hGT)o<;fG@1^-pZ7dqB?PAFy{?^r6!$kxh_9j9UT;PKlkAYtO4qphp>&b_kf3h8B+232SPb1l?E-#Xu(lsdgH z`7*6O(}NmEAsm$lg_gr_1fQ~G-Fg=Qe^HP2(oFBWzyN!K-SL%X!Zqw=c?WO7;Br2I>dt%paL;B#=EEg#iE z%zZLpIFv|jwB)IK1xpiCZE4&w-5c@8y#4FL4dH@&Llp42R}m~mHqq*x5xu_rCN3d} z27@CpUU|pPTgFvfWhpb6;)X94azpHaH2hlsLUEk z)W6z1zKT(saSbn@WN+T59O=tXT;2SyjYlcjk|yO>mAjIxZQ4BO!~|e*!^lkFYr zJn-=4&kvVb{5szjsfxj`NU~`eyWD?>*bvU?kCjxqy+Gy-4$?xEBnQNYTpnGH%$vXm z#5GP?k00Gzz8|Ylf6QD2LI$_2%lih;fHoB`%yx16T2MX;@t9Ey%6lM6{qPbK94XF= zn+1*B+3#}n3+t^;&(A4#MhQ2G(@dULE=t9B;~3I*1*l^@ z$~scJ?_}Kx`thg(yX^`dzF?j;QfHa4H#2!x`8Z;Rm0W$S{99Rihgz(8f(#OZ7Ax6& z&&r3iU#GCNtkyBq*;Xrs>dX7o+#@s@ZRnJe&Ue<)O7*hS#>fjDM7`LKARkJCAw-c6 z%O_Cglur??(%og7T8&bL*UAHU?DavTq5C+A3HyMbTQg?6%(0u=3M!Z+>rV5sqVjr@ zl}jV}f|YYSsrMvRn1z$`9p46&7MH2MDsQh?C+x^yb`m{KRp~xVQk&MYl&{LKD9!q1 zCZtfweNU|9Bx2Zxq$Vb~G#IRw%A*6zH+t&M9vp32O}RVhKJ2732i}2-_t6rL9upR^ z*u^_WAqd)QAa9jl4i9Ne%0e=($1(7iYqIVfO+8+F#oL#p6PDpH(tJ$L8VFxbdqVuEH=>=7I@fJUp-@~C= zRK8oZlaU2`>ORK-0~d>$2aIDbWU!ly!0rl) zB|5&`EynLHF}Z$4jAME_D6ySBA~&5TEG^cdH!J=TONEO8+7h#EpKzIKxe8ZSygrzRF0c4T zB^B2GI*gZJIjAU3oH$`v=K-u}MMZ9;2;awJ7vGPnr4k{!&a2!i=uIS_RSEB4Ta z@9o-_p>17$`@M?4L@_x%Mb$eoxF|`t6H_WyE8t+U#~~C7~A(IPay! zmaqS%qKV}3pZGpzq$)|a8vY=;wV)+MazWtpCr_^`w?<*zkadsP-W(;;J^xYhnY*m} z+x3!a+oVXC=W=PW$=M`eaR^w4W%hGP@>H6%)+F`sgU`|G6eNYe9 z-eQd#i=TGq2l{# zUBQyNgWZEWL`N=u8@7-ccm9$?k;UiNzme6V<*jl`aQ%;rmJ~ZiS+{C52IV2xY|brs zJY%Q_*u@!lP*w7o%1jh*d=d!a$$qN|fyIC6rQq*QsC-@_`EYOD^v`j(SycHV!TTB= z2RConiruqxMv5um&470kesNmmMGwi3%0tE|TZ7P02|BzlvWvWNYnakk-^<*Z&06ra z^|ME_gMsE&wQu&96 zcpTzqgu6$dTL))Fise)Dd zzWMVk>|x~s{?&i_ScCQ^VG*10y~l6QlPKaYJh{sow$DBEf#&w)jc)y{ z=&DznSv;wKXkk4%9b9h?pxXcpZZ2b<4B;RYO8?N#PmG$#=Ow?n7y?3 zPcNdZ7W}<)l~Ys_@>zfgTxSYx(mT|3X~SR5uH2v!+rMXRZ+l1nUgPb>2>g$1(U5J* ztn9_R-KflyrQjMZu@aZk_6R-lNXN@t*zye>#yGL1p5JjNmk5*$IM>}}%<&BCkWC!K zhh>yj1|yfczQL^++~2(dF46e1FboP`g9#X``wZn!4Tdj7au=u-uq2~WzpLyhd?hZD zvfc)ngMuo=(qF2JQ?gDdS#Lu5{kQgei#yVF>JU^{C$uk%TGF5&2OSwa$j`xS&C(OS z{!Rm4wYzdUdH#m>Ke!C1W!yiNh#ZGmDRcn$9uWMzOw;lz;rN)q!Rx0^=s*<3`(+}J z?Y?3hlx;4ASdD-bphPetzxkOwrR%Nn0@2Pqvf(Yn&PMQnue;5at>a{|A1(cgga4L+ zAs-Kf#d71kh6#^fPT+qxyEQ?QdRQ6hNc{+NcM8^yQ4Z6uF?VCVd~dz(G5E0B+?71H zmq+wj@HDUfHJ`1J<`43yqjv+pY{}X!{e%-YcjYW4+X%TL{t`^%O|6nssYIkdgi3{|K%> zfg8glxpgemNVil1F);ba7H^TuN9b7Fx(>ND#}n1V!jEfhTXTZGp1Bw0X0d&a#M<_> ztu3sSp-}=wIx>p+HlB;urr|XhZormYUL*#O zay_e4#!=41)8u7$)qcnvR4Rf===FZqAP%`}WYlWKF3H~htZGl?02cdx!(Qy~rMEt3 zs394^vKQT2B%wU(Vyy7gr1s`M3_(-|kI7qo&2UM9@H~S*9S#Q^%nz&_%_z`z3_G)V zPaKP69uryg@Ba}RfMhD^H>dhE!GTk{ZGyRRSI z9uWYtjW+r-?9bO0_NHWeP5F>jx1iIXW}TCpBfl4m*@;zsUHLT|)7GmYuZq3(u~?#w z)KtUTp1L&^8=ErPajZLq41#d@Ug>rN_$W>}JeODPx#dOS;&no2J{2qj*!leE_FFGN z`{3aw&&%<-ugmA9dX+hp z`40`Zy}w8wY}Q%legR&EcbKE;TzyBghO&O!UY)J)ZB~;3&-R&I0_OZT^pgmE3ZWzP zCqIe4mlD2xa_GGO2Ip<0wL$~4x()$D{Qw6(&pww!slFgAXw1rrZa0UUfqS~s! zqLNP#;F|Q*MOj=MRLVjMKJ>e?qsyKo(EG90WOJzj@E-L7wWGONv(ziJp_lz%p_a0< zD(1na4je6X6@h>clZ+ES65}8bOw-gfg8JeUP%n7T;a9S5g}E_Q0kgI`3EG2Z0>saw z3vQiIN~>^v@L`Lezm3X4Ust}#AH%E0&5>Adf@3Jvx>{4MQFd(;QVZ(dKQy=It#|_H z!&|Q^q#-Pz!C@Ok?bgpR54NUPfB=Z}3ZXmnP0WMXV~5oEy583u!DcSBGq^2!r8%4u zA=)6sLCOqskuo>x2b*zhE#G1LeI00gfD4VU1`U&$#yJxOd01&1AZcSi{)55MjWta#7_9vd{dhs467QSD2J@yC+B{uo(;2-5$>O zHo3hLiBVyHAv%g?$=@uC8Kov4bRfZN zFywWmtvoGj_=(b_?oO-9Qo5x%v1Oyv8d52$v3VLyY{yldB!spQF<*Vo$Ke z_Dzs-a%8?^(k`gCuL?NZlc$bJt0f9XcItRqJJxn=+ER|ImA44S2Zl-14=>XK|7F<% zkAZ%EYFcLjRQQ|HrYon*j<15gPdl;x<>6_a|B$W>yFw!XE^-A_57{QA#ByeE$)XA!f6(D}cw^Ynr@1t&XS$>CB$aEI%g= zPS0aKgD5$m3HVga(0PdPkN!6PF9|awoX9^*OiL7me!S22G}s{|8F!?Or<=q~WF4uL zye=Dlelgk!%QQJerMWKW}B>q zLhEt2T~xc9%EVii+VTI8+9zo~8X`kcEKLIWtxwZx3BJN8}KReK_&2!65^GQq^QPE!aC?-{+6UI^e_tBeE1vpmXS9}GF_u`-?G?rm^ zfHQ;t{<&1(rDbDzcKKMIp&_f8Rd#abzF-}S|0%5-i@%cgHSOKT4G5yrb)f7%S<&k3 zP_}vK0_D*emUIL)uQV%6UhT*78gD z(hiHlXcim`no+b$NAk~fvL|=`VcIShBBfVi)?dh-RWdAJwsW^$V# z7Mq(kimXe%pmM%+XSb7 z`u4XJ!xWuYzI`Eb8{F(C7PsI+N1|KS@`#eOd(P_dihVD}pAm3p z1IXz+M?EMv&H>p$V0wx&%~i3pueMHaC`i-kV=FT&nyoFX*EYQ_Ooh|CFqJMnN}5J* zVS}uE`tr9&g{gL|hdKn!Mpuo7^fp2?$4F=-NZ?~wP0EEp9v`0GT##l^Dhd}cp$s%g z!ziP_rP;3nG6d|-&i759z#`hDw`Ote)4Qt%oPD1!YnP5CeHQD}H@yjqIPK%gmKf4Q zDdb$%*uQ!;7TZ2u&3g4qhv$St*o`;8L|rV$E2=rNh!;U>>XQm)<6qWR^Jsp#{Ybs> z9ihDKpZJM5Z1i_|V>Yxa!y?nC2n*OO{G~9!KFD3({O_1$@y~jQ30bS(w8@zrCU?+n(%J|MXz>x2V8(_KiEv;wSjc0qMdq z(>iLadptjK)sKJ;;b`zzZQLSx6;x+;yPpiF*`W;w3B)+H@S}n^paIUcOo((T2ca6V zV}sKbEFLCRrNGipr2xd7bd{ET>sQ)44mRx?HhoF@m%~hewjAsJE$RsWpOk+*_*t1b_TBV zTUXxbqx5T%7?#8PE*TyNaP@|M5_@#)dIc(aE}u1N=nBOdaVcil%2OovQ}dYJL>&dX z4)`RFfba7UaLHH5MZ#?SlxesP99lo9p`&yN%V!5}=+{ze0EfmLQ^YsV?S%xzDls$FktH~e=7@f4!P1dke z`<4gMqeU8>urojgQ{or%ln3iIVJ~)dkU>`vH8F^a)R4TQ!v4g6y{&VlpBcm+6u>!NT$T-TPdU=lEqw8iImIN)pfum&+>Z(MY6Pq?NxV98a3=DBW$Ozy3%Y2|@_))>Cke#h)o z?*uRQyk5pkIwQnWRF0@sM4`gJ-SnZW`1(yB5gD~431jQ5UFncABf}s#3!U(>-FG<2 zrB|FN>R`O0jj^uM?%A>vUGWjb13PE@BBp8@Mlfte>5YS zn)}(&M`VHF$s_XFWd(RdHA1NxC)w}^FIrHP-You3TR{AMGtP)YWp+T+^ul&B1J)^c zd7Rc5CB1F*)1;(EEshz>L05%`YP%BU*6@reihLpoRrxHB(CzRkJeu)(6fjz8L}QmRIXXk7Wu!ag zNHG#QyrW)Feoi(HsU@++>oU&M^z^E=KH|SG$pU* z1W{RXI8H2p|2c<#PP)JiRb=S=jbwZB?!c*)JGav4{85scv^b1=cf;U=cjTcgqldHL z!EL89b_(j+aU*4zH_xqyoqcIrbQ5*8jrw@QxXE&L=6Y>(d7=X~x&|96%bum#)?YV8uEsW>$(SY7l|RksQjwha?eI`p zIm*9@(%g6Giv!qu^~Ia9mtSNYm7uQPMCR<}W$el$Z)EgW`r*yjLtoAKm~P2{@6Ys% zam=kC!;9VO<^p2y%t^0B>BXB|%V-O&GoSHoMu;T%@%^_m^b*~5VTYYK+UXY%gWSt# zA(A8hT4mcsPge>2vj-XVLFD)_wLe4KGilxk6J6FQ-P z+m>he^2p4LkClP%Pih(+`#U}3ju5ncOh7G`bRc6Sy^n<^ncvRNxF?a46COo7E-O_Y zK`-wJ{O`hy3Ih3KpRuD_m~R}}N%zd78l7%cpj?+fD$WQJ+2bZ2FbN3?g`wn$WsRz^ z=;skvFvYyO$7>!<3NSss(&M7ifS;3D$3EfggUouErX&Bt)eJD8E&T|T0FT<*4`81y zW~3W)i+h5!c)}N}pvFeH-ttJ@E{Zz=a~7HH4PvQ34gZy16(|@EydEh0r*$r^@m}xD37|60%vGw&P}Q2ejc?`^jnMgDVt}jJi5;z*Ig$lN5Bq1d zZvPT3pnI+HXj=DubriVu2rLAp?GG~h^9e07_i6<2V!pF{ucDPQWGd_VKfegqcgh^A zhTie@2I+?e2`+!4a?tf*pLk@>Q}@82jQkJziMqbDY0fEYlCFH*z|8#`q5pq~gt{F_ zb9XcEBzA(&9Q+Ijdnwz<9M_H?> znP0!=9IHFSEB4HUb1b~Ub=SBz)TQ0-vN*5y!f?OsK zgj_23hg>4Vn^m`1hBvEjkqk#m-9j0DthxnqFUa{aG{m}jat}Di>gLLDWYx`0&=Pht-Efr46jw)BpFVnx(PD8R(0cK9pqRU zh6TF!ljnTD}8{4Sd4)sP=^5%L2r zKpvN=rH{$*bkQA^mqH$qmq5lGk{98hz4AiHJ@P!r-SS+>UGf~ro$_qR9rF8-Or8a4 zl%pZH%QGPx%hYcg$<%M^$<%M^$WiGHjZ3KC&C6r(6lrMMhr3JZhJEk8rO9^>{^qXlQL@x>hY@r# z4>AvFBtt1_hd=)~IkUe?m?(dmSz8p^u;q1j)MP)O&y2)wUUGHPOPdW8c581<4XYM@A3K{T@%81)ncD?o8~}4hgr`5Hdi$+Z__3>**9D>-SWm7Q z?+n8brXD+SE%SFGA=t!D3HET~fxJJ8_uvsXG9yHx6RyR}gw=3I-tN216h$w#nuYEO z@?$AEnY&nIigg@(OpY3zL(2z zniA)1)W}e-?O>r7s^WIT*8{NVzcPD5W!HFusC!>d&6FillWk(5Ki5z~W&$#puGO;m zVVE7#GYb^;8k}uAF8ar77X>P9 zFa^8};9?h7Rg z+uX~WMZ4+;u*^T#1<+m#Q@~5-HZuWAhY#Z3-qxuC`8X#i--vAqvUa9LZq;T{hQeqM z6Mm_#B%2`$E98g!yC{?x)!~Plgl>t{4zfN4dPnwSE$cQAO3w(gc2biJdJ=l-PUxu<`@NMlTml2m2HFk#;*L&hfWTg~vEE^ZF4oJcaq?K^s<%!ch01dJ zG~oQuTLX;I3mjDu@)(|?w?2nwF~1OQ#bxyqs0`>auch-7Pwrq{AP|rD+gV&-NxhD{ zu^awwAqkOAEPA-r$TeN99Rz8TVlL%6@U?U z=-=umceFOZg~){qE3gk|S}X8~K30<;O;HpQD0F$fcJuH1SqF%`UN37qI0p=~-s2I2 ztuF<5AV&thiPj{BxtTT0UV^b+hy%FEs?_Oy>Ddxfl4 zqkW(|X|17Y8D)jOHMMGEW8cEdcG{FV)=+_T61bzVd+q-v{uAnBO)2r7#_SE?!&+di zCQ5T?1S-7_-}G^Tv{&860}0^hRII!+*R z--9gS_I+RW=!A8#lP)Q~stmuoBpSZTvo19H_N`nZ&!?2 zyQn+BZa1~e`u|41qm>p(4*QgHag=qxGTQs|x%;f^1>vBvksGx8ua)CCH60AW;jPd8 z4_d3K$gd4&O5uVpMX!wWniK8bJ=wZr){5kvm_U04d!1<)a9BQWl?7obkyQjx6c3SS zePsPk5anh3;tA_1m0FIWfdDEiCCR&j(Q>UVGks(YEld0NGu8$I2pxkBlSyesqW8zuDK9SLA6c80rLfDrauev3r(fr(L7^PSP<2>WZnIcjH7Lj> z>q}Aih|StP9|!D(y{6b-pRrA=hSr&VSuS1!SGj&nNsegfb?4Sd9BAD}BHd7)Ci0Wdtv*_z3fr

NQkYfBK;xv*eO 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 From 1c70f71e12bfaf07d851d1263ff872eb46bc8501 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 23 Jul 2019 13:26:43 +0000 Subject: [PATCH 046/221] Avoid redefining types u32 and u16 when fossildelta.c is compiled as part of the amalgamation. FossilOrigin-Name: d8e88248e3204b5f2b95b9b8921ee7ee2f7574ae81e6abd5b4f2ddf187f7d71b --- ext/misc/fossildelta.c | 3 +++ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index 2c7154882f..d5f62a8d27 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -36,6 +36,7 @@ #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 +#ifndef SQLITE_AMALGAMATION /* ** The "u32" type must be an unsigned 32-bit integer. Adjust this */ @@ -47,6 +48,8 @@ typedef unsigned int u32; typedef short int s16; typedef unsigned short int u16; +#endif /* SQLITE_AMALGAMATION */ + /* ** The width of a hash window in bytes. The algorithm only works if this diff --git a/manifest b/manifest index 3866a9c7bc..028a049bcc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\suse\sthe\sinsert-overwrite\soptimization\sif\sthe\scell\smight\soverwrite\sthe\npage\sheader. -D 2019-07-22T23:24:01.858 +C Avoid\sredefining\stypes\su32\sand\su16\swhen\sfossildelta.c\sis\scompiled\sas\spart\sof\sthe\samalgamation. +D 2019-07-23T13:26:43.019 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -290,7 +290,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c 288e7230e0fe464d71b0694e2d8bdd3a353118ac2e31da3964b95f460f09915f -F ext/misc/fossildelta.c 5c04d0a5657615daf4c6cd01c4281de8983dd28f6eed592b2691c10e3f6710e1 +F ext/misc/fossildelta.c 7708651072eb5620ab21bbfb518d184f27b2c29c0131b09b9a2d8852a8016430 F ext/misc/fuzzer.c c4e27daf41433a64cad5265cd27dbcb891147e9994d0422200ce81ce9a54b625 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c F ext/misc/json1.c c99b5f04fccba87c1c8c5ab5c0e53eef37c0144086e33911290a67dfba541d59 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e46b2afc99329c43de08d4a2e6ade4d2239d7409c5d5626bf272a3e0dd24d1b4 -R f02547e04f9016efb71b5df78bb77dee -U drh -Z 2c31e583b3a3e231570279d810b3f5f0 +P f60a83069168899dcfd706b4d0901084c7ce92d85277950317e962a8a98ec668 +R 84008622b9c994d74ed4e65360e28d93 +U dan +Z 85dff92fade63aa4999107c46113ee46 diff --git a/manifest.uuid b/manifest.uuid index c0e4baa1b3..a29c2b830d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f60a83069168899dcfd706b4d0901084c7ce92d85277950317e962a8a98ec668 \ No newline at end of file +d8e88248e3204b5f2b95b9b8921ee7ee2f7574ae81e6abd5b4f2ddf187f7d71b \ No newline at end of file From 95063c286768c880447ff66641e1a722c32d0b10 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 24 Jul 2019 08:15:09 +0000 Subject: [PATCH 047/221] Improve the ".recover" command in the shell tool so that it is not confused by auto-vacuum databases. And so that it can recover tables for which one or more of the column names are SQL keywords. FossilOrigin-Name: 87d76047d6a3df31bc9b7c0cffa7b758236c124f87263a520850b019cbbc4c6e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 17 ++++++++++++++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 028a049bcc..8353b07655 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sredefining\stypes\su32\sand\su16\swhen\sfossildelta.c\sis\scompiled\sas\spart\sof\sthe\samalgamation. -D 2019-07-23T13:26:43.019 +C Improve\sthe\s".recover"\scommand\sin\sthe\sshell\stool\sso\sthat\sit\sis\snot\sconfused\sby\sauto-vacuum\sdatabases.\sAnd\sso\sthat\sit\scan\srecover\stables\sfor\swhich\sone\sor\smore\sof\sthe\scolumn\snames\sare\sSQL\skeywords. +D 2019-07-24T08:15:09.374 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c edf29463177e9fa9dad5346e9adf482f24db9f180c693d0ba993e25dc797f6b7 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9817d812b13c956ac28d27390602751a8add217f87224d2636fb3ef7e4d646a7 -F src/shell.c.in a571d51dd7605b34796e9942dce0e895156d1860383faf6aaca3c88b08fe2a43 +F src/shell.c.in 68ef28e3a5f110c202d574a537ec75648aec075a74b19acb69192394efb00de9 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f60a83069168899dcfd706b4d0901084c7ce92d85277950317e962a8a98ec668 -R 84008622b9c994d74ed4e65360e28d93 +P d8e88248e3204b5f2b95b9b8921ee7ee2f7574ae81e6abd5b4f2ddf187f7d71b +R 01d1db0886e417c95a44058ab3274e67 U dan -Z 85dff92fade63aa4999107c46113ee46 +Z f78057b0d92324722c7a72785904e4d4 diff --git a/manifest.uuid b/manifest.uuid index a29c2b830d..eb75d34e9d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d8e88248e3204b5f2b95b9b8921ee7ee2f7574ae81e6abd5b4f2ddf187f7d71b \ No newline at end of file +87d76047d6a3df31bc9b7c0cffa7b758236c124f87263a520850b019cbbc4c6e \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index b51df8194b..7ccf0bae8c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6397,7 +6397,7 @@ static RecoverTable *recoverNewTable( } i = 1; shellPreparePrintf(dbtmp, &rc, &pStmt, - "SELECT %Q || group_concat(name, ', ') " + "SELECT %Q || group_concat(quote(name), ', ') " " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " "FROM pragma_table_info(%Q)", bIntkey ? ", " : "", pTab->iPk, @@ -6619,6 +6619,21 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ ); } + /* If this is an auto-vacuum database, add all pointer-map pages to + ** the freelist table. Do this regardless of whether or not + ** --freelist-corrupt was specified. */ + shellExec(pState->db, &rc, + "WITH ptrmap(pgno) AS (" + " SELECT 2 WHERE shell_int32(" + " (SELECT data FROM sqlite_dbpage WHERE pgno=1), 13" + " )" + " UNION ALL " + " SELECT pgno+1+(SELECT page_size FROM pragma_page_size)/5 AS pp " + " FROM ptrmap WHERE pp<=(SELECT page_count FROM pragma_page_count)" + ")" + "REPLACE INTO recovery.freelist SELECT pgno FROM ptrmap" + ); + shellExec(pState->db, &rc, "CREATE TABLE recovery.dbptr(" " pgno, child, PRIMARY KEY(child, pgno)" From 01c08bcacdce42ecc7f333576495b7159f57e409 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 24 Jul 2019 19:20:30 +0000 Subject: [PATCH 048/221] Improve the ".recover" command's handling of corrupt database schemas. FossilOrigin-Name: becaaa4d29d17ad613f2a120f0b173e53403b3de26f22beaf83f66ebf369bf60 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 8353b07655..9d14d4a62d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\s".recover"\scommand\sin\sthe\sshell\stool\sso\sthat\sit\sis\snot\sconfused\sby\sauto-vacuum\sdatabases.\sAnd\sso\sthat\sit\scan\srecover\stables\sfor\swhich\sone\sor\smore\sof\sthe\scolumn\snames\sare\sSQL\skeywords. -D 2019-07-24T08:15:09.374 +C Improve\sthe\s".recover"\scommand's\shandling\sof\scorrupt\sdatabase\sschemas. +D 2019-07-24T19:20:30.855 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c edf29463177e9fa9dad5346e9adf482f24db9f180c693d0ba993e25dc797f6b7 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9817d812b13c956ac28d27390602751a8add217f87224d2636fb3ef7e4d646a7 -F src/shell.c.in 68ef28e3a5f110c202d574a537ec75648aec075a74b19acb69192394efb00de9 +F src/shell.c.in 8bc78eac52d6b5adc304202eb7e5ac9030b60c4acf6afab17dd2d670bdc5ff46 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d8e88248e3204b5f2b95b9b8921ee7ee2f7574ae81e6abd5b4f2ddf187f7d71b -R 01d1db0886e417c95a44058ab3274e67 +P 87d76047d6a3df31bc9b7c0cffa7b758236c124f87263a520850b019cbbc4c6e +R f8528eeb79eb9ec604f822a0670c03c6 U dan -Z f78057b0d92324722c7a72785904e4d4 +Z c89bea65b11e28d9fe37e4838d0f8004 diff --git a/manifest.uuid b/manifest.uuid index eb75d34e9d..07ed2ef81f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -87d76047d6a3df31bc9b7c0cffa7b758236c124f87263a520850b019cbbc4c6e \ No newline at end of file +becaaa4d29d17ad613f2a120f0b173e53403b3de26f22beaf83f66ebf369bf60 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 7ccf0bae8c..d54b0170d3 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6589,6 +6589,7 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ shellExecPrintf(pState->db, &rc, /* Attach an in-memory database named 'recovery'. Create an indexed ** cache of the sqlite_dbptr virtual table. */ + "PRAGMA writable_schema = on;" "ATTACH %Q AS recovery;" "DROP TABLE IF EXISTS recovery.dbptr;" "DROP TABLE IF EXISTS recovery.freelist;" From 9443dbc493612588608e5cc6d3c46891c1c8025e Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 24 Jul 2019 20:10:27 +0000 Subject: [PATCH 049/221] Improve the ".recover" command so that it handles intkey pages linked into non-intkey b-trees, and vice-versa, better. FossilOrigin-Name: 9c458acba5a100a76148a3efb78ea9f57b85751e80788e4532694bd8976608a0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 20 ++++++++++++++++---- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 9d14d4a62d..9ab5996e0d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\s".recover"\scommand's\shandling\sof\scorrupt\sdatabase\sschemas. -D 2019-07-24T19:20:30.855 +C Improve\sthe\s".recover"\scommand\sso\sthat\sit\shandles\sintkey\spages\slinked\sinto\snon-intkey\sb-trees,\sand\svice-versa,\sbetter. +D 2019-07-24T20:10:27.248 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c edf29463177e9fa9dad5346e9adf482f24db9f180c693d0ba993e25dc797f6b7 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9817d812b13c956ac28d27390602751a8add217f87224d2636fb3ef7e4d646a7 -F src/shell.c.in 8bc78eac52d6b5adc304202eb7e5ac9030b60c4acf6afab17dd2d670bdc5ff46 +F src/shell.c.in 9c203a8c643fd638ab67a911e1fad1f51138c13a4d0ea3cedf7526fba5de60f2 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 87d76047d6a3df31bc9b7c0cffa7b758236c124f87263a520850b019cbbc4c6e -R f8528eeb79eb9ec604f822a0670c03c6 +P becaaa4d29d17ad613f2a120f0b173e53403b3de26f22beaf83f66ebf369bf60 +R 94d74886c98500c187a9db329f6aede4 U dan -Z c89bea65b11e28d9fe37e4838d0f8004 +Z 32ff5ab3849650d0809e5271f9614a81 diff --git a/manifest.uuid b/manifest.uuid index 07ed2ef81f..0c855a409c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -becaaa4d29d17ad613f2a120f0b173e53403b3de26f22beaf83f66ebf369bf60 \ No newline at end of file +9c458acba5a100a76148a3efb78ea9f57b85751e80788e4532694bd8976608a0 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index d54b0170d3..c5ca9242cd 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6740,6 +6740,7 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ ); shellPrepare(pState->db, &rc, "SELECT max(field), group_concat(shell_escape_crnl(quote(value)), ', ')" + ", min(field) " "FROM sqlite_dbdata WHERE pgno = ? AND field != ?" "GROUP BY cell", &pCells ); @@ -6758,6 +6759,7 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ int bNoop = 0; RecoverTable *pTab; + assert( bIntkey==0 || bIntkey==1 ); pTab = recoverFindTable(pState, &rc, iRoot, bIntkey, nCol, &bNoop); if( bNoop || rc ) continue; if( pTab==0 ){ @@ -6779,18 +6781,28 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ sqlite3_bind_int(pCells, 1, iPgno); while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){ int nField = sqlite3_column_int(pCells, 0); + int iMin = sqlite3_column_int(pCells, 2); const char *zVal = (const char*)sqlite3_column_text(pCells, 1); + RecoverTable *pTab2 = pTab; + if( pTab!=pOrphan && (iMin<0)!=bIntkey ){ + if( pOrphan==0 ){ + pOrphan = recoverOrphanTable(pState, &rc, zLostAndFound, nOrphan); + } + pTab2 = pOrphan; + if( pTab2==0 ) break; + } + nField = nField+1; - if( pTab==pOrphan ){ + if( pTab2==pOrphan ){ raw_printf(pState->out, "INSERT INTO %s VALUES(%d, %d, %d, %s%s%s);\n", - pTab->zQuoted, iRoot, iPgno, nField, - bIntkey ? "" : "NULL, ", zVal, pTab->azlCol[nField] + pTab2->zQuoted, iRoot, iPgno, nField, + iMin<0 ? "" : "NULL, ", zVal, pTab2->azlCol[nField] ); }else{ raw_printf(pState->out, "INSERT INTO %s(%s) VALUES( %s );\n", - pTab->zQuoted, pTab->azlCol[nField], zVal + pTab2->zQuoted, pTab2->azlCol[nField], zVal ); } } From 00c12a51e3f69ca8f1a01447bfae8216a3039a53 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 24 Jul 2019 23:15:19 +0000 Subject: [PATCH 050/221] Fix faulty asserts in the code generator. Ticket [c52b09c7f38903b1] FossilOrigin-Name: 01cdc590f7894ea23ee0d674747d7ebf8196efbef3c87d47e72dbc1ab6ae2883 --- manifest | 16 ++++++------ manifest.uuid | 2 +- src/select.c | 13 +++++++--- test/select1.test | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 9ab5996e0d..4aa0aab8f7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\s".recover"\scommand\sso\sthat\sit\shandles\sintkey\spages\slinked\sinto\snon-intkey\sb-trees,\sand\svice-versa,\sbetter. -D 2019-07-24T20:10:27.248 +C Fix\sfaulty\sasserts\sin\sthe\scode\sgenerator.\nTicket\s[c52b09c7f38903b1] +D 2019-07-24T23:15:19.192 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -522,7 +522,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c edf29463177e9fa9dad5346e9adf482f24db9f180c693d0ba993e25dc797f6b7 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 9817d812b13c956ac28d27390602751a8add217f87224d2636fb3ef7e4d646a7 +F src/select.c 1b8b5afee76e7d662b34c61705a638f7a6a20d5109515ca973c12343c84fb2d6 F src/shell.c.in 9c203a8c643fd638ab67a911e1fad1f51138c13a4d0ea3cedf7526fba5de60f2 F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1283,7 +1283,7 @@ F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 7d41f354998524070317207d4e2b68e725e4cf14a57835fc746d4bea686a8714 +F test/select1.test 703154cbf66d0a9fbbd5b771dc3d2c4d3700121d133d695958d4a9c5a33251e8 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select3.test 3905450067c28766bc83ee397f6d87342de868baa60f2bcfd00f286dfbd62cb9 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P becaaa4d29d17ad613f2a120f0b173e53403b3de26f22beaf83f66ebf369bf60 -R 94d74886c98500c187a9db329f6aede4 -U dan -Z 32ff5ab3849650d0809e5271f9614a81 +P 9c458acba5a100a76148a3efb78ea9f57b85751e80788e4532694bd8976608a0 +R bef3b356415d2b00c3ff0794e1a2bd40 +U drh +Z 3eaa65a1e0f80aa0cf734d748434dc11 diff --git a/manifest.uuid b/manifest.uuid index 0c855a409c..667af28ab4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9c458acba5a100a76148a3efb78ea9f57b85751e80788e4532694bd8976608a0 \ No newline at end of file +01cdc590f7894ea23ee0d674747d7ebf8196efbef3c87d47e72dbc1ab6ae2883 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 6e0eeb2f4e..1feee02b7e 100644 --- a/src/select.c +++ b/src/select.c @@ -5869,8 +5869,15 @@ int sqlite3Select( ** technically harmless for it to be generated multiple times. The ** following assert() will detect if something changes to cause ** the same subquery to be coded multiple times, as a signal to the - ** developers to try to optimize the situation. */ - assert( pItem->addrFillSub==0 ); + ** developers to try to optimize the situation. + ** + ** Update 2019-07-24: + ** See ticket https://sqlite.org/src/tktview/c52b09c7f38903b1311cec40. + ** The dbsqlfuzz fuzzer found a case where the same subquery gets + ** coded twice. So this assert() now becomes a testcase(). It should + ** be very rare, though. + */ + testcase( pItem->addrFillSub!=0 ); /* Increment Parse.nHeight by the height of the largest expression ** tree referred to by this, the parent select. The child select @@ -5944,7 +5951,7 @@ int sqlite3Select( int retAddr; struct SrcList_item *pPrior; - assert( pItem->addrFillSub==0 ); + testcase( pItem->addrFillSub==0 ); /* Ticket c52b09c7f38903b1311 */ pItem->regReturn = ++pParse->nMem; topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); pItem->addrFillSub = topAddr+1; diff --git a/test/select1.test b/test/select1.test index 468f118c41..27191caf67 100644 --- a/test/select1.test +++ b/test/select1.test @@ -1100,4 +1100,69 @@ do_execsql_test select1-17.3 { UNION ALL SELECT * FROM t2 WHERE y=3 ORDER BY y,z LIMIT 4); } {1 2 3} +# 2019-07-24 Ticket https://sqlite.org/src/tktview/c52b09c7f38903b1311 +# +do_execsql_test select1-18.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(c); + CREATE TABLE t2(x PRIMARY KEY, y); + INSERT INTO t1(c) VALUES(123); + INSERT INTO t2(x) VALUES(123); + SELECT x FROM t2, t1 WHERE x BETWEEN c AND null OR x AND + x IN ((SELECT x FROM (SELECT x FROM t2, t1 + WHERE x BETWEEN (SELECT x FROM (SELECT x COLLATE rtrim + FROM t2, t1 WHERE x BETWEEN c AND null + OR x AND x IN (c)), t1 WHERE x BETWEEN c AND null + OR x AND x IN (c)) AND null + OR NOT EXISTS(SELECT -4.81 FROM t1, t2 WHERE x BETWEEN c AND null + OR x AND x IN ((SELECT x FROM (SELECT x FROM t2, t1 + WHERE x BETWEEN (SELECT x FROM (SELECT x BETWEEN c AND null + OR x AND x IN (c)), t1 WHERE x BETWEEN c AND null + OR x AND x IN (c)) AND null + OR x AND x IN (c)), t1 WHERE x BETWEEN c AND null + OR x AND x IN (c)))) AND x IN (c) + ), t1 WHERE x BETWEEN c AND null + OR x AND x IN (c))); +} {} +do_execsql_test select1-18.2 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(c); + CREATE TABLE t2(x PRIMARY KEY, y); + INSERT INTO t1(c) VALUES(123); + INSERT INTO t2(x) VALUES(123); + SELECT x FROM t2, t1 WHERE x BETWEEN c AND (c+1) OR x AND + x IN ((SELECT x FROM (SELECT x FROM t2, t1 + WHERE x BETWEEN (SELECT x FROM (SELECT x COLLATE rtrim + FROM t2, t1 WHERE x BETWEEN c AND (c+1) + OR x AND x IN (c)), t1 WHERE x BETWEEN c AND (c+1) + OR x AND x IN (c)) AND (c+1) + OR NOT EXISTS(SELECT -4.81 FROM t1, t2 WHERE x BETWEEN c AND (c+1) + OR x AND x IN ((SELECT x FROM (SELECT x FROM t2, t1 + WHERE x BETWEEN (SELECT x FROM (SELECT x BETWEEN c AND (c+1) + OR x AND x IN (c)), t1 WHERE x BETWEEN c AND (c+1) + OR x AND x IN (c)) AND (c+1) + OR x AND x IN (c)), t1 WHERE x BETWEEN c AND (c+1) + OR x AND x IN (c)))) AND x IN (c) + ), t1 WHERE x BETWEEN c AND (c+1) + OR x AND x IN (c))); +} {123} +do_execsql_test select1-18.3 { + SELECT 1 FROM t1 WHERE ( + SELECT 2 FROM t2 WHERE ( + SELECT 3 FROM ( + SELECT x FROM t2 WHERE x=c OR x=(SELECT x FROM (VALUES(0))) + ) WHERE x>c OR x=c + ) + ); +} {1} +do_execsql_test select1-18.4 { + SELECT 1 FROM t1, t2 WHERE ( + SELECT 3 FROM ( + SELECT x FROM t2 WHERE x=c OR x=(SELECT x FROM (VALUES(0))) + ) WHERE x>c OR x=c + ); +} {1} + finish_test From bfe33f80dd58c6dfe7da2c7218253c34ebd05a0d Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 25 Jul 2019 19:29:24 +0000 Subject: [PATCH 051/221] Fix a potential buffer overread in fts5 triggered by a corrupt database record. FossilOrigin-Name: 16472112b6886ada18d45cfb409cca2e83dde5a8ba8a36d481e87b61100b0186 --- ext/fts5/fts5_index.c | 1 + ext/fts5/test/fts5corrupt3.test | 207 ++++++++++++++++++++++++++++++++ manifest | 16 +-- manifest.uuid | 2 +- 4 files changed, 217 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 73249b0a54..000ce98033 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -690,6 +690,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ }else{ /* TODO1: Fix this */ pRet->p[nByte] = 0x00; + pRet->p[nByte+1] = 0x00; pRet->szLeaf = fts5GetU16(&pRet->p[2]); } } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index c5544c8dd6..0497c95bcf 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -9161,6 +9161,213 @@ do_catchsql_test 62.1 { INSERT INTO t1(a) SELECT randomblob(2829) FROM c; } {0 {}} +#--------------------------------------------------------------------------- +do_test 63.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash-8230e6c3b368f5.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 7c 65 62 63 62 62 ......1tab|ebcbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 9d EATE TABLE 't1_. +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 64 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 ed1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 10 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 13 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 75 61 62 03 02 03 04 0a 19 8c 80 80 ....uab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 ec 68 03 02 .....8.....2.h.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 17 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 64 02 08 05 0a 1b 88 .......thd...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 43 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .C...........6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 01 00 02 30 21 02 ..0there.....0!. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 51 .............<.Q +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 51 62 6c 01 06 01 01 05 02 03 65 ...4tQbl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 17 63 68 01 02 03 01 04 70 .....4e.ch.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 03 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 12 02 31 65 01 02 02 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 01 f4 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 00 00 00 00 00 ................ +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 07 ....2.......1t.. +| 3744: f4 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 73 22 07 04 01 0e 01 02 34 20 08 04 ...4s.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 01 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 00 00 00 00 00 00 00 .......0t....... +| page 4 offset 12288 +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 02 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 08 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| end crash-8230e6c3b368f5.db +}]} {} + +do_catchsql_test 63.1 { + SELECT * FROM t1 WHERE b MATCH 'thead*thead*theSt*'; +} {1 {database disk image is malformed}} + +do_catchsql_test 63.2 { + INSERT INTO t1(t1) VALUES('optimize'); +} {0 {}} + +breakpoint +do_catchsql_test 63.3 { + SELECT * FROM t1 WHERE b MATCH 'thead*thead*theSt*'; +} {0 {}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 4aa0aab8f7..e522ecdf96 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfaulty\sasserts\sin\sthe\scode\sgenerator.\nTicket\s[c52b09c7f38903b1] -D 2019-07-24T23:15:19.192 +C Fix\sa\spotential\sbuffer\soverread\sin\sfts5\striggered\sby\sa\scorrupt\sdatabase\srecord. +D 2019-07-25T19:29:24.884 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c d7523cba5e66da077233c023aecbc3e6a37978ff75a18131c5ab5b1229d5bac7 F ext/fts5/fts5_expr.c 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c 5a89e0341297fade9a8f2c7aecc1ebd2e7e0989da84ece4d287a153da73cf0e6 +F ext/fts5/fts5_index.c cd363c2fa3e626c04a9b7c705ff50222b4cab052704938f6a24881602ed3ed0d F ext/fts5/fts5_main.c abd04720e2729ba5bab2648d9d541faab18f45d481ae21fc30f125b55e979d6b F ext/fts5/fts5_storage.c b24f6916fcdd68989a549f25962f286bdba9d9d59c7581567a6a0eb647cd07cc F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -157,7 +157,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test ee32b76e1b4beae8051f0bd5bc9cc9609667fdaed87886eda69b96b305d21897 +F ext/fts5/test/fts5corrupt3.test 1f36c04fdd717f7d44a0addcdad0f5e54a5a403eab8a25426b069757830682ee F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9c458acba5a100a76148a3efb78ea9f57b85751e80788e4532694bd8976608a0 -R bef3b356415d2b00c3ff0794e1a2bd40 -U drh -Z 3eaa65a1e0f80aa0cf734d748434dc11 +P 01cdc590f7894ea23ee0d674747d7ebf8196efbef3c87d47e72dbc1ab6ae2883 +R 7ee478119f0db3f146213212a0277fe8 +U dan +Z 35e2247278dd60a2332994dc0fccf047 diff --git a/manifest.uuid b/manifest.uuid index 667af28ab4..1a95ad7103 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -01cdc590f7894ea23ee0d674747d7ebf8196efbef3c87d47e72dbc1ab6ae2883 \ No newline at end of file +16472112b6886ada18d45cfb409cca2e83dde5a8ba8a36d481e87b61100b0186 \ No newline at end of file From dff1d5b61b3c3c74ede5593a4a75673be9e8d974 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 26 Jul 2019 16:16:31 +0000 Subject: [PATCH 052/221] Fix RBU handling of partial indexes with comments embedded in their CREATE INDEX statements. FossilOrigin-Name: e1ccf211aa975a6688a27f7dc4cea80784ed8dcfe1950b2fa6eb0a3cb938838a --- ext/rbu/rbupartial.test | 9 +++++++++ ext/rbu/sqlite3rbu.c | 7 +++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/ext/rbu/rbupartial.test b/ext/rbu/rbupartial.test index 9b0dce6109..d6cd7330fe 100644 --- a/ext/rbu/rbupartial.test +++ b/ext/rbu/rbupartial.test @@ -40,6 +40,15 @@ foreach {tn without_rowid a b c d} { CREATE INDEX i1c3 ON t1(%C%) WHERE %C% IS NOT NULL; CREATE INDEX i1c4 ON t1(%C%) WHERE %D% < 'd'; + CREATE INDEX i1c5 ON t1( + %C% -- for (c = ... expressions + ) WHERE %D% < 'd'; + CREATE INDEX i1c6 ON t1( + %C% /* Again, for (c=... expr */, %D% + ) WHERE %D% < 'd'; + + CREATE INDEX i1c7 ON t1( + %C% /* As before, for (c=... "expr */) WHERE %D% < 'd'; } do_execsql_test $tn.1.1 { diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index a4fbeb614e..b7f7dfdc2a 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -2216,6 +2216,13 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ for(i++; 1; i++){ if( zSql[i]==']' ) break; } + }else if( c=='-' && zSql[i+1]=='-' ){ + for(i=i+2; zSql[i] && zSql[i]!='\n'; i++); + if( zSql[i]=='\0' ) break; + }else if( c=='/' && zSql[i+1]=='*' ){ + for(i=i+2; zSql[i] && (zSql[i]!='*' || zSql[i+1]!='/'); i++); + if( zSql[i]=='\0' ) break; + i++; } } if( zSql[i] ){ diff --git a/manifest b/manifest index e522ecdf96..e370a31b6e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sbuffer\soverread\sin\sfts5\striggered\sby\sa\scorrupt\sdatabase\srecord. -D 2019-07-25T19:29:24.884 +C Fix\sRBU\shandling\sof\spartial\sindexes\swith\scomments\sembedded\sin\stheir\sCREATE\sINDEX\sstatements. +D 2019-07-26T16:16:31.199 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -352,7 +352,7 @@ F ext/rbu/rbufault4.test 03d2849c3df7d7bd14a622e789ff049e5080edd34a79cd432e01204 F ext/rbu/rbufts.test 0ae8d1da191c75bd776b86e24456db0fb6e97b7c944259fae5407ea55d23c31d F ext/rbu/rbumisc.test 329986cf5dd51890c4eb906c2f960ebb773a79a64bed90f506b7c417825b37eb F ext/rbu/rbumulti.test 5fb139058f37ddc5a113c5b93238de915b769b7792de41b44c983bc7c18cf5b9 -F ext/rbu/rbupartial.test 1c8bd6d42615b94caf08f129f5817fa26975523f0f51bceda1dca90e8114c7c4 +F ext/rbu/rbupartial.test f25df014b8dbe3c5345851fba6e66f79ab237f57dc201b2d5f0dbae658ae5a4c F ext/rbu/rbuprogress.test 04614ff8820bab9c1ec1b7dbec1edc4b45474421d4fe7abbd2a879a9c02884f9 F ext/rbu/rburesume.test dbdc4ca504e9c76375a69e5f0d91205db967dcc509a5166ca80231f8fda49eb1 F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d1cdd926 @@ -362,7 +362,7 @@ F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c 8741c0ee1496b41ff888b983a1a32547bc8822602603c68b3e524e5e0e287395 +F ext/rbu/sqlite3rbu.c 38c57ecab6697996cca56f56d4712ee0465a0957af1ea994a5a2ca815d5a06f6 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 01cdc590f7894ea23ee0d674747d7ebf8196efbef3c87d47e72dbc1ab6ae2883 -R 7ee478119f0db3f146213212a0277fe8 +P 16472112b6886ada18d45cfb409cca2e83dde5a8ba8a36d481e87b61100b0186 +R b8711fee1b5f80da15fd5f89a8e1d802 U dan -Z 35e2247278dd60a2332994dc0fccf047 +Z f0a7ed38f3e42e2ed2e83f589a12fac7 diff --git a/manifest.uuid b/manifest.uuid index 1a95ad7103..71225592f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -16472112b6886ada18d45cfb409cca2e83dde5a8ba8a36d481e87b61100b0186 \ No newline at end of file +e1ccf211aa975a6688a27f7dc4cea80784ed8dcfe1950b2fa6eb0a3cb938838a \ No newline at end of file From b8293a5bee4d064b29760da72c2aa9c17485d1a1 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 26 Jul 2019 20:33:23 +0000 Subject: [PATCH 053/221] Update RBU so that it supports indexes on expressions. FossilOrigin-Name: 6bfa44da226fd758a2ee924d1e8e3a742b0635b6d3f922a4a7919cb14b2418e6 --- ext/rbu/rbuexpr.test | 93 ++++++++++++++++++++++++++++++++++++ ext/rbu/sqlite3rbu.c | 110 +++++++++++++++++++++++++++++++++---------- manifest | 13 ++--- manifest.uuid | 2 +- 4 files changed, 185 insertions(+), 33 deletions(-) create mode 100644 ext/rbu/rbuexpr.test diff --git a/ext/rbu/rbuexpr.test b/ext/rbu/rbuexpr.test new file mode 100644 index 0000000000..a392c4ed8c --- /dev/null +++ b/ext/rbu/rbuexpr.test @@ -0,0 +1,93 @@ +# 2014 August 30 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +source [file join [file dirname [info script]] rbu_common.tcl] +set ::testprefix rbuexpr + +db close +sqlite3_shutdown +sqlite3_config_uri 1 + +sqlite3 db test.db + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b, c PRIMARY KEY); + CREATE INDEX i1 ON t1(a, null, b+1); + CREATE INDEX i2 ON t1(a+1, b+1, c+1); + + INSERT INTO t1 VALUES(1, 2, 3); + INSERT INTO t1 VALUES(4, 5, 6); + INSERT INTO t1 VALUES(7, 8, 9); + INSERT INTO t1 VALUES(10, 11, 12); + + PRAGMA integrity_check; +} {ok} + +forcedelete rbu.db +sqlite3 db2 rbu.db +do_execsql_test -db db2 1.1 { + CREATE TABLE data_t1(a, b, c, rbu_control); + INSERT INTO data_t1 VALUES(13, 14, 15, 0); + INSERT INTO data_t1 VALUES(NULL, NULL, 6, 1); + INSERT INTO data_t1 VALUES(NULL, 'three', 3, '.x.'); +} +db2 close +db close + +do_test 1.2 { + run_rbu test.db rbu.db +} {SQLITE_DONE} + +sqlite3 db test.db + +do_execsql_test 1.3 { + SELECT * FROM t1 WHERE a=4; +} + +integrity_check 1.4 + +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(c1, c2, c3, i INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES('one', 'one', 'one', 1); + INSERT INTO t1 VALUES('two', 'two', 'two', 2); + INSERT INTO t1 VALUES('three', 'three', 'three', 3); + INSERT INTO t1 VALUES('four', 'four', 'four', 4); + + CREATE INDEX i1 ON t1( substr(c1, 1, 2) ); + CREATE INDEX i2 ON t1( c1 || c2 || c3 ); + CREATE INDEX i3 ON t1( length(c1) + length(c2) - 1, c3||i ); +} + +forcedelete rbu.db +sqlite3 db2 rbu.db +do_execsql_test -db db2 2.1 { + CREATE TABLE data_t1(c1, c2, c3, i, rbu_control); + INSERT INTO data_t1 VALUES(NULL, NULL, NULL, 2, 1); + INSERT INTO data_t1 VALUES('thirty', NULL, NULL, 3, 'xx..'); + INSERT INTO data_t1 VALUES('five', 'five', 'five', 5, 0); +} +db2 close + +db close + +do_test 2.2 { + run_rbu test.db rbu.db +} {SQLITE_DONE} + +sqlite3 db test.db +integrity_check 2.3 + +finish_test + diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index b7f7dfdc2a..ee49ff361b 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -182,6 +182,7 @@ typedef struct RbuFrame RbuFrame; typedef struct RbuObjIter RbuObjIter; typedef struct RbuState RbuState; +typedef struct RbuSpan RbuSpan; typedef struct rbu_vfs rbu_vfs; typedef struct rbu_file rbu_file; typedef struct RbuUpdateStmt RbuUpdateStmt; @@ -226,6 +227,11 @@ struct RbuUpdateStmt { RbuUpdateStmt *pNext; }; +struct RbuSpan { + const char *zSpan; + int nSpan; +}; + /* ** An iterator of this type is used to iterate through all objects in ** the target database that require updating. For each such table, the @@ -275,6 +281,9 @@ struct RbuObjIter { sqlite3_stmt *pInsert; /* Statement for INSERT operations */ sqlite3_stmt *pDelete; /* Statement for DELETE ops */ sqlite3_stmt *pTmpInsert; /* Insert into rbu_tmp_$zDataTbl */ + int nIdxCol; + RbuSpan *aIdxCol; + char *zIdxSql; /* Last UPDATE used (for PK b-tree updates only), or NULL. */ RbuUpdateStmt *pRbuUpdate; @@ -809,6 +818,8 @@ static void rbuObjIterClearStatements(RbuObjIter *pIter){ sqlite3_free(pUp); pUp = pTmp; } + sqlite3_free(pIter->aIdxCol); + sqlite3_free(pIter->zIdxSql); pIter->pSelect = 0; pIter->pInsert = 0; @@ -816,6 +827,9 @@ static void rbuObjIterClearStatements(RbuObjIter *pIter){ pIter->pRbuUpdate = 0; pIter->pTmpInsert = 0; pIter->nCol = 0; + pIter->nIdxCol = 0; + pIter->aIdxCol = 0; + pIter->zIdxSql = 0; } /* @@ -1089,14 +1103,15 @@ static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){ static char *rbuStrndup(const char *zStr, int *pRc){ char *zRet = 0; - assert( *pRc==SQLITE_OK ); - if( zStr ){ - size_t nCopy = strlen(zStr) + 1; - zRet = (char*)sqlite3_malloc64(nCopy); - if( zRet ){ - memcpy(zRet, zStr, nCopy); - }else{ - *pRc = SQLITE_NOMEM; + if( *pRc==SQLITE_OK ){ + if( zStr ){ + size_t nCopy = strlen(zStr) + 1; + zRet = (char*)sqlite3_malloc64(nCopy); + if( zRet ){ + memcpy(zRet, zStr, nCopy); + }else{ + *pRc = SQLITE_NOMEM; + } } } @@ -1268,6 +1283,9 @@ static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){ while( p->rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pXInfo) ){ int iCid = sqlite3_column_int(pXInfo, 1); if( iCid>=0 ) pIter->abIndexed[iCid] = 1; + if( iCid==-2 ){ + memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol); + } } rbuFinalize(p, pXInfo); bIndex = 1; @@ -1682,26 +1700,34 @@ static char *rbuObjIterGetIndexCols( const char *zCol; const char *zType; - if( iCid<0 ){ - /* An integer primary key. If the table has an explicit IPK, use - ** its name. Otherwise, use "rbu_rowid". */ - if( pIter->eType==RBU_PK_IPK ){ - int i; - for(i=0; pIter->abTblPk[i]==0; i++); - assert( inTblCol ); - zCol = pIter->azTblCol[i]; - }else if( rbuIsVacuum(p) ){ - zCol = "_rowid_"; + if( iCid==-2 ){ + int iSeq = sqlite3_column_int(pXInfo, 0); + zRet = sqlite3_mprintf("%z%s(%.*s) COLLATE %Q", zRet, zCom, + pIter->aIdxCol[iSeq].nSpan, pIter->aIdxCol[iSeq].zSpan, zCollate + ); + zType = ""; + }else { + if( iCid<0 ){ + /* An integer primary key. If the table has an explicit IPK, use + ** its name. Otherwise, use "rbu_rowid". */ + if( pIter->eType==RBU_PK_IPK ){ + int i; + for(i=0; pIter->abTblPk[i]==0; i++); + assert( inTblCol ); + zCol = pIter->azTblCol[i]; + }else if( rbuIsVacuum(p) ){ + zCol = "_rowid_"; + }else{ + zCol = "rbu_rowid"; + } + zType = "INTEGER"; }else{ - zCol = "rbu_rowid"; + zCol = pIter->azTblCol[iCid]; + zType = pIter->azTblType[iCid]; } - zType = "INTEGER"; - }else{ - zCol = pIter->azTblCol[iCid]; - zType = pIter->azTblType[iCid]; + zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom,zCol,zCollate); } - zRet = sqlite3_mprintf("%z%s\"%w\" COLLATE %Q", zRet, zCom, zCol, zCollate); if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){ const char *zOrder = (bDesc ? " DESC" : ""); zImpPK = sqlite3_mprintf("%z%s\"rbu_imp_%d%w\"%s", @@ -2181,6 +2207,8 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ int rc = p->rc; char *zRet = 0; + assert( pIter->zIdxSql==0 && pIter->nIdxCol==0 && pIter->aIdxCol==0 ); + if( rc==SQLITE_OK ){ rc = prepareAndCollectError(p->dbMain, &pStmt, &p->zErrmsg, "SELECT trim(sql) FROM sqlite_master WHERE type='index' AND name=?" @@ -2190,21 +2218,50 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ int rc2; rc = sqlite3_bind_text(pStmt, 1, pIter->zIdx, -1, SQLITE_STATIC); if( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ - const char *zSql = (const char*)sqlite3_column_text(pStmt, 0); + char *zSql = (char*)sqlite3_column_text(pStmt, 0); + if( zSql ){ + pIter->zIdxSql = zSql = rbuStrndup(zSql, &rc); + } if( zSql ){ int nParen = 0; /* Number of open parenthesis */ int i; + int iIdxCol = 0; + int nIdxAlloc = 0; for(i=0; zSql[i]; i++){ char c = zSql[i]; + + /* If necessary, grow the pIter->aIdxCol[] array */ + if( iIdxCol==nIdxAlloc ){ + RbuSpan *aIdxCol = (RbuSpan*)sqlite3_realloc( + pIter->aIdxCol, (nIdxAlloc+16)*sizeof(RbuSpan) + ); + if( aIdxCol==0 ){ + rc = SQLITE_NOMEM; + break; + } + pIter->aIdxCol = aIdxCol; + nIdxAlloc += 16; + } + if( c=='(' ){ + if( nParen==0 ){ + assert( iIdxCol==0 ); + pIter->aIdxCol[0].zSpan = &zSql[i+1]; + } nParen++; } else if( c==')' ){ nParen--; if( nParen==0 ){ + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; i++; break; } + }else if( c==',' && nParen==1 ){ + int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan; + pIter->aIdxCol[iIdxCol++].nSpan = nSpan; + pIter->aIdxCol[iIdxCol].zSpan = &zSql[i+1]; }else if( c=='"' || c=='\'' || c=='`' ){ for(i++; 1; i++){ if( zSql[i]==c ){ @@ -2228,6 +2285,7 @@ static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){ if( zSql[i] ){ zRet = rbuStrndup(&zSql[i], &rc); } + pIter->nIdxCol = iIdxCol; } } @@ -2272,11 +2330,11 @@ static int rbuObjIterPrepareAll( int nBind = 0; assert( pIter->eType!=RBU_PK_VTAB ); + zPart = rbuObjIterGetIndexWhere(p, pIter); zCollist = rbuObjIterGetIndexCols( p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind ); zBind = rbuObjIterGetBindlist(p, nBind); - zPart = rbuObjIterGetIndexWhere(p, pIter); /* Create the imposter table used to write to this index. */ sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->dbMain, "main", 0, 1); diff --git a/manifest b/manifest index e370a31b6e..ddbd09314c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sRBU\shandling\sof\spartial\sindexes\swith\scomments\sembedded\sin\stheir\sCREATE\sINDEX\sstatements. -D 2019-07-26T16:16:31.199 +C Update\sRBU\sso\sthat\sit\ssupports\sindexes\son\sexpressions. +D 2019-07-26T20:33:23.040 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -345,6 +345,7 @@ F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68 F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 F ext/rbu/rbudiff.test 156957851136b63c143478518dc1bda6c832103cdbe8ac1d7cdd47edb3cbe0a3 F ext/rbu/rbudor.test e3e8623926012f43eebe51fedf06a102df2640750d971596b052495f2536db20 +F ext/rbu/rbuexpr.test 10d0420537c3bc7666e576d72adeffe7e86cfbb00dcc30aa9ce096c042415190 F ext/rbu/rbufault.test 2d7f567b79d558f6e093c58808cab4354f8a174e3802f69e7790a9689b3c09f8 F ext/rbu/rbufault2.test c81327a3ac2c385b9b954db3644d4e0df93eeebfc3de9f1f29975a1e73fd3d0c F ext/rbu/rbufault3.test b2fcc9db5c982b869f67d1d4688d8cb515d5b92f58011fff95665f2e62cec179 @@ -362,7 +363,7 @@ F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c 38c57ecab6697996cca56f56d4712ee0465a0957af1ea994a5a2ca815d5a06f6 +F ext/rbu/sqlite3rbu.c b254d13ae0058a07ee6322d01370fa15d4679e734a8962e923324e51b5cab556 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -1837,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 16472112b6886ada18d45cfb409cca2e83dde5a8ba8a36d481e87b61100b0186 -R b8711fee1b5f80da15fd5f89a8e1d802 +P e1ccf211aa975a6688a27f7dc4cea80784ed8dcfe1950b2fa6eb0a3cb938838a +R d25f513b3e1c94b2e54a2b873df68d96 U dan -Z f0a7ed38f3e42e2ed2e83f589a12fac7 +Z 99e04d0115a0c5741a15100c0c189bee diff --git a/manifest.uuid b/manifest.uuid index 71225592f6..77ff56a6b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e1ccf211aa975a6688a27f7dc4cea80784ed8dcfe1950b2fa6eb0a3cb938838a \ No newline at end of file +6bfa44da226fd758a2ee924d1e8e3a742b0635b6d3f922a4a7919cb14b2418e6 \ No newline at end of file From ac713403fdfa3b2c28aa9e1e0068baafdee7b2a5 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 29 Jul 2019 02:49:14 +0000 Subject: [PATCH 054/221] Fix harmless compiler warning seen with MSVC for x64. FossilOrigin-Name: 857b2ba6d05d6f5a8cfdf269bae9005b25e1903ab9dc6b70546979d8c633f03b --- ext/session/sqlite3session.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index ecc7644d74..a14172df3f 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -1837,7 +1837,7 @@ static int sessionBufferGrow(SessionBuffer *p, size_t nByte, int *pRc){ i64 nNew = p->nAlloc ? p->nAlloc : 128; do { nNew = nNew*2; - }while( (nNew-p->nBuf)nBuf)aBuf, nNew); if( 0==aNew ){ diff --git a/manifest b/manifest index ddbd09314c..a0a8f67803 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sRBU\sso\sthat\sit\ssupports\sindexes\son\sexpressions. -D 2019-07-26T20:33:23.040 +C Fix\sharmless\scompiler\swarning\sseen\swith\sMSVC\sfor\sx64. +D 2019-07-29T02:49:14.543 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -436,7 +436,7 @@ F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b295 F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d -F ext/session/sqlite3session.c 3d9d3a414be386b87d83e642f4d93c8cbe83fe7b975d17b398f96caa1bfdc2cf +F ext/session/sqlite3session.c a4dfb372f270df93422b0dc7666fd46849e6979b62a152f11287c21eed4ac21b F ext/session/sqlite3session.h 919be6649d39d6413ce7a63fc3e3bca3270e18bc2d57ad4040a70007b9e54397 F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e1ccf211aa975a6688a27f7dc4cea80784ed8dcfe1950b2fa6eb0a3cb938838a -R d25f513b3e1c94b2e54a2b873df68d96 -U dan -Z 99e04d0115a0c5741a15100c0c189bee +P 6bfa44da226fd758a2ee924d1e8e3a742b0635b6d3f922a4a7919cb14b2418e6 +R 69f369c65d95cf34dd4661c4aa31a538 +U mistachkin +Z 9922f1926c2e491323a211473a67d4a9 diff --git a/manifest.uuid b/manifest.uuid index 77ff56a6b1..2d6b4299c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6bfa44da226fd758a2ee924d1e8e3a742b0635b6d3f922a4a7919cb14b2418e6 \ No newline at end of file +857b2ba6d05d6f5a8cfdf269bae9005b25e1903ab9dc6b70546979d8c633f03b \ No newline at end of file From f71a243a608acd56e1bf3c71abd1a3b62e9a40cf Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 29 Jul 2019 02:52:11 +0000 Subject: [PATCH 055/221] Sync up warning related compiler options in the Makefiles for MSVC. FossilOrigin-Name: e77d48d1dd140967b18106044dd45e2ba6cd77b6aa5afa8bf3f0a9c16a50eec4 --- Makefile.msc | 2 +- autoconf/Makefile.msc | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 595763cdb7..e9997bd9c5 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -73,7 +73,7 @@ API_ARMOR = 0 !IFNDEF NO_WARN !IF $(USE_FULLWARN)!=0 NO_WARN = -wd4054 -wd4055 -wd4100 -wd4127 -wd4130 -wd4152 -wd4189 -wd4206 -NO_WARN = $(NO_WARN) -wd4210 -wd4232 -wd4305 -wd4306 -wd4702 -wd4706 +NO_WARN = $(NO_WARN) -wd4210 -wd4232 -wd4244 -wd4305 -wd4306 -wd4702 -wd4706 !ENDIF !ENDIF diff --git a/autoconf/Makefile.msc b/autoconf/Makefile.msc index df9b96a66a..2a7042efb0 100644 --- a/autoconf/Makefile.msc +++ b/autoconf/Makefile.msc @@ -73,7 +73,7 @@ API_ARMOR = 0 !IFNDEF NO_WARN !IF $(USE_FULLWARN)!=0 NO_WARN = -wd4054 -wd4055 -wd4100 -wd4127 -wd4130 -wd4152 -wd4189 -wd4206 -NO_WARN = $(NO_WARN) -wd4210 -wd4232 -wd4305 -wd4306 -wd4702 -wd4706 +NO_WARN = $(NO_WARN) -wd4210 -wd4232 -wd4244 -wd4305 -wd4306 -wd4702 -wd4706 !ENDIF !ENDIF diff --git a/manifest b/manifest index a0a8f67803..e36771a38d 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Fix\sharmless\scompiler\swarning\sseen\swith\sMSVC\sfor\sx64. -D 2019-07-29T02:49:14.543 +C Sync\sup\swarning\srelated\scompiler\soptions\sin\sthe\sMakefiles\sfor\sMSVC. +D 2019-07-29T02:52:11.458 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 4640daf826b80947a924ac44275c451ffc13007c7c866a5730c8ce5cf9e1dc74 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 26957950b2b4f3b26e311eeea70437f85a77765f71d3a06489466d66ee321100 +F Makefile.msc 1ce5a2f754201baf709132fe5b45027c73343fba2607107821f759d78cf136c0 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -15,7 +15,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc bea737cb2ed8802056ff44947c4963026307caff4d7382b9622e7928990a4a18 +F autoconf/Makefile.msc 3804b004efb6abd2d2e0f5f887dfc6ade3d1661f39335c0531df96e1ab61a062 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 F autoconf/configure.ac 308de24343e76ecfbe9a67f8fcd4c5216b790d230c5d9ce10210b7d5965d6192 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6bfa44da226fd758a2ee924d1e8e3a742b0635b6d3f922a4a7919cb14b2418e6 -R 69f369c65d95cf34dd4661c4aa31a538 +P 857b2ba6d05d6f5a8cfdf269bae9005b25e1903ab9dc6b70546979d8c633f03b +R 11de2cd5c31cbfac9f0185389bf14cae U mistachkin -Z 9922f1926c2e491323a211473a67d4a9 +Z 653781d1a3e637bfd462044c7a088827 diff --git a/manifest.uuid b/manifest.uuid index 2d6b4299c6..a663223d0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -857b2ba6d05d6f5a8cfdf269bae9005b25e1903ab9dc6b70546979d8c633f03b \ No newline at end of file +e77d48d1dd140967b18106044dd45e2ba6cd77b6aa5afa8bf3f0a9c16a50eec4 \ No newline at end of file From 122c5142714ea4fe64d6c993adce418869df1aa2 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 29 Jul 2019 05:23:01 +0000 Subject: [PATCH 056/221] Fix a minor typo in a comment. FossilOrigin-Name: cea8a892f76bddc63b921ffc11ea8dce8f8cf649a2c77aa908c7c5c91eed7f4c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e36771a38d..dd44b777fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Sync\sup\swarning\srelated\scompiler\soptions\sin\sthe\sMakefiles\sfor\sMSVC. -D 2019-07-29T02:52:11.458 +C Fix\sa\sminor\stypo\sin\sa\scomment. +D 2019-07-29T05:23:01.121 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -595,7 +595,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c e9493a767fafd71bb9b10462a39b3af36d029d4e47e8cc4f531f89175dadf7f4 +F src/vdbe.c a6ee4cdf329ffef2f3a6928ae9e27304b260375572bc506f5db9e9be337cb158 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 857b2ba6d05d6f5a8cfdf269bae9005b25e1903ab9dc6b70546979d8c633f03b -R 11de2cd5c31cbfac9f0185389bf14cae -U mistachkin -Z 653781d1a3e637bfd462044c7a088827 +P e77d48d1dd140967b18106044dd45e2ba6cd77b6aa5afa8bf3f0a9c16a50eec4 +R 05fd3ab1e6c5754fd410836a6a140be4 +U drh +Z a54d4cc2649c875d2de255fae9382262 diff --git a/manifest.uuid b/manifest.uuid index a663223d0b..50a28493f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e77d48d1dd140967b18106044dd45e2ba6cd77b6aa5afa8bf3f0a9c16a50eec4 \ No newline at end of file +cea8a892f76bddc63b921ffc11ea8dce8f8cf649a2c77aa908c7c5c91eed7f4c \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 8dead8cdfe..b0956f1209 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2812,7 +2812,7 @@ case OP_Affinity: { assert( pOp->p2>0 ); assert( zAffinity[pOp->p2]==0 ); pIn1 = &aMem[pOp->p1]; - while( 1 /*edit-by-break*/ ){ + while( 1 /*exit-by-break*/ ){ assert( pIn1 <= &p->aMem[(p->nMem+1 - p->nCursor)] ); assert( memIsValid(pIn1) ); applyAffinity(pIn1, zAffinity[0], encoding); From 337cc3992a688d2e44b4a6e09c1fad088dec423d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 29 Jul 2019 06:06:53 +0000 Subject: [PATCH 057/221] Fix the OP_Affinity operator so that when applying REAL affinity, it only sets MEM_IntReal if the integer value will fit in 6 bytes or less. Fix for ticket [ba2f4585cf495231] FossilOrigin-Name: 2b221bb15fd2b9f6a426e5eb439f7dbabbe3c4cab010c49b87dae3bb1f16c081 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 20 ++++++++++++++++---- test/intreal.test | 12 ++++++++++++ 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index dd44b777fb..182dcc8dd1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\stypo\sin\sa\scomment. -D 2019-07-29T05:23:01.121 +C Fix\sthe\sOP_Affinity\soperator\sso\sthat\swhen\sapplying\sREAL\saffinity,\sit\nonly\ssets\sMEM_IntReal\sif\sthe\sinteger\svalue\swill\sfit\sin\s6\sbytes\sor\sless.\nFix\sfor\sticket\s[ba2f4585cf495231] +D 2019-07-29T06:06:53.317 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -595,7 +595,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c a6ee4cdf329ffef2f3a6928ae9e27304b260375572bc506f5db9e9be337cb158 +F src/vdbe.c 8e9afa99c79cac271fac32ad8c4b758f8e1310df850fb6d6f63ed2babbab85db F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -1069,7 +1069,7 @@ F test/intarray.test 8319986182af37c8eb4879c6bfe9cf0074e9d43b193a4c728a0efa3417c F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 -F test/intreal.test 2c80b5c90c597e65c6606b333515261c73a534b6c527b7009e97ed6b78f8b79a +F test/intreal.test 2a87e85a5949bd55e41ef04c58f5800587c5380bdbc559ff1c79b614b0e6a533 F test/io.test f95bca1783b01ea7761671560d023360d2dfa4cc F test/ioerr.test 470fcc78e9cd352d162baf782fe301ea807d764241f58a48fc58109c2dfcdb6b F test/ioerr2.test 2593563599e2cc6b6b4fcf5878b177bdd5d8df26 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e77d48d1dd140967b18106044dd45e2ba6cd77b6aa5afa8bf3f0a9c16a50eec4 -R 05fd3ab1e6c5754fd410836a6a140be4 +P cea8a892f76bddc63b921ffc11ea8dce8f8cf649a2c77aa908c7c5c91eed7f4c +R a0bdb430e67719a9d96ef868306325b9 U drh -Z a54d4cc2649c875d2de255fae9382262 +Z ff81b1edb3c7d78332a1b9e4fd7361e9 diff --git a/manifest.uuid b/manifest.uuid index 50a28493f4..098e3f4806 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cea8a892f76bddc63b921ffc11ea8dce8f8cf649a2c77aa908c7c5c91eed7f4c \ No newline at end of file +2b221bb15fd2b9f6a426e5eb439f7dbabbe3c4cab010c49b87dae3bb1f16c081 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index b0956f1209..b7f37b59c4 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2817,10 +2817,22 @@ case OP_Affinity: { assert( memIsValid(pIn1) ); applyAffinity(pIn1, zAffinity[0], encoding); if( zAffinity[0]==SQLITE_AFF_REAL && (pIn1->flags & MEM_Int)!=0 ){ - /* When applying REAL affinity, if the result is still MEM_Int, - ** indicate that REAL is actually desired */ - pIn1->flags |= MEM_IntReal; - pIn1->flags &= ~MEM_Int; + /* When applying REAL affinity, if the result is still an MEM_Int + ** that will fit in 6 bytes, then change the type to MEM_IntReal + ** so that we keep the high-resolution integer value but know that + ** the type really wants to be REAL. */ + testcase( pIn1->u.i==140737488355328LL ); + testcase( pIn1->u.i==140737488355327LL ); + testcase( pIn1->u.i==-140737488355328LL ); + testcase( pIn1->u.i==-140737488355329LL ); + if( pIn1->u.i<=140737488355327LL && pIn1->u.i>=-140737488355328LL ){ + pIn1->flags |= MEM_IntReal; + pIn1->flags &= ~MEM_Int; + }else{ + pIn1->u.r = (double)pIn1->u.i; + pIn1->flags |= MEM_Real; + pIn1->flags &= ~MEM_Int; + } } REGISTER_TRACE((int)(pIn1-aMem), pIn1); zAffinity++; diff --git a/test/intreal.test b/test/intreal.test index cf2c3b79ae..1a3db0a234 100644 --- a/test/intreal.test +++ b/test/intreal.test @@ -82,5 +82,17 @@ do_execsql_test 2.6 { ); } [list a $D] +# 2019-07-29 ticket ba2f4585cf495231 +# +db close +sqlite3 db :memory: +do_execsql_test 3.0 { + CREATE TABLE t0 (c0 REAL, c1); + CREATE UNIQUE INDEX i0 ON t0(c1, 0 | c0); + INSERT INTO t0(c0) VALUES (4750228396194493326), (0); + UPDATE OR REPLACE t0 SET c0 = 'a', c1 = ''; + SELECT * FROM t0 ORDER BY t0.c1; + PRAGMA integrity_check; +} {a {} ok} finish_test From a79a0e733faf76a1dd47f094665b2a1960858e4a Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 29 Jul 2019 14:42:56 +0000 Subject: [PATCH 058/221] When using an index for both DISTINCT and ORDER BY, do not confuse the number of columns required for distinctness with the number required to get the correct sort order. Fix for [6749cb3c]. FossilOrigin-Name: b47169319ad88e8ffdbe8fbb91f4cced81ebd5c0ee1b018be2d0256c9a1c5159 --- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/where.c | 10 ++++++---- src/whereInt.h | 2 +- test/distinct2.test | 46 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index ddbd09314c..a333edf327 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sRBU\sso\sthat\sit\ssupports\sindexes\son\sexpressions. -D 2019-07-26T20:33:23.040 +C When\susing\san\sindex\sfor\sboth\sDISTINCT\sand\sORDER\sBY,\sdo\snot\sconfuse\sthe\snumber\sof\scolumns\srequired\sfor\sdistinctness\swith\sthe\snumber\srequired\sto\sget\sthe\scorrect\ssort\sorder.\sFix\sfor\s[6749cb3c]. +D 2019-07-29T14:42:56.109 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,8 +609,8 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 2f508c9a6dd2a42ad2b692105e77eb92cdec201d32916962ccdeff71836acb52 -F src/whereInt.h 1b728f71654ebf8421a1715497a587f02d6f538e819af58dc826908f8577e810 +F src/where.c a3c9a0e1215c0e67e508014084e8f47271895b56f780fc26ac57be34fac33c1a +F src/whereInt.h 6fab4b6f7e4ae716f112ee09cd1343fc6dde3d4a1831feabc6b3ed3b54b8eef3 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 F src/window.c 7728ba7a3d44084a44eefb60464a88fb2ff035eb20cdeb1160ae65ac3c0be6b9 @@ -812,7 +812,7 @@ F test/descidx2.test 9f1a0c83fd57f8667c82310ca21b30a350888b5d F test/descidx3.test 09ddbe3f5295f482d2f8b687cf6db8bad7acd9a2 F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e F test/distinct.test a1783b960ad8c15a77cd9f207be072898db1026c -F test/distinct2.test df0bb52b754661ea84ec9ff488d48913c97bd31d83ca17ce0bf1334645e660cf +F test/distinct2.test 1a01038083535fa9431f4a22587ae58d52d0a794910c36bd2bec07ba1e0e7367 F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d @@ -1838,7 +1838,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 e1ccf211aa975a6688a27f7dc4cea80784ed8dcfe1950b2fa6eb0a3cb938838a -R d25f513b3e1c94b2e54a2b873df68d96 +P 6bfa44da226fd758a2ee924d1e8e3a742b0635b6d3f922a4a7919cb14b2418e6 +R 41a42b5a743b4824fb1ffd95dbeba40a +T *branch * tkt-6749cb3c +T *sym-tkt-6749cb3c * +T -sym-trunk * U dan -Z 99e04d0115a0c5741a15100c0c189bee +Z 23a64fa9e8cd65c1486338cedc3724c0 diff --git a/manifest.uuid b/manifest.uuid index 77ff56a6b1..bcb651e360 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6bfa44da226fd758a2ee924d1e8e3a742b0635b6d3f922a4a7919cb14b2418e6 \ No newline at end of file +b47169319ad88e8ffdbe8fbb91f4cced81ebd5c0ee1b018be2d0256c9a1c5159 \ No newline at end of file diff --git a/src/where.c b/src/where.c index f83f285b98..2e6ca3acf2 100644 --- a/src/where.c +++ b/src/where.c @@ -3695,8 +3695,8 @@ static i8 wherePathSatisfiesOrderBy( if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ if( pLoop->u.vtab.isOrdered ) obSat = obDone; break; - }else{ - pLoop->u.btree.nIdxCol = 0; + }else if( wctrlFlags & WHERE_DISTINCTBY ){ + pLoop->u.btree.nDistinctCol = 0; } iCur = pWInfo->pTabList->a[pLoop->iTab].iCursor; @@ -3838,7 +3838,9 @@ static i8 wherePathSatisfiesOrderBy( pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; } - pLoop->u.btree.nIdxCol = j+1; + if( wctrlFlags & WHERE_DISTINCTBY ){ + pLoop->u.btree.nDistinctCol = j+1; + } isMatch = 1; break; } @@ -5159,7 +5161,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ && i==pWInfo->nLevel-1 /* Ticket [ef9318757b152e3] 2017-10-21 */ && (pLoop->wsFlags & WHERE_INDEXED)!=0 && (pIdx = pLoop->u.btree.pIndex)->hasStat1 - && (n = pLoop->u.btree.nIdxCol)>0 + && (n = pLoop->u.btree.nDistinctCol)>0 && pIdx->aiRowLogEst[n]>=36 ){ int r1 = pParse->nMem+1; diff --git a/src/whereInt.h b/src/whereInt.h index 090bbc287c..9936b5c281 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -128,7 +128,7 @@ struct WhereLoop { u16 nEq; /* Number of equality constraints */ u16 nBtm; /* Size of BTM vector */ u16 nTop; /* Size of TOP vector */ - u16 nIdxCol; /* Index column used for ORDER BY */ + u16 nDistinctCol; /* Index columns used to sort for DISTINCT */ Index *pIndex; /* Index used, or NULL */ } btree; struct { /* Information for virtual tables */ diff --git a/test/distinct2.test b/test/distinct2.test index 31ab355132..634dfd72e3 100644 --- a/test/distinct2.test +++ b/test/distinct2.test @@ -229,5 +229,51 @@ do_execsql_test 1020 { SELECT DISTINCT a FROM t1, t2 WHERE x=b; } {1 1} +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 2000 { + CREATE TABLE t0 (c0, c1, c2, PRIMARY KEY (c0, c1)); + CREATE TABLE t1 (c2); + INSERT INTO t0(c2) VALUES (0),(1),(3),(4),(5),(6),(7),(8),(9),(10),(11); + INSERT INTO t0(c1) VALUES ('a'); + INSERT INTO t1(c2) VALUES (0); +} +do_execsql_test 2010 { + SELECT DISTINCT t0.c0, t1._rowid_, t0.c1 FROM t1 CROSS JOIN t0 ORDER BY t0.c0; +} {{} 1 {} {} 1 a} +do_execsql_test 1.2 { + ANALYZE; +} +do_execsql_test 2020 { + SELECT DISTINCT t0.c0, t1._rowid_, t0.c1 FROM t1 CROSS JOIN t0 ORDER BY t0.c0; +} {{} 1 {} {} 1 a} + + +do_execsql_test 2030 { + CREATE TABLE t2(a, b, c); + CREATE INDEX t2ab ON t2(a, b); + + WITH c(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM c WHERE i<64) + INSERT INTO t2 SELECT 'one', i%2, 'one' FROM c; + + WITH c(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM c WHERE i<64) + INSERT INTO t2 SELECT 'two', i%2, 'two' FROM c; + + CREATE TABLE t3(x INTEGER PRIMARY KEY); + INSERT INTO t3 VALUES(1); + + ANALYZE; +} +do_execsql_test 2040 { + SELECT DISTINCT a, b, x FROM t3 CROSS JOIN t2 ORDER BY a; +} { + one 0 1 + one 1 1 + two 0 1 + two 1 1 +} + + finish_test From 8279fe8a4bcb2e14e9c9db854c9e0e0a73c86d10 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 29 Jul 2019 16:53:30 +0000 Subject: [PATCH 059/221] Fix a crash in fts3 caused by corrupt database records. FossilOrigin-Name: 11f7f94f1c5d761e7f381e277658b7e857cc369283996c509061de55fd6aad52 --- ext/fts3/fts3_write.c | 1 + manifest | 15 ++- manifest.uuid | 2 +- test/fts3corrupt4.test | 224 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 233 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 889a674f87..ee5cdb3c0d 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3941,6 +3941,7 @@ static int fts3AppendToNode( nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm); nSuffix = nTerm - nPrefix; + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; memcpy(pPrev->a, zTerm, nTerm); pPrev->n = nTerm; diff --git a/manifest b/manifest index 69d017d307..f80ed710fa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\susing\san\sindex\sfor\sboth\sDISTINCT\sand\sORDER\sBY,\sdo\snot\sconfuse\sthe\snumber\sof\scolumns\srequired\sfor\sdistinctness\swith\sthe\snumber\srequired\sto\sget\sthe\scorrect\ssort\sorder.\sFix\sfor\s[6749cb3c]. -D 2019-07-29T15:32:01.641 +C Fix\sa\scrash\sin\sfts3\scaused\sby\scorrupt\sdatabase\srecords. +D 2019-07-29T16:53:30.954 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 9e88111ca9f70e4079880d842c8323bffc4968b39ee38c0a75962a3485af9333 +F ext/fts3/fts3_write.c 6efc4cd7dc554df06c35bfd3335503838645806a78fc33137a55eb97a8b2f3b2 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -936,7 +936,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test c311911898e9ddac93fe71b947660a9716b285e2e600ad02810c231ff79a5925 +F test/fts3corrupt4.test 97a930e0f2fee35b3fdf21d31637865abc892526160136f92962556bf07d7473 F test/fts3corrupt5.test 1911bd38381fe7eb28b204e7171937d09e113e5ceb018399ded9f42ec7e6ae66 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -1838,8 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2b221bb15fd2b9f6a426e5eb439f7dbabbe3c4cab010c49b87dae3bb1f16c081 b47169319ad88e8ffdbe8fbb91f4cced81ebd5c0ee1b018be2d0256c9a1c5159 -R ffca6544c35b35a1077b7fc419306dbe -T +closed b47169319ad88e8ffdbe8fbb91f4cced81ebd5c0ee1b018be2d0256c9a1c5159 +P 6ac0f822450b26c7d67c33cdb2a90189cd3cf65a052af8497b795c3f71a23813 +R de5237173bbfe523808f0ae66ce2b671 U dan -Z 1ada3406a2249a9b51e11c7a4e4d08f2 +Z 58664cda1bd8fa02210bf17e12e3db81 diff --git a/manifest.uuid b/manifest.uuid index 461db1d4c2..7204806ec3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6ac0f822450b26c7d67c33cdb2a90189cd3cf65a052af8497b795c3f71a23813 \ No newline at end of file +11f7f94f1c5d761e7f381e277658b7e857cc369283996c509061de55fd6aad52 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 8c1a14a274..b312b7754f 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -26,6 +26,7 @@ ifcapable !fts3 { } sqlite3_fts3_may_be_corrupt 1 +database_may_be_corrupt do_execsql_test 1.0 { BEGIN; @@ -5094,5 +5095,228 @@ do_catchsql_test 28.1 { INSERT INTO t1(t1) SELECT x FROM t2; } {0 {}} +#------------------------------------------------------------------------- +# +reset_db +do_test 29.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-53f41622dd3bf6.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 54 69 72 .5tablet1_segTir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4d 54 45 47 45 52 2c 73 74 61 ,idx IMTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 39 4d cid INTEGER PR9M +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 12 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 6b 3c 65 74 31 74 31 43 52 ...._tak.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 72 7f 00 .........?%..r.. +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 21 44 45 42 4.0 20160609!DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 46 20 46 54 53 VTAB ENABLF FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 55 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLU JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 56 4d 41 58 20 4d 45 4d 4f 52 59 RTREEVMAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 42 43 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OBC EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 40 18 24 05 00 25 0f READSAFE=@.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 31 58 4e 4f 43 41 53 45 17 22 DSAFE=1XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 43 41 46 45 3d ..%..THREADCAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 48 MIT LOAD EXTENSH +| 3216: cf 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 .NXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 2d 35 30 30 30 30 MAX MEMORY-50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 49 18 1a 05 0d a5 0f 19 45 4e 41 42 INARI.......ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f be 31 53 45 17 LE RTREEXNO.1SE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 51 ...%..ENABLE RTQ +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 37 f8 52 54 52 49 4d 18 14 05 00 25 MSYS7.RTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 3e 31 58 4e 4f 43 41 53 45 17 LE JSO>1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 48 c0 47 45 4f 50 4f 4c 40 58 4e 4f 43 41 53 45 H.GEOPOL@XNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 51 49 4d 17 0f 05 00 23 OPOLYXRTQIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4d 41 52 59 17 0b LE FTS4XBIMARY.. +| 3776: 05 00 23 0f 19 45 4e 31 42 4c 45 20 46 1a 53 34 ..#..EN1BLE F.S4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 96 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 T.T VTABXRTRIM.. +| 3920: 05 00 17 0f 1e e4 45 42 55 47 58 42 49 4e 41 52 ......EBUGXBINAR +| 3936: 59 11 05 05 00 17 0e 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 01 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 40 32 30 31 36 30 36 30 cc-5.4.0@2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 4f 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMOILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 01 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 4d 03 25 15 00 00 04 .%....sysM.%.... +| 3200: 6e 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 nmit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 0e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 bd .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 06 00 00 01 35 09 01 04 00 01 04 00 02 04 ......5......... +| 3328: 00 01 07 30 30 e6 30 30 30 30 09 1c 04 00 01 04 ...00.0000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 04 01 02 02 10 03 01 02 02 ................ +| 3376: 00 0f 71 02 12 00 03 01 02 02 00 03 01 65 02 00 ..q..........e.. +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 0d a2 00 03 01 02 02 00 00 08 63 3b 6d 70 69 ...........c;mpi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 01 f0 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 01 f0 ................ +| 3760: 03 01 02 02 05 93 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 8a 72 65 65 09 19 03 00 01 03 00 11 03 00 .r.ree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 75 61 62 09 07 04 .........vuab... +| 3904: 00 01 04 00 01 04 00 00 61 78 b4 01 01 01 01 02 ........ax...... +| 3920: 00 01 01 01 02 00 00 f1 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 01 ff 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 09 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 02 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 11 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 1f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 10 d6 0f c7 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =1.............. +| end crash-53f41622dd3bf6.db +}]} {} + +do_catchsql_test 29.1 { + INSERT INTO t1(a) SELECT X'819192E578DE3F'; + UPDATE t1 SET b=quote(zeroblob(current_date)) WHERE t1 MATCH 't*'; + INSERT INTO t1(b) VALUES(x'78'); + INSERT INTO t1(t1) SELECT x FROM t2; +} {1 {database disk image is malformed}} + finish_test From 8fbcb04811d1a71d2aaf2b34ff77bd160a77713b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 29 Jul 2019 17:18:45 +0000 Subject: [PATCH 060/221] Convert an assert() in R-Tree into a database corruption detection case. FossilOrigin-Name: 48b518eb6f76fb0beb161d1ebcf3b793efc36262d6d77a1ad5906b6501138e28 --- ext/rtree/rtree.c | 4 +- ext/rtree/rtreefuzz001.test | 270 ++++++++++++++++++++++++++++++++++++ manifest | 16 +-- manifest.uuid | 2 +- 4 files changed, 282 insertions(+), 10 deletions(-) diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index a3dfa9b5ca..853d3608ab 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -669,7 +669,6 @@ static int nodeAcquire( ** increase its reference count and return it. */ if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ - assert( !pParent || !pNode->pParent || pNode->pParent==pParent ); if( pParent && !pNode->pParent ){ if( nodeInParentChain(pNode, pParent) ){ RTREE_IS_CORRUPT(pRtree); @@ -677,6 +676,9 @@ static int nodeAcquire( } pParent->nRef++; pNode->pParent = pParent; + }else if( pParent && pNode->pParent && pParent!=pNode->pParent ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; } pNode->nRef++; *ppNode = pNode; diff --git a/ext/rtree/rtreefuzz001.test b/ext/rtree/rtreefuzz001.test index 201308ce9f..f4a91264c7 100644 --- a/ext/rtree/rtreefuzz001.test +++ b/ext/rtree/rtreefuzz001.test @@ -774,4 +774,274 @@ do_test rtreefuzz001-400 { } } {1 {database disk image is malformed}} +do_test rtreefuzz001-500 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 16384 pagesize 4096 filename crash-2e81f5dce5cbd4.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 00 00 00 05 0e 6d 00 0f c8 0f 7b ..........m..... +| 112: 0f 20 0e cd 0e 6d 00 00 00 00 00 00 00 00 00 00 . ...m.......... +| 3680: 00 00 00 00 00 00 00 00 00 00 00 00 00 5e 05 07 .............^.. +| 3696: 17 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 ......tablet1_pa +| 3712: 72 65 6e 74 74 31 5f 70 61 72 65 6e 74 05 43 52 rentt1_parent.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 EATE TABLE .t1_p +| 3744: 61 72 65 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e arent.(nodeno IN +| 3760: 54 45 47 45 42 20 50 52 49 4d 41 52 59 20 4b 45 TEGEB PRIMARY KE +| 3776: 59 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 04 06 Y,parentnode)Q.. +| 3792: 17 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 .....tablet1_nod +| 3808: 65 74 31 5f 6e 6f 64 65 04 43 52 45 41 54 45 20 et1_node.CREATE +| 3824: 54 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 TABLE .t1_node.( +| 3840: 6e 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 nodeno INTEGER P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 RIMARY KEY,data) +| 3872: 59 03 07 17 1d 1d 01 81 05 74 61 62 6c 65 84 31 Y........table.1 +| 3888: 5f 72 6f 77 69 64 74 31 5f 72 6f 87 69 64 03 43 _rowidt1_ro.id.C +| 3904: 52 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f REATE TABLE .t1_ +| 3920: 72 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 rowid.(rowid INT +| 3936: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3952: 2c 6e f8 64 65 6e 6f 2c 61 30 29 4b 02 07 17 11 ,n.deno,a0)K.... +| 3968: 11 08 81 03 74 22 62 6c 65 74 31 74 31 43 52 45 ....t.blet1t1CRE +| 3984: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c ATE VIRTUAL TABL +| 4000: 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 65 65 E t1 USING rtree +| 4016: 5f 69 33 32 28 69 cc 2c 78 30 2c 78 31 2c 79 30 _i32(i.,x0,x1,y0 +| 4032: 2c 79 31 2c 2b 65 78 29 36 01 06 17 17 17 01 4d ,y1,+ex)6......M +| 4048: 74 61 62 6c 65 63 6f 6f 72 64 63 6f 6f 72 64 02 tablecoordcoord. +| 4064: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 6f CREATE TABLE coo +| 4080: 71 64 28 76 20 49 4e 54 2c 20 77 20 49 4e 54 29 qd(v INT, w INT) +| page 2 offset 4096 +| 4016: 00 00 00 00 00 00 00 00 00 00 00 05 0a 03 01 01 ................ +| 4032: 0a 02 05 09 03 01 01 09 02 05 08 03 01 01 08 02 ................ +| 4048: 05 07 03 01 01 07 02 05 06 03 11 01 06 02 05 05 ................ +| 4064: 03 01 01 05 02 05 04 03 01 01 04 02 05 03 03 01 ................ +| 4080: 01 03 02 05 02 03 01 01 02 02 04 01 03 09 01 02 ................ +| page 3 offset 8192 +| 0: 0d 0e 4f 00 64 0b 5a 12 0d bb 0d 84 0f eb 0d c6 ..O.d.Z......... +| 16: 0f d7 0e cc 0f c1 0f b6 0f ab 0f 9f 0f 94 0d 8f ................ +| 32: 0f 86 0d d1 0f 62 0f 67 0f 5c 0f 51 1f 46 0f 3a .....b.g...Q.F.: +| 48: 0f 30 0d 9a 0f 21 0d dc 0f 00 00 00 00 00 00 00 .0...!.......... +| 2896: 00 00 00 00 00 00 00 00 00 00 0a ce 1a 04 00 01 ................ +| 2912: 17 03 31 30 78 31 30 0a 4e 19 03 ff f1 15 03 31 ..10x10.N......1 +| 2928: 30 78 39 09 ce 18 04 00 01 15 03 31 30 78 38 09 0x9........10x8. +| 2944: ce 17 04 00 01 15 03 31 30 78 37 09 ce 16 04 00 .......10x7..... +| 2960: 12 15 03 31 30 78 36 09 ce 15 04 00 01 15 03 31 ...10x6........1 +| 2976: 30 78 35 09 ce 14 04 00 01 15 0d a1 30 78 34 09 0x5.........0x4. +| 2992: ce 13 04 00 01 15 03 31 30 78 33 09 ce 12 04 00 .......10x3..... +| 3008: 01 15 03 31 40 78 32 09 ce 11 04 00 01 15 03 31 ...1@x2........1 +| 3024: 30 78 31 09 c6 32 04 00 01 15 03 39 78 31 30 08 0x1..2.....9x10. +| 3040: c6 31 04 00 01 13 03 39 78 39 08 c6 30 04 00 01 .1.....9x9..0... +| 3056: 13 03 39 78 38 08 c6 2f 04 00 01 14 03 39 78 37 ..9x8../.....9x7 +| 3072: 08 c6 2e 04 00 01 13 03 39 78 36 08 c6 2d 04 00 ........9x6..-.. +| 3088: 01 13 03 39 78 34 f8 c6 2c 04 00 01 13 03 39 78 ...9x4..,.....9x +| 3104: 34 08 c6 2b 04 00 60 13 03 39 79 13 08 c6 2a 04 4..+..`..9y...*. +| 3120: 00 11 13 03 39 78 32 08 c6 29 04 00 01 13 03 39 ....9x2..).....9 +| 3136: 78 31 09 be 4a 04 00 01 15 03 38 78 31 30 08 be x1..J.....8x10.. +| 3152: 49 04 00 01 13 03 38 78 39 08 be 48 04 00 01 13 I.....8x9..H.... +| 3168: 03 38 77 98 08 be 47 04 00 01 14 23 38 78 37 08 .8w...G....#8x7. +| 3184: be 46 04 00 01 13 03 38 78 36 08 be 45 04 00 01 .F.....8x6..E... +| 3200: 13 03 38 78 35 08 be 44 04 00 01 13 03 38 78 34 ..8x5..D.....8x4 +| 3216: 08 be 43 04 00 01 13 03 38 78 33 08 be 42 04 00 ..C.....8x3..B.. +| 3232: 01 13 03 38 78 32 08 be 41 04 00 01 13 03 38 78 ...8x2..A.....8x +| 3248: 31 09 b6 62 04 00 01 15 03 37 68 31 30 08 b6 61 1..b.....7h10..a +| 3264: 04 00 01 13 03 37 79 39 08 b6 60 04 00 01 12 f3 .....7y9..`..... +| 3280: 37 78 38 08 b6 5e 04 00 01 13 03 37 78 37 08 b6 7x8..^.....7x7.. +| 3296: 5e 04 00 01 13 03 37 78 36 08 b6 5d 04 00 01 13 ^.....7x6..].... +| 3312: 03 37 78 35 08 b6 5c 04 00 00 13 03 37 78 34 08 .7x5........7x4. +| 3328: b6 5b 04 00 01 13 03 37 78 33 08 b6 5a 04 00 01 .[.....7x3..Z... +| 3344: 13 03 37 78 32 08 b6 59 04 00 01 13 03 37 78 31 ..7x2..Y.....7x1 +| 3360: 09 ae 7a 04 00 01 15 03 36 78 31 30 08 ae 79 04 ..z.....6x10..y. +| 3376: 00 01 e2 03 36 78 39 08 ae 78 04 00 01 13 03 36 ....6x9..x.....6 +| 3392: 78 38 08 ae 77 04 00 01 13 03 36 78 37 08 ae 76 x8..w.....6x7..v +| 3408: 04 00 01 13 03 36 78 36 08 ae 85 04 00 01 13 03 .....6x6........ +| 3424: 36 78 35 08 ae 73 f4 00 01 13 03 36 78 34 08 ae 6x5..s.....6x4.. +| 3440: 73 04 00 01 13 03 36 78 33 08 ae 72 04 00 01 13 s.....6x3..r.... +| 3456: 03 36 78 32 08 87 6a 04 00 01 13 02 3d e8 32 08 .6x2..j.....=.2. +| 3472: 8f 52 04 00 01 13 02 32 78 32 08 97 3b 04 00 01 .R.....2x2..;... +| 3488: 13 02 33 78 32 08 9f 22 04 00 01 13 02 34 78 32 ..3x2........4x2 +| 3504: 08 a7 0a 04 00 01 13 02 35 78 32 08 87 69 04 00 ........5x2..i.. +| 3520: 01 13 02 31 78 31 08 87 6c 04 00 01 13 02 31 78 ...1x1..l.....1x +| 3536: 34 08 8f 54 04 00 01 13 02 32 78 34 08 97 3c 04 4..T.....2x4..<. +| 3552: 00 01 12 f2 33 78 34 08 9f 24 04 00 01 13 02 34 ....3x4..$.....4 +| 3568: 78 34 08 a7 0c 04 00 01 13 02 35 78 34 0e 6c 00 x4........5x4.l. +| 3584: 08 ae 71 04 00 01 13 03 36 78 31 09 a7 12 04 00 ..q.....6x1..... +| 3600: 01 15 02 35 78 31 30 08 a7 11 04 00 01 13 02 35 ...5x10........5 +| 3616: 78 39 08 a7 10 04 00 01 13 02 35 78 38 08 a7 0f x9........5x8... +| 3632: 04 00 01 14 02 35 78 37 08 a7 0e 04 00 01 13 02 .....5x7........ +| 3648: 35 78 36 08 a7 0d 04 00 01 13 02 35 78 35 0e 0e 5x6........5x5.. +| 3664: b3 00 08 00 01 00 03 08 a7 0b 04 00 01 13 02 35 ...............5 +| 3680: 78 33 0e d1 00 08 a7 09 04 00 01 13 02 35 78 31 x3...........5x1 +| 3696: 09 9f 2a 04 00 01 15 02 34 78 31 30 03 cf 29 04 ..*.....4x10..). +| 3712: 00 01 13 02 34 78 39 08 9f 28 04 00 01 13 02 34 ....4x9..(.....4 +| 3728: 78 38 09 9f 27 04 00 01 13 02 34 78 37 08 9f 26 x8..'.....4x7..& +| 3744: 04 00 01 13 0e a4 78 36 08 9f 25 04 00 01 13 02 ......x6..%..... +| 3760: 34 78 35 0f 18 00 09 00 09 13 34 78 08 9f 23 04 4x5.......4x..#. +| 3776: 00 01 13 02 34 78 33 0f 36 00 08 9f 21 04 00 01 ....4x3.6...!... +| 3792: 13 02 34 78 31 09 97 42 04 00 01 15 02 33 78 31 ..4x1..B.....3x1 +| 3808: 30 08 97 41 04 00 01 13 02 33 78 39 08 97 40 04 0..A.....3x9..@. +| 3824: 00 01 13 02 33 78 38 18 97 3f 04 00 01 13 02 33 ....3x8..?.....3 +| 3840: 78 37 08 97 3e 04 00 01 13 02 33 78 36 08 97 3d x7..>.....3x6..= +| 3856: 04 00 01 13 02 33 78 35 1f 7d 00 09 00 09 13 33 .....3x5.......3 +| 3872: 78 07 97 3b 04 00 01 13 02 33 78 33 0f 9b 00 08 x..;.....3x3.... +| 3888: 97 39 04 00 01 13 02 33 78 31 09 8f 5a 04 00 01 .9.....3x1..Z... +| 3904: 15 02 32 79 31 30 08 8f 59 04 00 01 13 fa 32 78 ..2y10..Y.....2x +| 3920: 39 08 8f 58 04 00 01 13 02 32 78 38 08 8f 57 04 9..X.....2x8..W. +| 3936: 00 01 13 02 32 78 37 08 8f 56 04 00 01 13 02 32 ....2x7..V.....2 +| 3952: 78 36 08 8f 55 04 00 01 13 02 32 78 35 0f e2 00 x6..U.....2x5... +| 3968: 09 00 09 13 32 78 08 8f 53 04 00 01 13 02 32 78 ....2x..S.....2x +| 3984: 33 00 00 00 08 8f 51 04 00 01 13 02 aa 78 31 09 3.....Q......x1. +| 4000: 87 72 04 00 01 15 02 31 78 31 30 08 87 71 04 00 .r.....1x10..q.. +| 4016: 01 13 03 31 78 39 08 87 70 04 00 01 13 02 31 78 ...1x9..p.....1x +| 4032: 38 08 87 6f 04 00 01 13 02 31 78 37 08 87 6e 04 8..o.....1x7..n. +| 4048: 00 01 13 02 31 78 36 08 87 6d 04 00 01 13 02 31 ....1x6..m.....1 +| 4064: 7d 25 0f f9 00 08 ff f9 13 31 78 08 87 6b 04 00 .%.......1x..k.. +| 4080: 01 13 02 31 78 33 00 00 00 00 00 08 00 01 00 03 ...1x3.......... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 01 87 00 0b 2d 06 5a 01 87 00 00 .........-.Z.... +| 384: 00 00 00 00 00 00 00 89 50 01 54 00 93 24 00 00 ........P.T..$.. +| 400: 00 32 00 00 00 00 00 00 23 2f 00 00 00 09 00 00 .2......#/...... +| 416: 00 0b 00 00 00 07 00 00 00 09 00 00 00 00 00 00 ................ +| 432: 23 2e 00 00 10 09 00 00 00 0b 00 00 00 06 00 00 #............... +| 448: 00 08 00 00 00 00 00 00 23 2d 00 00 00 09 00 00 ........#-...... +| 464: 00 0b 00 00 00 05 00 00 00 07 00 00 00 00 00 00 ................ +| 480: 23 2c 00 00 00 09 00 00 00 0b 00 00 00 04 00 00 #,.............. +| 496: 00 06 00 00 00 00 00 00 23 2b 00 00 00 09 00 00 ........#+...... +| 512: 00 0b 00 00 00 03 00 00 00 05 00 00 00 00 00 00 ................ +| 528: 23 2a 00 00 00 09 00 00 00 0b 00 00 00 02 00 00 #*.............. +| 544: 00 04 00 00 00 00 00 00 23 29 00 00 00 09 00 00 ........#)...... +| 560: 00 0b 00 00 00 01 00 00 00 03 00 00 00 00 00 00 ................ +| 576: 1f 4a 00 00 00 08 00 00 00 0a 00 00 00 0a 00 00 .J.............. +| 592: 00 0c 00 00 00 00 00 00 0f 49 00 00 00 08 00 00 .........I...... +| 608: 00 0a 00 00 00 09 00 00 00 0b 00 00 00 00 00 00 ................ +| 624: 1f 48 00 00 00 08 00 00 00 0a 00 00 00 08 00 06 .H.............. +| 640: 00 0a 00 00 00 00 00 00 1f 47 00 00 00 08 00 00 .........G...... +| 656: 00 0a 00 00 00 07 00 00 00 09 00 00 00 00 00 00 ................ +| 672: 15 d6 00 00 00 08 00 00 00 0a 00 00 00 06 00 00 ................ +| 688: 00 08 00 00 00 00 00 00 1f 45 00 00 00 08 00 00 .........E...... +| 704: 00 0a 00 00 00 05 00 00 00 07 00 00 00 00 00 00 ................ +| 720: 1f 44 00 00 00 08 00 00 00 0a 00 00 00 04 00 00 .D.............. +| 736: 00 06 00 00 00 00 00 00 1f 43 00 00 00 07 ff ff .........C...... +| 752: f0 0a 00 00 00 03 00 00 00 05 00 00 00 00 00 00 ................ +| 768: 1f 42 00 00 00 08 00 00 00 0a 00 00 00 01 ff f0 .B.............. +| 784: 00 03 ff ff ff ff ff ff 1f 41 00 00 00 08 00 00 .........A...... +| 800: 00 0a 00 00 00 01 00 00 00 03 00 00 00 00 00 00 ................ +| 816: 1b 62 00 00 00 07 00 00 00 09 00 00 00 0a 00 00 .b.............. +| 832: 00 0c 05 00 00 00 00 00 1b 64 10 00 00 07 00 00 .........d...... +| 848: 00 09 00 00 00 09 00 00 00 0b 00 00 00 00 00 00 ................ +| 864: 1b 60 00 00 00 07 00 00 00 09 00 00 00 08 00 00 .`.............. +| 880: 00 0a 00 00 00 00 00 00 1b 5f 00 00 00 07 00 00 ........._...... +| 896: 00 09 00 00 00 07 00 00 00 09 00 00 00 00 00 00 ................ +| 912: 1b 5e 00 00 00 07 00 00 00 09 00 00 00 06 00 00 .^.............. +| 928: 00 08 00 00 00 00 00 00 1b 5d 00 00 00 08 00 00 .........]...... +| 944: 00 09 00 00 00 05 00 00 00 07 00 00 00 00 00 00 ................ +| 960: 1b 5c 00 00 00 07 00 00 00 09 00 00 00 04 00 00 ................ +| 976: 06 46 00 00 00 00 00 00 1b 5b 00 00 00 07 00 00 .F.......[...... +| 992: 00 09 00 00 00 03 00 00 00 04 ff f0 00 00 00 00 ................ +| 1008: 1b 5a 00 00 00 07 00 00 00 19 00 00 00 02 00 00 .Z.............. +| 1024: 00 04 00 00 00 00 00 00 1b 59 00 00 00 07 00 00 .........Y...... +| 1040: 00 09 00 00 00 01 00 00 00 03 00 00 00 00 ff f0 ................ +| 1056: 17 7a 00 00 00 06 00 00 00 08 00 00 00 0a 00 00 .z.............. +| 1072: 00 0c 00 00 00 00 00 00 17 79 00 00 00 06 00 00 .........y...... +| 1088: 00 08 00 00 00 09 00 00 00 0b 00 00 00 00 00 00 ................ +| 1104: 17 78 00 00 00 06 00 00 00 08 00 00 00 08 00 00 .x.............. +| 1120: 00 0a 00 00 00 00 00 00 17 77 00 00 00 06 10 00 .........w...... +| 1136: 00 08 00 00 00 07 00 09 c0 09 00 00 00 00 00 00 ................ +| 1152: 17 76 00 00 00 06 00 00 00 08 00 00 00 06 00 00 .v.............. +| 1168: 00 08 00 00 00 00 00 00 17 75 00 00 00 06 00 00 .........u...... +| 1184: 00 08 00 00 00 05 00 00 00 07 00 00 00 00 00 00 ................ +| 1200: 17 74 00 00 00 06 00 00 00 08 00 00 00 03 ff ff .t.............. +| 1216: f0 06 00 00 00 83 00 00 17 73 00 00 00 06 00 00 .........s...... +| 1232: 00 08 00 00 00 03 00 00 00 05 00 00 00 00 00 00 ................ +| 1248: 17 71 ff 00 00 06 00 00 10 08 00 00 00 02 00 00 .q.............. +| 1264: 00 04 00 00 c0 00 00 00 17 0d 00 00 00 06 00 00 ................ +| 1280: 00 08 00 00 e7 01 00 00 00 03 00 00 09 e0 00 00 ................ +| 1296: 23 30 00 00 00 09 00 00 00 0a 00 00 00 08 00 00 #0.............. +| 1312: 00 0a 00 00 00 00 bb 00 23 31 00 00 00 09 00 00 ........#1...... +| 1328: 00 0b 00 00 00 09 00 00 00 0b 00 00 00 00 00 00 ................ +| 1344: 23 32 00 00 00 09 00 00 00 0b 00 00 00 0a 00 00 #2.............. +| 1360: 00 0c 00 00 00 00 00 00 27 11 00 00 00 0a 00 00 ........'....... +| 1376: 00 0c 00 00 00 01 00 08 c0 03 00 00 00 00 00 00 ................ +| 1392: 27 12 00 00 00 0a 00 00 00 0c 51 00 00 02 00 00 '.........Q..... +| 1408: 00 04 6f 00 00 00 00 00 27 13 00 00 00 09 ff ff ..o.....'....... +| 1424: 00 0c 00 00 00 03 00 00 00 05 00 00 00 00 00 00 ................ +| 1440: 27 14 00 00 00 0a 00 00 00 00 00 00 00 00 00 00 '............... +| 1616: 00 00 00 00 00 00 00 00 00 00 89 50 02 04 00 93 ...........P.... +| 1632: 24 00 00 00 32 00 00 00 00 00 00 23 8c 00 00 00 $...2......#.... +| 1648: 05 00 00 00 07 00 00 00 04 00 00 00 06 00 00 00 ................ +| 1664: 00 00 00 0f a4 00 00 00 04 00 00 00 06 00 00 00 ................ +| 1680: 04 00 00 00 06 00 00 00 00 00 00 0b bc 00 00 00 ................ +| 1696: 03 00 00 00 05 00 00 00 04 00 00 00 06 00 00 00 ................ +| 1712: 00 00 00 07 d4 00 00 00 02 00 00 00 04 00 00 00 ................ +| 1728: 04 00 00 00 06 00 00 00 10 00 00 03 ec 00 00 00 ................ +| 1744: 01 00 00 00 03 00 00 00 04 00 00 00 06 00 00 00 ................ +| 1760: 00 00 00 13 8d 00 00 00 05 00 00 00 07 00 00 00 ................ +| 1776: 05 00 00 00 07 00 00 00 00 00 00 0f a5 00 00 00 ................ +| 1792: 04 00 00 00 06 00 00 00 05 00 00 00 07 00 00 00 ................ +| 1808: 00 00 00 0b bd 00 00 00 03 00 00 00 05 00 00 00 ................ +| 1824: 05 00 00 00 07 00 00 00 00 00 00 07 d5 00 00 00 ................ +| 1840: 02 00 00 00 05 00 00 00 05 00 00 00 07 00 00 00 ................ +| 1856: 00 00 00 03 ed 00 00 00 01 00 00 00 03 00 00 00 ................ +| 1872: 05 00 00 00 07 00 00 00 00 00 00 13 8e 00 00 00 ................ +| 1888: 05 00 00 00 07 00 00 00 06 00 00 00 08 00 00 00 ................ +| 1904: 00 00 00 0f a6 00 00 00 04 00 00 00 06 00 00 00 ................ +| 1920: 06 00 00 00 07 ff ff 00 00 00 00 0b be 00 00 00 ................ +| 1936: 0b 40 00 00 05 00 00 00 06 00 00 00 08 00 00 00 .@.............. +| 1952: 00 00 00 07 d6 00 00 00 02 00 00 00 04 00 00 00 ................ +| 1968: 05 00 00 00 08 00 00 00 00 00 00 03 ee 00 00 00 ................ +| 1984: 01 00 00 00 02 ff ff 00 06 00 00 00 08 00 00 00 ................ +| 2000: 00 00 00 13 8f 00 00 00 05 00 00 00 07 00 00 00 ................ +| 2016: 07 00 00 00 09 00 00 00 00 00 00 0f a7 00 00 00 ................ +| 2032: 04 00 00 00 06 00 00 00 07 00 00 00 09 00 00 08 ................ +| 2048: 30 00 00 0b bf 00 00 00 03 00 00 00 05 00 00 00 0............... +| 2064: 07 00 00 00 09 00 00 00 00 00 00 07 d7 00 00 00 ................ +| 2080: 02 00 00 00 04 00 00 00 07 00 00 00 09 00 00 00 ................ +| 2096: 00 00 00 03 ef 00 00 00 01 00 00 00 03 00 00 00 ................ +| 2112: 07 00 00 00 09 00 00 00 00 00 00 13 90 00 00 00 ................ +| 2128: 05 00 01 00 07 00 00 00 08 00 00 00 0a 00 00 00 ................ +| 2144: 00 00 00 0f a8 00 00 00 04 00 00 00 06 00 00 00 ................ +| 2160: 08 00 00 00 0a 00 00 00 00 00 00 0b f2 00 00 00 ................ +| 2176: 03 00 00 00 05 00 00 00 08 00 00 00 0a 00 00 01 ................ +| 2192: 00 00 00 07 d8 00 00 00 02 00 00 00 04 00 00 00 ................ +| 2208: 08 00 00 00 0a 00 00 00 00 00 00 03 f0 00 00 00 ................ +| 2224: 01 00 00 00 03 00 00 00 08 00 00 00 09 ff 00 00 ................ +| 2240: 00 00 00 13 91 00 00 00 05 00 00 00 07 00 00 00 ................ +| 2256: 09 00 00 00 0b 00 00 00 00 00 00 0f a9 00 00 00 ................ +| 2272: 04 00 00 00 06 00 00 00 09 00 00 00 0b 00 00 00 ................ +| 2288: 00 00 00 0b c1 00 00 00 03 00 00 00 05 00 00 00 ................ +| 2304: 09 00 00 00 0b 00 00 00 00 00 00 07 d9 00 00 00 ................ +| 2320: 02 00 00 00 04 00 00 00 09 00 00 00 0b 00 00 01 ................ +| 2336: 00 00 00 03 f0 ff ff 00 01 00 00 00 03 00 00 00 ................ +| 2352: 09 00 00 00 0b 00 00 00 00 00 00 13 92 00 00 00 ................ +| 2368: 05 00 00 00 07 00 00 00 0a 00 00 00 0c 00 00 00 ................ +| 2384: 00 00 00 0f aa 00 00 00 04 00 00 00 06 00 00 00 ................ +| 2400: 0a 00 00 00 0c 00 00 00 00 00 00 0b c2 00 00 00 ................ +| 2416: 03 00 00 00 05 00 00 00 0a 00 00 00 0c 00 00 00 ................ +| 2432: 00 00 00 07 da 00 00 00 02 00 00 00 04 00 00 00 ................ +| 2448: 0a 00 00 00 0c 00 00 00 00 00 00 03 f2 00 00 00 ................ +| 2464: 01 00 00 10 03 00 00 00 0a 00 00 00 0c 00 00 00 ................ +| 2480: 00 00 00 03 eb 00 00 00 01 00 00 00 03 00 00 00 ................ +| 2496: 03 00 00 00 05 00 00 00 00 00 00 07 d3 00 00 00 ................ +| 2512: 02 00 00 00 04 00 00 00 03 00 00 00 05 00 00 00 ................ +| 2528: 00 00 00 0b bb 00 00 00 03 00 00 00 05 00 00 00 ................ +| 2544: 03 00 00 00 05 00 00 00 00 00 00 0f a3 00 00 00 ................ +| 2560: 04 00 00 00 06 00 00 00 03 00 00 00 05 00 00 00 ................ +| 2576: 00 00 00 13 8b 00 00 00 05 00 00 00 07 00 00 00 ................ +| 2592: 03 00 00 00 05 00 00 00 00 00 00 03 ea 00 00 00 ................ +| 2608: 01 00 00 00 03 00 00 00 02 00 00 00 04 00 00 00 ................ +| 2624: 00 00 00 07 d2 00 00 00 02 00 00 00 04 00 00 00 ................ +| 2640: 02 00 00 00 04 00 00 00 00 00 00 0b ba 00 00 00 ................ +| 2656: 03 00 00 00 05 00 00 00 02 00 00 00 04 00 00 00 ................ +| 2672: 00 00 00 0f a1 ff ff ff 04 00 00 00 06 00 00 00 ................ +| 2688: 02 00 00 00 04 00 00 00 00 00 00 13 8a 00 00 00 ................ +| 2704: 05 00 00 00 06 ff ff ff f2 00 00 00 04 00 00 00 ................ +| 2720: 00 00 00 03 e9 00 00 00 01 00 00 00 03 00 00 00 ................ +| 2736: 01 00 00 00 03 00 00 00 00 00 00 07 d1 00 00 00 ................ +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 01 00 02 00 00 00 00 00 00 00 02 ...$............ +| 2880: ff ff ff 06 00 00 00 0c 00 00 00 01 00 00 00 0b ................ +| 2896: 00 00 00 00 00 00 00 02 40 00 00 00 00 00 00 00 ........@....... +| end crash-2e81f5dce5cbd4.db}] + catchsql {UPDATE t1 SET ex= ex ISNULL} +} {1 {database disk image is malformed}} + + finish_test diff --git a/manifest b/manifest index f80ed710fa..4f979abb1a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sin\sfts3\scaused\sby\scorrupt\sdatabase\srecords. -D 2019-07-29T16:53:30.954 +C Convert\san\sassert()\sin\sR-Tree\sinto\sa\sdatabase\scorruption\sdetection\scase. +D 2019-07-29T17:18:45.497 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -377,7 +377,7 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350 F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/geopoly.c c591164125808f8bba9659e92665b78412cd263e654b6f05294f3a8da7cdd9fb -F ext/rtree/rtree.c 2bc0cec6c2570d48717472d317dbbe602e296336909c011fb70eab60800325f2 +F ext/rtree/rtree.c f8d9ea7d988c1002bff5acfac77d188f2f5d9eb025f24d5038a3d70a9c3f3d9d F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 7573134f1b4f59df36c1b0a6de51268fd3b9c714d91f3811482263e734e416ea F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 @@ -401,7 +401,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreefuzz001.test 836d87653851ae8e7b506d8bd3d62329548adc48ff9bc0a9051efd576710be7b +F ext/rtree/rtreefuzz001.test f9fecd174fc6475174d876f78f77b538122c1db296a96dca4615918953a892be F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6ac0f822450b26c7d67c33cdb2a90189cd3cf65a052af8497b795c3f71a23813 -R de5237173bbfe523808f0ae66ce2b671 -U dan -Z 58664cda1bd8fa02210bf17e12e3db81 +P 11f7f94f1c5d761e7f381e277658b7e857cc369283996c509061de55fd6aad52 +R 4b6136e9b391e089f928150a88e88819 +U drh +Z d18c141f950c38e740b9d65f9c3aa0d1 diff --git a/manifest.uuid b/manifest.uuid index 7204806ec3..95480f6001 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -11f7f94f1c5d761e7f381e277658b7e857cc369283996c509061de55fd6aad52 \ No newline at end of file +48b518eb6f76fb0beb161d1ebcf3b793efc36262d6d77a1ad5906b6501138e28 \ No newline at end of file From 822bc969f65f9d4dfb77df8c9221c058d16c9580 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 30 Jul 2019 01:17:03 +0000 Subject: [PATCH 061/221] Disable the skip-scan optimization for DISTINCT queries. Fix for ticket [ced41c7c7d6b4d36] FossilOrigin-Name: a871d69c6de65038360aa6142fbad22689fb347e526cca56bb83e695c1441fbe --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 1 + test/skipscan1.test | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4f979abb1a..f940ffbed6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Convert\san\sassert()\sin\sR-Tree\sinto\sa\sdatabase\scorruption\sdetection\scase. -D 2019-07-29T17:18:45.497 +C Disable\sthe\sskip-scan\soptimization\sfor\sDISTINCT\squeries.\nFix\sfor\sticket\s[ced41c7c7d6b4d36] +D 2019-07-30T01:17:03.473 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c a3c9a0e1215c0e67e508014084e8f47271895b56f780fc26ac57be34fac33c1a +F src/where.c 03125c703ae26ae6ec32bc2e5563b38e41082c120d6d6e526c5f0174ce1cbd93 F src/whereInt.h 6fab4b6f7e4ae716f112ee09cd1343fc6dde3d4a1831feabc6b3ed3b54b8eef3 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 @@ -1329,7 +1329,7 @@ F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test b1fef3046d555836712d4a3a7c8ae8193356c6a15bee59cb3976e4ee98596c97 +F test/skipscan1.test 64ad7a05a3c336e0280ac277c656b029d723071a18afc22beb3e352058e05c03 F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 11f7f94f1c5d761e7f381e277658b7e857cc369283996c509061de55fd6aad52 -R 4b6136e9b391e089f928150a88e88819 +P 48b518eb6f76fb0beb161d1ebcf3b793efc36262d6d77a1ad5906b6501138e28 +R cc614d2cc68120f92ad0f4eec7ab3887 U drh -Z d18c141f950c38e740b9d65f9c3aa0d1 +Z 570b02f38ebd5b0effe898329e81f79a diff --git a/manifest.uuid b/manifest.uuid index 95480f6001..ace1a0b23d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -48b518eb6f76fb0beb161d1ebcf3b793efc36262d6d77a1ad5906b6501138e28 \ No newline at end of file +a871d69c6de65038360aa6142fbad22689fb347e526cca56bb83e695c1441fbe \ No newline at end of file diff --git a/src/where.c b/src/where.c index 2e6ca3acf2..27c407976a 100644 --- a/src/where.c +++ b/src/where.c @@ -2723,6 +2723,7 @@ static int whereLoopAddBtreeIndex( && pProbe->noSkipScan==0 && OptimizationEnabled(db, SQLITE_SkipScan) && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ + && (pWInfo->wctrlFlags & (WHERE_WANT_DISTINCT|WHERE_DISTINCTBY))==0 && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK ){ LogEst nIter; diff --git a/test/skipscan1.test b/test/skipscan1.test index 6aaf5335fe..ad3b82db78 100644 --- a/test/skipscan1.test +++ b/test/skipscan1.test @@ -373,4 +373,21 @@ do_execsql_test skipscan1-2.3 { SELECT a,b,c,d,'|' FROM t6 WHERE d<>99 AND b=345 ORDER BY a DESC; } {} +# 2019-07-29 Ticket ced41c7c7d6b4d36 +# Skip-scan is disabled for DISTINCT queries +# +db close +sqlite3 db :memory: +do_execsql_test skipscan1-3.1 { + CREATE TABLE t1 (c1, c2, c3, c4, PRIMARY KEY(c4, c3)); + INSERT INTO t1 VALUES(NULL,0,1,NULL); + INSERT INTO t1 VALUES(0,NULL,1,NULL); + INSERT INTO t1 VALUES(NULL,NULL,1,NULL); + ANALYZE sqlite_master; + INSERT INTO sqlite_stat1 VALUES('t1','sqlite_autoindex_t1_1','18 18 6'); + ANALYZE sqlite_master; + SELECT DISTINCT quote(c1), quote(c2), quote(c3), quote(c4), '|' + FROM t1 WHERE t1.c3 = 1; +} {NULL 0 1 NULL | 0 NULL 1 NULL | NULL NULL 1 NULL |} + finish_test From 2ad07d96b69b031f5dd2cec52e0155d8bf0d5850 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 30 Jul 2019 14:22:10 +0000 Subject: [PATCH 062/221] Improved fix for ticket [ced41c7c7d6b4d36] that keeps skip-scan enabled, but avoids identifying a skip-scan as order-distinct (because it is not) and thus forces a separate b-tree to implement the DISTINCT clause of a query. This undoes check-in [a871d69c6de65038] and substitutes a new fix. FossilOrigin-Name: 89bf0399e87be76e7b264e0a35e8a6d3af0f9e71123a929c20754882b636ca70 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 4 ++-- test/skipscan1.test | 19 ++++++++++++++----- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index f940ffbed6..ae8a1b31d8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sthe\sskip-scan\soptimization\sfor\sDISTINCT\squeries.\nFix\sfor\sticket\s[ced41c7c7d6b4d36] -D 2019-07-30T01:17:03.473 +C Improved\sfix\sfor\sticket\s[ced41c7c7d6b4d36]\sthat\skeeps\sskip-scan\senabled,\nbut\savoids\sidentifying\sa\sskip-scan\sas\sorder-distinct\s(because\sit\sis\snot)\nand\sthus\sforces\sa\sseparate\sb-tree\sto\simplement\sthe\sDISTINCT\sclause\sof\sa\nquery.\s\sThis\sundoes\scheck-in\s[a871d69c6de65038]\sand\ssubstitutes\sa\snew\sfix. +D 2019-07-30T14:22:10.200 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 03125c703ae26ae6ec32bc2e5563b38e41082c120d6d6e526c5f0174ce1cbd93 +F src/where.c 01b68cfc7f8a6eba6a0a10b24b7ab3ec11f7244830791560119e14680c756078 F src/whereInt.h 6fab4b6f7e4ae716f112ee09cd1343fc6dde3d4a1831feabc6b3ed3b54b8eef3 F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 @@ -1329,7 +1329,7 @@ F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test 64ad7a05a3c336e0280ac277c656b029d723071a18afc22beb3e352058e05c03 +F test/skipscan1.test acbde73b530bfc6618626abebad8868d86cc737c61a52a204fdcd02ded049936 F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 48b518eb6f76fb0beb161d1ebcf3b793efc36262d6d77a1ad5906b6501138e28 -R cc614d2cc68120f92ad0f4eec7ab3887 +P a871d69c6de65038360aa6142fbad22689fb347e526cca56bb83e695c1441fbe +R 277630844b23a68da6a6e28edcb71a9f U drh -Z 570b02f38ebd5b0effe898329e81f79a +Z 6873f4d0939662a6f4dc4c5cfa6fb08a diff --git a/manifest.uuid b/manifest.uuid index ace1a0b23d..9a232bb1b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a871d69c6de65038360aa6142fbad22689fb347e526cca56bb83e695c1441fbe \ No newline at end of file +89bf0399e87be76e7b264e0a35e8a6d3af0f9e71123a929c20754882b636ca70 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 27c407976a..b8778a6633 100644 --- a/src/where.c +++ b/src/where.c @@ -2723,7 +2723,6 @@ static int whereLoopAddBtreeIndex( && pProbe->noSkipScan==0 && OptimizationEnabled(db, SQLITE_SkipScan) && pProbe->aiRowLogEst[saved_nEq+1]>=42 /* TUNING: Minimum for skip-scan */ - && (pWInfo->wctrlFlags & (WHERE_WANT_DISTINCT|WHERE_DISTINCTBY))==0 && (rc = whereLoopResize(db, pNew, pNew->nLTerm+1))==SQLITE_OK ){ LogEst nIter; @@ -3745,7 +3744,8 @@ static i8 wherePathSatisfiesOrderBy( assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); assert( pIndex->aiColumn[nColumn-1]==XN_ROWID || !HasRowid(pIndex->pTable)); - isOrderDistinct = IsUniqueIndex(pIndex); + isOrderDistinct = IsUniqueIndex(pIndex) + && (pLoop->wsFlags & WHERE_SKIPSCAN)==0; } /* Loop through all columns of the index and deal with the ones diff --git a/test/skipscan1.test b/test/skipscan1.test index ad3b82db78..3722cbda06 100644 --- a/test/skipscan1.test +++ b/test/skipscan1.test @@ -374,20 +374,29 @@ do_execsql_test skipscan1-2.3 { } {} # 2019-07-29 Ticket ced41c7c7d6b4d36 -# Skip-scan is disabled for DISTINCT queries +# A skipscan query is not order-distinct # db close sqlite3 db :memory: do_execsql_test skipscan1-3.1 { CREATE TABLE t1 (c1, c2, c3, c4, PRIMARY KEY(c4, c3)); - INSERT INTO t1 VALUES(NULL,0,1,NULL); - INSERT INTO t1 VALUES(0,NULL,1,NULL); - INSERT INTO t1 VALUES(NULL,NULL,1,NULL); + INSERT INTO t1 VALUES(3,0,1,NULL); + INSERT INTO t1 VALUES(0,4,1,NULL); + INSERT INTO t1 VALUES(5,6,1,NULL); + INSERT INTO t1 VALUES(0,4,1,NULL); ANALYZE sqlite_master; INSERT INTO sqlite_stat1 VALUES('t1','sqlite_autoindex_t1_1','18 18 6'); ANALYZE sqlite_master; SELECT DISTINCT quote(c1), quote(c2), quote(c3), quote(c4), '|' FROM t1 WHERE t1.c3 = 1; -} {NULL 0 1 NULL | 0 NULL 1 NULL | NULL NULL 1 NULL |} +} {3 0 1 NULL | 0 4 1 NULL | 5 6 1 NULL |} +do_eqp_test skipscan1-3.2 { + SELECT DISTINCT quote(c1), quote(c2), quote(c3), quote(c4), '|' + FROM t1 WHERE t1.c3 = 1; +} { + QUERY PLAN + |--SEARCH TABLE t1 USING INDEX sqlite_autoindex_t1_1 (ANY(c4) AND c3=?) + `--USE TEMP B-TREE FOR DISTINCT +} finish_test From 9c3bb59f76bd1cc196e6a5609017555b228eb64c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 30 Jul 2019 21:00:13 +0000 Subject: [PATCH 063/221] Fix the build for when -DSQLITE_SMALL_STACK is used. FossilOrigin-Name: b9eda2249ab5cf523093e4849c317d9a4b1743f7e15d96bdd6bb6cc423302914 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 28 ++++++++++++++-------------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index ae8a1b31d8..1090d858b8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sfix\sfor\sticket\s[ced41c7c7d6b4d36]\sthat\skeeps\sskip-scan\senabled,\nbut\savoids\sidentifying\sa\sskip-scan\sas\sorder-distinct\s(because\sit\sis\snot)\nand\sthus\sforces\sa\sseparate\sb-tree\sto\simplement\sthe\sDISTINCT\sclause\sof\sa\nquery.\s\sThis\sundoes\scheck-in\s[a871d69c6de65038]\sand\ssubstitutes\sa\snew\sfix. -D 2019-07-30T14:22:10.200 +C Fix\sthe\sbuild\sfor\swhen\s-DSQLITE_SMALL_STACK\sis\sused. +D 2019-07-30T21:00:13.643 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -595,7 +595,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 8e9afa99c79cac271fac32ad8c4b758f8e1310df850fb6d6f63ed2babbab85db +F src/vdbe.c 4d542e9fc51d4dd35c4c0c6e58d56bc168a6a221f71b065dfd52950bd567a8ca F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a871d69c6de65038360aa6142fbad22689fb347e526cca56bb83e695c1441fbe -R 277630844b23a68da6a6e28edcb71a9f +P 89bf0399e87be76e7b264e0a35e8a6d3af0f9e71123a929c20754882b636ca70 +R 7f40d3e7a173a03d17ea66296173b371 U drh -Z 6873f4d0939662a6f4dc4c5cfa6fb08a +Z ea6e4405731827a0308cc422416a8eca diff --git a/manifest.uuid b/manifest.uuid index 9a232bb1b5..1cc4ae2c90 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -89bf0399e87be76e7b264e0a35e8a6d3af0f9e71123a929c20754882b636ca70 \ No newline at end of file +b9eda2249ab5cf523093e4849c317d9a4b1743f7e15d96bdd6bb6cc423302914 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index b7f37b59c4..049c6f1467 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2984,37 +2984,37 @@ case OP_MakeRecord: { }else if( pRec->flags & (MEM_Int|MEM_IntReal) ){ /* Figure out whether to use 1, 2, 4, 6 or 8 bytes. */ i64 i = pRec->u.i; - u64 u; + u64 uu; testcase( pRec->flags & MEM_Int ); testcase( pRec->flags & MEM_IntReal ); if( i<0 ){ - u = ~i; + uu = ~i; }else{ - u = i; + uu = i; } nHdr++; - testcase( u==127 ); testcase( u==128 ); - testcase( u==32767 ); testcase( u==32768 ); - testcase( u==8388607 ); testcase( u==8388608 ); - testcase( u==2147483647 ); testcase( u==2147483648 ); - testcase( u==140737488355327LL ); testcase( u==140737488355328LL ); - if( u<=127 ){ + testcase( uu==127 ); testcase( uu==128 ); + testcase( uu==32767 ); testcase( uu==32768 ); + testcase( uu==8388607 ); testcase( uu==8388608 ); + testcase( uu==2147483647 ); testcase( uu==2147483648 ); + testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL ); + if( uu<=127 ){ if( (i&1)==i && file_format>=4 ){ - pRec->uTemp = 8+(u32)u; + pRec->uTemp = 8+(u32)uu; }else{ nData++; pRec->uTemp = 1; } - }else if( u<=32767 ){ + }else if( uu<=32767 ){ nData += 2; pRec->uTemp = 2; - }else if( u<=8388607 ){ + }else if( uu<=8388607 ){ nData += 3; pRec->uTemp = 3; - }else if( u<=2147483647 ){ + }else if( uu<=2147483647 ){ nData += 4; pRec->uTemp = 4; - }else if( u<=140737488355327LL ){ + }else if( uu<=140737488355327LL ){ nData += 6; pRec->uTemp = 5; }else{ From 7e35e81dcbf150df7e3c26d59c1c2dddf0f147ab Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 31 Jul 2019 12:13:58 +0000 Subject: [PATCH 064/221] Do not allow the json_set() function to overwrite the same element more than once. FossilOrigin-Name: f237f60e4fa9171dfe9a77c8637595c2701e971034d41bd6018944e8b2b27a6f --- ext/misc/json1.c | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 0bb4e1cee5..3a9d10331c 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -1083,6 +1083,7 @@ static JsonNode *jsonLookupStep( const char *zKey; JsonNode *pRoot = &pParse->aNode[iRoot]; if( zPath[0]==0 ) return pRoot; + if( pRoot->jnFlags & JNODE_REPLACE ) return 0; if( zPath[0]=='.' ){ if( pRoot->eType!=JSON_OBJECT ) return 0; zPath++; diff --git a/manifest b/manifest index 1090d858b8..9f811da009 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbuild\sfor\swhen\s-DSQLITE_SMALL_STACK\sis\sused. -D 2019-07-30T21:00:13.643 +C Do\snot\sallow\sthe\sjson_set()\sfunction\sto\soverwrite\sthe\ssame\selement\smore\sthan\nonce. +D 2019-07-31T12:13:58.411 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -293,7 +293,7 @@ F ext/misc/fileio.c 288e7230e0fe464d71b0694e2d8bdd3a353118ac2e31da3964b95f460f09 F ext/misc/fossildelta.c 7708651072eb5620ab21bbfb518d184f27b2c29c0131b09b9a2d8852a8016430 F ext/misc/fuzzer.c c4e27daf41433a64cad5265cd27dbcb891147e9994d0422200ce81ce9a54b625 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c c99b5f04fccba87c1c8c5ab5c0e53eef37c0144086e33911290a67dfba541d59 +F ext/misc/json1.c 71ce4e39793b743fc7e4790bc3bab15598e95cab57ad8da4326fa640ae5e5310 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 89bf0399e87be76e7b264e0a35e8a6d3af0f9e71123a929c20754882b636ca70 -R 7f40d3e7a173a03d17ea66296173b371 +P b9eda2249ab5cf523093e4849c317d9a4b1743f7e15d96bdd6bb6cc423302914 +R 93f7a4005fd45a64a133dc239fab4460 U drh -Z ea6e4405731827a0308cc422416a8eca +Z a743559183e13ed7c5d31402bb32ffd5 diff --git a/manifest.uuid b/manifest.uuid index 1cc4ae2c90..67e5e9eb53 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b9eda2249ab5cf523093e4849c317d9a4b1743f7e15d96bdd6bb6cc423302914 \ No newline at end of file +f237f60e4fa9171dfe9a77c8637595c2701e971034d41bd6018944e8b2b27a6f \ No newline at end of file From 9252df49692952ff4f83a73286dcc380e53a15e2 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 31 Jul 2019 15:16:14 +0000 Subject: [PATCH 065/221] New test cases in test/fuzzdata8.db. FossilOrigin-Name: 6e92d71c24c6039e7116f02fc5f39b2b87efcd3674ea828077c03d760bf49c45 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1256448 -> 1288192 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 9f811da009..55d600d31d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\sthe\sjson_set()\sfunction\sto\soverwrite\sthe\ssame\selement\smore\sthan\nonce. -D 2019-07-31T12:13:58.411 +C New\stest\scases\sin\stest/fuzzdata8.db. +D 2019-07-31T15:16:14.758 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1012,7 +1012,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 5142ecb1f8dae2ba6c6e3098c7b1a1bff635e2e6c3232bfe22c8d3b39b8a5e23 +F test/fuzzdata8.db 2f1375f053b772a48e0820fd3684eac0e109bc37d5612b72b0bb4bcebc1f0133 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b9eda2249ab5cf523093e4849c317d9a4b1743f7e15d96bdd6bb6cc423302914 -R 93f7a4005fd45a64a133dc239fab4460 +P f237f60e4fa9171dfe9a77c8637595c2701e971034d41bd6018944e8b2b27a6f +R 22845c42decd0c34a7c752ff5adc7373 U drh -Z a743559183e13ed7c5d31402bb32ffd5 +Z 002ffc2c9d2b7953ffcbe175234492ba diff --git a/manifest.uuid b/manifest.uuid index 67e5e9eb53..47a4cb1d23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f237f60e4fa9171dfe9a77c8637595c2701e971034d41bd6018944e8b2b27a6f \ No newline at end of file +6e92d71c24c6039e7116f02fc5f39b2b87efcd3674ea828077c03d760bf49c45 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 00ab95ef5ae875bc69f56479a8cf72d429200a65..353f39ba70cedd99c078d243654615c4ea9f1d46 100644 GIT binary patch delta 34593 zcmaG|2Yi%8)4zTCJ=f`>C7~v?+@(iaqEu-K9T7+usR>0vT8?HzNC+}EFtLDwKq8Vw z5lF;>ijXMsS`dO_LxEuTwebD-k_*D;_g#LsmuJiD?9A-!?Ck7Q@X_#s>XC(QJj*N= z<$~qfr+ZP47`CiDeW%Wr72A!2D>_S|Qi#-4a!9(w*dOd?cA0(4zF?oR|F9bNE_;I= zW-qh7Y!}~5CNX0jYMjZI=>*a$Y5rLf*CjzzIZ)-lkdGSi=o z{-^r;BOUGUi*%sBH`1H^2}tAp@s<@9rI$Yj4`Kdjq^ABpseKLY6me^;dE{auir^LIvi+TRIjwI6-UZ~4QK9`uJIec9g*X}P~G(&zlG zk(T;fA$`=}(qdU57x`P@;Q@bhq)YtGkk0ovK|0g#L3+F2jdZNviFB~vfi%W%L)yb{ zAnokek+%11NL%<-q?%u`SfpS564G;iP(k_xERc>YMY3x#lIQP2^6Ww+8x|m0u__4Rj_O-NFckc*Jz%h97x-)00q$C!1zRmogR7Ru!Booz@YJ#n zEVbNUe8kpUS~_{9eXX5U*d?`9Q(t^^d{%s1LTpTo_?q6>_~P<@ZE0#JscUgbKZTja z$;myaqLb9x&;E@`f{?o zzN|Q}FCznAUwp0?gGq`HRGA!`7#rv}HYaOJZU&`gNzJ4fFZmLs*5sWa*;zcT&yrfv z`dmq)%kffM8WAtGr?0Z4)@qVB+M7YvY-t7+bdzkfI6{gGjgCWZkSbm=-uSrODL$_` z8N_QCQiRtV>qACnE=X1X@x~`4#An51qD723InnEdh+8bwD@kfeH|0pK*3m#%Af1(k z;tcN;Z!CVZvZr_x=)Fj(OM73OH`berA%i$Rv=^V;cmX^n*Oy41Zqk@`UQi+d)lex5 z9o1I?E@%*wNE33UNE=9GihMvJ{~5J8)xE756xL1ZvcmMCT|x{bCO$qcJ_p~V_=NaG z@FNzT|G%(eHT1nPnX_=`c`(O!Xh5}pF|#BY7~pj<{mOpriXX79-vSs7D&*||9= z$jO=Fh16vFk^+RtOw67Vo%4@gyudLDm?of3cJvggdY-jP5H!cQ(Xyc?#3V~l!Iztf zFNm89q=d8plrI}($;$M`WYyE5)}xsr$Of)4z&RTKMdLq_;>*kKk;XAqvRfoO_ng-x zNiWWEDwge|ipz7uC~}JAq1pjVV_C(%C!4Vt@{N$1(uN3oNMH(3iQi?gL~8AoB0Bow zfJq|0(O`xb6DKKpN(QDxE{Ks~PDa)g@o&b);M90U(qd6V9iFKqCKB-BE_?YMn3@j-+5&Vev zCHV01`eL#ZpyMnL;Jco})1?pj$DO3R4d$k_p3)4Za8sO%AMPn7OX@?YQp6RnbXAr% z#?e8a)Sh>Ym1=diiF_X^&3LOm(swd@m@CPs!Zy=~LnJSc9Uz^M8Bx?NQUvcYMEZ}+ z9^uMxQR7i6pDZ<})RB_OJElstGJA|GW2LKx>QOEJ2Pu4!5zax_Q<7SYzPHd>(1ZiW z&tck_aOP|WDglg`@OfH!#rIY(^DUH83ONy6SDb>uEqNpxc(&^BA zppls;mCEcXy6oS@umPZGpW>@~&8mX_OJ_Ag*Q&DeyCgt_h+VBVNlNQVD zIr3i8dhzIW()%_;vXo%Sv6K{h25i#rk8Yt@Hr^Qk8d*OzA;eIvjWQhL%}t7d4CiKN zd2=%p@f2&)E`t`w7u}dv`e3#vmj!Duh*g;3!-~1u1`?h2onF!>>Ac%#{9W+rp?Wq zk(0F`qHEV4VT;3hbX{=w+^(X*yt#MZncYL=3J{TzVS`4G8WFa@C!Two6;DW)6xNbo zE|J_ad!gbPsi(?X@m|kMHIlj;WGkog)vhZ3#tYH_s~UnCKS?kvkuJZA1;aJT70PE; zNShcdtJp8SsHm+K%NAFl21gBm+*?s8l`3i*^|T&=zQqH6xq6LsT>)Pcu*3;`C-3mCR&%s4qS?8fZj&W0PWY z;$owrbQ2O9pOWZGq&ATGXv8cwkL6J1EY=(rm*qgLH#;%c3xvJd**+|0(cWA$KEazC z2T70f`Eq09y}24EGrhRi*tdyNW z-_2n@P^sNqmWQA9b6IS^*xbadcvvRFvhaZ{F)>LAi7~NWk(()UG0^(lB>alp43UdT zBXUW}V^f z#mD8)@O(CedFgmx7C{H|*-#CZu;tZg`gANCL?h=hYwJX@RC=*`26~N0+cZlkU6P-ylE7X?Vgjy3HRJ-;;aYnH9o-r#fa7v{k~KDn`hE|Ak$-wbpxK2Qnpg89MUARO@wJ~zV0zd!;FV3Gzt zH#Puq4<&4#Dm828i^~=*#pk+8Vi56EJ6vkk3~+)pX{OaB0f(?R(7&JZyi4$xPv_2avhywa@h1#mQFEj3%#o0iKqyWF{C<=;P0#&Emn~#Hb7A+gW zqXsqwfzNfIkrSj^Y=CVIl~6w@gbnpgUs7Ox#Gxoi$Qwc3Fk#TYfayy}$e?qWinj(q z29XVPhTsgBIRrZC1A&^+|f z3e{aN)<mCrLqZ36eVqEr?+NiD(%04cOdRF7gvmxsd|F2EiU08^odNc$5YUVzHlY z{Gf;6z>>uD7ia}h2o_vNTQmr&s|+s~LLM zUrb_fG6zN?S|$W0^FVKIMsRRJ?1D{$`N1jK&_QNq5LP2~0-!>?3E9CW4TOe-S9;^j zKyh1dOir+2kfV(Nu)%EJ3|IygQV>ppkny$x$skhKAt}ZYEC{Rw4JcxD%?yIdY-kaf zU2Ro(W3uA|bYyXXg{d9z3f2wc6)ogIz%~O_+5)qnz%*jk&{bglgTa>pDg_wwzm}|^ zcBt0^_0v}%7=+kJgdjxmD?nYRHbC5jdbI0TTwvV*K=>uD*%)MFg1mYWeQhz;nLn}ZXmzCvbhaQ>j9`j$az1l!d&2;!5F9nd)~g=;AA2^3%J zGbTua|22YO15C(Zj_Qhaq9+bGqZy2gOrL3l#i@$ zo{$}E9vmmY)MFbgs8>~uP{8+kK?&qQ+AV+-6M$K-?o8ku1Qw)KkO@KJ1}AQC48i=y zG1M1aQ?A!H$P9RcM4iS#iHCOh1|ePFAR#-$3`o+7e=m<|WOHCtNP>V-zn&b|1B}TD zYVbzF2n_HEHVh8EJ~tsdkZ;1Jz?!c3_d1zk0SSC=EN^%=|7lF2VlEs(^`9H)_U}kw zM%Q;R1*UpXB7>X>Lb@L9n4BQJZX9Ni!;Runk4QpxbiKlk2v=J)%ghWm4}cea#);x~ zO>;A_R0jm95p_|}qC*2-z%|%3h*7{tiYDaC)mtRQKQXXHRon>VTB71L1)P8#8ch zSk9up_=XJ~GjiPU;bFxd_kc~ZqA_`+Mc&9geO#YN#bE<>>y>glc*P1R<0+Sq_8fz| z@lYuXahsEK;J{wb=6W+nY~VzvyD~!-jmW&nY}@mryGm- z(vPHjW%ef3tTjUD@B)1>jhb!rn=KAkEbmbM2zxAxro0_y6n3;}m!!#Pm$BZA#8cI`=KWG) z7M1TbN70;PW*1Zp*KDUmQK-9@oS73tVGEIs4Q@+E80G1<2c-mTosXNbILxxVOZjQ` zD4N>a-IFj&4*^Ah$sCB99zPh0|;U$o;6TDV0rj-^8-X z)7Ks1jKQ`)HY+v`?u~d~1{FovzLnsADc>bGr^34xE7h%lk1r>Os%p$T0V;fze2*2K zAB)a`H=O*B+hU~HTykGA`&%I)kQ$sF@X~wCX^gxtnd{*osY-D_NwsHep;Bfxv9q== zpqcxW+0unR15Fa(lkn!CQtid;eyug2`lAD14Ot9ylnJA7IhZooKfYy7I z^1IYpI8AC!nK&BBq_pMcqmnO|!f&(prNjR*Q}_yxt(ei(CrrB(mqev+s4XZ|vUida zv3dB|Y=%MRH?`eHsh^lxT3kGUTIk$;wh&-l8f|MU!C{jo+tXIJrJGz` zq=ZPSd|L0=A#35hc{y_yOv}z#kOR-&gdqb*2PW2tl(DxA3G2F`TUYX3GP=lJyGBxZ zf1?EzjIuVNx+V~S|1aricVG~b|>#d<%0f?qU0?5VhFf@tZf0y=9L@eKH%-kssksjmZSJqQ(9Zw$NaNzq%Jb6p|mjD zZ5)&3S(&|0`5Vk0+*>DoAhQpssGl4{$|?4)v_H#t^^wQO zl&-jyiixtOkTyU*#lrW^l{?7lhiHA8*d6vfK1-3;1;BsC%fp;q1K>XlfImawiu2h< z@L~LPqTDu6^(>uh=?JA!ht-Xun_+TAgnV96J1CaZHVy}BQ&|w>Q+z+aVGLi~IEM4r zk0H=WSDAfD`5PV23*b=(>sXKUIl%jdGWNQ=3!0pi*|*%?R<6SsZL(d^;{thXGTh&a zbM5t5cakY@iL8h^-~9`5;Qj9e)H@2)+sKq^D2l-UYkV(p&oTS2j1K)QH{-5M`6tFM zQ~69KjwfZy@5ro<+P@`#PEX#aByN7gs_+hX%I73@g^IS>xA4+g@@#{3=B|Zuoupm_ zxSuHhCR=YxALVYz$1jq1$?RvL2FLM9OXVFh`-Reekec(50{Mc>ex-h@yCd(qT0Ska z--zv%7t+~Cx554Q$rlW@i(>h9Ar2>^`BO#m6p8&IZ3 zRPH0O|5iL9->aw*a7E_?nxHI2R{sP>S1Dtjb2w(RZ;J^H17p3+}2KBO0Fq$8NV zdGAYOAna+c8ogTOWW^^!4F&WR&YNRm;^W0(x`oQV(QifFv=5{`VnOOo`wtrJsAQFq zP9taQv-#l*dJ3b%Pa7%JcdkAF8ol0p!<#)P4-q(#zz^>e9^s@tw97nP`9o^e=!ziVNrWM13EK(SA3*m`6OR(R&d=Zmi6970uGN5BoMhb$5^CkM5J(>S{N|@_j}S zA%ko~%`Uw4LHWF-G0Z|{=P7F)&96z*R=Aitxax?mGww%rv zy)Hk14xLoh)X|^*?BR&uGmpxIEEjne*pqnQWAa5^?GEc^MPsM@&Xe-Pvc{msSrhVq zX}_B<`AEJOjhYe*k=szod-myKVrTMiPs<_5Z$`c~N(7bU$f0~#t;~_toIK(3&3w># z`BmA@TGU$xv2n5SR8Z__$vb}|-)pd*d{>?Pg=DZ+dnWf#EN3b0eQRL;83Y_6L2ZV3 z4jksDq|04+Sb=g%Xi?Uhhi|pRFn~TELWRtEmKUs5?h4SS4W&$%uU@(TayPuV5I zwNlg45hYY^IaQ|F+g30|)>(VXXwx*3($i&Kz&#d#8%k+McRyh=S4x==i+=9v; zf(ZnOhxnfn%HKl6vv6WXW+bmpwC`s8J*IS)Dq1O>RJE64`P9bC>*Nn4fjq)jSSL#B zZr@3HpUTa7brM-$(E;LT5l~hE~ux>Yysr&y;rXB$@aSZCs06snc7xW=YYn6HH`J*v} z@8F20<`cQSpw^i{8z1+FIVaqJ{_+6&(d6&s>?Ob-4^+j5_Ie&nQJNTv55y80H;(sx zLn#jsOau_Y68@Pr6aCc6RIST~Ab0{#+2$B=LuUny(ofn0_HE!g)peE4ibaZ{D$$~AAJYR}9|&|UBAfc~nq0w=+VAWkJh@zXDZuQ$ z&<4!1T-TN|Fp&z@8|$!s)T`dgXIr+uV6 zBeOB&nc?bBg&uc2pZl#+BvI;D$^f)g?X;n(nom(~HBJTqDs82=~}wfN#gojfg)Y;Uu7+oHBmQ+VNJLZu&c=RGGBgCStGHD zl=6n-T@GNYboD01ay+4N02~8oBGI19N_!gORDTs(K!oT`CeLBBJxA7l*4QU(qT4C$ zb7dfTzf-FJrNig>DoLHIseKenRZ6gr?m{n5-D31sEUz>VX7(2yH<#4gP&SQM{icj! ze2haalURCVcMU`27~&WvWnfRUSG%>IL>weqXI1+tmQCRSkgjm`eIt8a)4q!3kw*3m z=hdf`fs9`6s19P86`j-&Rqd}>9!v{1X~*x0RPUGA9pveu4yCXjs)OIwLw#Om(-9-1 z9=EE=ie-QQVD%7k-vSLb^(M8HvD}J2>M2D{Q7li0(2@QWW_Us<@|erTyX|ndV|?1p zY6(+kV1Tn}Po(E&3Tw?Gxp$$uMB*0)sUeKb;fEHfH_PI%_bz&Mm^zrv<>3q2S&6o+ zP_t;zDD@!AA1V~jS2wE9)8#C+8CytCW~kkGuWa>08GYxslUnh%)72JM?PmBV zUg;Yg&>X()F?BqnLa9j$YP~?+DdYpuplmUvRI?TwS>MX+9`X%VhtT@L>O3lZgt_>8 zi&TW{ENL9r0DfqxI#6ay#h6|xuH4;;HpDu!`11Rm%OxtTu!mCZdMA7q7PgG1EOj1+ zPW(Y`NnsO&^=o0vc}jt^19U;H^Bt;tP;F|gNb-a(|HSp z9dVkJ_p3vvEswda)NZiz3;sa5`l?j1NnN9=1F!)U=5&BzorE>H^4;uPFlrhW%ngis z5>pqUa24f`(K}J)XwQ6J@~1mWqRRHxbu|7-br)Mro@$1@ONlyOW@{*Xr+Svs&!{Se z)~dHszgSJDot>;+3OxyRx8+$iS7K`^-&Chl!K2K^?|x2QC$oELT_@|PKpjFIlNY_9 z&ePfbw0@&2f%kq%Ju0&Yc=blP2jkd%eju?2x$>%tu&H(ATV`v^!z$G;Wci^Sll*mN zYaaGG9v$nw@reD)Mf@0I0jXxc*^CaawvC`Y_uAS+&fP6(@!P76PJe7#`71}&p)%V* zR~#y|$Tx~csr{^>yx^F+N@j(0=MFZW-&QSVMGr6u+~(#O|nzJ zqiiItcv{8kbw)kH*e0sl>}kV6zw-z}qmSBYF!|1_f9c8~1#U5D=449ktA$Wuz6$5T z_iC1ver`7q+`G^hjvZ|xC3mq#@?96z(UN)}*!RfZj5}9KeC-eFGR7X|%1?rDj}_O< z3E}O2Q@_&L6IAm6P^$B4lPSri+4dD^l{y>DQw;5ptUeA9Pm;5rwuG;+YpZ2e!uv4o zb*Sj&nujjMYWMIlO|@ex8_L5%v~$dO>d~1)6w6+y&%WABDl@eE#EjXB@6*&a$`j9T zYOB31vuEgBGta&J!7y!+%$}t);hsUff239=QCT<7%+0gGn$%ueH`>`%o5;5DJz-i; z?44S8oTAq28bZ;0RoXnNJ}mX1LZ|jTALi5cOOVCzL0TrGhZGG9TT@NrJL0s(nmP=` zixem=r0U7eCY1WM)`|A_)ndfbwR20>t=!R9`$1B-9=Xw zytk=UF>-Iz=F`+$v}f5aI_}b<3B(vn$C6zlC0%Z+dw9q|?SjO1Q_V0P zuAtj=JMTY4dtGN`x_Q4;ZJD7CS1d0qydJk)zH5>O2JQhmdwKp{+JhMU zH`=2-VygBjV=qzocN(Tfy7stL9RUTMaDDT8`P7A4Qzi)iBEFoeyjm1L`;C^s_>9@w zIZYj@Say&5mqw+MT7ed?Q2tB}L5hnsXq5w0zC`Q7-E*}2883WT>i}&ySnELU<*!64{8(n!qr-Y!BY9wby_7e4)4@P zDV9^7>v4F2lKW{{0&jSMStYsel~O5mpzh!qh1ydxtKuhy=({EU;$|&PW$+Romb&xG z7qk{YsYa{f+E(o^248WJtoe9ciI#4tX^Q1w(!ccLr?MZk)im~T2~mxAYb!;ka167z z=uCgDJxy8MAYB6dEiyYwHQ#Ab6eVjljiNu4M_trLLfBgB<7uv{wV>L0h?R`lt3|2m z7{&6#;OqO17IwfpTZWESEC*U%UlbU)p97_K0k*w~n(tED8mT{xS}V2S1xdOS+Rv?9 z8P7YU6*G2>JO?yCUsI_qm)U#d*{X%|QA@Q@iQoJtB$XYf@ReFJ{cVTy;Gq**TiSX` zo6L_K)skg)f@LkTd zk@0WipsVe4)%fD^=@S(TzhR=)^O`C{_5SKvAbXy(gW6p1wMgrN5jN592yDr|q_YFG zzEo}KPx9JMdPkjo4S%2h7~k4M&ym?TRC+|4Mqoi4&3c3xyu_f4!q;jziLDVBX=qaIi};_DS)Sa1ET`W1Tr4qiz)oRS?{24CApU#7E*JUt0C71Fj! zqJ4w)k?a!Be@ENE_~F;JRgC5=*Dh2H*Pm3_6kd|5=SoK1qq(<3>8Axcrpz(=7WI3; zzCvkzuww%QHZy)=oE|H&AFv8)@G?x)*E^J{uvKxeq7CPra`jJ{`Xk!>LRHPBW|TU} z_>JTI=SKiggrq!D>W81J-5hyVEx8nM8bM-j!w2|jR{K0;TgDVD!N1^UVS zKdbc!S^XKf{LOvL_%Gvs-><6@yGnah1G}Jg`nR$qS!j>dNabS-_1$=4e2>FW8Mi*H z|1RM}?|F=Lp8bfv6@@Zap3uF9nyy&>o=l~G>1q6dXY_@#`WKw@8eJJ{y>)N;=@PlP z;2A`0TO^&XOtgNqw|cpk?LA(hVAa{9{~$?lhwjiZ2hPm1qQ5mS>dTlU!85fR5`A@t zwF7tGWnIhmmaR->#g%yr1tfFt?rx)5@tKQ<=Ca#c4z9ee{|)?|bYi^?=J8SeD?GUrDMfqj3D2FZLEtsAZ!&7IpuF+YIT`4TXnZ)W5(OThZa|03=+j94^)~jCcP*{|{Q> zKyjz&p}|#}#V`G&?>1N_-}0B90mN{BNoq^Sx9J7@RvRm1){euI4$G=Nja#pW@{Wdq zivXcCZlnGq|J82TWfn#Wn{~wayA8znhi`sN#|qWVI4-jeo44vi`G{7=_lA}QIy^8~ z$jE%EZ0c#oA9+TP7v2sD*Qun=RPw&Dlke$djFnjzUiFo3XWSiWV3KsDstfwBR5#qP zbG@hWr^F(7)g>LS5loK+J}u4IEL;~-Bvt*OucZEW>5sw@Wt^AbgsS=l8}D}W3_s(^ z$Bbu?_BN(yEQfDRF=CnC;}tVofj{5(yyPSIV&h}ld9x8BaO#9_PwwhuT#>0@t6>uz z^y01v;{li}?@KBC#83lsK8ifK2Am|@zI3*6uf$7_8m%QU?yD;HzwH(o2aKC4 zj9j>Ln_pu<{kie4iw#3k5m_wt=DzohNXC0EGfqjY57u4dD&JWnwP!SQrv5OmSZR!4 ztS=RHH?VfCHn4W}BhNPDSss;Yco}uC)7>1(sV1!% zL}e3=^?ZMkF-&49g%o?hIKhVT@Ne`Q#y>o0^pe0@`?9wae(s{=sSEg7F7~`zock5Sj0dFLX8u z`!wUK4ky%=HCE8xjsDEupW`&VoH9*x{U2Dta_I5E-vd-r14yp?sdEG~qlq*L|NtQDPoOwFL`A8>slHAXF?)D}$HJOkVL zvMuU1O#BlpmC}E8wV~P=HLS6eP>M?>7KBn%wzG~FJ_DTDR=%c(ldHYdkuG+$wt&i+ z{ES-1_)nd!E{WyRVXINVcO_X*GoIef`ZU8lEj3&d`RzTd+u@?3v``oJ%3dq>%6D=l z)(QnYgDZ*RcP91Nt%mc?eXM6>Hj65sz(UY-7Q7OFzX{v;&mn5J|7$x&^n1p9-F48l6nVbieSh%R{3^ zTMe3)=eF|}qpjaEH3LJ>-|L%>Em-eyRv0n!_?3L?8;rj_$$FFUSY26YJrZCbx?Vt6 z7Qr6f}-MUYPzv{{|>yhnmWm`>k4j9*WZ+WgaAmMocyl8Loj7m)PtA>v!ud`le z#iKgoHjYJFOfJbfZ|`TFJ4(fK=ln(Ap0Q%?SfqQ%rCICt*1h6}t?=9t8ubdZ?X8># zOB#hs$oGY{OL6Z*q*86io?2cexT4gL}vctu;PZ0&AOby&s00l8bT{xWNmrUbJllc?cQtzYiH3tXRK4n z%dy#c?yR*BpTEmmC`tFl6qontKy|Oc*%6Xy4WkKPSRdl^%dLePdw}LPXJ5Y99Ohl^ zZ=RNHbEf%+Ak%|Xq?y%p^)}BK-u0mMv;==tXso;foRTz~pg(VN>V_ z)>`#`R4AgNCxsvWq!owe8;h%!w4)JaY$reVku?E6r{dDla0;BZ!e6$jxGJwTZ(nQu zQe0)+P;Ska_`s3bl+!fYF;&~&@97d}zTUW40Xj*gjvlt*@fHQdBc(V{HGK3jo zn2%EUFYGk0{mI%9jw9?U9f%0{4FqM6^OU2WP;9;PJQuj*Z|g5A+d}!@HQ7LQ1SIhUoxW`b9eGz4AUWQLi#&Ou%GNE?57e6 z54FWn>VMR-;?z_FZU?xwE`^vTqpjgh`_uD(sWv{RiTN;NrBwQswKG+^q~v`gB?rz% zy5M$F^4}~|jNvJ&2{-HbPpwRxFFwtE&CL^VV@4uIY4`6~ti#%vL+NrWQ>D6-I6z%; zPMoh=q-TnYHVmj}BEg?jd66l+ti9QS@z*<;VY;>u6QAznU|o}ddG-YAZ>N+|I2$hc zMry{BHS=cdKPP*9{MKIP%M1>ybIUwgRQRja;B&pE!(eyuWr^lWS>1-FJE>@#IhZHM znZqE(2dp?-_$STs=*gbIb4h>mKDeiR+2%ZcSF+jDP#43?;GvX!+hmf5nuC;z!}Au= zh@s{TWA_trcf&I@SD=WC?dW3%zI#rbIB~oMp9bcA8Nc$I zwJD=_CYt@|>QC046{AfY443n?;pQGVq%kh4{h8qa$RfSS(^5@^abuGChXfzhxuNFM zj6X0P2vXEE^CWwThmSMi$cGrcDIiV|t@iQoNg{Lhc~4&+c8B=|AW%kI+h{(1mWdFN z{ge@A8$!#UmElS|YUWVh*Jcv`Z=PwD*~{cVX8uU29c2$U7K&b9A%C?Ai+Yg>i~0ah z-(o94e--9gTD8I~V6SrTelwQwM8Em2#tzZBwzk#$zWdB2GCNGA6K#X}uyy8s8E&SU zQ3$6indt7bO}D{-Ijm}ww?ft^bgC_n>W-Te_{|$l_*AMWe3$%eeRy2$CpOOSeAs+U zVy|)K5p#`ITMC&dfVGfs%M|oJR^?lQoRv8u=N>AV3SWG|Q|55x^%tAn!>gY{WT1Kw z_1@r!qAHO^C?Yn|7U@lnKq^7+`6hgO7U?aX*2$(Z`a8)TjXjp_6JBr}!=pm0EuhPf z^0Wxs%Mw5MqB)4Mw-Gw&&ZmM2_U^poB{NHA@9<==trBrTPIoU#KWz$so%Al9y8~Be z5u?_OC%kGN)8RuZ4aXijh~`i}=XLX88Ea+!V)-??dY5e(|M)rcU|<(KS z+hYFrVpD>HYD+_lk9pBVdm1BGl)Yw4p5%vO}d=k-wl>VJrLWM0I9uePJ z4A)e0n!SWv8_gKXJ7RA})xX+oBC<1t$}XC-DNJ(rrMw@d)jT!bb|f&Sv%I{(X2=wp zWBW29vk~Dkr|2tv?99X2UczCs` z$#mv+#ONHd+b)aDuPIM+?`jnDP9kbS`lfNLM|5_9(mJRiH(&?z0rkG4stLCKwDm6A z86neW1DW4b)nsJmz3VV|YA0J6mXL2`RaC!7z7vkt9Px`^gQpEx1So!qsZ`VPlzf}LlSrBbf=>xj9V38Urm8z^{rN4!ZI!xmB|9UQ*A&U!C2_KK zJiyf-=nAt{)113)8+qOPHaDZ)#kSFuhY(`CWWYXdvhMt#FkZxTackDGz@ z{})(!wofpRV~qiz~@9nWc6VBfqXy6_bZjI(~@~XzU@7x{`RuV&nRua zZMRy75&vF%?#`B!H_}~4g)XxVUvWW-Vtm|Pw%rU~ISla_uU=$}5nj2po7^w+gG+6L zWcDYe^>brCRA9pv`Y$T|O-kpfKbg~^7vI2zC%hcvIfwGT zL(gUF%-i6|H=RPZWm8PQCN~bZ?Ee~CPtnFkn0AOiebx2>u(yl(wuQd_%(ju<_zU_o z>NVR3Op+a9%C+3L%Z|<5oEY0C2{Cy!e@QKP`j=RZ`77_(hNu!&^W+dWTzI{0g^k*q zN*2q-{Bn)0DM;m^@aGVRQ=r)TOM)re0J;ff^mcckIlrRI|BnX`28P&_c0Z13QhPg7 zIh4dY#(`@afNnfd3q@Y}z#t<=!+?Dw`% zS(9BDe=A<}fZ01BJB$B?uuB7k55bu?>s?ZpXi_#Q-%bokA7PG$&m8;>~j zVn0c5E5b6pK7rHCGGzB9LHTx+GS$9{!XA?QiuF2{TrF&FZm9MSx~jp4 zJXfqcdDyiZjiP`93+XB7Wf^Z+k`Y{9pu9q%L*>czWRa~og&wzm&-biUu$rY;+aDHv zgj3NhrIPYyIts~~D|ev0H{>7q^cMEV8S6krc}hPj_`{=7)DEY~|DNNJ(6o#5c3u`@ zA0x4jyu8K@lSBk+5su$a@;U3>8?k*Tvac4 zktj4(SuJo4#kZ@7t$G{t=6m}$0>xngvPOsiF2rbg?H|Z2lERug*3j9L_J!n{>$nm? z1n1vM0$&+#_cIYjmtw<={>Z))@n(Z6gpw2C?p^q!L+vw!8?*F^4g4H#2S2@(zr=il#!^{?eIUOh+x~SY8gq#o$>Q}zF<#unkOxrBY-KwY zA_R`=-jLn=%@TWG5n1Osk2tvw&j^+bqATya5mNA+-Dao`*k{86gy$gqCRSWFtSx+n z@{kvA^&`aY%YZj~bGYiF+Gi1!fjV!~?!ERj5soJhrJ7F00$x^NPn9>{Dklm&Z{-;) z-A`hzXoIj&2<9IlmfT$Pdb+o3EL%23D>NWdI3?9$0 zO^!8;pS8mO$g9UW2C|BycDS`i{VRFEkMlI;K1WCDb;AB3OXY{}bfidusmd``yJ9`= z?tqWLBBxO)t^)A9AMDt)7wiNt-QlvqqfXi3X&FuDZjul3Jg?&(Mq9ph^yl|{V!xju zDvw1eSE;r?lm+fhgu`nmx8>=d+2`oY$xocOdu0{xqm#$;e8aH;nh9(x`_4WF2d?>c z$1srL7u@I&`0)oX+82okyELDD0=*Ck>*;8u1CI5}rFJi)T|e5#vq_W|XTMLNRKw`< zJY^NH{l(sqvD+vu$-b!(ueFer<8mRt_+NVq#wPRpwxa97W(!I^XP@wr1I{3~VyW{q z&ZoB6X30}tPV~F54PMxoeZQE=h~bl`HclRm=AM*0@{%|wqWP-dcG|hibo|8FG^&~8 zX^=>e{9XDiQ}$A!CcjT-v!Emcq1vvk_Fn|0(}{iSZV&Q13NdTAQa~FzIp@urNEY{xLoV%k2-hXNk2)r@iZBPn z0N15juy879)70b$a)!|o_L}2@z^5sHtBa!#;_ayBD)uS?0jwS3z!ANBlza~@AMOxw zWAYs$_8C_~rsI-E@=>`v6&yg!QAsO%2Le9*_>P{ANfLafRqx1ydDJ@hLB>l)JJKP> zEtE$DfIF$`xQyv{m!km6zL&EzCWLD8_WkVZaEg@R7|Ui*%}HD?sI9f%MO!90*766F z9IDPdyeQc*M^>`|WOi}*5hiychR{!6(0}lWv>NiT#i~wZ3*9Z;Wz~+?iTrO zIyYOPM*TE|Uz+7;F0(}xejZ~iTWrHCtdeBdeS`8H2PFg#vJYVCrfzb)kB#6xCSKWh zMD-Am##y}uOl>4Tf&3qF+hPal;=NtJ+8WU%W?lNqct76U^|P-rv#W3k%M0*bMx}Sj zPxI}o9k%6j-uC;} zaY~@#=lKg9?Pc1v*MVCg?>in8nJcL(+>Vp0M;zblY&E}PI1ny?o{k4Bu{BgQRF35b zKXcq7@w)q=^hBGr{EFN0l2pHphdymjqRZzUkBO3dsV2@2hx!W+oYUP${?5361XZ;R z6ZM3{dyT0t3na!PF0iJreQTg|iQMh6C#-nfaVw?&;Ar=7p{i8ucWl?x<~XpdR|rD= zTLV;Cg}&BNdX(Jv`n4#HS5^U4_-YIGVooClyY)2%|0z{U&I1BXcyHg7d(zn^jyG?x zMR?vb_Q8QcZs6>YdKFU&*A_%r;!TVuop9`6g`B;H2wZ+^jpGSjZJ}7cThYj}O^~Mo z`)rE&)NxFG5FHisx-||ru^CZ;f{q&*-+az7TVf9*{7YQ@oNFJ$m!5ar zi?`JAG_T_(#=*5WV5#x6SO*Tdf;`*GyIyjfW_V+rXS2O2<1Mc^LUbJA`+jpAm(`8v z@^PMj%>EdZ(n{rFin;2jMpR&awSD8h&Cc1faO$44fAJ673r65`{IrHEbZjfn=qw{B zVU^WcAh9QT%|f{imZ_yq8x=&!?XIVEKzK?hY#UX5 zDaXQGR372g5l(C=@eaFmTTkxm;cRV)i`QCM&pt5wMOFa@C zNSqb1h9U}@17ae4gj=2PJH9SJ!KyBCVp)1av^&IKd&Zd}uB7`;I3uXnL+TO=&2^6B ze?I42q^seI{?Hy-2U%lUn(35v5EoTvdv}*)EKcLdN&T0JWI3YtpSt}06&`Bzt zFN!9qtwH`*oexpi7-ualKjBrBk83douk;tJZ+;BM|jqs zo&S~CCzQ6$i8l!R=7jeAl!|JcbrdGM4F2bz&S8eQBl}6CxFPmOb$KN9Kfvk?`JQnt zq^J}Y&v7Ptn+%Bu3bXF{&`BSbTd|@ls1G4%V zpnSoVwytJYr3=C!#fyv7~;E3SV(0!i7WZuX#a=>kOl_U%EmmeYK3>+#HHIM!uwbBTf_Qham1lchPvWXD6%2LZ%>y@i66i^fYa~Aq>xwa1 zSAMyl%gxj;0sed3rE|5U!u8ld7WQEa`CG}ZJ~F#Vv(sIl^REWD+R5w^?P=@DB@6-) zQ!lvuw4uKzolhO=dR7wmf+x5}@iD_)W#V3NWvmW;KHde(C~uT&7Qbt>>n~MY!M&Kn z&&_h#B);l4*HY&A4qg8ULm8iF+@Wpb+DXaXTvlFry9@U*e~PF4Ual6j`xXo{I6@oa z&t$l!Nw_?WqfbPgWxJ{jTq5~wmJ4^ge*nPWD0ROpipS)+s%6Cfg@?MtuGfWK?|9?$cP5a57qFt*mbT8G8AZWX$u%cg|6@LfQw1#7|34_xyIpbtcdqn zvB|Xx`4T+J3L?E8ak)*_olkwrRmyC*nXIUSBykB;y5H52%J#b)1d`0+{ACwld8fL1 zP^%i(T~wA-@%2Hyfp~l@OHQ2WMr^M zp*`F+N>c-UNu3ho_;sD7Wo!w_6h@XiUvMP)Tu zbLu9#+@j!PbnT`Zrw8Gj)vhym@=(!25G?PcYa^bTP|;#c!sAu0eEz^ku0^_}Ac&#H z0JmzvEmLVOULhs?Zd8=-O6J4QyDCtpC8e1-qVD&ZvY2oD-qq5ocooa@K}UgufA_Pi zsiY|_fKcmV&kXo`esjU!(}v#`@5b5Zv3BlQi9WsRiogxl{6w7K;9RG$(LrBGCA;yi zi06B|Cs1C2{5+*zGEF{3a&Kd-9p(3dJ&hx>V#W)unDZI6)7@XO_WZV+QBDOvn;I{( zy5V^X<(2#7WLOk45k#=n>3&sJqhUCS`$}`DjneT$$xp#2F9l-6z>7j(oMJ7maD$qsWI;bwj_F^mKWcVJU?nIDt0H{6wt*b=Zk zOBo&APqEHax)PhsOR~EORo9p}8&ll*SZdeGm_!z(3zh$9cBk~4-Q)P`2saj~uAE7B zD?(XUn)mTMhdZBfEz13u!XmeA$8mn%gXTnW?Ash>pBtq5+Ei%gAFgqNw$BR>U;cU= zJ{2yN$HK*77VxcqyD}lm@0l+N9DioruVE=@`ZUTKu$mE=Cp`pN@$!$px_g1ZavTS4 zSi^hr6OnEo&bE%KZF$-tcf6+Jl;&c9oK!s5jl<{RZdFzzFet=~IP9b9PrAf8*kjx= z+WiZI_s>5`?MkT!;7t0T_O3NZis}l}kJ+6WcBOj3-7~W@E6+t9%NukN zw7~4n?zR|2Sp+3&Y$j2RuLX+7)qnzO6awlh!c`+6(ICDTqn7c>5~9Rt1hr7BNX&O` zchB_BE>Vf5@I&naJit*{#ptkgCZ zBE$2+HQHpQ2q$*c5y`TcVWv`S*kTz^S=MQ978b~FOJ{bN1rU_!!S!cm24cfJ6TR!h z0volJf$=x@%ACd5ZqznOp>Z2}W{~61OxvO8z!V^l@^GvLVv+^)Q>#1;xL*+9V2 z@T}5E8aV%}j#}0`lVX!LX-yr^#-F1JqdZ|DZBL6MZLVd47Fpgj{+w$R#Lp04Q`IQ3y!lIFNTfmwKv6v}CtFr(p%a-h}% zG(RyDaKi*XY8Zfw2aFmpl+8N8?UVsyqOQ!0)y3*Tk@iufU5W(Y%ZQ>jRu=|IjgO?p zBQaBgBn=T3I*=7($I3mDSW=MG#L|WZVqO) zW`>1TJQ4^*9fFvT362jE-aJ%+JTQp^$=Cv(Wwy(Js3%PzE*y*6f+hwbR?NuJn1-uu z+_f#?Y7!hYFpu2vf#(QK2p}JF!eD5Y*PE7)iIpWu0umcwArN7qnm`<2Vg!wCnDus+ zq>Q-0guqZj7kyli1m_A$2$Fhm0K~SD?GV9jyA;B-7>W95J;0?w5jJXp$7jSmUjZ_T zV3LLi3wXz{zuTdBjzn1BOarvqGCg03T1MFPd?oJK)~taLj|7vZQg|-FyghY<=ZeY! zmYMW*Nw^EFAB(~Ngg&S*08UwlfoWW406e&`Z#s?o0Tw`?vkLntlCT(zmxK_@B!6-H zWCAHmSO$17f+7JC76u|qVZ+Nj634vpFoam9&tXi*VW6$!x>e1QuK$gwJem35KIU`(lF{19v5L-gJ1wH zqb@fU4bNRLP0hNbY1A74K%@YZ)ucA;s)Bhc{NJd95DPAuqw$=qAO)VApfl4!@HCU<;42?9_QqobZgMfv``s7}R`EXsVe&TvfEBZt%1q+EA zv|#5LCCKh6Vg$q}Ab@5iB*@yy6mBH*8oi|h6N z>oGfb1Dl7|EzoPx!W#$2-tkyGUMsG9;~=^K32vvcst~|?)~u)r<1%VJ4q_3p1t)^; zavNX;1a7?BK$tr$IMu>pD4pQmD5C~Z&l+Nh5R6)n1BxKH^zJxN9UJl)u^fm7KsL>a z21;U#W|O!9dz%P}*#_=NBO<%>&h!%jUo^-c2e;FRzFAdM^&ofqhKNgyY#~7`g;-66 zXhd@%!opU{-)V$bSG3q_nQ`=mBqONeXS$~<#bdYEh@{yDU?k#nvIY%&<3Rm)ZV)Hm zIMDSlMGhgN^@JdNaOXP40Tb7=l8C>c2hc?nN3YbeIkg~!0+wLrpADc$eX|1UiI6E;xMShEf#G!= zvCGfN>o}mA(T5b)LZ?C804veyXgTfdoa<&9i;z2bHqhLh8>Bn!TU{4-0NUW>PSq@Y zp?`!3TVI}< zjRtEf$$`Bxw83}OAi_(PZ-H&9E&2|xIb z8eVWnhY=qLS^?skXFlxbJuDhiKEPmlG#dm5!V~=G>}tJ@xv< z`=<~CwR@ZbSRBc9Zr zC|scw6s+u^EbFim&;D-gxOGMbd02lRoVZVByIu*6VxLrobxKUd!OT1MYiTKT?vjO> zL3kdz0MGw=u@xJ%;epB6epIpbYc(9@+oRzq-&EE;QZ$`cAJp!|!}B?+#!vWA`xNh8 zItuJv^*ol@PYJBe8WLEi@s|E4bi=dnlaw921pwE z+Kv3dH#NYWLFxr;SHlS>^XMBI<&1^ZB7X1t+Dv4}vGrdU<2B1c?QS|5Ja>|E6L0)T zTcF@P@X$t}Pm475=HAL)t{v8HDa2{>JHFI@7WnD?GcrSX(O24Ma^QUMM^0OYfTYfG z(7kFE2?*M61qQGs)xb=BZ+4*D)@k}?k<8Z8sTUs9U*D;a4+!Y5%2F*dv5*uS-H5kR zK%<(<8-x0SLL{<1|0|ryFV}P&5wwtDES=1Xejd1nb?Z^^E?;n>-biqB%YIRWw{oZG z2Nii%>GIKC`*HI$eXr8-;v^n)#!+m@h_YpeOU_^$S4gv0bq%fIL%Zuw%XGZAmp&&{ z09d-OY7$KE8yQY`SY-m$gg0kUFqz&O)#3jfRxzW~fb3h&&HN-o|CrA2?pxlelwQ$2 z&p(OlofQfB)C2XMcx@Vjx`Xu;uPN7YuzD_A&w{72eTh!v>GDke%pm>#!f=J!;houu zuknvHEK>~r;0S%P52R%h6hEKU?3ZTo%jWCLl)`jb zIfxgqn)h&4y!wd#Aa9UQuON%8^lNPhn>;jB%qLarc;$H&o6@x-&Rlm2-^2IR>DL93f;(Z3{;*s; z4@epvD&^boDgEsSuQM$z$P9z(Kh~N4vCedVyz>2jtTWA?N|sav$IHla?x22%8PRX{ zEy`kLk#dzXU%6D7rKFV^%6ZCUWvntn8KR^VQ#n)Vqm(MADxH-Rlps)Oj><>mL-L36 z0r_3|4fz%M1$nppr2M%2i2Q)OLB2~~Bd?N|$~Vc^$=AvY<$3ZYvL#o`7syreM6O>W zZKXgaXhVZ7Cyd9MR(O+p6Prc%J1sy z334+t9f!wDcW6B*ysrSD0pE2bgzUCqQ*?1yR{iDjik^M4aebQtM9sq=hpuLa#^{x7 zP3Oq%y!w3oZW&;jzSw?!o7leCAKP!yKMfWTX6J2#`L6ByKsiJ!-nICDBa%6aqrOFm zubZdWNvC&ijaU;`u!et>Jk8hcE7>FQrMvaZB_y_19MNB5SPmO`^|K^yRlZuRjatHX zxB1n&-LIBd7k}ed>uuVljN(HM=nJLrnislc2tBiv9gz~N-ocEW`tw^Bb;g+u5B7mh zPN{dYUFYi?aK<@+W>XuGAN?VMp|rX>m`BH}~t9_Cd)Z z)^B&H7cKDOxU;&Rb)TkpXJNBW*BG$_1FV!3zp!V z!M(@ukNevA$A)}I-k3iaziWRmHu(o*b9OL-d~C0h#}w&)|6rV6@>x(C&7at=pDhP| z3;Q)4L%)aG==X5Gep~YOd!&8+w)*wkmetSOMDaHIRl52CjuYqV+Mi#)Z=)X)T3ZK# z?fLrcXkWjbe*K$j(U{hsyf_ncop z5d)BcbJq7(-EuS_K9B9x}gZf5{pN z*`zHyL)}(&4Nqk6>5+1p@=W577e@?gsx8z;V+{pqn0xwTl92%u&ZN&5@y{#sFIH{k9IMS9B80shcreVb5q zj4b_??R_TP#rg5Unx}??40t3+h3%le&(@F8=QHTIohMF=yd)ztwf_wL6@`o|GQJM- z{!RKOz#w*sRLRIe1pvaS^gBeTiK9kxkBC}WFad^M-J4;>x`RjM2+q*iP1+44q2=Fh C-ecJS delta 22664 zcmeHvcT`o^v;W;^pLXxL7VHXY>;>$xg1rm2*x|+!TNFeYO)L<5i~<(M zF2oe0Mj)1$*dUt37z-rEB*yZabB$o6)g!SLg>u4cf{$PqWWmB7vis~VyUD&~ zm)QlD!%nh~*-^Hi?PedcEi9S6%T}^wY$1D#&0&7~~?Qf8wb@^cPQcqIW%2i2mrQOf=t9iRfidMWSDMDiF=_P}lsVCy?l8o&cgB zdHjiHc*+so=_x~Wqo)+n4W8GC#)78={kP0hjOg1QU-Od3hv=IggJ`rzCmQ8(5q-ns zAR6JZ6K(0yh&J|EiPrL{L`!;PqCOr@RPzW#MGv!Bghw8dgm62S$d%bdKATA-a~hHD zZxV@3oJ@3i43Q<#M5at2GHNW5!J~=vA4R0+NFr@U5UD?$NbMm+{09>;B8gZB60r=h zSlA!^iQMW(q`1$9Z8+6J!zA*B3-f;^@)VkBT|>t z$?60XsToA1GHH|rkV09hnne6asj`b{Ed``j%a5d0%MYYf%Xg$x z%T-dTg1QP-v1Sk9E6!G-*vEV#3DQRh#UQ+|V8aUig*?sx#Yo|)D(RBNvjhV3)Ih8@ zO1L0M@znRbaIJ|@76Zo$-*WaIiqU2pYa#bdp(0kDEL`Gj9pp|CUW4SBLL}&Og$Vp& znh?U-ddQ6xf}micpuo{sVq@?uA%(LIuyC$04dNyVRiMT^VHN~W5}a7eBWzVAL$v%} zIx&5C0RFLvoC8~vu~fJyO1`3HcR$D<%H7~h5az2Jmqz)BmNjkZ$tw6!g3wHmQi#({ zkg!o11JPUL(ztk~FrBl_5Zp_tjdfNFUurUA1IUc_7_GZA{?2QD7`a*4Ah0bN9}0Ix zRt)c@2|8!nGWH6!Bvu@29}sc{=>uwZC#2tYW#K1>h1OQ7glO6NhRI4pxOZBR!IkCm z$1$G@D;fJRs;O^ke;9>Q!{de6j3Tk*WE>Lmd`jZJQY}a#zkR^J*j})x_XXewMRikg$xGgwTeXf)!iyYn){QlkLPv zJ3d`W>LbeXSPNfa8JlRdj^w+vvUp`EFVEGF(i)TzEqRlk4R%9)UV}WD29ls)&7e0X~n`0ehUldD2bez2mUhKnbaP}$WCfhgT&ZWFN zhsd$IxFwQ{=JO|jW!s~1Y&c))ZSZqUU+ApjZScIe!IKa;*15T;!2rCxkeBg3dJ6Jm z9sba@ioC*XxFgS)#&3vHIni=iLsGskH@W_derI0cI{Q_wbNl0oeNMBQPc@Xoy)&wF^FM+*I z@SU9HLqv1l6W=(^Kj7?Jh-k@+VaXhRi?i#{e4JhZtDNJPIlBR@v^WK>CFm-8F7jKd zR9>|FIEAKo9eh8Z4-nY3j2nEgBvuf~C8cav>%!3jULBAB$eRl6`;6QCZBeR7^Jtj& z6}lJ3rJKajPmu1>$3ys9y)z!Oi>uZf-LuX_+ti;sl7Q+fb|a_tzTCF)&pOJ!LQykS)T*YNeA@%n=cse`Y#F?Su+w{^O zz((=XkX+v}($wu>{IRuIlCD1l_Z_h+B=6(?*s-06bm>npVt7kz(@8wc?UqON>emUb z7gDc&y%31|(@_E|g^O>itSav8BVHF&%ahc8RYc1*h-hr{sz3$ep_*wSl{a@lm|^ z#GK_!fv5_+8s;S1cQO28lvqi~h!ZPHQZ>!`JnsX1XfiNB`KH$*3q=>D+0uobrd(Bu9Xxl zeJj-wEt}pX_t6}dCrD1H>z3{-_2%|;i8mFkI> zk8041Eg*G)+yZXJNP*_GX|N!$E?#RYRphK8+#N3U!$G0aCe9jx@ujN;#81~la6*KX zAV7E*sWrVT*DQJ^Vw#vHsbojbpYq|l;#VpIfT`6p2F-t(p<%C`AmZ%W|5fn5g@g2N#F9W70er3RuUE9`k6H7GY@t=Fj` zqUB(*=NDU;9TyX%P`dXzW<^R}8Frr{r3tJ}QFnh05ow6snb3AHM3h!Kpx%>=16#yO zORZ8P(Xuko+oWre^rhNisc%EkvbsnWoiL}h^g4qBOQbfeUB*(Wq$D*KElVPvzfu-w zBuI+{))|bIQhNwkDLJt3N@+W1T~J&tow15dM9Y2%^s|Qo^-vP@R%D(7-y)uc zx*$qTMax<<*lqy<^Nf;Et)A|}Lxxe7;h+zsWG0!(U3W;`Y_x=cQmh&VUy)`Ccx#tb zlCd6mG*4>DVdP{s6%Ox_+OnP)IE7sk;OQNqA(TexChLXlTj!q)pB|7zf%OLWBWFnr zDC^1-@bOWJ0{1?Ua9tgP(cd`Z>8UL9sW*|cr=|0p^@o_U!fRM2M=EZWn^B%~u-WqgjmIs5+>1f{0-xeg>aw)Mv=1|B z9Ry)HlnKzKA32KzcdFD5mZeG)A$~P;;TL%lB{@+LbxR0^ZIfAuIl9((^oI00XM>>) zN(U1&cU6StYn?-IPN8#-0P*E0sLXrdq&U*ThG5tY=P`1BeZ>+GaLioTEo>-;-E@|x zY2VIu5(<8ieAQu%-1Qr{8-;-9w6iz{-j^r~8xHA1U9BLXhRX)ggPaPi6AUYqO?6(! z#V4f0LdGL$z9hAvINOY$yjrVB5CR){YG`vBI&^$~)jRYzm_+$J8wF7<^w%KgG_ynI z8DkPAPcwo9$XsAu3cVD0CmRh$4x^A&m3whE1_FKMYY^E+mcYNA+yR=el@-{r)EW%_ z=U6>l=a7dBY%Ih~ltx0_8m8f!y1bOLajeR6eye`^@i|pNrvz(R)37E zC(q?%qN6?_bL`ttrup$EB!uulIQA_+pOoSo0l^D>Dq(apIZKv@|JQstl25nF^5^LUEXLmX(6|48ab~Pp~c!tI4!vwULiA zHUqLs`IJTy;tkGb!o~SAg?gRj$BGyxQc^@tITXS-%OxTHYpEJ!_K=5IXa8C@l=OJ3 z85o=8J`lRhS`Byhl)DMicv9q?JyE0H5^zCZc{XFQDE2p{7nhhjz9g27l)qQlTacSX zEETMl`$3~OWewv-%9#pliDA+5Q7(C?jrri*BG1Iw$?`nT7GTp+^2Y+S_+B>P?pk>U zcAqJqmRM^H@W}a0UASgUE77v2pUKS_NQ;&inloq~{T4x)9YzQ?o+p3K*<#3#H{Ql2 z3*~8?ErF}+j5gRJLCz8&ZHqA`>AXbQZjxLbb}X0su%(!~P_D%wZH3`9pZZv4%fMYt znFu-ALQRODDsRV*Yvla`TaJOd&E(CU0Xhxin-?K{X z$U`?MdUFj9ydwKDQ^>37w+^ya%RzW8Txq~?^m#d7mfDM!T|NK)e2O5grH7Lt=B!L; zPM%DDBn8s1%au{TATMGV|5z?hPB2w24|<65C#XNkPSYj54@PlU6=?R8d_3upYZ?y! zQC=sojllBtk}&8OxerdcEmu`pM_hkj&SdK59dZZJa>4L+k0km)FQ*%*sV$%<3gO_t zQ*mI_@ACVcZN=;~WtV`vpU4ps+YY(eLJiFHQ;HKOjg%~uW#utrA5h38yRp8iM5@eNwKxL#HX!m-&wRADpAz`AVK<& zuBSspg3toGt`Lf2T#Di(=QT~SGK{XQBr>)ej0%be=T}wcaJB~wS@FlNH)MYSTh>;x z7~2bhx8zWGGFegKod!x7Sl?XfhsT4JP|o&2?gjb8OWHxw&M%B*z`kIm5{8B=0UVZ> zQ0gRoC(qAls&J9*C)7ZBBB0PpVT@p)m>SA*489?67qDqtWuYQ<6)k(cv(-B_j+$~q z`W?oURmvL-^V|v-FtWP>k`yjlcFZmsZGQnmvxOk@1%hk{1j>$)$tCw!t`q))p2kWn zg#Q znZ_|g8R1QjPQkSgOdVx8!(%l`R51Q~`BuhWWrN82VDf%txS(EGGrTvs z;s|fYF!+$NPWqDC{t6;CQT9Y)PGXpSM5!mRixAmFp`<@kS>_PmpokLm&2lHKct*Lz zOeBYZpR8hnAB68xe@DU_e=$LyfeL@$#2Z&(lk>_6fnCMUIqGNBWG^+4L8{Bz7Je*L zUxSX9l>O`)40Q3;ko<-^8utI9w!SOr4@i46ToqKLml@gfFJ6k^6?K>*?N)NU&G1D)kdBPx?X1Ff{@f+tn#tx=vl( zhQh#H)9X!nK3U*faac9+o(# zc2)CUAw+kwmDm%%Fq$W>d*prm=RGl}`!XC@P2EIe_yxt9>J#GsK4d@8D25GIzo)-` zB@BR-z|!^9ALy?KklsY?3bBvvIgs64U4ZcejTQ_#_cLmOUlaANzn~n z=YI#ItQ-hIzqx8bvlEIR4i8l`Rk{DOu!3aM2f|0Piny)4+DnkxPsHe-5O!TX1Qdif z#y>i#R%+!D98;`e(Cn;oyvR0cV6{JZ4R5Oa7>;S??XS$+8UdG)IjV^MJ=NDGtE}S$zq-Z*i3tdH;3l z4S^t_tbu9?Ec=b>VHjG^x{2sUb%0D!<@)VvJ*M~^v<(so6LcRC+@R;HU&D?M)RHDo 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 Date: Wed, 31 Jul 2019 21:08:55 +0000 Subject: [PATCH 066/221] Update "releasetest_data.tcl" so that it is a standalone script that generates sh or batch scripts to run each tcl test run at release time. Update wapptest.tcl to use it. FossilOrigin-Name: 559c2dd6724b2fc238760863d4be7132b591457e72ca5758fdd4002fbf7df4bc --- manifest | 17 +- manifest.uuid | 2 +- test/releasetest_data.tcl | 357 +++++++++++++++++++++++++++----------- test/wapptest.tcl | 129 +++++--------- 4 files changed, 303 insertions(+), 202 deletions(-) diff --git a/manifest b/manifest index 55d600d31d..0bde094361 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sin\stest/fuzzdata8.db. -D 2019-07-31T15:16:14.758 +C Update\s"releasetest_data.tcl"\sso\sthat\sit\sis\sa\sstandalone\sscript\sthat\sgenerates\ssh\sor\sbatch\sscripts\sto\srun\seach\stcl\stest\srun\sat\srelease\stime.\sUpdate\swapptest.tcl\sto\suse\sit. +D 2019-07-31T21:08:55.220 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1245,7 +1245,7 @@ F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d F test/releasetest.tcl 968fc1e8fd23e113fb8a04379747f3a9f2c12d207b2de85aeff5a825962e1cd7 x -F test/releasetest_data.tcl 146a73e8c8212f962b6558fee0711b895f11b607ee0610e6910781dc8f83797d +F test/releasetest_data.tcl 9dc6b01c986826a9e362bb8d1cc4289e558012dc618e98dff8b6f77dc472d129 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa @@ -1670,7 +1670,7 @@ F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec -F test/wapptest.tcl 56d2b7974ecd8cca3189a670f757306d5ff3334cc9fe3744f7a6ad7ae4380e8c x +F test/wapptest.tcl b02f882a545191375e7ea452d351e32bfa1225da5005d5c41a20a6c0c91e30c3 x F test/where.test 0607caa5a1fbfe7b93b95705981b463a3a0408038f22ae6e9dc11b36902b0e95 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c @@ -1838,7 +1838,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f237f60e4fa9171dfe9a77c8637595c2701e971034d41bd6018944e8b2b27a6f -R 22845c42decd0c34a7c752ff5adc7373 -U drh -Z 002ffc2c9d2b7953ffcbe175234492ba +P 6e92d71c24c6039e7116f02fc5f39b2b87efcd3674ea828077c03d760bf49c45 +R 8d98008b874d874a1ef71d33d67987f5 +T +closed f0b7d3b9a08a17081f312215bcb6cb778e02a9bb2de4b359b9e7aecff23d258b +U dan +Z 27d723c03ce07f3864426e28004404f2 diff --git a/manifest.uuid b/manifest.uuid index 47a4cb1d23..779006ab8f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e92d71c24c6039e7116f02fc5f39b2b87efcd3674ea828077c03d760bf49c45 \ No newline at end of file +559c2dd6724b2fc238760863d4be7132b591457e72ca5758fdd4002fbf7df4bc \ No newline at end of file diff --git a/test/releasetest_data.tcl b/test/releasetest_data.tcl index 6b6c2a8efe..e28719aacf 100644 --- a/test/releasetest_data.tcl +++ b/test/releasetest_data.tcl @@ -2,6 +2,22 @@ # This file contains Configuration data used by "wapptest.tcl" and # "releasetest.tcl". # +set USAGE { +$argv0 configurations + List available configurations. + +$argv0 script ?-msvc? CONFIGURATION TARGET + Given a configuration and make target, return a bash (or, if -msvc + is specified, batch) script to execute the test. The first argument + passed to the script must be a directory containing SQLite source code. + +$argv0 platforms + List available platforms. + +$argv0 tests ?-nodebug? PLATFORM + List tests in a specified platform. If the -nodebug switch is + specified, synthetic debug/ndebug configurations are omitted. +} # Omit comments (text between # and \n) in a long multi-line string. # @@ -158,8 +174,6 @@ array set ::Configs [strip_comments { -DHAVE_LOCALTIME_R=1 -DHAVE_PREAD=1 -DHAVE_PWRITE=1 - -DHAVE_USLEEP=1 - -DHAVE_USLEEP=1 -DHAVE_UTIME=1 -DSQLITE_DEFAULT_CACHE_SIZE=1000 -DSQLITE_DEFAULT_CKPTFULLFSYNC=1 @@ -172,7 +186,6 @@ array set ::Configs [strip_comments { -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS3_TOKENIZER=1 - if:os=="Darwin" -DSQLITE_ENABLE_LOCKING_STYLE=1 -DSQLITE_ENABLE_PERSIST_WAL=1 -DSQLITE_ENABLE_PURGEABLE_PCACHE=1 -DSQLITE_ENABLE_RTREE=1 @@ -212,7 +225,6 @@ array set ::Configs [strip_comments { "No-lookaside" { -DSQLITE_TEST_REALLOC_STRESS=1 -DSQLITE_OMIT_LOOKASIDE=1 - -DHAVE_USLEEP=1 } "Valgrind" { -DSQLITE_ENABLE_STAT4 @@ -234,6 +246,9 @@ array set ::Configs [strip_comments { FuzzFail1 {-O0} FuzzFail2 {-O0} }] +if {$tcl_platform(os)=="Darwin"} { + lappend Configs(Apple -DSQLITE_ENABLE_LOCKING_STYLE=1 +} array set ::Platforms [strip_comments { Linux-x86_64 { @@ -299,105 +314,6 @@ array set ::Platforms [strip_comments { } }] -proc make_test_suite {msvc withtcl name testtarget config} { - - # Tcl variable $opts is used to build up the value used to set the - # OPTS Makefile variable. Variable $cflags holds the value for - # CFLAGS. The makefile will pass OPTS to both gcc and lemon, but - # CFLAGS is only passed to gcc. - # - set makeOpts "" - set cflags [expr {$msvc ? "-Zi" : "-g"}] - set opts "" - set title ${name}($testtarget) - set configOpts $withtcl - set skip 0 - - regsub -all {#[^\n]*\n} $config \n config - foreach arg $config { - if {$skip} { - set skip 0 - continue - } - if {[regexp {^-[UD]} $arg]} { - lappend opts $arg - } elseif {[regexp {^[A-Z]+=} $arg]} { - lappend testtarget $arg - } elseif {[regexp {^if:([a-z]+)(.*)} $arg all key tail]} { - # Arguments of the form 'if:os=="Linux"' will cause the subsequent - # argument to be skipped if the $tcl_platform(os) is not "Linux", for - # example... - set skip [expr !(\$::tcl_platform($key)$tail)] - } elseif {[regexp {^--(enable|disable)-} $arg]} { - if {$msvc} { - if {$arg eq "--disable-amalgamation"} { - lappend makeOpts USE_AMALGAMATION=0 - continue - } - if {$arg eq "--disable-shared"} { - lappend makeOpts USE_CRT_DLL=0 DYNAMIC_SHELL=0 - continue - } - if {$arg eq "--enable-fts5"} { - lappend opts -DSQLITE_ENABLE_FTS5 - continue - } - if {$arg eq "--enable-json1"} { - lappend opts -DSQLITE_ENABLE_JSON1 - continue - } - if {$arg eq "--enable-shared"} { - lappend makeOpts USE_CRT_DLL=1 DYNAMIC_SHELL=1 - continue - } - } - lappend configOpts $arg - } else { - if {$msvc} { - if {$arg eq "-g"} { - lappend cflags -Zi - continue - } - if {[regexp -- {^-O(\d+)$} $arg all level]} then { - lappend makeOpts OPTIMIZATIONS=$level - continue - } - } - lappend cflags $arg - } - } - - # Disable sync to make testing faster. - # - lappend opts -DSQLITE_NO_SYNC=1 - - # Some configurations already set HAVE_USLEEP; in that case, skip it. - # - if {[lsearch -regexp $opts {^-DHAVE_USLEEP(?:=|$)}]==-1} { - lappend opts -DHAVE_USLEEP=1 - } - - # Add the define for this platform. - # - if {$::tcl_platform(platform)=="windows"} { - lappend opts -DSQLITE_OS_WIN=1 - } else { - lappend opts -DSQLITE_OS_UNIX=1 - } - - # Set the sub-directory to use. - # - set dir [string tolower [string map {- _ " " _ "(" _ ")" _} $name]] - - # Join option lists into strings, using space as delimiter. - # - set makeOpts [join $makeOpts " "] - set cflags [join $cflags " "] - set opts [join $opts " "] - - return [list $title $dir $configOpts $testtarget $makeOpts $cflags $opts] -} - # Configuration verification: Check that each entry in the list of configs # specified for each platforms exists. # @@ -410,3 +326,238 @@ foreach {key value} [array get ::Platforms] { } } +proc usage {} { + global argv0 + puts stderr [subst $::USAGE] + exit 1 +} + +proc is_prefix {p str min} { + set n [string length $p] + if {$n<$min} { return 0 } + if {[string range $str 0 [expr $n-1]]!=$p} { return 0 } + return 1 +} + +proc main_configurations {} { + foreach k [lsort [array names ::Configs]] { + puts $k + } +} + +proc main_platforms {} { + foreach k [lsort [array names ::Platforms]] { + puts "\"$k\"" + } +} + +proc main_script {args} { + set bMsvc 0 + set nArg [llength $args] + if {$nArg==3} { + if {![is_prefix [lindex $args 0] -msvc 2]} usage + set bMsvc 1 + } elseif {$nArg<2 || $nArg>3} { + usage + } + set config [lindex $args end-1] + set target [lindex $args end] + + set opts [list] ;# OPTS value + set cflags [expr {$bMsvc ? "-Zi" : "-g"}] ;# CFLAGS value + set makeOpts [list] ;# Extra args for [make] + set configOpts [list] ;# Extra args for [configure] + + if {$::tcl_platform(platform)=="windows"} { + lappend opts -DSQLITE_OS_WIN=1 + } else { + lappend opts -DSQLITE_OS_UNIX=1 + } + + # Figure out if this is a synthetic ndebug or debug configuration. + # + set bRemoveDebug 0 + if {[string match *-ndebug $config]} { + set bRemoveDebug 1 + set config [string range $config 0 end-7] + } + if {[string match *-debug $config]} { + lappend opts -DSQLITE_DEBUG + lappend opts -DSQLITE_EXTRA_IFNULLROW + set config [string range $config 0 end-6] + } + + # Ensure that the named configuration exists. + # + if {![info exists ::Configs($config)]} { + puts stderr "No such config: $config" + exit 1 + } + + # Loop through the parameters of the nominated configuration, updating + # $opts, $cflags, $makeOpts and $configOpts along the way. Rules are as + # follows: + # + # 1. If $bRemoveDebug is set and the parameter is -DSQLITE_DEBUG or + # -DSQLITE_DEBUG=1, discard it. + # + # 2. If the parameter begins with "-D", add it to $opts. + # + # 3. If the parameter begins with "--" add it to $configOpts. Unless + # this command is preparing a script for MSVC - then add an + # equivalent to $makeOpts or $opts. + # + # 4. If the parameter begins with "-" add it to $cflags. If in MSVC + # mode and the parameter is an -O option, instead add + # an OPTIMIZATIONS= switch to $makeOpts. + # + # 5. If none of the above apply, add the parameter to $makeOpts + # + foreach param $::Configs($config) { + if {$bRemoveDebug} { + if {$param=="-DSQLITE_DEBUG" || $param=="-DSQLITE_DEBUG=1" + || $param=="-DSQLITE_MEMDEBUG" || $param=="-DSQLITE_MEMDEBUG=1" + } { + continue + } + } + + if {[string range $param 0 1]=="-D"} { + lappend opts $param + continue + } + + if {[string range $param 0 1]=="--"} { + if {$bMsvc} { + switch -- $param { + --disable-amalgamation { + lappend makeOpts USE_AMALGAMATION=0 + } + --disable-shared { + lappend makeOpts USE_CRT_DLL=0 DYNAMIC_SHELL=0 + } + --enable-fts5 { + lappend opts -DSQLITE_ENABLE_FTS5 + } + --enable-json1 { + lappend opts -DSQLITE_ENABLE_JSON1 + } + --enable-shared { + lappend makeOpts USE_CRT_DLL=1 DYNAMIC_SHELL=1 + } + --enable-session { + lappend opts -DSQLITE_ENABLE_PREUPDATE_HOOK + lappend opts -DSQLITE_ENABLE_SESSION + } + default { + error "Cannot translate $param for MSVC" + } + } + } else { + lappend configOpts $param + } + + continue + } + + if {[string range $param 0 0]=="-"} { + if {$bMsvc && [regexp -- {^-O(\d+)$} $param -> level]} { + lappend makeOpts OPTIMIZATIONS=$level + } else { + lappend cflags $param + } + continue + } + + lappend makeOpts $param + } + + # Some configurations specify -DHAVE_USLEEP=0. For all others, add + # -DHAVE_USLEEP=1. + # + if {[lsearch $opts "-DHAVE_USLEEP=0"]<0} { + lappend opts -DHAVE_USLEEP=1 + } + + if {$bMsvc==0} { + puts {set -e} + puts {} + puts {if [ "$#" -ne 1 ] ; then} + puts { echo "Usage: $0 " } + puts { exit -1 } + puts {fi } + puts {SRCDIR=$1} + puts {} + puts "TCL=\"[::tcl::pkgconfig get libdir,install]\"" + + puts "\$SRCDIR/configure --with-tcl=\$TCL $configOpts" + puts {} + puts {OPTS=" -DSQLITE_NO_SYNC=1"} + foreach o $opts { + puts "OPTS=\"\$OPTS $o\"" + } + puts {} + puts "CFLAGS=\"$cflags\"" + puts {} + puts "make $target \"CFLAGS=\$CFLAGS\" \"OPTS=\$OPTS\" $makeOpts" + } else { + + puts {set SRCDIR=%1} + set makecmd "nmake /f %SRCDIR%\\Makefile.msc TOP=%SRCDIR% $target " + append makecmd "\"CFLAGS=$cflags\" \"OPTS=$opts\" $makeOpts" + + puts $makecmd + } +} + +proc main_tests {args} { + set bNodebug 0 + set nArg [llength $args] + if {$nArg==2} { + if {[is_prefix [lindex $args 0] -nodebug 2]} { + set bNodebug 1 + } elseif {[is_prefix [lindex $args 0] -debug 2]} { + set bNodebug 0 + } else usage + } elseif {$nArg==0 || $nArg>2} { + usage + } + set p [lindex $args end] + if {![info exists ::Platforms($p)]} { + puts stderr "No such platform: $p" + exit 1 + } + + foreach {config target} $::Platforms($p) { + puts "$config \"$target\"" + if {$bNodebug==0} { + if {$target!="checksymbols" && $target!="valgrindtest" + && $target!="fuzzoomtest" + } { + set iHas [string first SQLITE_DEBUG $::Configs($config)] + if {$iHas>=0} { + puts "$config-ndebug \"test\"" + } else { + puts "$config-debug \"test\"" + } + } + } + } +} + +if {[llength $argv]==0} { usage } +set cmd [lindex $argv 0] +set n [expr [llength $argv]-1] +if {[string match ${cmd}* configurations] && $n==0} { + main_configurations +} elseif {[string match ${cmd}* script]} { + main_script {*}[lrange $argv 1 end] +} elseif {[string match ${cmd}* platforms] && $n==0} { + main_platforms +} elseif {[string match ${cmd}* tests]} { + main_tests {*}[lrange $argv 1 end] +} else { + usage +} + + diff --git a/test/wapptest.tcl b/test/wapptest.tcl index 65bf98891c..dae2052ffc 100755 --- a/test/wapptest.tcl +++ b/test/wapptest.tcl @@ -5,10 +5,6 @@ exec wapptclsh "$0" ${1+"$@"} # package required wapp source [file join [file dirname [info script]] wapp.tcl] -# Read the data from the releasetest_data.tcl script. -# -source [file join [file dirname [info script]] releasetest_data.tcl] - # Variables set by the "control" form: # # G(platform) - User selected platform. @@ -69,6 +65,15 @@ proc wapptest_run {} { wapptest_output [string repeat * 70] } +proc releasetest_data {args} { + global G + set rtd [file join $G(srcdir) test releasetest_data.tcl] + set fd [open "|[info nameofexecutable] $rtd $args" r+] + set ret [read $fd] + close $fd + return $ret +} + # Generate the text for the box at the top of the UI. The current SQLite # version, according to fossil, along with a warning if there are # uncommitted changes in the checkout. @@ -108,7 +113,9 @@ proc set_test_array {} { global G if { $G(state)=="config" } { set G(test_array) [list] - foreach {config target} $::Platforms($G(platform)) { + set debug "-debug" + if {$G(debug)==0} { set debug "-nodebug"} + foreach {config target} [releasetest_data tests $debug $G(platform)] { # If using MSVC, do not run sanitize or valgrind tests. Or the # checksymbols test. @@ -136,22 +143,6 @@ proc set_test_array {} { } lappend G(test_array) [dict create config $config target $target] - - set exclude [list checksymbols valgrindtest fuzzoomtest] - if {$G(debug) && !($target in $exclude)} { - set debug_idx [lsearch -glob $::Configs($config) -DSQLITE_DEBUG*] - set xtarget $target - regsub -all {fulltest[a-z]*} $xtarget test xtarget - if {$debug_idx<0} { - lappend G(test_array) [ - dict create config $config-(Debug) target $xtarget - ] - } else { - lappend G(test_array) [ - dict create config $config-(NDebug) target $xtarget - ] - } - } } } } @@ -322,42 +313,28 @@ proc slave_fileevent {name} { # proc wapptest_slave_script {} { global G - set res { - proc readfile {filename} { - set fd [open $filename] - set data [read $fd] - close $fd - return $data - } + if {$G(msvc)==0} { + set dir [file join .. $G(srcdir)] + set res [subst -nocommands { + set rc [catch "exec sh wapptest_cmd.sh {$dir} >>& test.log" ] + exit [set rc] + }] + } else { + set dir [file nativename [file normalize $G(srcdir)]] + set dir [string map [list "\\" "\\\\"] $dir] + set res [subst -nocommands { + set rc [catch "exec wapptest_cmd.bat {$dir} >>& test.log" ] + exit [set rc] + }] } - if {$G(msvc)==0} { - append res { - set cfg [readfile wapptest_configure.sh] - set rc [catch { exec {*}$cfg >& test.log } msg] - if {$rc==0} { - set make [readfile wapptest_make.sh] - set rc [catch { exec {*}$make >>& test.log }] - } - } - } else { - append res { - set make [readfile wapptest_make.sh] - set rc [catch { exec {*}$make >>& test.log }] - } - } - - append res { exit $rc } - set res } # Launch a slave process to run a test. # -proc slave_launch { - name wtcl title dir configOpts testtarget makeOpts cflags opts -} { +proc slave_launch {name target dir} { global G catch { file mkdir $dir } msg @@ -366,28 +343,18 @@ proc slave_launch { } set G(test.$name.dir) $dir - # Write the configure command to wapptest_configure.sh. This file - # is empty if using MSVC - MSVC does not use configure. + # Write the test command to wapptest_cmd.sh|bat. # - set fd1 [open [file join $dir wapptest_configure.sh] w] - if {$G(msvc)==0} { - puts $fd1 "[file join .. $G(srcdir) configure] $wtcl $configOpts" + set ext sh + if {$G(msvc)} { set ext bat } + set fd1 [open [file join $dir wapptest_cmd.$ext] w] + if {$G(msvc)} { + puts $fd1 [releasetest_data script -msvc $name $target] + } else { + puts $fd1 [releasetest_data script $name $target] } close $fd1 - # Write the make command to wapptest_make.sh. Using nmake for MSVC and - # make for all other systems. - # - set makecmd "make" - if {$G(msvc)} { - set nativedir [file nativename $G(srcdir)] - set nativedir [string map [list "\\" "\\\\"] $nativedir] - set makecmd "nmake /f [file join $nativedir Makefile.msc] TOP=$nativedir" - } - set fd2 [open [file join $dir wapptest_make.sh] w] - puts $fd2 "$makecmd $makeOpts $testtarget \"CFLAGS=$cflags\" \"OPTS=$opts\"" - close $fd2 - # Write the wapptest_run.tcl script to the test directory. To run the # commands in the other two files. # @@ -448,30 +415,12 @@ proc do_some_stuff {} { } { set target [dict get $j target] + set dir [string tolower [string map {" " _ "-" _} $name]] set G(test.$name.start) [clock seconds] - set wtcl "" - if {$G(tcl)!=""} { set wtcl "--with-tcl=$G(tcl)" } + set G(test.$name.log) [file join $dir test.log] - # If this configuration is named -(Debug) or -(NDebug), - # then add or remove the SQLITE_DEBUG option from the base - # configuration before running the test. - if {[regexp -- {(.*)-(\(.*\))} $name -> head tail]} { - set opts $::Configs($head) - if {$tail=="(Debug)"} { - append opts " -DSQLITE_DEBUG=1 -DSQLITE_EXTRA_IFNULLROW=1" - } else { - regsub { *-DSQLITE_MEMDEBUG[^ ]* *} $opts { } opts - regsub { *-DSQLITE_DEBUG[^ ]* *} $opts { } opts - } - } else { - set opts $::Configs($name) - } + slave_launch $name $target $dir - set L [make_test_suite $G(msvc) $wtcl $name $target $opts] - set G(test.$name.log) [file join [lindex $L 1] test.log] - slave_launch $name $wtcl {*}$L - - set G(test.$name.log) [file join [lindex $L 1] test.log] incr nLaunch -1 } } @@ -517,7 +466,7 @@ proc generate_main_page {{extra {}}} { } # Build the "platform" select widget. - set lOpt [array names ::Platforms] + set lOpt [releasetest_data platforms] generate_select_widget Platform control_platform $lOpt $G(platform) # Build the "test" select widget. @@ -886,7 +835,7 @@ for {set i 0} {$i < [llength $lTestArg]} {incr i} { if {$i==[llength $lTestArg]-1} { wapptest_usage } incr i set arg [lindex $lTestArg $i] - set lPlatform [array names ::Platforms] + set lPlatform [releasetest_data platforms] if {[lsearch $lPlatform $arg]<0} { puts stderr "No such platform: $arg. Platforms are: $lPlatform" exit -1 From 71f059c88067736471c631cba95211c1bd100392 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 1 Aug 2019 10:58:46 +0000 Subject: [PATCH 067/221] Fix a problem in ALTER TABLE triggered by views or triggers that include the construction "ORDER BY true" or "ORDER BY false". FossilOrigin-Name: 8168021f9ab5fb8b4888257963c9ec68fd1dfeedaf6bba4b8e07438001d0be0f --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/resolve.c | 2 +- test/altertab3.test | 18 ++++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 0bde094361..a7f5ce451b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\s"releasetest_data.tcl"\sso\sthat\sit\sis\sa\sstandalone\sscript\sthat\sgenerates\ssh\sor\sbatch\sscripts\sto\srun\seach\stcl\stest\srun\sat\srelease\stime.\sUpdate\swapptest.tcl\sto\suse\sit. -D 2019-07-31T21:08:55.220 +C Fix\sa\sproblem\sin\sALTER\sTABLE\striggered\sby\sviews\sor\striggers\sthat\sinclude\sthe\sconstruction\s"ORDER\sBY\strue"\sor\s"ORDER\sBY\sfalse". +D 2019-08-01T10:58:46.890 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c edf29463177e9fa9dad5346e9adf482f24db9f180c693d0ba993e25dc797f6b7 +F src/resolve.c 6d57cfcb728fe1513fcbfb2bbd4192838b8cfe094616f72c7a54be55a550cc84 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1b8b5afee76e7d662b34c61705a638f7a6a20d5109515ca973c12343c84fb2d6 F src/shell.c.in 9c203a8c643fd638ab67a911e1fad1f51138c13a4d0ea3cedf7526fba5de60f2 @@ -633,7 +633,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 8e6db08ed61aab2ca2d2f19608ba9d4dcade669b057e581588d3aa0a6d642e27 +F test/altertab3.test 0f1e2801afb0b1b0b723ec016dda140aa5dc0d2d48846d5eead003fcd72828e8 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1838,8 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6e92d71c24c6039e7116f02fc5f39b2b87efcd3674ea828077c03d760bf49c45 -R 8d98008b874d874a1ef71d33d67987f5 -T +closed f0b7d3b9a08a17081f312215bcb6cb778e02a9bb2de4b359b9e7aecff23d258b +P 559c2dd6724b2fc238760863d4be7132b591457e72ca5758fdd4002fbf7df4bc +R 52d29a8e2c101f64ed5a3491f70b6fac U dan -Z 27d723c03ce07f3864426e28004404f2 +Z e08aba3f0c29a2bffdcb1f40ba9072b4 diff --git a/manifest.uuid b/manifest.uuid index 779006ab8f..0aa7e04cfb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -559c2dd6724b2fc238760863d4be7132b591457e72ca5758fdd4002fbf7df4bc \ No newline at end of file +8168021f9ab5fb8b4888257963c9ec68fd1dfeedaf6bba4b8e07438001d0be0f \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 672f1356d8..9e4099372f 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1278,7 +1278,7 @@ int sqlite3ResolveOrderGroupBy( ExprList *pEList; struct ExprList_item *pItem; - if( pOrderBy==0 || pParse->db->mallocFailed ) return 0; + if( pOrderBy==0 || pParse->db->mallocFailed || IN_RENAME_OBJECT ) return 0; if( pOrderBy->nExpr>db->aLimit[SQLITE_LIMIT_COLUMN] ){ sqlite3ErrorMsg(pParse, "too many terms in %s BY clause", zType); return 1; diff --git a/test/altertab3.test b/test/altertab3.test index 8a275ebc31..b17e9c0836 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -345,5 +345,23 @@ do_catchsql_test 14.2 { ALTER TABLE t1 RENAME TO t1x; } {1 {error in trigger AFTER: no such column: a}} +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 16.1 { + CREATE TABLE t1(x); + CREATE TRIGGER AFTER INSERT ON t1 BEGIN + SELECT (WITH t2 AS (WITH t3 AS (SELECT true) + SELECT * FROM t3 ORDER BY true COLLATE nocase) + SELECT 11); + + WITH t4 AS (SELECT * FROM t1) SELECT 33; + END; +} + +do_execsql_test 16.2 { + ALTER TABLE t1 RENAME TO t1x; +} + finish_test From 401593e348028071e0fd59753df046216a137ef9 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 1 Aug 2019 15:18:51 +0000 Subject: [PATCH 068/221] Add new release tests for windows to releasetest_data.tcl. FossilOrigin-Name: 1b330ec24c350c59f6d3779f6c0819fe95b89f4dfca5a1f2c22f22b5fe9cd087 --- manifest | 14 ++--- manifest.uuid | 2 +- test/releasetest_data.tcl | 123 +++++++++++++++++++++++++------------- test/wapptest.tcl | 8 +-- 4 files changed, 92 insertions(+), 55 deletions(-) diff --git a/manifest b/manifest index a7f5ce451b..b561811f52 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sALTER\sTABLE\striggered\sby\sviews\sor\striggers\sthat\sinclude\sthe\sconstruction\s"ORDER\sBY\strue"\sor\s"ORDER\sBY\sfalse". -D 2019-08-01T10:58:46.890 +C Add\snew\srelease\stests\sfor\swindows\sto\sreleasetest_data.tcl. +D 2019-08-01T15:18:51.658 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1245,7 +1245,7 @@ F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d F test/releasetest.tcl 968fc1e8fd23e113fb8a04379747f3a9f2c12d207b2de85aeff5a825962e1cd7 x -F test/releasetest_data.tcl 9dc6b01c986826a9e362bb8d1cc4289e558012dc618e98dff8b6f77dc472d129 +F test/releasetest_data.tcl 29b791054d86fbd7abca0a63c95b342d9af7b5f8768e905274dcb4f4be4599a5 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa @@ -1670,7 +1670,7 @@ F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec -F test/wapptest.tcl b02f882a545191375e7ea452d351e32bfa1225da5005d5c41a20a6c0c91e30c3 x +F test/wapptest.tcl 3090239c59379d41e1a0644feb6683082fdb86edfab0c668973f8003f22c0e5d x F test/where.test 0607caa5a1fbfe7b93b95705981b463a3a0408038f22ae6e9dc11b36902b0e95 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 559c2dd6724b2fc238760863d4be7132b591457e72ca5758fdd4002fbf7df4bc -R 52d29a8e2c101f64ed5a3491f70b6fac +P 8168021f9ab5fb8b4888257963c9ec68fd1dfeedaf6bba4b8e07438001d0be0f +R 068c68305578d308897576e75c286995 U dan -Z e08aba3f0c29a2bffdcb1f40ba9072b4 +Z ce2f09d0b267a958fe715ae4d7635761 diff --git a/manifest.uuid b/manifest.uuid index 0aa7e04cfb..d210a3a7af 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8168021f9ab5fb8b4888257963c9ec68fd1dfeedaf6bba4b8e07438001d0be0f \ No newline at end of file +1b330ec24c350c59f6d3779f6c0819fe95b89f4dfca5a1f2c22f22b5fe9cd087 \ No newline at end of file diff --git a/test/releasetest_data.tcl b/test/releasetest_data.tcl index e28719aacf..7782a7a8a8 100644 --- a/test/releasetest_data.tcl +++ b/test/releasetest_data.tcl @@ -1,22 +1,42 @@ - -# This file contains Configuration data used by "wapptest.tcl" and -# "releasetest.tcl". +# 2019 August 01 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file implements a program that produces scripts (either shell scripts +# or batch files) to implement a particular test that is part of the SQLite +# release testing procedure. For example, to run veryquick.test with a +# specified set of -D compiler switches. +# +# A "configuration" is a set of options passed to [./configure] and [make] +# to build the SQLite library in a particular fashion. A "platform" is a +# list of tests; most platforms are named after the hardware/OS platform +# that the tests will be run on as part of the release procedure. Each +# "test" is a combination of a configuration and a makefile target (e.g. +# "fulltest"). The program may be invoked as follows: # set USAGE { -$argv0 configurations - List available configurations. +$argv0 platforms + List available platforms. + +$argv0 tests ?-nodebug? PLATFORM + List tests in a specified platform. If the -nodebug switch is + specified, synthetic debug/ndebug configurations are omitted. Each + test is a combination of a configuration and a makefile target. $argv0 script ?-msvc? CONFIGURATION TARGET Given a configuration and make target, return a bash (or, if -msvc is specified, batch) script to execute the test. The first argument passed to the script must be a directory containing SQLite source code. -$argv0 platforms - List available platforms. - -$argv0 tests ?-nodebug? PLATFORM - List tests in a specified platform. If the -nodebug switch is - specified, synthetic debug/ndebug configurations are omitted. +$argv0 configurations + List available configurations. } # Omit comments (text between # and \n) in a long multi-line string. @@ -234,15 +254,24 @@ array set ::Configs [strip_comments { --enable-json1 } + "Windows-Memdebug" { + MEMDEBUG=1 + DEBUG=3 + } + "Windows-Win32Heap" { + WIN32HEAP=1 + DEBUG=4 + } + # The next group of configurations are used only by the # Failure-Detection platform. They are all the same, but we need # different names for them all so that they results appear in separate # subdirectories. # - Fail0 {-O0} - Fail2 {-O0} - Fail3 {-O0} - Fail4 {-O0} + Fail0 {-O0} + Fail2 {-O0} + Fail3 {-O0} + Fail4 {-O0} FuzzFail1 {-O0} FuzzFail2 {-O0} }] @@ -252,7 +281,7 @@ if {$tcl_platform(os)=="Darwin"} { array set ::Platforms [strip_comments { Linux-x86_64 { - "Check-Symbols" checksymbols + "Check-Symbols*" checksymbols "Fast-One" "fuzztest test" "Debug-One" "mptest test" "Have-Not" test @@ -268,7 +297,7 @@ array set ::Platforms [strip_comments { "Sanitize" {QUICKTEST_OMIT=func4.test,nan.test test} "Device-One" fulltest "Default" "threadtest fulltest" - "Valgrind" valgrindtest + "Valgrind*" valgrindtest } Linux-i686 { "Devkit" test @@ -291,11 +320,15 @@ array set ::Platforms [strip_comments { "Windows NT-intel" { "Stdcall" test "Have-Not" test + "Windows-Memdebug*" test + "Windows-Win32Heap*" test "Default" "mptest fulltestonly" } "Windows NT-amd64" { "Stdcall" test "Have-Not" test + "Windows-Memdebug*" test + "Windows-Win32Heap*" test "Default" "mptest fulltestonly" } @@ -304,13 +337,13 @@ array set ::Platforms [strip_comments { # correctly identifies failures. # Failure-Detection { - Fail0 "TEST_FAILURE=0 test" - Sanitize "TEST_FAILURE=1 test" - Fail2 "TEST_FAILURE=2 valgrindtest" - Fail3 "TEST_FAILURE=3 valgrindtest" - Fail4 "TEST_FAILURE=4 test" - FuzzFail1 "TEST_FAILURE=5 test" - FuzzFail2 "TEST_FAILURE=5 valgrindtest" + Fail0* "TEST_FAILURE=0 test" + Sanitize* "TEST_FAILURE=1 test" + Fail2* "TEST_FAILURE=2 valgrindtest" + Fail3* "TEST_FAILURE=3 valgrindtest" + Fail4* "TEST_FAILURE=4 test" + FuzzFail1* "TEST_FAILURE=5 test" + FuzzFail2* "TEST_FAILURE=5 valgrindtest" } }] @@ -319,6 +352,9 @@ array set ::Platforms [strip_comments { # foreach {key value} [array get ::Platforms] { foreach {v t} $value { + if {[string range $v end end]=="*"} { + set v [string range $v 0 end-1] + } if {0==[info exists ::Configs($v)]} { puts stderr "No such configuration: \"$v\"" exit -1 @@ -368,7 +404,7 @@ proc main_script {args} { set makeOpts [list] ;# Extra args for [make] set configOpts [list] ;# Extra args for [configure] - if {$::tcl_platform(platform)=="windows"} { + if {$::tcl_platform(platform)=="windows" || $bMsvc} { lappend opts -DSQLITE_OS_WIN=1 } else { lappend opts -DSQLITE_OS_UNIX=1 @@ -398,22 +434,26 @@ proc main_script {args} { # $opts, $cflags, $makeOpts and $configOpts along the way. Rules are as # follows: # - # 1. If $bRemoveDebug is set and the parameter is -DSQLITE_DEBUG or - # -DSQLITE_DEBUG=1, discard it. + # 1. If the parameter begins with a "*", discard it. # - # 2. If the parameter begins with "-D", add it to $opts. + # 2. If $bRemoveDebug is set and the parameter is -DSQLITE_DEBUG or + # -DSQLITE_DEBUG=1, discard it # - # 3. If the parameter begins with "--" add it to $configOpts. Unless + # 3. If the parameter begins with "-D", add it to $opts. + # + # 4. If the parameter begins with "--" add it to $configOpts. Unless # this command is preparing a script for MSVC - then add an # equivalent to $makeOpts or $opts. # - # 4. If the parameter begins with "-" add it to $cflags. If in MSVC + # 5. If the parameter begins with "-" add it to $cflags. If in MSVC # mode and the parameter is an -O option, instead add # an OPTIMIZATIONS= switch to $makeOpts. # - # 5. If none of the above apply, add the parameter to $makeOpts + # 6. If none of the above apply, add the parameter to $makeOpts # foreach param $::Configs($config) { + if {[string range $param 0 0]=="*"} continue + if {$bRemoveDebug} { if {$param=="-DSQLITE_DEBUG" || $param=="-DSQLITE_DEBUG=1" || $param=="-DSQLITE_MEMDEBUG" || $param=="-DSQLITE_MEMDEBUG=1" @@ -529,17 +569,18 @@ proc main_tests {args} { } foreach {config target} $::Platforms($p) { + set bNosynthetic 0 + if {[string range $config end end]=="*"} { + set bNosynthetic 1 + set config [string range $config 0 end-1] + } puts "$config \"$target\"" - if {$bNodebug==0} { - if {$target!="checksymbols" && $target!="valgrindtest" - && $target!="fuzzoomtest" - } { - set iHas [string first SQLITE_DEBUG $::Configs($config)] - if {$iHas>=0} { - puts "$config-ndebug \"test\"" - } else { - puts "$config-debug \"test\"" - } + if {$bNodebug==0 && $bNosynthetic==0} { + set iHas [string first SQLITE_DEBUG $::Configs($config)] + if {$iHas>=0} { + puts "$config-ndebug \"test\"" + } else { + puts "$config-debug \"test\"" } } } diff --git a/test/wapptest.tcl b/test/wapptest.tcl index dae2052ffc..5753455e2b 100755 --- a/test/wapptest.tcl +++ b/test/wapptest.tcl @@ -304,12 +304,8 @@ proc slave_fileevent {name} { } # Return the contents of the "slave script" - the script run by slave -# processes to actually perform the test. It does two things: -# -# 1. Reads and [exec]s the contents of file wapptest_configure.sh. -# 2. Reads and [exec]s the contents of file wapptest_make.sh. -# -# Step 1 is omitted if the test uses MSVC (which does not use configure). +# processes to actually perform the test. All it does is execute the +# test script already written to disk (wapptest_cmd.sh or wapptest_cmd.bat). # proc wapptest_slave_script {} { global G From d744ee0b50e64348a0ba605eb8270cd2363e8dd3 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 1 Aug 2019 22:48:45 +0000 Subject: [PATCH 069/221] The sqlite3_set_authorizer() interface should only expire prepared statements when it is setting a new authorizer, not when clearing the authorizer. And statements that are running when sqlite3_set_authorizer() is invoked should be allowed to continue running to completion. FossilOrigin-Name: 961e2f08c35238bcb1d32430d16451a96807b2c4bbb194ee621128dd09cd3981 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/auth.c | 2 +- test/schema.test | 20 ++++++++++++++++---- 4 files changed, 26 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index b561811f52..8d31d42710 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\snew\srelease\stests\sfor\swindows\sto\sreleasetest_data.tcl. -D 2019-08-01T15:18:51.658 +C The\ssqlite3_set_authorizer()\sinterface\sshould\sonly\sexpire\sprepared\sstatements\nwhen\sit\sis\ssetting\sa\snew\sauthorizer,\snot\swhen\sclearing\sthe\sauthorizer.\s\sAnd\nstatements\sthat\sare\srunning\swhen\ssqlite3_set_authorizer()\sis\sinvoked\sshould\sbe\nallowed\sto\scontinue\srunning\sto\scompletion. +D 2019-08-01T22:48:45.195 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -460,7 +460,7 @@ F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c c1b5e5639b88dcc146db326315f2dea4f7f1c599e524eeb421d544927a0b1e86 F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c -F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df +F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 @@ -1275,7 +1275,7 @@ F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7 F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 F test/scanstatus.test 874e35011779b07725a47dbf1dd6282b0ca04af7e028fb0b534ee544b571be42 -F test/schema.test 8f7999be894260f151adf15c2c7540f1c6d6a481 +F test/schema.test 5dd11c96ba64744de955315d2e4f8992e447533690153b93377dffb2a5ef5431 F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 F test/schema4.test 3b26c9fa916abb6dadf894137adcf41b7796f7b9 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8168021f9ab5fb8b4888257963c9ec68fd1dfeedaf6bba4b8e07438001d0be0f -R 068c68305578d308897576e75c286995 -U dan -Z ce2f09d0b267a958fe715ae4d7635761 +P 1b330ec24c350c59f6d3779f6c0819fe95b89f4dfca5a1f2c22f22b5fe9cd087 +R 23b8e4dd44ae93c74678bbe4b9f9949a +U drh +Z ae2bdc1746bd01e035fa2c38a9fb31b7 diff --git a/manifest.uuid b/manifest.uuid index d210a3a7af..7c1ec5ec82 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1b330ec24c350c59f6d3779f6c0819fe95b89f4dfca5a1f2c22f22b5fe9cd087 \ No newline at end of file +961e2f08c35238bcb1d32430d16451a96807b2c4bbb194ee621128dd09cd3981 \ No newline at end of file diff --git a/src/auth.c b/src/auth.c index 6fcdce251d..40673d5ea4 100644 --- a/src/auth.c +++ b/src/auth.c @@ -78,7 +78,7 @@ int sqlite3_set_authorizer( sqlite3_mutex_enter(db->mutex); db->xAuth = (sqlite3_xauth)xAuth; db->pAuthArg = pArg; - sqlite3ExpirePreparedStatements(db, 0); + if( db->xAuth ) sqlite3ExpirePreparedStatements(db, 1); sqlite3_mutex_leave(db->mutex); return SQLITE_OK; } diff --git a/test/schema.test b/test/schema.test index afca39ed60..c7daef20ba 100644 --- a/test/schema.test +++ b/test/schema.test @@ -209,17 +209,29 @@ ifcapable utf16 { #--------------------------------------------------------------------- # Tests 8.1 and 8.2 check that prepared statements are invalidated when -# the authorization function is set. +# the authorization function is set to a non-null function. Tests 8.11 +# and 8.12 verify that no invalidations occur when the authorizer is +# cleared. # ifcapable auth { + proc noop_auth {args} {return SQLITE_OK} do_test schema-8.1 { + set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL] + db auth noop_auth + sqlite3_step $::STMT + } {SQLITE_ERROR} + do_test schema-8.2 { + sqlite3_finalize $::STMT + } {SQLITE_SCHEMA} + do_test schema-8.11 { set ::STMT [sqlite3_prepare $::DB {SELECT * FROM sqlite_master} -1 TAIL] db auth {} sqlite3_step $::STMT - } {SQLITE_ERROR} - do_test schema-8.3 { + } {SQLITE_ROW} + do_test schema-8.12 { sqlite3_finalize $::STMT - } {SQLITE_SCHEMA} + } {SQLITE_OK} + } #--------------------------------------------------------------------- From ddd7421c9170317294e69a4287deda996a3cd3dc Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 2 Aug 2019 18:43:59 +0000 Subject: [PATCH 070/221] If a query like "SELECT min(a), b FROM t1" visits no rows where "a" is not null, extract a value for "b" from one of the rows where "a" is null. Possible fix for ticket [41866dc37]. FossilOrigin-Name: a7277ed0623dccdbf775ae6127611d6bc6e150f6942a048ab4281e5136c0e98d --- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/wherecode.c | 19 +++++++++++++++++++ test/minmax4.test | 30 +++++++++++++++++++++++++++++- 4 files changed, 60 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 8d31d42710..9d4a452caa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\ssqlite3_set_authorizer()\sinterface\sshould\sonly\sexpire\sprepared\sstatements\nwhen\sit\sis\ssetting\sa\snew\sauthorizer,\snot\swhen\sclearing\sthe\sauthorizer.\s\sAnd\nstatements\sthat\sare\srunning\swhen\ssqlite3_set_authorizer()\sis\sinvoked\sshould\sbe\nallowed\sto\scontinue\srunning\sto\scompletion. -D 2019-08-01T22:48:45.195 +C If\sa\squery\slike\s"SELECT\smin(a),\sb\sFROM\st1"\svisits\sno\srows\swhere\s"a"\sis\snot\snull,\sextract\sa\svalue\sfor\s"b"\sfrom\sone\sof\sthe\srows\swhere\s"a"\sis\snull.\sPossible\sfix\sfor\sticket\s[41866dc37]. +D 2019-08-02T18:43:59.348 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 01b68cfc7f8a6eba6a0a10b24b7ab3ec11f7244830791560119e14680c756078 F src/whereInt.h 6fab4b6f7e4ae716f112ee09cd1343fc6dde3d4a1831feabc6b3ed3b54b8eef3 -F src/wherecode.c 37a1004237d630d785c47bba2290eac652a7a8b0047518eba3cb7c808b604c4a +F src/wherecode.c 52451ce3673e1d737b2d9f0a05ff336038e9dd2dcfba221d43e06b51c1fe514e F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 F src/window.c 7728ba7a3d44084a44eefb60464a88fb2ff035eb20cdeb1160ae65ac3c0be6b9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1151,7 +1151,7 @@ F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063 F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 -F test/minmax4.test 936941484ebdceb8adec7c86b6cd9b6e5e897c1f +F test/minmax4.test be0b227f574a20871bdd4258d4a26620f263e4cd231d2eec0259b8980e7408b4 F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d @@ -1838,7 +1838,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 1b330ec24c350c59f6d3779f6c0819fe95b89f4dfca5a1f2c22f22b5fe9cd087 -R 23b8e4dd44ae93c74678bbe4b9f9949a -U drh -Z ae2bdc1746bd01e035fa2c38a9fb31b7 +P 961e2f08c35238bcb1d32430d16451a96807b2c4bbb194ee621128dd09cd3981 +R 967b7339813b309eb9b996030fc19505 +T *branch * tkt-41866dc37 +T *sym-tkt-41866dc37 * +T -sym-trunk * +U dan +Z 5a050a5929e904750046b34f5a015f7b diff --git a/manifest.uuid b/manifest.uuid index 7c1ec5ec82..219e64d6b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -961e2f08c35238bcb1d32430d16451a96807b2c4bbb194ee621128dd09cd3981 \ No newline at end of file +a7277ed0623dccdbf775ae6127611d6bc6e150f6942a048ab4281e5136c0e98d \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index a625448459..6152f7c359 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1694,6 +1694,25 @@ Bitmask sqlite3WhereCodeOneLoopStart( VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + + if( bSeekPastNull && (pLoop->wsFlags & WHERE_TOP_LIMIT)==0 ){ + /* If bSeekPastNull is set only to skip past the NULL values for + ** a query like "SELECT min(a), b FROM t1", then add code so that + ** if there are no rows with (a IS NOT NULL), then do the seek + ** without jumping past NULLs instead. This allows the code in + ** select.c to pick a value for "b" in the above query. */ + assert( startEq==0 && (op==OP_SeekGT || op==OP_SeekLT) ); + assert( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 && pWInfo->nOBSat>0 ); + sqlite3VdbeChangeP2(v, -1, sqlite3VdbeCurrentAddr(v)+1); + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + + op = aStartOp[(start_constraints<<2) + (1<<1) + bRev]; + assert( op!=0 ); + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + } } /* Load the value for the inequality constraint at the end of the diff --git a/test/minmax4.test b/test/minmax4.test index 8063538bfd..11d747a1cb 100644 --- a/test/minmax4.test +++ b/test/minmax4.test @@ -19,6 +19,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix minmax4 ifcapable !compound { finish_test @@ -148,6 +149,33 @@ do_test minmax4-2.7 { } } {1 1 {} 2 2 2 3 3 5 5} - +#------------------------------------------------------------------------- +foreach {tn sql} { + 1 { CREATE INDEX i1 ON t1(a) } + 2 { CREATE INDEX i1 ON t1(a DESC) } + 3 { } +} { + reset_db + do_execsql_test 3.$tn.0 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(NULL, 1); + } + execsql $sql + do_execsql_test 3.$tn.1 { + SELECT min(a), b FROM t1; + } {{} 1} + do_execsql_test 3.$tn.2 { + SELECT min(a), b FROM t1 WHERE a<50; + } {{} {}} + do_execsql_test 3.$tn.3 { + INSERT INTO t1 VALUES(2, 2); + } + do_execsql_test 3.$tn.4 { + SELECT min(a), b FROM t1; + } {2 2} + do_execsql_test 3.$tn.5 { + SELECT min(a), b FROM t1 WHERE a<50; + } {2 2} +} finish_test From ade54d68ee770d74ff98716f3eae9ecb2512da54 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 2 Aug 2019 20:45:04 +0000 Subject: [PATCH 071/221] Add the SQLITE_TESTCTRL_PRNG_SEED test control. FossilOrigin-Name: 3ac5723164ae801e209ce525a5d94692767136f9d06be2a84883dcea677d02da --- manifest | 30 ++++++++++++++++-------------- manifest.uuid | 2 +- src/global.c | 1 + src/main.c | 12 ++++++------ src/os.c | 10 +++++++++- src/shell.c.in | 3 ++- src/sqlite.h.in | 5 +++-- src/sqliteInt.h | 1 + src/test1.c | 24 +++++++++++++++++++++++- 9 files changed, 62 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index bfde79bbcc..47da76a216 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sa\squery\slike\s"SELECT\smin(a),\sb\sFROM\st1"\svisits\sno\srows\swhere\s"a"\sis\snot\snull,\sextract\sa\svalue\sfor\s"b"\sfrom\sone\sof\sthe\srows\swhere\s"a"\sis\snull.\sFix\sfor\sticket\s[41866dc37]. -D 2019-08-02T19:40:01.648 +C Add\sthe\sSQLITE_TESTCTRL_PRNG_SEED\stest\scontrol. +D 2019-08-02T20:45:04.317 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/expr.c b49492392bf93b62dc508b31e0ec32186118df439cde9e2f9ebc98aab54e9fa7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c ab1971900477e93b6aaabf160d2d1c79c06edd9227441ccfaf0de7e7431d7f48 F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 -F src/global.c 1e942b1e6fb6a2a15e6015bda72be0abefc4b1339a8640a47b1b71b7f317917b +F src/global.c 0c9c45844ae182b458610e4d427834deffcdcd45fbc8c957f6ad82051b8f161f F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da @@ -487,7 +487,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c f20925c2c08144442dabeb73dcd0f5026f5f085d827f3d5635f7c45e5d195320 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c 591a0084b1a6b0ed6741f77181bd1a630ca10bb460420f00e8c11809da7df5b9 +F src/main.c e30b0b22666f7e1e0bb6c8d051d5201bd85419eca8c2423ffe7b1bce6364653a F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -503,7 +503,7 @@ F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58 F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 -F src/os.c 8aeb0b0f40f8f5b0da03fe49706695adaf42d2f516ab95abc72e86c245e119de +F src/os.c 033039bb9b6da7d163c1806ba0d4dc0be9748ed78d8490c018bfd2346b774c1e F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 @@ -524,16 +524,16 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 6d57cfcb728fe1513fcbfb2bbd4192838b8cfe094616f72c7a54be55a550cc84 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1b8b5afee76e7d662b34c61705a638f7a6a20d5109515ca973c12343c84fb2d6 -F src/shell.c.in 9c203a8c643fd638ab67a911e1fad1f51138c13a4d0ea3cedf7526fba5de60f2 -F src/sqlite.h.in 83ebc8ab1a2e82d92214006ea2c15bf8a0604f3fac2c31dd9ce9021f568c71f2 +F src/shell.c.in 5ab94c68a555b573a28e2ccdd811cc9ab8e0dd79274dad52567056fa6830d061 +F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 122621557d07c6102d5a41897fe50eabe9767ca7db8ded6746de0446225d03d3 +F src/sqliteInt.h c4e5e98e0eddb78a3594603f57dd720f63660add5bd117f6e55ce39120313036 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c 118945bc3c2aabe4528ef2ddb412868e29f5addfb76252b77d441e7b0d67043c +F src/test1.c fd8a05277bebf42cea5d8c8d1f272cf8dc69e838bbc4f14f547b9810f2d689fb F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -1838,8 +1838,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 961e2f08c35238bcb1d32430d16451a96807b2c4bbb194ee621128dd09cd3981 a7277ed0623dccdbf775ae6127611d6bc6e150f6942a048ab4281e5136c0e98d -R 967b7339813b309eb9b996030fc19505 -T +closed a7277ed0623dccdbf775ae6127611d6bc6e150f6942a048ab4281e5136c0e98d -U dan -Z d74453ebc37fff244bf6e5db95a7c365 +P faaaae4940b5f4f70e4988ad5b45582410b381ace0031e6abcde0b9217c06796 +R cc4f195b7834252acf2666d4e1ada0cd +T *branch * prng-seed-test-control +T *sym-prng-seed-test-control * +T -sym-trunk * +U drh +Z 787ec1171fdf2c223779ee565290b12f diff --git a/manifest.uuid b/manifest.uuid index 686ba2ca04..31a61510ed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -faaaae4940b5f4f70e4988ad5b45582410b381ace0031e6abcde0b9217c06796 \ No newline at end of file +3ac5723164ae801e209ce525a5d94692767136f9d06be2a84883dcea677d02da \ No newline at end of file diff --git a/src/global.c b/src/global.c index b512e6f0bb..79b1d427a4 100644 --- a/src/global.c +++ b/src/global.c @@ -260,6 +260,7 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* bInternalFunctions */ 0x7ffffffe, /* iOnceResetThreshold */ SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ + 0, /* iPrngSeed */ }; /* diff --git a/src/main.c b/src/main.c index 6127006275..81a76aabce 100644 --- a/src/main.c +++ b/src/main.c @@ -3824,13 +3824,13 @@ int sqlite3_test_control(int op, ...){ break; } - /* - ** Reset the PRNG back to its uninitialized state. The next call - ** to sqlite3_randomness() will reseed the PRNG using a single call - ** to the xRandomness method of the default VFS. + /* sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, unsigned int); + ** + ** Use the integer value as the seed for SQLite's internal PRNG. + ** rather than the VFS xRandomness() function. */ - case SQLITE_TESTCTRL_PRNG_RESET: { - sqlite3_randomness(0,0); + case SQLITE_TESTCTRL_PRNG_SEED: { + sqlite3Config.iPrngSeed = va_arg(ap, unsigned int); break; } diff --git a/src/os.c b/src/os.c index 54b7fcfb29..08701028ba 100644 --- a/src/os.c +++ b/src/os.c @@ -258,7 +258,15 @@ void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ } #endif /* SQLITE_OMIT_LOAD_EXTENSION */ int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ - return pVfs->xRandomness(pVfs, nByte, zBufOut); + if( sqlite3Config.iPrngSeed ){ + memset(zBufOut, 0, nByte); + if( nByte>sizeof(unsigned) ) nByte = sizeof(unsigned int); + memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); + return SQLITE_OK; + }else{ + return pVfs->xRandomness(pVfs, nByte, zBufOut); + } + } int sqlite3OsSleep(sqlite3_vfs *pVfs, int nMicro){ return pVfs->xSleep(pVfs, nMicro); diff --git a/src/shell.c.in b/src/shell.c.in index c5ca9242cd..fa82cf2ad3 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9150,9 +9150,9 @@ static int do_meta_command(char *zLine, ShellState *p){ { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" }, #endif { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " }, - { "prng_reset", SQLITE_TESTCTRL_PRNG_RESET, "" }, { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, + { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED" }, { "reserve", SQLITE_TESTCTRL_RESERVE, "BYTES-OF-RESERVE" }, }; int testctrl = -1; @@ -9227,6 +9227,7 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(int, uint) */ case SQLITE_TESTCTRL_PENDING_BYTE: + case SQLITE_TESTCTRL_PRNG_SEED: if( nArg==3 ){ unsigned int opt = (unsigned int)integerValue(azArg[2]); rc2 = sqlite3_test_control(testctrl, opt); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 4dd14ac17c..5b3e5a15f3 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -7335,7 +7335,7 @@ int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_FIRST 5 #define SQLITE_TESTCTRL_PRNG_SAVE 5 #define SQLITE_TESTCTRL_PRNG_RESTORE 6 -#define SQLITE_TESTCTRL_PRNG_RESET 7 +#define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */ #define SQLITE_TESTCTRL_BITVEC_TEST 8 #define SQLITE_TESTCTRL_FAULT_INSTALL 9 #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10 @@ -7358,7 +7358,8 @@ int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_IMPOSTER 25 #define SQLITE_TESTCTRL_PARSER_COVERAGE 26 #define SQLITE_TESTCTRL_RESULT_INTREAL 27 -#define SQLITE_TESTCTRL_LAST 27 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_PRNG_SEED 28 +#define SQLITE_TESTCTRL_LAST 28 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b41ba4ed8f..166c46514a 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3464,6 +3464,7 @@ struct Sqlite3Config { int bInternalFunctions; /* Internal SQL functions are visible */ int iOnceResetThreshold; /* When to reset OP_Once counters */ u32 szSorterRef; /* Min size in bytes to use sorter-refs */ + unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ }; /* diff --git a/src/test1.c b/src/test1.c index 02a7aad9fa..c582bb3a02 100644 --- a/src/test1.c +++ b/src/test1.c @@ -6373,7 +6373,28 @@ static int SQLITE_TCLAPI reset_prng_state( int objc, /* Number of arguments */ Tcl_Obj *CONST objv[] /* Command arguments */ ){ - sqlite3_test_control(SQLITE_TESTCTRL_PRNG_RESET); + sqlite3_randomness(0,0); + return TCL_OK; +} +/* +** tclcmd: prng_seed INT +** +** Establish TEXT as the seed for the PRNG +*/ +static int SQLITE_TCLAPI prng_seed( + ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ + int objc, /* Number of arguments */ + Tcl_Obj *CONST objv[] /* Command arguments */ +){ + unsigned int i; + if( objc!=2 ){ + Tcl_WrongNumArgs(interp, 1, objv, "PRNG-SEED-TEXT"); + return TCL_ERROR; + } + if( Tcl_GetIntFromObj(objv[0],&i) ) return TCL_ERROR; + sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, (unsigned int)i); + sqlite3_randomness(0,0); return TCL_OK; } @@ -7923,6 +7944,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "save_prng_state", save_prng_state, 0 }, { "restore_prng_state", restore_prng_state, 0 }, { "reset_prng_state", reset_prng_state, 0 }, + { "prng_seed", prng_seed, 0 }, { "database_never_corrupt", database_never_corrupt, 0}, { "database_may_be_corrupt", database_may_be_corrupt, 0}, { "optimization_control", optimization_control,0}, From e6e96b1b45b28a1fdb96af673604bb33dc9f5658 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 2 Aug 2019 21:03:24 +0000 Subject: [PATCH 072/221] Fixes to the PRNG_SEED pragma idea. FossilOrigin-Name: c71098409c98af8360f8f28b9238a12ec764018a5782e8ff03fdf5db54031d6e --- manifest | 19 ++++++++----------- manifest.uuid | 2 +- src/test1.c | 2 +- test/dbfuzz2.c | 4 ++++ test/fuzzcheck.c | 4 ++++ 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 47da76a216..0b52767182 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_TESTCTRL_PRNG_SEED\stest\scontrol. -D 2019-08-02T20:45:04.317 +C Fixes\sto\sthe\sPRNG_SEED\spragma\sidea. +D 2019-08-02T21:03:24.230 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c fd8a05277bebf42cea5d8c8d1f272cf8dc69e838bbc4f14f547b9810f2d689fb +F src/test1.c 2139262641607bf3b5fc8d651b344233695f622bf477b4cbb55182b93251fe6b F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -797,7 +797,7 @@ F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test e32d14465f1c77712896fda6a1ccc0f037b481c191c1696a9c44f6c9e4964faf F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c b93db9056ad057733463ba333f89d2d195a95155805065c5962422955d7fb011 +F test/dbfuzz2.c 2a7adaa5716f3d8f1928dd9fc1a72dfe1a9437c6e763e2cb953f27576387ae48 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1004,7 +1004,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c d0e76671ea5c3a766768b65d69f7d755aa614a98c17b84fa4496f4cd2e2fa515 +F test/fuzzcheck.c 3f07fef9ef333ffd06b77e68f698b1daed9339b69308a8d83a9d64e30fa3b43a F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1838,10 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P faaaae4940b5f4f70e4988ad5b45582410b381ace0031e6abcde0b9217c06796 -R cc4f195b7834252acf2666d4e1ada0cd -T *branch * prng-seed-test-control -T *sym-prng-seed-test-control * -T -sym-trunk * +P 3ac5723164ae801e209ce525a5d94692767136f9d06be2a84883dcea677d02da +R 7c1b13735fcb01fd3eed4bb028d38797 U drh -Z 787ec1171fdf2c223779ee565290b12f +Z db22194a3a99057abc0b1999051a8fec diff --git a/manifest.uuid b/manifest.uuid index 31a61510ed..ca8bda57c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3ac5723164ae801e209ce525a5d94692767136f9d06be2a84883dcea677d02da \ No newline at end of file +c71098409c98af8360f8f28b9238a12ec764018a5782e8ff03fdf5db54031d6e \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index c582bb3a02..51eb2cc361 100644 --- a/src/test1.c +++ b/src/test1.c @@ -6392,7 +6392,7 @@ static int SQLITE_TCLAPI prng_seed( Tcl_WrongNumArgs(interp, 1, objv, "PRNG-SEED-TEXT"); return TCL_ERROR; } - if( Tcl_GetIntFromObj(objv[0],&i) ) return TCL_ERROR; + if( Tcl_GetIntFromObj(interp,objv[0],&i) ) return TCL_ERROR; sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, (unsigned int)i); sqlite3_randomness(0,0); return TCL_OK; diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 025204dcf9..3f3a477387 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -211,6 +211,10 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ if( mxCb>0 ){ sqlite3_progress_handler(db, 10, progress_handler, 0); } +#ifdef SQLITE_TESTCTRL_PRNG_SEED + sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, 0); + sqlite3_randomness(0,0); +#endif for(i=0; i=1 ){ printf("%s\n", azSql[i]); diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 4096f845d1..50079cf499 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1805,6 +1805,10 @@ int main(int argc, char **argv){ sqlite3_progress_handler(db, 100000, progressHandler, &vdbeLimitFlag); } +#endif +#ifdef SQLITE_TESTCTRL_PRNG_SEED + sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, 0); + sqlite3_randomness(0,0); #endif do{ runSql(db, (char*)pSql->a, runFlags); From 2e6d83bc498c7f3c49c72ac96887228336966db3 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 3 Aug 2019 01:39:20 +0000 Subject: [PATCH 073/221] Give the SQLITE_TESTCTRL_PRNG_SEED two arguments. The second argument if not NULL is a pointer to a database connection which seeds the connection from its schema cookie. In this way, fuzzers can control the PRNG seed. FossilOrigin-Name: 49aa34480622cce4d7a72c59d9cfa8336886387acec8ee15b72f295ea1a52d8c --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/btree.c | 2 +- src/main.c | 29 +++++++++++++++++++++++++---- src/os.c | 2 +- src/shell.c.in | 20 ++++++++++++++++++-- src/test1.c | 27 ++++++++++++++++++++------- test/dbfuzz2.c | 3 +-- test/fuzzcheck.c | 3 +-- 9 files changed, 80 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index 0b52767182..e1120f6aa1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fixes\sto\sthe\sPRNG_SEED\spragma\sidea. -D 2019-08-02T21:03:24.230 +C Give\sthe\sSQLITE_TESTCTRL_PRNG_SEED\stwo\sarguments.\s\sThe\ssecond\sargument\sif\snot\nNULL\sis\sa\spointer\sto\sa\sdatabase\sconnection\swhich\sseeds\sthe\sconnection\sfrom\nits\sschema\scookie.\s\sIn\sthis\sway,\sfuzzers\scan\scontrol\sthe\sPRNG\sseed. +D 2019-08-03T01:39:20.466 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -464,7 +464,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 58d002f711c41a50a1183b5880b2e30fcd2363962df1ecf25731d011a796ee94 +F src/btree.c 4f122e985d939452677e67ce777a8ac68737c96a6e47aa0a4620e574b31bed0c F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 48f22e7c3b80550eb9c0cc3a3738f9117109b87d5f5fdba027009b7f2917df4a @@ -487,7 +487,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c f20925c2c08144442dabeb73dcd0f5026f5f085d827f3d5635f7c45e5d195320 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c e30b0b22666f7e1e0bb6c8d051d5201bd85419eca8c2423ffe7b1bce6364653a +F src/main.c ddba2dd3c8b11ad1d2ecc146a85a459c50a9a6b592ff154246a5db44d601d64f F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -503,7 +503,7 @@ F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58 F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 -F src/os.c 033039bb9b6da7d163c1806ba0d4dc0be9748ed78d8490c018bfd2346b774c1e +F src/os.c 66948e071d5ba7ae9ca5839799fdf68159f059cb97cada8a07eaf95a56edce79 F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 @@ -524,7 +524,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 6d57cfcb728fe1513fcbfb2bbd4192838b8cfe094616f72c7a54be55a550cc84 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1b8b5afee76e7d662b34c61705a638f7a6a20d5109515ca973c12343c84fb2d6 -F src/shell.c.in 5ab94c68a555b573a28e2ccdd811cc9ab8e0dd79274dad52567056fa6830d061 +F src/shell.c.in e5351f14716065d6e00a0437d3910cbb1a9d4fa96af61f59f18e5623679fe605 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -533,7 +533,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c 2139262641607bf3b5fc8d651b344233695f622bf477b4cbb55182b93251fe6b +F src/test1.c 18f980ceb2611d2cfc59da8bde7dfb4f12f235a6c91bf85ca6efdf855c34493f F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -797,7 +797,7 @@ F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test e32d14465f1c77712896fda6a1ccc0f037b481c191c1696a9c44f6c9e4964faf F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 2a7adaa5716f3d8f1928dd9fc1a72dfe1a9437c6e763e2cb953f27576387ae48 +F test/dbfuzz2.c c2c9cb40082a77b7e95ffb8b2da1e93322efadfb1c8c1e0001c95a0af1e156c2 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -1004,7 +1004,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 3f07fef9ef333ffd06b77e68f698b1daed9339b69308a8d83a9d64e30fa3b43a +F test/fuzzcheck.c 3ad76298a80cda31d270dc5e4f31194fa38d507d3e9b3f355cf1c283895cd5a5 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3ac5723164ae801e209ce525a5d94692767136f9d06be2a84883dcea677d02da -R 7c1b13735fcb01fd3eed4bb028d38797 +P c71098409c98af8360f8f28b9238a12ec764018a5782e8ff03fdf5db54031d6e +R 4b4e0ecd3d28a8dbcf6d6e7975ad293a U drh -Z db22194a3a99057abc0b1999051a8fec +Z 66ff94f6273220c1c96ad3fc6404132a diff --git a/manifest.uuid b/manifest.uuid index ca8bda57c6..9e9cf3ba83 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c71098409c98af8360f8f28b9238a12ec764018a5782e8ff03fdf5db54031d6e \ No newline at end of file +49aa34480622cce4d7a72c59d9cfa8336886387acec8ee15b72f295ea1a52d8c \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index a943078a12..a6b4a551b9 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6896,7 +6896,7 @@ static int rebuildPage( assert( i(u32)usableSize) ){ j = 0; } + if( j>(u32)usableSize ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kaDb[0].pSchema!=0 ); + if( db && (y = db->aDb[0].pSchema->schema_cookie)!=0 ){ x = y; } + sqlite3Config.iPrngSeed = x; + sqlite3_randomness(0,0); break; } diff --git a/src/os.c b/src/os.c index 08701028ba..adfa520e25 100644 --- a/src/os.c +++ b/src/os.c @@ -260,7 +260,7 @@ void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ if( sqlite3Config.iPrngSeed ){ memset(zBufOut, 0, nByte); - if( nByte>sizeof(unsigned) ) nByte = sizeof(unsigned int); + if( ALWAYS(nByte>sizeof(unsigned)) ) nByte = sizeof(unsigned int); memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); return SQLITE_OK; }else{ diff --git a/src/shell.c.in b/src/shell.c.in index fa82cf2ad3..366b82b9dc 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9152,7 +9152,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " }, { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, - { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED" }, + { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" }, { "reserve", SQLITE_TESTCTRL_RESERVE, "BYTES-OF-RESERVE" }, }; int testctrl = -1; @@ -9227,7 +9227,6 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(int, uint) */ case SQLITE_TESTCTRL_PENDING_BYTE: - case SQLITE_TESTCTRL_PRNG_SEED: if( nArg==3 ){ unsigned int opt = (unsigned int)integerValue(azArg[2]); rc2 = sqlite3_test_control(testctrl, opt); @@ -9235,6 +9234,23 @@ static int do_meta_command(char *zLine, ShellState *p){ } break; + /* sqlite3_test_control(int, int, sqlite3*) */ + case SQLITE_TESTCTRL_PRNG_SEED: + if( nArg==3 || nArg==4 ){ + int i = (int)integerValue(azArg[2]); + sqlite3 *db; + if( nArg==3 ){ + db = 0; + }else{ + db = p->db; + /* Make sure the schema has been loaded */ + sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); + } + rc2 = sqlite3_test_control(testctrl, i, db); + isOk = 3; + } + break; + /* sqlite3_test_control(int, int) */ case SQLITE_TESTCTRL_ASSERT: case SQLITE_TESTCTRL_ALWAYS: diff --git a/src/test1.c b/src/test1.c index 51eb2cc361..808765ec17 100644 --- a/src/test1.c +++ b/src/test1.c @@ -6377,9 +6377,19 @@ static int SQLITE_TCLAPI reset_prng_state( return TCL_OK; } /* -** tclcmd: prng_seed INT +** tclcmd: prng_seed INT ?DB? ** -** Establish TEXT as the seed for the PRNG +** Set up the SQLITE_TESTCTRL_PRNG_SEED pragma with parameter INT and DB. +** INT is an integer. DB is a database connection, or a NULL pointer if +** omitted. +** +** When INT!=0 and DB!=0, set the PRNG seed to the value of the schema +** cookie for DB, or to INT if the schema cookie happens to be zero. +** +** When INT!=0 and DB==0, set the PRNG seed to just INT. +** +** If INT==0 and DB==0 then use the default procedure of calling the +** xRandomness method on the default VFS to get the PRNG seed. */ static int SQLITE_TCLAPI prng_seed( ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ @@ -6387,14 +6397,17 @@ static int SQLITE_TCLAPI prng_seed( int objc, /* Number of arguments */ Tcl_Obj *CONST objv[] /* Command arguments */ ){ - unsigned int i; - if( objc!=2 ){ - Tcl_WrongNumArgs(interp, 1, objv, "PRNG-SEED-TEXT"); + int i = 0; + sqlite3 *db = 0; + if( objc!=2 && objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "SEED ?DB?"); return TCL_ERROR; } if( Tcl_GetIntFromObj(interp,objv[0],&i) ) return TCL_ERROR; - sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, (unsigned int)i); - sqlite3_randomness(0,0); + if( objc==3 && getDbPointer(interp, Tcl_GetString(objv[2]), &db) ){ + return TCL_ERROR; + } + sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, i, db); return TCL_OK; } diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 3f3a477387..804222ce4e 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -212,8 +212,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ sqlite3_progress_handler(db, 10, progress_handler, 0); } #ifdef SQLITE_TESTCTRL_PRNG_SEED - sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, 0); - sqlite3_randomness(0,0); + sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, 1, db); #endif for(i=0; i=1 ){ diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 50079cf499..4d52aedea9 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1807,8 +1807,7 @@ int main(int argc, char **argv){ } #endif #ifdef SQLITE_TESTCTRL_PRNG_SEED - sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, 0); - sqlite3_randomness(0,0); + sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, 1, db); #endif do{ runSql(db, (char*)pSql->a, runFlags); From 55b4c827fae95c394729c6968605863f5ce9eac5 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 3 Aug 2019 16:17:46 +0000 Subject: [PATCH 074/221] In the ".wheretrace 0x100" debugging mode, show the structure of the main parameters to sqlite3WhereBegin() calls. FossilOrigin-Name: fd598e475d353363e19adc27a671170f11ae9f6d8cad58cb2303fb2ad8ac6bec --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/sqliteInt.h | 1 + src/treeview.c | 23 +++++++++++++++-------- src/where.c | 10 ++++++++++ 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 1884f9c4db..cd7c67612a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_TESTCTRL_PRNG_SEED\swhich\scan\scontrol\sthe\sPRNG\sseed\seither\ndirectly\sor\sthrough\sthe\sschema\scookie\sof\sa\ssupplied\sdatabase\sconnection. -D 2019-08-03T01:40:17.104 +C In\sthe\s".wheretrace\s0x100"\sdebugging\smode,\sshow\sthe\sstructure\sof\sthe\nmain\sparameters\sto\ssqlite3WhereBegin()\scalls. +D 2019-08-03T16:17:46.598 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -528,7 +528,7 @@ F src/shell.c.in e5351f14716065d6e00a0437d3910cbb1a9d4fa96af61f59f18e5623679fe60 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h c4e5e98e0eddb78a3594603f57dd720f63660add5bd117f6e55ce39120313036 +F src/sqliteInt.h fdb9fbcdbc227b3caea58a5c01bc7935b1c56b8534da672db2d5d86ec703a1f7 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -588,7 +588,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e -F src/treeview.c cf03f9f6efb93288c7b9f17374ea48e4ce9111b0bc7e428d6850c3eee532b461 +F src/treeview.c e1faf913bb86e8445affa9889d9d32c34e92e50b97923ba7eef5b2adc0d8a548 F src/trigger.c 563df58084fa50aaf22b13ac5b71fdb02c9ffc6f0bf5d262cfe07aade4e20b3f F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 01b68cfc7f8a6eba6a0a10b24b7ab3ec11f7244830791560119e14680c756078 +F src/where.c 57a9b7b393878e4ab276e1028a392926ab10fd21057980291a30fdb19b4e6d1f F src/whereInt.h 6fab4b6f7e4ae716f112ee09cd1343fc6dde3d4a1831feabc6b3ed3b54b8eef3 F src/wherecode.c 52451ce3673e1d737b2d9f0a05ff336038e9dd2dcfba221d43e06b51c1fe514e F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 @@ -1838,8 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P faaaae4940b5f4f70e4988ad5b45582410b381ace0031e6abcde0b9217c06796 49aa34480622cce4d7a72c59d9cfa8336886387acec8ee15b72f295ea1a52d8c -R 4b4e0ecd3d28a8dbcf6d6e7975ad293a -T +closed 49aa34480622cce4d7a72c59d9cfa8336886387acec8ee15b72f295ea1a52d8c +P 2660e9292ae2c229eb7c57a6a79bb19f0c970072f86750fbe9cca3113d44ffe4 +R a7169e6245912e88f71e7cf76fa1ca23 U drh -Z e28a7b4cb873c0c74b6ed34b39f7e4b8 +Z cd555f66c82162cedea0a54c10ae02a4 diff --git a/manifest.uuid b/manifest.uuid index 39306419b0..606292b285 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2660e9292ae2c229eb7c57a6a79bb19f0c970072f86750fbe9cca3113d44ffe4 \ No newline at end of file +fd598e475d353363e19adc27a671170f11ae9f6d8cad58cb2303fb2ad8ac6bec \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 166c46514a..5166554302 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2904,6 +2904,7 @@ struct Select { #define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */ #define SF_IncludeHidden 0x20000 /* Include hidden columns in output */ #define SF_ComplexResult 0x40000 /* Result contains subquery or function */ +#define SF_WhereBegin 0x80000 /* Really a WhereBegin() call. Debug Only */ /* ** The results of a SELECT can be distributed in several ways, as defined diff --git a/src/treeview.c b/src/treeview.c index 6b4a98e3ab..91025cb330 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -176,13 +176,17 @@ void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ sqlite3TreeViewPush(pView, 1); } do{ - sqlite3TreeViewLine(pView, - "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d", - ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), - ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), - p->selId, p, p->selFlags, - (int)p->nSelectRow - ); + if( p->selFlags & SF_WhereBegin ){ + sqlite3TreeViewLine(pView, "sqlite3WhereBegin()"); + }else{ + sqlite3TreeViewLine(pView, + "SELECT%s%s (%u/%p) selFlags=0x%x nSelectRow=%d", + ((p->selFlags & SF_Distinct) ? " DISTINCT" : ""), + ((p->selFlags & SF_Aggregate) ? " agg_flag" : ""), + p->selId, p, p->selFlags, + (int)p->nSelectRow + ); + } if( cnt++ ) sqlite3TreeViewPop(pView); if( p->pPrior ){ n = 1000; @@ -199,7 +203,10 @@ void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 moreToFollow){ if( p->pWinDefn ) n++; #endif } - sqlite3TreeViewExprList(pView, p->pEList, (n--)>0, "result-set"); + if( p->pEList ){ + sqlite3TreeViewExprList(pView, p->pEList, n>0, "result-set"); + } + n--; #ifndef SQLITE_OMIT_WINDOWFUNC if( p->pWin ){ Window *pX; diff --git a/src/where.c b/src/where.c index b8778a6633..799bf3ea4d 100644 --- a/src/where.c +++ b/src/where.c @@ -4769,6 +4769,16 @@ WhereInfo *sqlite3WhereBegin( sqlite3DebugPrintf(", limit: %d", iAuxArg); } sqlite3DebugPrintf(")\n"); + if( sqlite3WhereTrace & 0x100 ){ + Select sSelect; + memset(&sSelect, 0, sizeof(sSelect)); + sSelect.selFlags = SF_WhereBegin; + sSelect.pSrc = pTabList; + sSelect.pWhere = pWhere; + sSelect.pOrderBy = pOrderBy; + sSelect.pEList = pResultSet; + sqlite3TreeViewSelect(0, &sSelect, 0); + } } if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ sqlite3WhereClausePrint(sWLB.pWC); From 192418bd499cb1dbd358142cbeb6b2295ec8f060 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 3 Aug 2019 16:37:40 +0000 Subject: [PATCH 075/221] =?UTF-8?q?Fix=20a=20problem=20with=20queries=20of?= =?UTF-8?q?=20the=20form=20"SELECT=20min()=20...=20WHERE=20=3D?= =?UTF-8?q?=3F"=20where=20there=20is=20an=20index=20on=20.=20Fix=20f?= =?UTF-8?q?or=20[71e183ca].?= FossilOrigin-Name: d465c3eef458c851d97eea6e4117247d9c69386b276168080dbff7bb64070c93 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/where.c | 3 +++ src/whereInt.h | 1 + src/wherecode.c | 11 +++++------ test/minmax4.test | 23 +++++++++++++++++++++++ 6 files changed, 43 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index cd7c67612a..94ac6f835d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\s".wheretrace\s0x100"\sdebugging\smode,\sshow\sthe\sstructure\sof\sthe\nmain\sparameters\sto\ssqlite3WhereBegin()\scalls. -D 2019-08-03T16:17:46.598 +C Fix\sa\sproblem\swith\squeries\sof\sthe\sform\s"SELECT\smin()\s...\sWHERE\s=?"\swhere\sthere\sis\san\sindex\son\s.\sFix\sfor\s[71e183ca]. +D 2019-08-03T16:37:40.150 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,9 +609,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 57a9b7b393878e4ab276e1028a392926ab10fd21057980291a30fdb19b4e6d1f -F src/whereInt.h 6fab4b6f7e4ae716f112ee09cd1343fc6dde3d4a1831feabc6b3ed3b54b8eef3 -F src/wherecode.c 52451ce3673e1d737b2d9f0a05ff336038e9dd2dcfba221d43e06b51c1fe514e +F src/where.c dee31d6842a8f6acd54bc7a7c2505050cd0fa52228634187195bc0b64eb9c240 +F src/whereInt.h 2bb9632f90a1a32952d43a52587209cdd536c3548715d7859bf0c1f9a65a2efd +F src/wherecode.c b45c98f260a9fa84787b0673d7053d55d60cb55900236376cac935f2ab6ce3ec F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 F src/window.c 7728ba7a3d44084a44eefb60464a88fb2ff035eb20cdeb1160ae65ac3c0be6b9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1151,7 +1151,7 @@ F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063 F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 -F test/minmax4.test be0b227f574a20871bdd4258d4a26620f263e4cd231d2eec0259b8980e7408b4 +F test/minmax4.test 325f0fccb12f3d36049105817a0152a3e9bbf7f194b2610744de899e636c7d69 F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2660e9292ae2c229eb7c57a6a79bb19f0c970072f86750fbe9cca3113d44ffe4 -R a7169e6245912e88f71e7cf76fa1ca23 -U drh -Z cd555f66c82162cedea0a54c10ae02a4 +P fd598e475d353363e19adc27a671170f11ae9f6d8cad58cb2303fb2ad8ac6bec +R cc89bfbc259b9b7136163b32cac7f905 +U dan +Z 99d6ce70f917d34037e260832ba76b7f diff --git a/manifest.uuid b/manifest.uuid index 606292b285..3432518493 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fd598e475d353363e19adc27a671170f11ae9f6d8cad58cb2303fb2ad8ac6bec \ No newline at end of file +d465c3eef458c851d97eea6e4117247d9c69386b276168080dbff7bb64070c93 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 799bf3ea4d..29f6eca102 100644 --- a/src/where.c +++ b/src/where.c @@ -3862,6 +3862,9 @@ static i8 wherePathSatisfiesOrderBy( distinctColumns = 1; } obSat |= MASKBIT(i); + if( (wctrlFlags & WHERE_ORDERBY_MIN) && j==pLoop->u.btree.nEq ){ + pLoop->wsFlags |= WHERE_MIN_ORDERED; + } }else{ /* No match found */ if( j==0 || jpOrderBy==0 - || pWInfo->pOrderBy->nExpr==1 + assert( (pWInfo->pOrderBy!=0 && pWInfo->pOrderBy->nExpr==1) || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); - if( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 - && pWInfo->nOBSat>0 - && (pIdx->nKeyCol>nEq) - ){ + if( pLoop->wsFlags & WHERE_MIN_ORDERED ){ + assert( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN) ); + assert( pWInfo->nOBSat ); + assert( pIdx->nColumn>nEq ); assert( pLoop->nSkip==0 ); bSeekPastNull = 1; nExtraReg = 1; diff --git a/test/minmax4.test b/test/minmax4.test index 11d747a1cb..351e528664 100644 --- a/test/minmax4.test +++ b/test/minmax4.test @@ -178,4 +178,27 @@ foreach {tn sql} { } {2 2} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE TABLE t0 (c0, c1); + CREATE INDEX i0 ON t0(c1, c1 + 1 DESC); + INSERT INTO t0(c0) VALUES (1); +} +do_execsql_test 4.1 { + SELECT MIN(t0.c1), t0.c0 FROM t0 WHERE t0.c1 ISNULL; +} {{} 1} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 5.0 { + CREATE TABLE t1 (a, b); + INSERT INTO t1 VALUES(123, NULL); + CREATE INDEX i1 ON t1(a, b DESC); +} +do_execsql_test 5.1 { + SELECT MIN(a) FROM t1 WHERE a=123; +} {123} + finish_test + From 45f3b3cf1de9fcc80e2abfa6fd9924d472fc1199 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 3 Aug 2019 19:06:18 +0000 Subject: [PATCH 076/221] Stregthen an assert() in the WHERE clause code generator for the min/max optimization. FossilOrigin-Name: 1bd4b97d6405c9b093f3bfed914c56088ee13e4a2242be62b74a86660f74f533 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 94ac6f835d..7135c8e530 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\squeries\sof\sthe\sform\s"SELECT\smin()\s...\sWHERE\s=?"\swhere\sthere\sis\san\sindex\son\s.\sFix\sfor\s[71e183ca]. -D 2019-08-03T16:37:40.150 +C Stregthen\san\sassert()\sin\sthe\sWHERE\sclause\scode\sgenerator\sfor\sthe\smin/max\noptimization. +D 2019-08-03T19:06:18.863 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c dee31d6842a8f6acd54bc7a7c2505050cd0fa52228634187195bc0b64eb9c240 F src/whereInt.h 2bb9632f90a1a32952d43a52587209cdd536c3548715d7859bf0c1f9a65a2efd -F src/wherecode.c b45c98f260a9fa84787b0673d7053d55d60cb55900236376cac935f2ab6ce3ec +F src/wherecode.c 5dd20651afc1f67bad35523514e87f017295f1cddfdf5d1ea31a8e299d7054a8 F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 F src/window.c 7728ba7a3d44084a44eefb60464a88fb2ff035eb20cdeb1160ae65ac3c0be6b9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fd598e475d353363e19adc27a671170f11ae9f6d8cad58cb2303fb2ad8ac6bec -R cc89bfbc259b9b7136163b32cac7f905 -U dan -Z 99d6ce70f917d34037e260832ba76b7f +P d465c3eef458c851d97eea6e4117247d9c69386b276168080dbff7bb64070c93 +R 8f097cfa3ce30475d286df29d894ccc6 +U drh +Z 75bab5a01b9371fe4c3ad256ed32bece diff --git a/manifest.uuid b/manifest.uuid index 3432518493..34699165cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d465c3eef458c851d97eea6e4117247d9c69386b276168080dbff7bb64070c93 \ No newline at end of file +1bd4b97d6405c9b093f3bfed914c56088ee13e4a2242be62b74a86660f74f533 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index a644a0ad1a..a6cfdb04f7 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1706,7 +1706,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); op = aStartOp[(start_constraints<<2) + (1<<1) + bRev]; - assert( op!=0 ); + assert( op==OP_SeekGE || op==OP_SeekLE ); sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); VdbeCoverage(v); VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); From 3cbbd195ca84adb2bd2a2ae579a0f9fcbe4de595 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Aug 2019 12:55:56 +0000 Subject: [PATCH 077/221] Prevent an fts5 table from being its own content table, or part of a view that is the content table. FossilOrigin-Name: b6d52c9364767ff4ab7279ae981afb97799299dcfaf38a0110c40ca82c72a825 --- ext/fts5/fts5Int.h | 1 + ext/fts5/fts5_main.c | 7 +++++++ ext/fts5/fts5_storage.c | 2 ++ ext/fts5/test/fts5content.test | 15 +++++++++++++++ manifest | 20 ++++++++++---------- manifest.uuid | 2 +- 6 files changed, 36 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 10191472f1..d0bb543e4c 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -178,6 +178,7 @@ struct Fts5Config { char *zContentExprlist; Fts5Tokenizer *pTok; fts5_tokenizer *pTokApi; + int bLock; /* True when table is preparing statement */ /* Values loaded from the %_config table */ int iCookie; /* Incremented when %_config is modified */ diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 06b8183778..d44e95942c 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -536,6 +536,13 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ assert( SQLITE_INDEX_CONSTRAINT_GEbLock ){ + pTab->base.zErrMsg = sqlite3_mprintf( + "recursively defined fts5 content table" + ); + return SQLITE_ERROR; + } + /* Set idxFlags flags for all WHERE clause terms that will be used. */ for(i=0; inConstraint; i++){ struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 611e6bc918..960c1805c3 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -138,7 +138,9 @@ static int fts5StorageGetStmt( }else{ int f = SQLITE_PREPARE_PERSISTENT; if( eStmt>FTS5_STMT_LOOKUP ) f |= SQLITE_PREPARE_NO_VTAB; + p->pConfig->bLock++; rc = sqlite3_prepare_v3(pC->db, zSql, -1, f, &p->aStmt[eStmt], 0); + p->pConfig->bLock--; sqlite3_free(zSql); if( rc!=SQLITE_OK && pzErrMsg ){ *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); diff --git a/ext/fts5/test/fts5content.test b/ext/fts5/test/fts5content.test index a74b26dd2e..bd510a552d 100644 --- a/ext/fts5/test/fts5content.test +++ b/ext/fts5/test/fts5content.test @@ -253,5 +253,20 @@ do_execsql_test 6.2 { SELECT name FROM sqlite_master; } {} +#--------------------------------------------------------------------------- +# Check that an fts5 table cannot be its own content table. +# +reset_db +do_execsql_test 7.1 { + CREATE VIRTUAL TABLE t1 USING fts5(a, c=t1 ); + INSERT INTO t1( a ) VALUES('abc'); +} +do_catchsql_test 7.2 { + SELECT * FROM t1; +} {1 {recursively defined fts5 content table}} +do_catchsql_test 7.3 { + SELECT * FROM t1('abc'); +} {1 {recursively defined fts5 content table}} finish_test + diff --git a/manifest b/manifest index 7135c8e530..ea7174a32b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Stregthen\san\sassert()\sin\sthe\sWHERE\sclause\scode\sgenerator\sfor\sthe\smin/max\noptimization. -D 2019-08-03T19:06:18.863 +C Prevent\san\sfts5\stable\sfrom\sbeing\sits\sown\scontent\stable,\sor\spart\sof\sa\sview\sthat\sis\sthe\scontent\stable. +D 2019-08-05T12:55:56.569 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -110,15 +110,15 @@ F ext/fts3/unicode/mkunicode.tcl bf7fcaa6d68e6d38223467983785d054f1cff4d9e3905dd F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 7c9da96f2b9dcfa4dd94081fb2d87ec418d8cdb35b25df56756c334b6b558fd7 -F ext/fts5/fts5Int.h 5c26dce0ec9272fca726c6fddb92f634d0c912d4ca170330270d488a94b80416 +F ext/fts5/fts5Int.h d87fb17d12296613cdec2d1f4213ecd8840d3deb34837b6d3889b830d06baac4 F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 F ext/fts5/fts5_config.c d7523cba5e66da077233c023aecbc3e6a37978ff75a18131c5ab5b1229d5bac7 F ext/fts5/fts5_expr.c 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c cd363c2fa3e626c04a9b7c705ff50222b4cab052704938f6a24881602ed3ed0d -F ext/fts5/fts5_main.c abd04720e2729ba5bab2648d9d541faab18f45d481ae21fc30f125b55e979d6b -F ext/fts5/fts5_storage.c b24f6916fcdd68989a549f25962f286bdba9d9d59c7581567a6a0eb647cd07cc +F ext/fts5/fts5_main.c 346a1ec08caa66f1187f1e0bf12e39e4d24682323b839e8a76ef653b8db8a91d +F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 @@ -154,7 +154,7 @@ F ext/fts5/test/fts5columnsize.test 45459ce4dd9fd853b6044cdc9674921bff89e3d840f3 F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825ce437d26afe0817f F ext/fts5/test/fts5conflict.test 655925678e630d3cdf145d18725a558971806416f453ac8410ca8c04d934238d F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c073e19b3ae9126b2f4 -F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 +F ext/fts5/test/fts5content.test 9517cc527a8e8a33949652d5c7b5e251f8c3d5ae3f23f01d4320e30f29a0336b F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f F ext/fts5/test/fts5corrupt3.test 1f36c04fdd717f7d44a0addcdad0f5e54a5a403eab8a25426b069757830682ee @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d465c3eef458c851d97eea6e4117247d9c69386b276168080dbff7bb64070c93 -R 8f097cfa3ce30475d286df29d894ccc6 -U drh -Z 75bab5a01b9371fe4c3ad256ed32bece +P 1bd4b97d6405c9b093f3bfed914c56088ee13e4a2242be62b74a86660f74f533 +R e92ea622f14cc1b4c90fee388e599b52 +U dan +Z c8a1ea238b46dd4eaa7276d7b60e185f diff --git a/manifest.uuid b/manifest.uuid index 34699165cf..bbf31e1cd0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1bd4b97d6405c9b093f3bfed914c56088ee13e4a2242be62b74a86660f74f533 \ No newline at end of file +b6d52c9364767ff4ab7279ae981afb97799299dcfaf38a0110c40ca82c72a825 \ No newline at end of file From 72d1eac673f66ddc68b6716fe21e6147d07afff7 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Aug 2019 13:19:25 +0000 Subject: [PATCH 078/221] Fix a problem with renaming a table when a view or trigger within the schema uses a FILTER with an aggregate function that is not currently registered with the database. FossilOrigin-Name: 2ac0e42f8ab7a9184c2a2efd13bd50ab51bc01f9f34e9e63591fd18db02dff54 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 4 ++-- test/altertab3.test | 21 ++++++++++++++++++++- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index ea7174a32b..9132476b8b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\san\sfts5\stable\sfrom\sbeing\sits\sown\scontent\stable,\sor\spart\sof\sa\sview\sthat\sis\sthe\scontent\stable. -D 2019-08-05T12:55:56.569 +C Fix\sa\sproblem\swith\srenaming\sa\stable\swhen\sa\sview\sor\strigger\swithin\sthe\sschema\suses\sa\sFILTER\swith\san\saggregate\sfunction\sthat\sis\snot\scurrently\sregistered\swith\sthe\sdatabase. +D 2019-08-05T13:19:25.017 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 6d57cfcb728fe1513fcbfb2bbd4192838b8cfe094616f72c7a54be55a550cc84 +F src/resolve.c 1db9e08a91df0e0bcac4c5f3cd01ca86dd1be37b283efeb81139266f1c74e7a3 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1b8b5afee76e7d662b34c61705a638f7a6a20d5109515ca973c12343c84fb2d6 F src/shell.c.in e5351f14716065d6e00a0437d3910cbb1a9d4fa96af61f59f18e5623679fe605 @@ -633,7 +633,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 0f1e2801afb0b1b0b723ec016dda140aa5dc0d2d48846d5eead003fcd72828e8 +F test/altertab3.test 9b868b9fc643af9a7d70c0dca984fc6ea91cbb9c5b0bfc678243f3d296c4be48 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1bd4b97d6405c9b093f3bfed914c56088ee13e4a2242be62b74a86660f74f533 -R e92ea622f14cc1b4c90fee388e599b52 +P b6d52c9364767ff4ab7279ae981afb97799299dcfaf38a0110c40ca82c72a825 +R 28ce5921d081582c0d1ccac9c38fc5f7 U dan -Z c8a1ea238b46dd4eaa7276d7b60e185f +Z 3ddbf0b6cdda36b7df15d0621b9689d7 diff --git a/manifest.uuid b/manifest.uuid index bbf31e1cd0..952349fee7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b6d52c9364767ff4ab7279ae981afb97799299dcfaf38a0110c40ca82c72a825 \ No newline at end of file +2ac0e42f8ab7a9184c2a2efd13bd50ab51bc01f9f34e9e63591fd18db02dff54 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 9e4099372f..4e25f16120 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -934,8 +934,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pExpr->op2++; pNC2 = pNC2->pNext; } - assert( pDef!=0 ); - if( pNC2 ){ + assert( pDef!=0 || IN_RENAME_OBJECT ); + if( pNC2 && pDef ){ assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX); diff --git a/test/altertab3.test b/test/altertab3.test index b17e9c0836..1472c92c5f 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -358,10 +358,29 @@ do_execsql_test 16.1 { WITH t4 AS (SELECT * FROM t1) SELECT 33; END; } - do_execsql_test 16.2 { ALTER TABLE t1 RENAME TO t1x; } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 17.1 { + CREATE TABLE t1(a,b,c); + CREATE TRIGGER AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + SELECT a () FILTER (WHERE a>0) FROM t1; + END; +} + +do_execsql_test 17.2 { + ALTER TABLE t1 RENAME TO t1x; + ALTER TABLE t1x RENAME a TO aaa; + SELECT sql FROM sqlite_master WHERE type='trigger'; +} { +{CREATE TRIGGER AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN + SELECT a () FILTER (WHERE aaa>0) FROM "t1x"; + END} +} + + finish_test From 2b96b6969ae7f2f8dfa6a07b97fea1057dbcdab5 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 5 Aug 2019 16:22:20 +0000 Subject: [PATCH 079/221] Improved detection of corruption on the freeblock list of a btree page. FossilOrigin-Name: 4b00799bdf107fce8a9dd84fd5bf6597e4f3373659b89aae4a1242be5964726f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 11 +++++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 9132476b8b..6cfdcb0c00 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srenaming\sa\stable\swhen\sa\sview\sor\strigger\swithin\sthe\sschema\suses\sa\sFILTER\swith\san\saggregate\sfunction\sthat\sis\snot\scurrently\sregistered\swith\sthe\sdatabase. -D 2019-08-05T13:19:25.017 +C Improved\sdetection\sof\scorruption\son\sthe\sfreeblock\slist\sof\sa\sbtree\spage. +D 2019-08-05T16:22:20.557 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -464,7 +464,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 4f122e985d939452677e67ce777a8ac68737c96a6e47aa0a4620e574b31bed0c +F src/btree.c 397b5075441d0bd7366e93f6f2ef908dd0610cd80c4e351f4a900b614e32ccf0 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 48f22e7c3b80550eb9c0cc3a3738f9117109b87d5f5fdba027009b7f2917df4a @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b6d52c9364767ff4ab7279ae981afb97799299dcfaf38a0110c40ca82c72a825 -R 28ce5921d081582c0d1ccac9c38fc5f7 -U dan -Z 3ddbf0b6cdda36b7df15d0621b9689d7 +P 2ac0e42f8ab7a9184c2a2efd13bd50ab51bc01f9f34e9e63591fd18db02dff54 +R 25b0309e54c4a44a38baef97d33cecfa +U drh +Z 87c0b13ed7ac3ffed0f21199971e8372 diff --git a/manifest.uuid b/manifest.uuid index 952349fee7..14b089b424 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2ac0e42f8ab7a9184c2a2efd13bd50ab51bc01f9f34e9e63591fd18db02dff54 \ No newline at end of file +4b00799bdf107fce8a9dd84fd5bf6597e4f3373659b89aae4a1242be5964726f \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index a6b4a551b9..8ebe0ccb37 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1647,9 +1647,12 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ if( (data[hdr+2] || data[hdr+1]) && gap+2<=top ){ u8 *pSpace = pageFindSlot(pPage, nByte, &rc); if( pSpace ){ - assert( pSpace>=data && (pSpace - data)<65536 ); - *pIdx = (int)(pSpace - data); - return SQLITE_OK; + assert( pSpace+nByte<=data+pPage->pBt->usableSize ); + if( (*pIdx = (int)(pSpace-data))<=gap ){ + return SQLITE_CORRUPT_PAGE(pPage); + }else{ + return SQLITE_OK; + } }else if( rc ){ return rc; } @@ -6896,7 +6899,7 @@ static int rebuildPage( assert( i(u32)usableSize ){ j = 0; } + if( NEVER(j>(u32)usableSize) ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(k Date: Mon, 5 Aug 2019 18:01:42 +0000 Subject: [PATCH 080/221] Refactor field Expr.affinity into Expr.affExpr to avoid confusion with other fields and variables named "affinity" and display affExpr it in sqlite3TreeViewExpr() output. FossilOrigin-Name: a29f2a7d07beff64e489e8f824babc6228c4a499fadc0ee701caa60a63baadcd --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/expr.c | 16 ++++++++-------- src/fkey.c | 6 +++--- src/parse.y | 6 +++--- src/resolve.c | 4 ++-- src/sqliteInt.h | 2 +- src/treeview.c | 14 ++++++++------ 8 files changed, 37 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index 6cfdcb0c00..90bcc21788 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\scorruption\son\sthe\sfreeblock\slist\sof\sa\sbtree\spage. -D 2019-08-05T16:22:20.557 +C Refactor\sfield\sExpr.affinity\sinto\sExpr.affExpr\sto\savoid\sconfusion\swith\sother\nfields\sand\svariables\snamed\s"affinity"\sand\sdisplay\saffExpr\sit\sin\nsqlite3TreeViewExpr()\soutput. +D 2019-08-05T18:01:42.394 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,9 +475,9 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c b49492392bf93b62dc508b31e0ec32186118df439cde9e2f9ebc98aab54e9fa7 +F src/expr.c 20dca64dd896e87747e45052fdb73f8790a64905c8ef57edee5ebe7934d6ee80 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c ab1971900477e93b6aaabf160d2d1c79c06edd9227441ccfaf0de7e7431d7f48 +F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 F src/global.c 0c9c45844ae182b458610e4d427834deffcdcd45fbc8c957f6ad82051b8f161f F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -512,7 +512,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 22889d25bbab20b3fbff5eca1208a1f098ce9cf3ebc309f0dd0753dda79cc864 +F src/parse.y 6d03a24bc0dcd15b93c480ea8a87f7ccd25313fe826485726d9ef13b82f2378d F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -521,14 +521,14 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 1db9e08a91df0e0bcac4c5f3cd01ca86dd1be37b283efeb81139266f1c74e7a3 +F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1b8b5afee76e7d662b34c61705a638f7a6a20d5109515ca973c12343c84fb2d6 F src/shell.c.in e5351f14716065d6e00a0437d3910cbb1a9d4fa96af61f59f18e5623679fe605 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h fdb9fbcdbc227b3caea58a5c01bc7935b1c56b8534da672db2d5d86ec703a1f7 +F src/sqliteInt.h 67de168774b2fcc8db9d4f30448ca57f2e569f4291e229819afd68e77b910bad F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -588,7 +588,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e -F src/treeview.c e1faf913bb86e8445affa9889d9d32c34e92e50b97923ba7eef5b2adc0d8a548 +F src/treeview.c 06e65db6ffa14dd583f90403192190dfe3855c0e3acfcbac0e82109a46e2b16c F src/trigger.c 563df58084fa50aaf22b13ac5b71fdb02c9ffc6f0bf5d262cfe07aade4e20b3f F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2ac0e42f8ab7a9184c2a2efd13bd50ab51bc01f9f34e9e63591fd18db02dff54 -R 25b0309e54c4a44a38baef97d33cecfa +P 4b00799bdf107fce8a9dd84fd5bf6597e4f3373659b89aae4a1242be5964726f +R dacf57e6b8446ef98d2c115e292d46f4 U drh -Z 87c0b13ed7ac3ffed0f21199971e8372 +Z ee2588e2d826992a9f3fe3e7ef29d6ef diff --git a/manifest.uuid b/manifest.uuid index 14b089b424..94f2efd364 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b00799bdf107fce8a9dd84fd5bf6597e4f3373659b89aae4a1242be5964726f \ No newline at end of file +a29f2a7d07beff64e489e8f824babc6228c4a499fadc0ee701caa60a63baadcd \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 5d8fdea55f..28ab5b0ce8 100644 --- a/src/expr.c +++ b/src/expr.c @@ -71,7 +71,7 @@ char sqlite3ExprAffinity(Expr *pExpr){ pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr ); } - return pExpr->affinity; + return pExpr->affExpr; } /* @@ -4099,27 +4099,27 @@ expr_code_doover: } #ifndef SQLITE_OMIT_TRIGGER case TK_RAISE: { - assert( pExpr->affinity==OE_Rollback - || pExpr->affinity==OE_Abort - || pExpr->affinity==OE_Fail - || pExpr->affinity==OE_Ignore + assert( pExpr->affExpr==OE_Rollback + || pExpr->affExpr==OE_Abort + || pExpr->affExpr==OE_Fail + || pExpr->affExpr==OE_Ignore ); if( !pParse->pTriggerTab ){ sqlite3ErrorMsg(pParse, "RAISE() may only be used within a trigger-program"); return 0; } - if( pExpr->affinity==OE_Abort ){ + if( pExpr->affExpr==OE_Abort ){ sqlite3MayAbort(pParse); } assert( !ExprHasProperty(pExpr, EP_IntValue) ); - if( pExpr->affinity==OE_Ignore ){ + if( pExpr->affExpr==OE_Ignore ){ sqlite3VdbeAddOp4( v, OP_Halt, SQLITE_OK, OE_Ignore, 0, pExpr->u.zToken,0); VdbeCoverage(v); }else{ sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_TRIGGER, - pExpr->affinity, pExpr->u.zToken, 0, 0); + pExpr->affExpr, pExpr->u.zToken, 0, 0); } break; diff --git a/src/fkey.c b/src/fkey.c index 67da6e6c79..fc75023669 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -478,13 +478,13 @@ static Expr *exprTableRegister( if( iCol>=0 && iCol!=pTab->iPKey ){ pCol = &pTab->aCol[iCol]; pExpr->iTable = regBase + iCol + 1; - pExpr->affinity = pCol->affinity; + pExpr->affExpr = pCol->affinity; zColl = pCol->zColl; if( zColl==0 ) zColl = db->pDfltColl->zName; pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl); }else{ pExpr->iTable = regBase; - pExpr->affinity = SQLITE_AFF_INTEGER; + pExpr->affExpr = SQLITE_AFF_INTEGER; } } return pExpr; @@ -1287,7 +1287,7 @@ static Trigger *fkActionTrigger( tFrom.n = nFrom; pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); if( pRaise ){ - pRaise->affinity = OE_Abort; + pRaise->affExpr = OE_Abort; } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), diff --git a/src/parse.y b/src/parse.y index f5727ade2c..648e79d9e3 100644 --- a/src/parse.y +++ b/src/parse.y @@ -949,7 +949,7 @@ idlist(A) ::= nm(Y). if( p ){ /* memset(p, 0, sizeof(Expr)); */ p->op = (u8)op; - p->affinity = 0; + p->affExpr = 0; p->flags = EP_Leaf; p->iAgg = -1; p->pLeft = p->pRight = 0; @@ -1508,13 +1508,13 @@ trigger_cmd(A) ::= scanpt(B) select(X) scanpt(E). expr(A) ::= RAISE LP IGNORE RP. { A = sqlite3PExpr(pParse, TK_RAISE, 0, 0); if( A ){ - A->affinity = OE_Ignore; + A->affExpr = OE_Ignore; } } expr(A) ::= RAISE LP raisetype(T) COMMA nm(Z) RP. { A = sqlite3ExprAlloc(pParse->db, TK_RAISE, &Z, 1); if( A ) { - A->affinity = (char)T; + A->affExpr = (char)T; } } %endif !SQLITE_OMIT_TRIGGER diff --git a/src/resolve.c b/src/resolve.c index 4e25f16120..0ba8abd8bc 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -381,7 +381,7 @@ static int lookupName( { #ifndef SQLITE_OMIT_TRIGGER if( iCol<0 ){ - pExpr->affinity = SQLITE_AFF_INTEGER; + pExpr->affExpr = SQLITE_AFF_INTEGER; }else if( pExpr->iTable==0 ){ testcase( iCol==31 ); testcase( iCol==32 ); @@ -413,7 +413,7 @@ static int lookupName( ){ cnt = 1; pExpr->iColumn = -1; - pExpr->affinity = SQLITE_AFF_INTEGER; + pExpr->affExpr = SQLITE_AFF_INTEGER; } /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5166554302..6d4c07677d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2447,7 +2447,7 @@ typedef int ynVar; */ struct Expr { u8 op; /* Operation performed by this node */ - char affinity; /* The affinity of the column or 0 if not a column */ + char affExpr; /* affinity, or RAISE type */ u32 flags; /* Various flags. EP_* See below */ union { char *zToken; /* Token value. Zero terminated and dequoted */ diff --git a/src/treeview.c b/src/treeview.c index 91025cb330..753f214899 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -402,12 +402,14 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ sqlite3TreeViewPop(pView); return; } - if( pExpr->flags ){ + if( pExpr->flags || pExpr->affExpr ){ if( ExprHasProperty(pExpr, EP_FromJoin) ){ - sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x iRJT=%d", - pExpr->flags, pExpr->iRightJoinTable); + sqlite3_snprintf(sizeof(zFlgs),zFlgs," fg.af=%x.%c iRJT=%d", + pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n', + pExpr->iRightJoinTable); }else{ - sqlite3_snprintf(sizeof(zFlgs),zFlgs," flags=0x%x",pExpr->flags); + sqlite3_snprintf(sizeof(zFlgs),zFlgs," fg.af=%x.%c", + pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); } }else{ zFlgs[0] = 0; @@ -635,7 +637,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ #ifndef SQLITE_OMIT_TRIGGER case TK_RAISE: { const char *zType = "unk"; - switch( pExpr->affinity ){ + switch( pExpr->affExpr ){ case OE_Rollback: zType = "rollback"; break; case OE_Abort: zType = "abort"; break; case OE_Fail: zType = "fail"; break; @@ -676,7 +678,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ sqlite3TreeViewExpr(pView, pExpr->pRight, 0); }else if( zUniOp ){ sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); - sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); + sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); } sqlite3TreeViewPop(pView); } From 81506b88b8b286c50940bbba66e6abaac5d64b62 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 5 Aug 2019 19:32:06 +0000 Subject: [PATCH 081/221] One of two options on how to address ticket [61c853857f40da49]. In this mode, we back out the documentation change of [https://www.sqlite.org/docsrc/info/07b7749da88d54e5|[07b7749da88d54e5]] and change the core to work as it has been documented to work since 2017, rather than how it has actually worked since 2009. FossilOrigin-Name: 09cd0c0c6e6c963e0039a733876e5149adb3cd10e9b92699fa1dcb0633e997a4 --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/build.c | 8 ++++---- src/insert.c | 10 +++++----- src/select.c | 13 ++++++++----- src/sqliteInt.h | 4 ++-- src/window.c | 2 +- 7 files changed, 34 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index 90bcc21788..6be75380f0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactor\sfield\sExpr.affinity\sinto\sExpr.affExpr\sto\savoid\sconfusion\swith\sother\nfields\sand\svariables\snamed\s"affinity"\sand\sdisplay\saffExpr\sit\sin\nsqlite3TreeViewExpr()\soutput. -D 2019-08-05T18:01:42.394 +C One\sof\stwo\soptions\son\show\sto\saddress\sticket\s[61c853857f40da49].\s\sIn\sthis\nmode,\swe\sback\sout\sthe\sdocumentation\schange\sof\n[https://www.sqlite.org/docsrc/info/07b7749da88d54e5|[07b7749da88d54e5]]\nand\schange\sthe\score\sto\swork\sas\sit\shas\sbeen\sdocumented\sto\swork\ssince\s2017,\nrather\sthan\show\sit\shas\sactually\sworked\ssince\s2009. +D 2019-08-05T19:32:06.820 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -467,7 +467,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 397b5075441d0bd7366e93f6f2ef908dd0610cd80c4e351f4a900b614e32ccf0 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 48f22e7c3b80550eb9c0cc3a3738f9117109b87d5f5fdba027009b7f2917df4a +F src/build.c b48552e607494b914ce45cb82ffde58d1cee3cf240529abdcb7d6445803b5fa5 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 37f3d21193c4f7d141d0691cced5b39c99951bfef78df9887faf9167b9c42f37 @@ -484,7 +484,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c f20925c2c08144442dabeb73dcd0f5026f5f085d827f3d5635f7c45e5d195320 +F src/insert.c ea7e0c3dae74ba766967deabc3112d77e36cb9230245b0cf422051886c911af5 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c F src/main.c ddba2dd3c8b11ad1d2ecc146a85a459c50a9a6b592ff154246a5db44d601d64f @@ -523,12 +523,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 1b8b5afee76e7d662b34c61705a638f7a6a20d5109515ca973c12343c84fb2d6 +F src/select.c 5b0ef2a8b392fad19d1c8ceb803ab82a2e5ddf34d7f138cabb0a00d0a4c9d646 F src/shell.c.in e5351f14716065d6e00a0437d3910cbb1a9d4fa96af61f59f18e5623679fe605 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 67de168774b2fcc8db9d4f30448ca57f2e569f4291e229819afd68e77b910bad +F src/sqliteInt.h 6350fc633ada5484a6db345fb0f29d76ceb0c471e3713a07acad65d697975bda F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -613,7 +613,7 @@ F src/where.c dee31d6842a8f6acd54bc7a7c2505050cd0fa52228634187195bc0b64eb9c240 F src/whereInt.h 2bb9632f90a1a32952d43a52587209cdd536c3548715d7859bf0c1f9a65a2efd F src/wherecode.c 5dd20651afc1f67bad35523514e87f017295f1cddfdf5d1ea31a8e299d7054a8 F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 7728ba7a3d44084a44eefb60464a88fb2ff035eb20cdeb1160ae65ac3c0be6b9 +F src/window.c 8da008a1a6f4db73e1462e88fadb2e05809bd557e4e40d1c37339fecc8b998c1 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1838,7 +1838,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 4b00799bdf107fce8a9dd84fd5bf6597e4f3373659b89aae4a1242be5964726f -R dacf57e6b8446ef98d2c115e292d46f4 +P a29f2a7d07beff64e489e8f824babc6228c4a499fadc0ee701caa60a63baadcd +R 97414c81c0b4f69819c6816648005997 +T *branch * tkt-61c853-A +T *sym-tkt-61c853-A * +T -sym-trunk * U drh -Z ee2588e2d826992a9f3fe3e7ef29d6ef +Z 92b9b582014c94f15af3528987c407cd diff --git a/manifest.uuid b/manifest.uuid index 94f2efd364..99fe1f741b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a29f2a7d07beff64e489e8f824babc6228c4a499fadc0ee701caa60a63baadcd \ No newline at end of file +09cd0c0c6e6c963e0039a733876e5149adb3cd10e9b92699fa1dcb0633e997a4 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 80bc4eb0d0..2a33dbb897 100644 --- a/src/build.c +++ b/src/build.c @@ -2160,7 +2160,7 @@ void sqlite3EndTable( addrTop = sqlite3VdbeCurrentAddr(v) + 1; sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); if( pParse->nErr ) return; - pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect); + pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect, SQLITE_AFF_BLOB); if( pSelTab==0 ) return; assert( p->aCol==0 ); p->nCol = pSelTab->nCol; @@ -2424,10 +2424,10 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ #ifndef SQLITE_OMIT_AUTHORIZATION xAuth = db->xAuth; db->xAuth = 0; - pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, 0); db->xAuth = xAuth; #else - pSelTab = sqlite3ResultSetOfSelect(pParse, pSel); + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, 0); #endif pParse->nTab = n; if( pTable->pCheck ){ @@ -2443,7 +2443,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ && pParse->nErr==0 && pTable->nCol==pSel->pEList->nExpr ){ - sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, 0); } }else if( pSelTab ){ /* CREATE VIEW name AS... without an argument list. Construct diff --git a/src/insert.c b/src/insert.c index 2fe015fa05..2f1a19952d 100644 --- a/src/insert.c +++ b/src/insert.c @@ -88,18 +88,18 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ } for(n=0; nnColumn; n++){ i16 x = pIdx->aiColumn[n]; + char aff; if( x>=0 ){ - pIdx->zColAff[n] = pTab->aCol[x].affinity; + aff = pTab->aCol[x].affinity; }else if( x==XN_ROWID ){ - pIdx->zColAff[n] = SQLITE_AFF_INTEGER; + aff = SQLITE_AFF_INTEGER; }else{ - char aff; assert( x==XN_EXPR ); assert( pIdx->aColExpr!=0 ); aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); - if( aff==0 ) aff = SQLITE_AFF_BLOB; - pIdx->zColAff[n] = aff; } + if( aff==0 ) aff = SQLITE_AFF_BLOB; + pIdx->zColAff[n] = aff; } pIdx->zColAff[n] = 0; } diff --git a/src/select.c b/src/select.c index 1feee02b7e..2133cf48ad 100644 --- a/src/select.c +++ b/src/select.c @@ -2035,7 +2035,8 @@ int sqlite3ColumnsFromExprList( void sqlite3SelectAddColumnTypeAndCollation( Parse *pParse, /* Parsing contexts */ Table *pTab, /* Add column type information to this table */ - Select *pSelect /* SELECT used to determine types and collations */ + Select *pSelect, /* SELECT used to determine types and collations */ + char aff /* Default affinity for columns */ ){ sqlite3 *db = pParse->db; NameContext sNC; @@ -2068,7 +2069,7 @@ void sqlite3SelectAddColumnTypeAndCollation( pCol->colFlags |= COLFLAG_HASTYPE; } } - if( pCol->affinity==0 ) pCol->affinity = SQLITE_AFF_BLOB; + if( pCol->affinity==0 ) pCol->affinity = aff; pColl = sqlite3ExprCollSeq(pParse, p); if( pColl && pCol->zColl==0 ){ pCol->zColl = sqlite3DbStrDup(db, pColl->zName); @@ -2081,7 +2082,7 @@ void sqlite3SelectAddColumnTypeAndCollation( ** Given a SELECT statement, generate a Table structure that describes ** the result set of that SELECT. */ -Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ +Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect, char aff){ Table *pTab; sqlite3 *db = pParse->db; u64 savedFlags; @@ -2101,7 +2102,7 @@ Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ pTab->zName = 0; pTab->nRowLogEst = 200; assert( 200==sqlite3LogEst(1048576) ); sqlite3ColumnsFromExprList(pParse, pSelect->pEList, &pTab->nCol, &pTab->aCol); - sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSelect, aff); pTab->iPKey = -1; if( db->mallocFailed ){ sqlite3DeleteTable(db, pTab); @@ -5195,7 +5196,9 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ Select *pSel = pFrom->pSelect; if( pSel ){ while( pSel->pPrior ) pSel = pSel->pPrior; - sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel); + sqlite3SelectAddColumnTypeAndCollation( + pParse, pTab, pSel, SQLITE_AFF_BLOB + ); } } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6d4c07677d..821bfdbd08 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3911,8 +3911,8 @@ void sqlite3CollapseDatabaseArray(sqlite3*); void sqlite3CommitInternalChanges(sqlite3*); void sqlite3DeleteColumnNames(sqlite3*,Table*); int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); -void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*); -Table *sqlite3ResultSetOfSelect(Parse*,Select*); +void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char); +Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); void sqlite3OpenMasterTable(Parse *, int); Index *sqlite3PrimaryKeyIndex(Table*); i16 sqlite3ColumnOfIndex(Index*, i16); diff --git a/src/window.c b/src/window.c index 199185013e..665bd2cdcd 100644 --- a/src/window.c +++ b/src/window.c @@ -994,7 +994,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; - pTab2 = sqlite3ResultSetOfSelect(pParse, pSub); + pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_BLOB); if( pTab2==0 ){ rc = SQLITE_NOMEM; }else{ From 2046a773658569ad88df4590d808b1ee16c2d14b Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Aug 2019 19:44:47 +0000 Subject: [PATCH 082/221] Fix the patch on this branch so that it works with sub-queries, as well as views. FossilOrigin-Name: 7480db307c39b86bce269583e5917f5e1a3990500552fd98400ef3e7088c0b2a --- manifest | 19 ++++++++----------- manifest.uuid | 2 +- src/select.c | 4 +--- src/window.c | 2 +- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 6be75380f0..b6c90dbbcd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C One\sof\stwo\soptions\son\show\sto\saddress\sticket\s[61c853857f40da49].\s\sIn\sthis\nmode,\swe\sback\sout\sthe\sdocumentation\schange\sof\n[https://www.sqlite.org/docsrc/info/07b7749da88d54e5|[07b7749da88d54e5]]\nand\schange\sthe\score\sto\swork\sas\sit\shas\sbeen\sdocumented\sto\swork\ssince\s2017,\nrather\sthan\show\sit\shas\sactually\sworked\ssince\s2009. -D 2019-08-05T19:32:06.820 +C Fix\sthe\spatch\son\sthis\sbranch\sso\sthat\sit\sworks\swith\ssub-queries,\sas\swell\sas\sviews. +D 2019-08-05T19:44:47.542 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 5b0ef2a8b392fad19d1c8ceb803ab82a2e5ddf34d7f138cabb0a00d0a4c9d646 +F src/select.c 196bc4990e765cbebc0d2e99fb468a454da857372189a0a035aefdd138fb2db1 F src/shell.c.in e5351f14716065d6e00a0437d3910cbb1a9d4fa96af61f59f18e5623679fe605 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -613,7 +613,7 @@ F src/where.c dee31d6842a8f6acd54bc7a7c2505050cd0fa52228634187195bc0b64eb9c240 F src/whereInt.h 2bb9632f90a1a32952d43a52587209cdd536c3548715d7859bf0c1f9a65a2efd F src/wherecode.c 5dd20651afc1f67bad35523514e87f017295f1cddfdf5d1ea31a8e299d7054a8 F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 8da008a1a6f4db73e1462e88fadb2e05809bd557e4e40d1c37339fecc8b998c1 +F src/window.c 773d7f89e4f20270eaf6315e2707cfd8f4ca1e991604c60be69f1959d6569a75 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1838,10 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a29f2a7d07beff64e489e8f824babc6228c4a499fadc0ee701caa60a63baadcd -R 97414c81c0b4f69819c6816648005997 -T *branch * tkt-61c853-A -T *sym-tkt-61c853-A * -T -sym-trunk * -U drh -Z 92b9b582014c94f15af3528987c407cd +P 09cd0c0c6e6c963e0039a733876e5149adb3cd10e9b92699fa1dcb0633e997a4 +R 8160d312ef65c6c22225d62347d07efe +U dan +Z 1b28e450eef7b9a84f216281fe844a90 diff --git a/manifest.uuid b/manifest.uuid index 99fe1f741b..4ad83f9063 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -09cd0c0c6e6c963e0039a733876e5149adb3cd10e9b92699fa1dcb0633e997a4 \ No newline at end of file +7480db307c39b86bce269583e5917f5e1a3990500552fd98400ef3e7088c0b2a \ No newline at end of file diff --git a/src/select.c b/src/select.c index 2133cf48ad..d3e4fd2460 100644 --- a/src/select.c +++ b/src/select.c @@ -5196,9 +5196,7 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ Select *pSel = pFrom->pSelect; if( pSel ){ while( pSel->pPrior ) pSel = pSel->pPrior; - sqlite3SelectAddColumnTypeAndCollation( - pParse, pTab, pSel, SQLITE_AFF_BLOB - ); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel, 0); } } } diff --git a/src/window.c b/src/window.c index 665bd2cdcd..ef62ddda3c 100644 --- a/src/window.c +++ b/src/window.c @@ -994,7 +994,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; - pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_BLOB); + pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, 0); if( pTab2==0 ){ rc = SQLITE_NOMEM; }else{ From 0a8d06a93f308e2ad450a62b961a09d43c15bba6 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Aug 2019 20:45:53 +0000 Subject: [PATCH 083/221] Add test cases to this branch. FossilOrigin-Name: f37317d81cc2864ed57c76a7347351310d61c8056a2a0179218530ba60a44986 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/view.test | 37 +++++++++++++++++++++++++++++++++++++ test/window9.test | 15 +++++++++++++++ 4 files changed, 60 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b6c90dbbcd..9177d1cb2b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\spatch\son\sthis\sbranch\sso\sthat\sit\sworks\swith\ssub-queries,\sas\swell\sas\sviews. -D 2019-08-05T19:44:47.542 +C Add\stest\scases\sto\sthis\sbranch. +D 2019-08-05T20:45:53.659 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1611,7 +1611,7 @@ F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2 F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 40d54c9ddf5b9fdee692bf936d3352159fe467838f92742aa1d08c7c7d1eac73 +F test/view.test f0326e787878fa6c3d7e0ecd18291fea971210dcc0420e9ff162a9d7e6a33565 F test/vtab1.test fa6baded08fdadd6f416a9c54956c049ae327b9bdd05d25bf8163f65e65e849c F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e @@ -1714,7 +1714,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f -F test/window9.test 7bbefbb188cd95d96382d4f72dc418dd3104a9c509fb5b70d91f7f78255d67da +F test/window9.test 2bc9f311a97f1dd27de57636ebd29549fb6729c2be32f56063c0867634ed07aa F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 09cd0c0c6e6c963e0039a733876e5149adb3cd10e9b92699fa1dcb0633e997a4 -R 8160d312ef65c6c22225d62347d07efe +P 7480db307c39b86bce269583e5917f5e1a3990500552fd98400ef3e7088c0b2a +R b1f7472fc9b174cc74ba9e00e5ff64d4 U dan -Z 1b28e450eef7b9a84f216281fe844a90 +Z ae9b0a58941d32ddda7f9190b5bf51cf diff --git a/manifest.uuid b/manifest.uuid index 4ad83f9063..87cbd8da92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7480db307c39b86bce269583e5917f5e1a3990500552fd98400ef3e7088c0b2a \ No newline at end of file +f37317d81cc2864ed57c76a7347351310d61c8056a2a0179218530ba60a44986 \ No newline at end of file diff --git a/test/view.test b/test/view.test index 8a60f86215..4f2402169a 100644 --- a/test/view.test +++ b/test/view.test @@ -724,4 +724,41 @@ do_execsql_test view-26.1 { 1 1 3 3 } +#------------------------------------------------------------------------- +reset_db +do_execsql_test view-27.0 { + CREATE TABLE t0(c0 TEXT, c1); + INSERT INTO t0(c0, c1) VALUES (-1, 0); + CREATE VIEW v0(c0, c1) AS SELECT t0.c0, AVG(t0.c1) FROM t0; +} + +do_execsql_test view-27.1 { + SELECT c0, typeof(c0), affinity(c0), c1, typeof(c1), affinity(c1) FROM v0; +} { + -1 text text + 0.0 real none +} + +do_execsql_test view-27.2 { SELECT c0 Date: Tue, 6 Aug 2019 14:37:24 +0000 Subject: [PATCH 084/221] Use 0x40 (ASCII '@') instead of 0x00 to mean "no affinity" so that columns with no affinity can appear in a zero-terminated string. Use the new SQLITE_AFF_NONE macro for this new magic number. FossilOrigin-Name: e8234f6939ccff4c10f741cf66d1c537cfebcbd0d1d79a618a64c755a7f087b5 --- manifest | 31 +++++++++++++++---------------- manifest.uuid | 2 +- src/build.c | 7 ++++--- src/expr.c | 14 +++++++------- src/insert.c | 5 +++-- src/select.c | 5 +++-- src/sqliteInt.h | 11 ++++++----- src/vdbe.c | 1 + src/where.c | 1 + src/wherecode.c | 15 ++++++++------- src/window.c | 2 +- 11 files changed, 50 insertions(+), 44 deletions(-) diff --git a/manifest b/manifest index df02c57e44..92a1dc6764 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\scolumns\sof\sviews\sand\ssub-queries\sthat\sare\sexpressions\swith\sno\saffinity\sare\snot\sassigned\sBLOB\saffinity.\sThis\smatches\sthe\sdocumentation.\sFix\sfor\s[61c853857f40da49]. -D 2019-08-05T20:53:19.747 +C Use\s0x40\s(ASCII\s'@')\sinstead\sof\s0x00\sto\smean\s"no\saffinity"\sso\sthat\scolumns\nwith\sno\saffinity\scan\sappear\sin\sa\szero-terminated\sstring.\s\sUse\sthe\snew\nSQLITE_AFF_NONE\smacro\sfor\sthis\snew\smagic\snumber. +D 2019-08-06T14:37:24.439 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -467,7 +467,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 397b5075441d0bd7366e93f6f2ef908dd0610cd80c4e351f4a900b614e32ccf0 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c b48552e607494b914ce45cb82ffde58d1cee3cf240529abdcb7d6445803b5fa5 +F src/build.c 14906ec302406e7ba50f5adf07942d1f4af9a7134a2d042b3ccd992787b98e56 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 37f3d21193c4f7d141d0691cced5b39c99951bfef78df9887faf9167b9c42f37 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 20dca64dd896e87747e45052fdb73f8790a64905c8ef57edee5ebe7934d6ee80 +F src/expr.c 0e6c36895aa4be921615095499fd9ba1cd83dcb81f2d46f85d49fe7f03480087 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -484,7 +484,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c ea7e0c3dae74ba766967deabc3112d77e36cb9230245b0cf422051886c911af5 +F src/insert.c c2194dd2886337b870226fcb31c13e7df8c4b5e0ea85140e510a6f1daf1ad65b F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c F src/main.c ddba2dd3c8b11ad1d2ecc146a85a459c50a9a6b592ff154246a5db44d601d64f @@ -523,12 +523,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 196bc4990e765cbebc0d2e99fb468a454da857372189a0a035aefdd138fb2db1 +F src/select.c db06006136ec50868ce6f6fe17e8dfad21b58c089f9372d29c1a79283445907f F src/shell.c.in e5351f14716065d6e00a0437d3910cbb1a9d4fa96af61f59f18e5623679fe605 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 6350fc633ada5484a6db345fb0f29d76ceb0c471e3713a07acad65d697975bda +F src/sqliteInt.h e24c813896e6649d9ef42b85a83fb362b043858339f8c912979d519e69e3cd57 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -595,7 +595,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 4d542e9fc51d4dd35c4c0c6e58d56bc168a6a221f71b065dfd52950bd567a8ca +F src/vdbe.c d0c302d9f58adfbb1f5fd3542cb49ac02a8cc1375808d2a4dcacdc2a8f1fd64b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da @@ -609,11 +609,11 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c dee31d6842a8f6acd54bc7a7c2505050cd0fa52228634187195bc0b64eb9c240 +F src/where.c b6055f471431fdb8e2fe388789aaac239823f85c3bd394d53be0e0f727e4cd1c F src/whereInt.h 2bb9632f90a1a32952d43a52587209cdd536c3548715d7859bf0c1f9a65a2efd -F src/wherecode.c 5dd20651afc1f67bad35523514e87f017295f1cddfdf5d1ea31a8e299d7054a8 +F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 773d7f89e4f20270eaf6315e2707cfd8f4ca1e991604c60be69f1959d6569a75 +F src/window.c 89778546eccb05a81daf8e69957feaf8e22af6a3c63393bc3c34930fe07cde8b F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1838,8 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a29f2a7d07beff64e489e8f824babc6228c4a499fadc0ee701caa60a63baadcd f37317d81cc2864ed57c76a7347351310d61c8056a2a0179218530ba60a44986 -R b1f7472fc9b174cc74ba9e00e5ff64d4 -T +closed f37317d81cc2864ed57c76a7347351310d61c8056a2a0179218530ba60a44986 -U dan -Z 6f3e4abeb031e13757b5ea5703f23ca4 +P e15a0977ddfad3d0f4c7654c5665ff10830c25b20ecf6ef500b1ba23fb89e31f +R 6cb661c6ae5ac0ee443fa40f160ea1c9 +U drh +Z b23b61942492fda7f82683e9e87934ba diff --git a/manifest.uuid b/manifest.uuid index 91e7500e0d..7f89ceb392 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e15a0977ddfad3d0f4c7654c5665ff10830c25b20ecf6ef500b1ba23fb89e31f \ No newline at end of file +e8234f6939ccff4c10f741cf66d1c537cfebcbd0d1d79a618a64c755a7f087b5 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 2a33dbb897..a2cd4afeb0 100644 --- a/src/build.c +++ b/src/build.c @@ -2424,10 +2424,10 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ #ifndef SQLITE_OMIT_AUTHORIZATION xAuth = db->xAuth; db->xAuth = 0; - pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, 0); + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); db->xAuth = xAuth; #else - pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, 0); + pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); #endif pParse->nTab = n; if( pTable->pCheck ){ @@ -2443,7 +2443,8 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ && pParse->nErr==0 && pTable->nCol==pSel->pEList->nExpr ){ - sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, 0); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTable, pSel, + SQLITE_AFF_NONE); } }else if( pSelTab ){ /* CREATE VIEW name AS... without an argument list. Construct diff --git a/src/expr.c b/src/expr.c index 28ab5b0ce8..ae91f0b040 100644 --- a/src/expr.c +++ b/src/expr.c @@ -230,7 +230,7 @@ int sqlite3ExprCollSeqMatch(Parse *pParse, Expr *pE1, Expr *pE2){ */ char sqlite3CompareAffinity(Expr *pExpr, char aff2){ char aff1 = sqlite3ExprAffinity(pExpr); - if( aff1 && aff2 ){ + if( aff1>SQLITE_AFF_NONE && aff2>SQLITE_AFF_NONE ){ /* Both sides of the comparison are columns. If one has numeric ** affinity, use that. Otherwise use no affinity. */ @@ -239,15 +239,15 @@ char sqlite3CompareAffinity(Expr *pExpr, char aff2){ }else{ return SQLITE_AFF_BLOB; } - }else if( !aff1 && !aff2 ){ + }else if( aff1<=SQLITE_AFF_NONE && aff2<=SQLITE_AFF_NONE ){ /* Neither side of the comparison is a column. Compare the ** results directly. */ return SQLITE_AFF_BLOB; }else{ /* One side is a column, the other is not. Use the columns affinity. */ - assert( aff1==0 || aff2==0 ); - return (aff1 + aff2); + assert( aff1<=SQLITE_AFF_NONE || aff2<=SQLITE_AFF_NONE ); + return (aff1<=SQLITE_AFF_NONE ? aff2 : aff1) | SQLITE_AFF_NONE; } } @@ -2800,7 +2800,7 @@ void sqlite3CodeRhsOfIN( struct ExprList_item *pItem; int r1, r2, r3; affinity = sqlite3ExprAffinity(pLeft); - if( !affinity ){ + if( affinity<=SQLITE_AFF_NONE ){ affinity = SQLITE_AFF_BLOB; } if( pKeyInfo ){ @@ -3490,7 +3490,7 @@ expr_code_doover: */ int iReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft,target); int aff = sqlite3TableColumnAffinity(pExpr->y.pTab, pExpr->iColumn); - if( aff!=SQLITE_AFF_BLOB ){ + if( aff>SQLITE_AFF_BLOB ){ static const char zAff[] = "B\000C\000D\000E"; assert( SQLITE_AFF_BLOB=='A' ); assert( SQLITE_AFF_TEXT=='B' ); @@ -3793,7 +3793,7 @@ expr_code_doover: assert( nFarg==1 ); aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); sqlite3VdbeLoadString(v, target, - aff ? azAff[aff-SQLITE_AFF_BLOB] : "none"); + (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); return target; } #endif diff --git a/src/insert.c b/src/insert.c index 2f1a19952d..53d7e89b2a 100644 --- a/src/insert.c +++ b/src/insert.c @@ -98,7 +98,7 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ assert( pIdx->aColExpr!=0 ); aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); } - if( aff==0 ) aff = SQLITE_AFF_BLOB; + if( affzColAff[n] = aff; } pIdx->zColAff[n] = 0; @@ -139,11 +139,12 @@ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ } for(i=0; inCol; i++){ + assert( pTab->aCol[i].affinity!=0 ); zColAff[i] = pTab->aCol[i].affinity; } do{ zColAff[i--] = 0; - }while( i>=0 && zColAff[i]==SQLITE_AFF_BLOB ); + }while( i>=0 && zColAff[i]<=SQLITE_AFF_BLOB ); pTab->zColAff = zColAff; } assert( zColAff!=0 ); diff --git a/src/select.c b/src/select.c index d3e4fd2460..f59b50e93d 100644 --- a/src/select.c +++ b/src/select.c @@ -2069,7 +2069,7 @@ void sqlite3SelectAddColumnTypeAndCollation( pCol->colFlags |= COLFLAG_HASTYPE; } } - if( pCol->affinity==0 ) pCol->affinity = aff; + if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; pColl = sqlite3ExprCollSeq(pParse, p); if( pColl && pCol->zColl==0 ){ pCol->zColl = sqlite3DbStrDup(db, pColl->zName); @@ -5196,7 +5196,8 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ Select *pSel = pFrom->pSelect; if( pSel ){ while( pSel->pPrior ) pSel = pSel->pPrior; - sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel, 0); + sqlite3SelectAddColumnTypeAndCollation(pParse, pTab, pSel, + SQLITE_AFF_NONE); } } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 821bfdbd08..86358a7251 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1874,11 +1874,12 @@ struct CollSeq { ** Note also that the numeric types are grouped together so that testing ** for a numeric type is a single comparison. And the BLOB type is first. */ -#define SQLITE_AFF_BLOB 'A' -#define SQLITE_AFF_TEXT 'B' -#define SQLITE_AFF_NUMERIC 'C' -#define SQLITE_AFF_INTEGER 'D' -#define SQLITE_AFF_REAL 'E' +#define SQLITE_AFF_NONE 0x40 /* '@' */ +#define SQLITE_AFF_BLOB 0x41 /* 'A' */ +#define SQLITE_AFF_TEXT 0x42 /* 'B' */ +#define SQLITE_AFF_NUMERIC 0x43 /* 'C' */ +#define SQLITE_AFF_INTEGER 0x44 /* 'D' */ +#define SQLITE_AFF_REAL 0x45 /* 'E' */ #define sqlite3IsNumericAffinity(X) ((X)>=SQLITE_AFF_NUMERIC) diff --git a/src/vdbe.c b/src/vdbe.c index 049c6f1467..89ef666f17 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -343,6 +343,7 @@ static void applyNumericAffinity(Mem *pRec, int bTryForInt){ ** Convert pRec to a text representation. ** ** SQLITE_AFF_BLOB: +** SQLITE_AFF_NONE: ** No-op. pRec is unchanged. */ static void applyAffinity( diff --git a/src/where.c b/src/where.c index 29f6eca102..4d23deb255 100644 --- a/src/where.c +++ b/src/where.c @@ -1305,6 +1305,7 @@ char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){ if( !pIdx->zColAff ){ if( sqlite3IndexAffinityStr(db, pIdx)==0 ) return SQLITE_AFF_BLOB; } + assert( pIdx->zColAff[iCol]!=0 ); return pIdx->zColAff[iCol]; } #endif diff --git a/src/wherecode.c b/src/wherecode.c index a6cfdb04f7..c781b06c15 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -318,9 +318,9 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ ** Code an OP_Affinity opcode to apply the column affinity string zAff ** to the n registers starting at base. ** -** As an optimization, SQLITE_AFF_BLOB entries (which are no-ops) at the -** beginning and end of zAff are ignored. If all entries in zAff are -** SQLITE_AFF_BLOB, then no code gets generated. +** As an optimization, SQLITE_AFF_BLOB and SQLITE_AFF_NONE entries (which +** are no-ops) at the beginning and end of zAff are ignored. If all entries +** in zAff are SQLITE_AFF_BLOB or SQLITE_AFF_NONE, then no code gets generated. ** ** This routine makes its own copy of zAff so that the caller is free ** to modify zAff after this routine returns. @@ -333,15 +333,16 @@ static void codeApplyAffinity(Parse *pParse, int base, int n, char *zAff){ } assert( v!=0 ); - /* Adjust base and n to skip over SQLITE_AFF_BLOB entries at the beginning - ** and end of the affinity string. + /* Adjust base and n to skip over SQLITE_AFF_BLOB and SQLITE_AFF_NONE + ** entries at the beginning and end of the affinity string. */ - while( n>0 && zAff[0]==SQLITE_AFF_BLOB ){ + assert( SQLITE_AFF_NONE0 && zAff[0]<=SQLITE_AFF_BLOB ){ n--; base++; zAff++; } - while( n>1 && zAff[n-1]==SQLITE_AFF_BLOB ){ + while( n>1 && zAff[n-1]<=SQLITE_AFF_BLOB ){ n--; } diff --git a/src/window.c b/src/window.c index ef62ddda3c..3b9af199eb 100644 --- a/src/window.c +++ b/src/window.c @@ -994,7 +994,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; - pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, 0); + pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); if( pTab2==0 ){ rc = SQLITE_NOMEM; }else{ From 915e434c3547b250b60ac37eea9276888cd8605f Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 6 Aug 2019 15:18:15 +0000 Subject: [PATCH 085/221] Performance optimization to the new affinity handling logic. FossilOrigin-Name: c9724e761bce7a4ae63ce3c1408795915865e8d3024dcb90690456f724f0df53 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 18 ++++++------------ 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 92a1dc6764..fe8d7137ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\s0x40\s(ASCII\s'@')\sinstead\sof\s0x00\sto\smean\s"no\saffinity"\sso\sthat\scolumns\nwith\sno\saffinity\scan\sappear\sin\sa\szero-terminated\sstring.\s\sUse\sthe\snew\nSQLITE_AFF_NONE\smacro\sfor\sthis\snew\smagic\snumber. -D 2019-08-06T14:37:24.439 +C Performance\soptimization\sto\sthe\snew\saffinity\shandling\slogic. +D 2019-08-06T15:18:15.358 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 0e6c36895aa4be921615095499fd9ba1cd83dcb81f2d46f85d49fe7f03480087 +F src/expr.c 338a6f564f58158d3fe0c6cc71e33f95380f13b3c5e3c03c9f144d6c920c2c81 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e15a0977ddfad3d0f4c7654c5665ff10830c25b20ecf6ef500b1ba23fb89e31f -R 6cb661c6ae5ac0ee443fa40f160ea1c9 +P e8234f6939ccff4c10f741cf66d1c537cfebcbd0d1d79a618a64c755a7f087b5 +R 10cb868e06c68a10cec1488a25566b47 U drh -Z b23b61942492fda7f82683e9e87934ba +Z e5207bffd030ca72efc9eede26e261ef diff --git a/manifest.uuid b/manifest.uuid index 7f89ceb392..16aa4fa76d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e8234f6939ccff4c10f741cf66d1c537cfebcbd0d1d79a618a64c755a7f087b5 \ No newline at end of file +c9724e761bce7a4ae63ce3c1408795915865e8d3024dcb90690456f724f0df53 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ae91f0b040..376da57cf8 100644 --- a/src/expr.c +++ b/src/expr.c @@ -239,11 +239,6 @@ char sqlite3CompareAffinity(Expr *pExpr, char aff2){ }else{ return SQLITE_AFF_BLOB; } - }else if( aff1<=SQLITE_AFF_NONE && aff2<=SQLITE_AFF_NONE ){ - /* Neither side of the comparison is a column. Compare the - ** results directly. - */ - return SQLITE_AFF_BLOB; }else{ /* One side is a column, the other is not. Use the columns affinity. */ assert( aff1<=SQLITE_AFF_NONE || aff2<=SQLITE_AFF_NONE ); @@ -280,14 +275,13 @@ static char comparisonAffinity(Expr *pExpr){ */ int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity){ char aff = comparisonAffinity(pExpr); - switch( aff ){ - case SQLITE_AFF_BLOB: - return 1; - case SQLITE_AFF_TEXT: - return idx_affinity==SQLITE_AFF_TEXT; - default: - return sqlite3IsNumericAffinity(idx_affinity); + if( aff Date: Tue, 6 Aug 2019 18:40:36 +0000 Subject: [PATCH 086/221] Add "PRAGMA foreign_keys=OFF;" to the start of the script output by ".recover", just as is done for ".dump". FossilOrigin-Name: bfc29e62eff0ed00c153e18a27815f7e3ba316f46871e9645b84ab1e6709a392 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/shell.c.in | 5 +++++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 288b8be99e..bd21295943 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\scolumns\sof\sviews\sand\ssub-queries\sthat\sare\sexpressions\swith\s\nno\saffinity\sare\scomparied\swithout\sany\stype\sconversions,\sas\srequired\sin\sthe\ndocumentation.\s\sTickets\s[61c853857f40da49]\sand\s[d52a29a9e6bc55c5]. -D 2019-08-06T15:32:42.960 +C Add\s"PRAGMA\sforeign_keys=OFF;"\sto\sthe\sstart\sof\sthe\sscript\soutput\sby\s".recover",\sjust\sas\sis\sdone\sfor\s".dump". +D 2019-08-06T18:40:36.681 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c db06006136ec50868ce6f6fe17e8dfad21b58c089f9372d29c1a79283445907f -F src/shell.c.in e5351f14716065d6e00a0437d3910cbb1a9d4fa96af61f59f18e5623679fe605 +F src/shell.c.in 486dbf00639caefff49157ff0fb495ece63b5d3446226530a4d12da4523a85d7 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1838,8 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a29f2a7d07beff64e489e8f824babc6228c4a499fadc0ee701caa60a63baadcd c9724e761bce7a4ae63ce3c1408795915865e8d3024dcb90690456f724f0df53 -R 10cb868e06c68a10cec1488a25566b47 -T +closed c9724e761bce7a4ae63ce3c1408795915865e8d3024dcb90690456f724f0df53 -U drh -Z 12b7f7b98368f306c0b1bf9a2a6cf4b0 +P 9c8c1092a8ce80e114fcfe8ce780332a6f269b8c87df226242b582d2d825c393 +R 57f54a483ad45f70950f478d347477c2 +U dan +Z 611328cc84a1359679c9e0fa05abc352 diff --git a/manifest.uuid b/manifest.uuid index bc4e25b74a..e0b22fe4d1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9c8c1092a8ce80e114fcfe8ce780332a6f269b8c87df226242b582d2d825c393 \ No newline at end of file +bfc29e62eff0ed00c153e18a27815f7e3ba316f46871e9645b84ab1e6709a392 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 366b82b9dc..4c625e5700 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6708,6 +6708,11 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ ** CREATE TABLE statements that extracted from the existing schema. */ if( rc==SQLITE_OK ){ sqlite3_stmt *pStmt = 0; + /* ".recover" might output content in an order which causes immediate + ** foreign key constraints to be violated. So disable foreign-key + ** constraint enforcement to prevent problems when running the output + ** script. */ + raw_printf(pState->out, "PRAGMA foreign_keys=OFF;\n"); raw_printf(pState->out, "BEGIN;\n"); raw_printf(pState->out, "PRAGMA writable_schema = on;\n"); shellPrepare(pState->db, &rc, From a2de66c6b4f7a89f55cfd4098d27f8b031e29229 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 6 Aug 2019 20:26:17 +0000 Subject: [PATCH 087/221] Enhance the ".recover" output in the shell to use double-quotes around table and column identifiers. FossilOrigin-Name: 846d2d2d2f7fd2e4178c70bc2b92f18941a7972fe88c0129035b7a253ed21785 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 32 +++++++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index bd21295943..fa96541093 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\s"PRAGMA\sforeign_keys=OFF;"\sto\sthe\sstart\sof\sthe\sscript\soutput\sby\s".recover",\sjust\sas\sis\sdone\sfor\s".dump". -D 2019-08-06T18:40:36.681 +C Enhance\sthe\s".recover"\soutput\sin\sthe\sshell\sto\suse\sdouble-quotes\saround\stable\nand\scolumn\sidentifiers. +D 2019-08-06T20:26:17.504 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c db06006136ec50868ce6f6fe17e8dfad21b58c089f9372d29c1a79283445907f -F src/shell.c.in 486dbf00639caefff49157ff0fb495ece63b5d3446226530a4d12da4523a85d7 +F src/shell.c.in 97714cd5e177b6d53fac83c74becf4b19fe0aa8f1a4ed6a4fa1eede4bafb96f7 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9c8c1092a8ce80e114fcfe8ce780332a6f269b8c87df226242b582d2d825c393 -R 57f54a483ad45f70950f478d347477c2 -U dan -Z 611328cc84a1359679c9e0fa05abc352 +P bfc29e62eff0ed00c153e18a27815f7e3ba316f46871e9645b84ab1e6709a392 +R 10086bf66980a741a6f6a6c27d24c72b +U drh +Z 2822779ed58d184aa4feb3102735adde diff --git a/manifest.uuid b/manifest.uuid index e0b22fe4d1..a8ffcdbce2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bfc29e62eff0ed00c153e18a27815f7e3ba316f46871e9645b84ab1e6709a392 \ No newline at end of file +846d2d2d2f7fd2e4178c70bc2b92f18941a7972fe88c0129035b7a253ed21785 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 4c625e5700..916b11283b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3977,6 +3977,22 @@ static void shellInt32( } } +/* +** Scalar function "shell_idquote(X)" returns string X quoted as an identifier, +** using "..." with internal double-quote characters doubled. +*/ +static void shellIdQuote( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zName = (const char*)sqlite3_value_text(argv[0]); + if( zName ){ + char *z = sqlite3_mprintf("\"%w\"", zName); + sqlite3_result_text(context, z, -1, sqlite3_free); + } +} + /* ** Scalar function "shell_escape_crnl" used by the .recover command. ** The argument passed to this function is the output of built-in @@ -4153,6 +4169,8 @@ static void open_db(ShellState *p, int openFlags){ shellEscapeCrnl, 0, 0); sqlite3_create_function(p->db, "shell_int32", 2, SQLITE_UTF8, 0, shellInt32, 0, 0); + sqlite3_create_function(p->db, "shell_idquote", 1, SQLITE_UTF8, 0, + shellIdQuote, 0, 0); #ifndef SQLITE_NOHAVE_SYSTEM sqlite3_create_function(p->db, "edit", 1, SQLITE_UTF8, 0, editFunc, 0, 0); @@ -6330,6 +6348,10 @@ static RecoverTable *recoverNewTable( sqlite3_stmt *pStmt = 0; rc = sqlite3_open("", &dbtmp); + if( rc==SQLITE_OK ){ + sqlite3_create_function(dbtmp, "shell_idquote", 1, SQLITE_UTF8, 0, + shellIdQuote, 0, 0); + } if( rc==SQLITE_OK ){ rc = sqlite3_exec(dbtmp, "PRAGMA writable_schema = on", 0, 0, 0); } @@ -6386,18 +6408,18 @@ static RecoverTable *recoverNewTable( } } - pTab->zQuoted = shellMPrintf(&rc, "%Q", zName); + pTab->zQuoted = shellMPrintf(&rc, "\"%w\"", zName); pTab->azlCol = (char**)shellMalloc(&rc, sizeof(char*) * (nSqlCol+1)); pTab->nCol = nSqlCol; if( bIntkey ){ - pTab->azlCol[0] = shellMPrintf(&rc, "%Q", zPk); + pTab->azlCol[0] = shellMPrintf(&rc, "\"%w\"", zPk); }else{ pTab->azlCol[0] = shellMPrintf(&rc, ""); } i = 1; shellPreparePrintf(dbtmp, &rc, &pStmt, - "SELECT %Q || group_concat(quote(name), ', ') " + "SELECT %Q || group_concat(shell_idquote(name), ', ') " " FILTER (WHERE cid!=%d) OVER (ORDER BY %s cid) " "FROM pragma_table_info(%Q)", bIntkey ? ", " : "", pTab->iPk, @@ -6511,7 +6533,7 @@ static RecoverTable *recoverOrphanTable( pTab = (RecoverTable*)shellMalloc(pRc, sizeof(RecoverTable)); if( pTab ){ - pTab->zQuoted = shellMPrintf(pRc, "%Q", zTab); + pTab->zQuoted = shellMPrintf(pRc, "\"%w\"", zTab); pTab->nCol = nCol; pTab->iPk = -2; if( nCol>0 ){ @@ -6775,7 +6797,7 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ if( pTab==0 ) break; } - if( 0==sqlite3_stricmp(pTab->zQuoted, "'sqlite_sequence'") ){ + if( 0==sqlite3_stricmp(pTab->zQuoted, "\"sqlite_sequence\"") ){ raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n"); } sqlite3_bind_int(pPages, 1, iRoot); From 55220a6c7016750ad316a985d2b887ed58b017ad Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 6 Aug 2019 20:55:06 +0000 Subject: [PATCH 088/221] Improved reuse of file descriptors for which close() is delayed to prevent clearly of posix advisory locks. FossilOrigin-Name: 509c1ba26a4c12c63ecf04ddfa2f175eaf4dd9b96ab7be15faebd36deb0a0a31 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_unix.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fa96541093..584eb435c3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\s".recover"\soutput\sin\sthe\sshell\sto\suse\sdouble-quotes\saround\stable\nand\scolumn\sidentifiers. -D 2019-08-06T20:26:17.504 +C Improved\sreuse\sof\sfile\sdescriptors\sfor\swhich\sclose()\sis\sdelayed\sto\sprevent\nclearly\sof\sposix\sadvisory\slocks. +D 2019-08-06T20:55:06.592 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -507,7 +507,7 @@ F src/os.c 66948e071d5ba7ae9ca5839799fdf68159f059cb97cada8a07eaf95a56edce79 F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 7a2e00cf63588096f356451b7405bf9c7316e1cd8543a7cfbe64e8ffed2e3f34 +F src/os_unix.c 4ec5b1305ced509ca52c4c0cb3aeabed2ed3972147b4090cf94eb31d48caeb53 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bfc29e62eff0ed00c153e18a27815f7e3ba316f46871e9645b84ab1e6709a392 -R 10086bf66980a741a6f6a6c27d24c72b +P 846d2d2d2f7fd2e4178c70bc2b92f18941a7972fe88c0129035b7a253ed21785 +R febd0c95a539da02454221d993b8efa9 U drh -Z 2822779ed58d184aa4feb3102735adde +Z 92c2dc406e9cbd99dca5df27c91ad236 diff --git a/manifest.uuid b/manifest.uuid index a8ffcdbce2..d79f37be05 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -846d2d2d2f7fd2e4178c70bc2b92f18941a7972fe88c0129035b7a253ed21785 \ No newline at end of file +509c1ba26a4c12c63ecf04ddfa2f175eaf4dd9b96ab7be15faebd36deb0a0a31 \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index 0a7c4bb467..3c1d48a4d9 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -5770,6 +5770,7 @@ static UnixUnusedFd *findReusableFd(const char *zPath, int flags){ UnixUnusedFd **pp; assert( sqlite3_mutex_notheld(pInode->pLockMutex) ); sqlite3_mutex_enter(pInode->pLockMutex); + flags &= (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); for(pp=&pInode->pUnused; *pp && (*pp)->flags!=flags; pp=&((*pp)->pNext)); pUnused = *pp; if( pUnused ){ @@ -6073,7 +6074,8 @@ static int unixOpen( if( p->pPreallocatedUnused ){ p->pPreallocatedUnused->fd = fd; - p->pPreallocatedUnused->flags = flags; + p->pPreallocatedUnused->flags = + flags & (SQLITE_OPEN_READONLY|SQLITE_OPEN_READWRITE); } if( isDelete ){ From 2712b022abeb6c3d3ca0f1253bbbcca404e52b8a Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 6 Aug 2019 21:16:28 +0000 Subject: [PATCH 089/221] Ensure that when the col in an operator like "val IN(col)" is a column of a view, its affinity is not used to coerce val. Fix for [0a5e2c1d]. FossilOrigin-Name: 17b3d2218c02a4005d4c96471c452105b54abb25901ae62990b01f0c955135fe --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 3 +++ test/view.test | 14 ++++++++++++++ 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 584eb435c3..28f357f009 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sreuse\sof\sfile\sdescriptors\sfor\swhich\sclose()\sis\sdelayed\sto\sprevent\nclearly\sof\sposix\sadvisory\slocks. -D 2019-08-06T20:55:06.592 +C Ensure\sthat\swhen\sthe\scol\sin\san\soperator\slike\s"val\sIN(col)"\sis\sa\scolumn\sof\sa\sview,\sits\saffinity\sis\snot\sused\sto\scoerce\sval.\sFix\sfor\s[0a5e2c1d]. +D 2019-08-06T21:16:28.847 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c db06006136ec50868ce6f6fe17e8dfad21b58c089f9372d29c1a79283445907f +F src/select.c 29fd0dea774b1cc02e7451cd58dfd05f47edb7f9d20fecb7278fa94c65885d50 F src/shell.c.in 97714cd5e177b6d53fac83c74becf4b19fe0aa8f1a4ed6a4fa1eede4bafb96f7 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1611,7 +1611,7 @@ F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2 F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test f0326e787878fa6c3d7e0ecd18291fea971210dcc0420e9ff162a9d7e6a33565 +F test/view.test 3a4e64be30a51a5e3c63818febaf5c4b749a2563b539c30193121aa3966bd3c4 F test/vtab1.test fa6baded08fdadd6f416a9c54956c049ae327b9bdd05d25bf8163f65e65e849c F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 846d2d2d2f7fd2e4178c70bc2b92f18941a7972fe88c0129035b7a253ed21785 -R febd0c95a539da02454221d993b8efa9 -U drh -Z 92c2dc406e9cbd99dca5df27c91ad236 +P 509c1ba26a4c12c63ecf04ddfa2f175eaf4dd9b96ab7be15faebd36deb0a0a31 +R 55e2d87efa132254be9293c605c02f10 +U dan +Z 0eac4d9e13db8d3c7f7c1099148e5700 diff --git a/manifest.uuid b/manifest.uuid index d79f37be05..1276e07700 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -509c1ba26a4c12c63ecf04ddfa2f175eaf4dd9b96ab7be15faebd36deb0a0a31 \ No newline at end of file +17b3d2218c02a4005d4c96471c452105b54abb25901ae62990b01f0c955135fe \ No newline at end of file diff --git a/src/select.c b/src/select.c index f59b50e93d..1c9ac79ab0 100644 --- a/src/select.c +++ b/src/select.c @@ -3476,6 +3476,9 @@ static Expr *substExpr( pNew->iRightJoinTable = pExpr->iRightJoinTable; ExprSetProperty(pNew, EP_FromJoin); } + if( pNew && ExprHasProperty(pExpr,EP_Generic) ){ + ExprSetProperty(pNew, EP_Generic); + } sqlite3ExprDelete(db, pExpr); pExpr = pNew; } diff --git a/test/view.test b/test/view.test index 4f2402169a..0af8d40815 100644 --- a/test/view.test +++ b/test/view.test @@ -761,4 +761,18 @@ do_execsql_test view-27.9 { SELECT 1 FROM (SELECT t0.c0 AS c0, AVG(t0.c1) AS c1 FROM t0) WHERE c0 Date: Wed, 7 Aug 2019 13:25:21 +0000 Subject: [PATCH 090/221] Do not make SQLITE_READ authorizer calls for tables without names, as all such tables will be internal-use-only tables for subqueries and whatnot. FossilOrigin-Name: 193c87fc96f964984a144c1a4506ef9db033ab2b80e64dd4d09d820fef466407 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 28f357f009..72aeed451b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\swhen\sthe\scol\sin\san\soperator\slike\s"val\sIN(col)"\sis\sa\scolumn\sof\sa\sview,\sits\saffinity\sis\snot\sused\sto\scoerce\sval.\sFix\sfor\s[0a5e2c1d]. -D 2019-08-06T21:16:28.847 +C Do\snot\smake\sSQLITE_READ\sauthorizer\scalls\sfor\stables\swithout\snames,\sas\sall\nsuch\stables\swill\sbe\sinternal-use-only\stables\sfor\ssubqueries\sand\swhatnot. +D 2019-08-07T13:25:21.372 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 29fd0dea774b1cc02e7451cd58dfd05f47edb7f9d20fecb7278fa94c65885d50 +F src/select.c 1c2c1d3ca6437349c5bceab29c9d3583f8fedb21ab3366d6f9d7381259af60cf F src/shell.c.in 97714cd5e177b6d53fac83c74becf4b19fe0aa8f1a4ed6a4fa1eede4bafb96f7 F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 509c1ba26a4c12c63ecf04ddfa2f175eaf4dd9b96ab7be15faebd36deb0a0a31 -R 55e2d87efa132254be9293c605c02f10 -U dan -Z 0eac4d9e13db8d3c7f7c1099148e5700 +P 17b3d2218c02a4005d4c96471c452105b54abb25901ae62990b01f0c955135fe +R 7416f927830c666df23d108179a39bca +U drh +Z 25c6c6c7c7a7a6e0ba13d172e2f31a7e diff --git a/manifest.uuid b/manifest.uuid index 1276e07700..27384e9f2c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -17b3d2218c02a4005d4c96471c452105b54abb25901ae62990b01f0c955135fe \ No newline at end of file +193c87fc96f964984a144c1a4506ef9db033ab2b80e64dd4d09d820fef466407 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 1c9ac79ab0..059c6ea9ae 100644 --- a/src/select.c +++ b/src/select.c @@ -5860,7 +5860,7 @@ int sqlite3Select( ** assume the column name is non-NULL and segfault. The use of an empty ** string for the fake column name seems safer. */ - if( pItem->colUsed==0 ){ + if( pItem->colUsed==0 && pItem->zName!=0 ){ sqlite3AuthCheck(pParse, SQLITE_READ, pItem->zName, "", pItem->zDatabase); } From 0e3c50c5dc156fd5f05d7284510c5905494f04db Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Aug 2019 17:45:37 +0000 Subject: [PATCH 091/221] Eliminate some more cases of redundant sorting in window-function queries. FossilOrigin-Name: 8158d2aca68c5a253054376fdf1b8eaab2db874f4b93524742be7340e9c50dd5 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/window.c | 5 ++++- test/window9.test | 26 ++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 72aeed451b..397d866523 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\smake\sSQLITE_READ\sauthorizer\scalls\sfor\stables\swithout\snames,\sas\sall\nsuch\stables\swill\sbe\sinternal-use-only\stables\sfor\ssubqueries\sand\swhatnot. -D 2019-08-07T13:25:21.372 +C Eliminate\ssome\smore\scases\sof\sredundant\ssorting\sin\swindow-function\squeries. +D 2019-08-07T17:45:37.981 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/where.c b6055f471431fdb8e2fe388789aaac239823f85c3bd394d53be0e0f727e4cd1c F src/whereInt.h 2bb9632f90a1a32952d43a52587209cdd536c3548715d7859bf0c1f9a65a2efd F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 -F src/window.c 89778546eccb05a81daf8e69957feaf8e22af6a3c63393bc3c34930fe07cde8b +F src/window.c 98b2571c66246bddadf42e76da45ed970fe7518a4c9c1ccc8cdace0711bfabba F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1714,7 +1714,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f -F test/window9.test 2bc9f311a97f1dd27de57636ebd29549fb6729c2be32f56063c0867634ed07aa +F test/window9.test 7ba6c69d3034b51db4ff680e552dbc01e945850a3e2ae74237581cc00f618978 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 17b3d2218c02a4005d4c96471c452105b54abb25901ae62990b01f0c955135fe -R 7416f927830c666df23d108179a39bca -U drh -Z 25c6c6c7c7a7a6e0ba13d172e2f31a7e +P 193c87fc96f964984a144c1a4506ef9db033ab2b80e64dd4d09d820fef466407 +R cf8e896490e535b9c5c16cd5f2f5a730 +U dan +Z 4641b29bc9e526bd7952f7ad9437097c diff --git a/manifest.uuid b/manifest.uuid index 27384e9f2c..31ed0bd0e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -193c87fc96f964984a144c1a4506ef9db033ab2b80e64dd4d09d820fef466407 \ No newline at end of file +8158d2aca68c5a253054376fdf1b8eaab2db874f4b93524742be7340e9c50dd5 \ No newline at end of file diff --git a/src/window.c b/src/window.c index 3b9af199eb..ebcb576bb5 100644 --- a/src/window.c +++ b/src/window.c @@ -934,11 +934,14 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** redundant, remove the ORDER BY from the parent SELECT. */ pSort = sqlite3ExprListDup(db, pMWin->pPartition, 0); pSort = exprListAppendList(pParse, pSort, pMWin->pOrderBy, 1); - if( pSort && p->pOrderBy ){ + if( pSort && p->pOrderBy && p->pOrderBy->nExpr<=pSort->nExpr ){ + int nSave = pSort->nExpr; + pSort->nExpr = p->pOrderBy->nExpr; if( sqlite3ExprListCompare(pSort, p->pOrderBy, -1)==0 ){ sqlite3ExprListDelete(db, p->pOrderBy); p->pOrderBy = 0; } + pSort->nExpr = nSave; } /* Assign a cursor number for the ephemeral table used to buffer rows. diff --git a/test/window9.test b/test/window9.test index 65834ed89b..754761b78b 100644 --- a/test/window9.test +++ b/test/window9.test @@ -145,6 +145,32 @@ do_execsql_test 4.1.2 { SELECT b, b=count(*), group_concat(b) OVER () FROM t1 GROUP BY b; } {1 0 1,2 2 1 1,2} +#-------------------------------------------------------------------------- +reset_db +do_execsql_test 5.0 { + CREATE TABLE t1(a, b, c, d, e); + CREATE INDEX i1 ON t1(a, b, c, d, e); +} + +foreach {tn sql} { + 1 { + SELECT + sum(e) OVER (), + sum(e) OVER (ORDER BY a), + sum(e) OVER (PARTITION BY a ORDER BY b), + sum(e) OVER (PARTITION BY a, b ORDER BY c), + sum(e) OVER (PARTITION BY a, b, c ORDER BY d) + FROM t1; + } + 2 { + SELECT sum(e) OVER (PARTITION BY a ORDER BY b) FROM t1 ORDER BY a; + } +} { + do_test 5.1.$tn { + execsql "EXPLAIN QUERY PLAN $sql" + } {~/ORDER/} +} + finish_test From e7e48dc629f2703f1130ee792705374f8b72622c Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Aug 2019 18:34:21 +0000 Subject: [PATCH 092/221] Add "set TMP=%CD%" to the start of each msvc script output by releasetest_data.tcl. Otherwise, since binaries compiled with SQLITE_TEST all choose the same sequence of pseudo-random numbers, collisions between temp file names cause errors when running multiple tests in parallel. FossilOrigin-Name: f5d0436d8dc650cadb61a5fe76fd1a0d68dabba54ff0c2a8c138f9dfbdab1c3f --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/releasetest_data.tcl | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 397d866523..2eb7259b18 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Eliminate\ssome\smore\scases\sof\sredundant\ssorting\sin\swindow-function\squeries. -D 2019-08-07T17:45:37.981 +C Add\s"set\sTMP=%CD%"\sto\sthe\sstart\sof\seach\smsvc\sscript\soutput\sby\sreleasetest_data.tcl.\sOtherwise,\ssince\sbinaries\scompiled\swith\sSQLITE_TEST\sall\schoose\sthe\ssame\ssequence\sof\spseudo-random\snumbers,\scollisions\sbetween\stemp\sfile\snames\scause\serrors\swhen\srunning\smultiple\stests\sin\sparallel. +D 2019-08-07T18:34:21.690 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1245,7 +1245,7 @@ F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d F test/releasetest.tcl 968fc1e8fd23e113fb8a04379747f3a9f2c12d207b2de85aeff5a825962e1cd7 x -F test/releasetest_data.tcl 29b791054d86fbd7abca0a63c95b342d9af7b5f8768e905274dcb4f4be4599a5 +F test/releasetest_data.tcl 4f55292d7e3e7995754373612a16b71f41be22dfded3a0375ccaf65c465d3765 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 193c87fc96f964984a144c1a4506ef9db033ab2b80e64dd4d09d820fef466407 -R cf8e896490e535b9c5c16cd5f2f5a730 +P 8158d2aca68c5a253054376fdf1b8eaab2db874f4b93524742be7340e9c50dd5 +R 072ac875b97aeb49fe07427245b5d6d5 U dan -Z 4641b29bc9e526bd7952f7ad9437097c +Z dd0b32346d93ef63ee23b8e92d055597 diff --git a/manifest.uuid b/manifest.uuid index 31ed0bd0e7..39bbbbc8ed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8158d2aca68c5a253054376fdf1b8eaab2db874f4b93524742be7340e9c50dd5 \ No newline at end of file +f5d0436d8dc650cadb61a5fe76fd1a0d68dabba54ff0c2a8c138f9dfbdab1c3f \ No newline at end of file diff --git a/test/releasetest_data.tcl b/test/releasetest_data.tcl index 7782a7a8a8..638a45d555 100644 --- a/test/releasetest_data.tcl +++ b/test/releasetest_data.tcl @@ -546,6 +546,7 @@ proc main_script {args} { set makecmd "nmake /f %SRCDIR%\\Makefile.msc TOP=%SRCDIR% $target " append makecmd "\"CFLAGS=$cflags\" \"OPTS=$opts\" $makeOpts" + puts "set TMP=%CD%" puts $makecmd } } From 679c9613f61a9af9a2c6c5c9d8295ebe28b9d6c6 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Aug 2019 19:57:21 +0000 Subject: [PATCH 093/221] Remove use of the affinity() function from view.test, as it is only available in SQLITE_DEBUG builds. FossilOrigin-Name: 7f2246a17be9915b3492624a3d8deff56694bdc372f7627e3f16c1869415b1a3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/view.test | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2eb7259b18..8c3f7705c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\s"set\sTMP=%CD%"\sto\sthe\sstart\sof\seach\smsvc\sscript\soutput\sby\sreleasetest_data.tcl.\sOtherwise,\ssince\sbinaries\scompiled\swith\sSQLITE_TEST\sall\schoose\sthe\ssame\ssequence\sof\spseudo-random\snumbers,\scollisions\sbetween\stemp\sfile\snames\scause\serrors\swhen\srunning\smultiple\stests\sin\sparallel. -D 2019-08-07T18:34:21.690 +C Remove\suse\sof\sthe\saffinity()\sfunction\sfrom\sview.test,\sas\sit\sis\sonly\savailable\sin\sSQLITE_DEBUG\sbuilds. +D 2019-08-07T19:57:21.304 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1611,7 +1611,7 @@ F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2 F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 3a4e64be30a51a5e3c63818febaf5c4b749a2563b539c30193121aa3966bd3c4 +F test/view.test c1e64ff5a860fdbb7b52add0996af2ee1af563ddf2e86b964d15d04d81a001be F test/vtab1.test fa6baded08fdadd6f416a9c54956c049ae327b9bdd05d25bf8163f65e65e849c F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8158d2aca68c5a253054376fdf1b8eaab2db874f4b93524742be7340e9c50dd5 -R 072ac875b97aeb49fe07427245b5d6d5 +P f5d0436d8dc650cadb61a5fe76fd1a0d68dabba54ff0c2a8c138f9dfbdab1c3f +R 56eccd3e7dc59c44ac74cbf902104d89 U dan -Z dd0b32346d93ef63ee23b8e92d055597 +Z 6c3c61a860bfee993c6b3b37c84b4fae diff --git a/manifest.uuid b/manifest.uuid index 39bbbbc8ed..68ebd05ac6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f5d0436d8dc650cadb61a5fe76fd1a0d68dabba54ff0c2a8c138f9dfbdab1c3f \ No newline at end of file +7f2246a17be9915b3492624a3d8deff56694bdc372f7627e3f16c1869415b1a3 \ No newline at end of file diff --git a/test/view.test b/test/view.test index 0af8d40815..490dc65a68 100644 --- a/test/view.test +++ b/test/view.test @@ -733,10 +733,10 @@ do_execsql_test view-27.0 { } do_execsql_test view-27.1 { - SELECT c0, typeof(c0), affinity(c0), c1, typeof(c1), affinity(c1) FROM v0; + SELECT c0, typeof(c0), c1, typeof(c1) FROM v0; } { - -1 text text - 0.0 real none + -1 text + 0.0 real } do_execsql_test view-27.2 { SELECT c0 Date: Thu, 8 Aug 2019 01:39:07 +0000 Subject: [PATCH 094/221] Remove a NEVER() that is reachable from a corrupt database. FossilOrigin-Name: 30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8c3f7705c4..55625abaef 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\suse\sof\sthe\saffinity()\sfunction\sfrom\sview.test,\sas\sit\sis\sonly\savailable\sin\sSQLITE_DEBUG\sbuilds. -D 2019-08-07T19:57:21.304 +C Remove\sa\sNEVER()\sthat\sis\sreachable\sfrom\sa\scorrupt\sdatabase. +D 2019-08-08T01:39:07.548 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -464,7 +464,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 397b5075441d0bd7366e93f6f2ef908dd0610cd80c4e351f4a900b614e32ccf0 +F src/btree.c 781e4594098dca97db672e52ed17c7f063b5b65db144c0c1bf1e9818e7be1ad4 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 14906ec302406e7ba50f5adf07942d1f4af9a7134a2d042b3ccd992787b98e56 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f5d0436d8dc650cadb61a5fe76fd1a0d68dabba54ff0c2a8c138f9dfbdab1c3f -R 56eccd3e7dc59c44ac74cbf902104d89 -U dan -Z 6c3c61a860bfee993c6b3b37c84b4fae +P 7f2246a17be9915b3492624a3d8deff56694bdc372f7627e3f16c1869415b1a3 +R 993358d1d5d49cd9c39a3b9f8a7f3cb8 +U drh +Z 096154c22e200783c49c846795c77c40 diff --git a/manifest.uuid b/manifest.uuid index 68ebd05ac6..94549f2843 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7f2246a17be9915b3492624a3d8deff56694bdc372f7627e3f16c1869415b1a3 \ No newline at end of file +30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 8ebe0ccb37..30cd0d128c 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6899,7 +6899,7 @@ static int rebuildPage( assert( i(u32)usableSize) ){ j = 0; } + if( j>(u32)usableSize ){ j = 0; } memcpy(&pTmp[j], &aData[j], usableSize - j); for(k=0; pCArray->ixNx[k]<=i && ALWAYS(k Date: Thu, 8 Aug 2019 15:24:17 +0000 Subject: [PATCH 095/221] Remove support for STAT3. The sqlite_stat3 tables are ignored, if they exist. STAT4 continues to work as it always has, and as it is a superset of STAT3 is the recommended replacement. FossilOrigin-Name: 1e17ea2fd1df4ad49138c787c8fe3207dd0c25c93f9001d52a9b69f8c12e841c --- manifest | 116 +++---- manifest.uuid | 2 +- src/analyze.c | 207 +++++------- src/build.c | 2 +- src/ctime.c | 2 - src/func.c | 3 - src/shell.c.in | 5 +- src/sqlite.h.in | 2 +- src/sqliteInt.h | 25 +- src/test1.c | 1 - src/test_config.c | 6 - src/util.c | 4 +- src/vdbeInt.h | 3 - src/vdbeapi.c | 6 +- src/vdbeaux.c | 9 +- src/vdbemem.c | 67 +--- src/where.c | 34 +- src/whereInt.h | 6 +- src/whereexpr.c | 6 +- test/alter.test | 1 - test/altertab.test | 1 - test/altertab3.test | 1 - test/analyze.test | 33 +- test/analyze3.test | 8 +- test/analyze5.test | 38 +-- test/analyze6.test | 2 +- test/analyze7.test | 4 +- test/analyze8.test | 4 +- test/analyzeA.test | 186 ----------- test/analyzeB.test | 682 --------------------------------------- test/auth.test | 6 +- test/dbstatus.test | 2 +- test/filter1.test | 2 - test/fkey8.test | 1 - test/fts3corrupt4.test | 1 - test/fts3corrupt5.test | 1 - test/fts3expr5.test | 1 - test/fts4rename.test | 1 - test/index6.test | 3 +- test/index7.test | 2 +- test/json104.test | 2 - test/like.test | 1 - test/mallocA.test | 18 -- test/minmax4.test | 1 - test/skipscan1.test | 1 - test/tempdb2.test | 1 - test/tkt-cbd054fa6b.test | 21 +- test/triggerC.test | 1 - test/walvfs.test | 1 - test/where.test | 1 - test/where9.test | 7 +- test/wild001.test | 311 ------------------ test/window6.test | 1 - test/window9.test | 1 - test/without_rowid1.test | 5 - 55 files changed, 227 insertions(+), 1632 deletions(-) delete mode 100644 test/analyzeA.test delete mode 100644 test/analyzeB.test delete mode 100644 test/wild001.test diff --git a/manifest b/manifest index 55625abaef..4b9a15dfc3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sthat\sis\sreachable\sfrom\sa\scorrupt\sdatabase. -D 2019-08-08T01:39:07.548 +C Remove\ssupport\sfor\sSTAT3.\s\sThe\ssqlite_stat3\stables\sare\signored,\sif\sthey\nexist.\s\sSTAT4\scontinues\sto\swork\sas\sit\salways\shas,\sand\sas\sit\sis\sa\ssuperset\sof\nSTAT3\sis\sthe\srecommended\sreplacement. +D 2019-08-08T15:24:17.512 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -458,7 +458,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c c1b5e5639b88dcc146db326315f2dea4f7f1c599e524eeb421d544927a0b1e86 -F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 +F src/analyze.c eed90d1d757cd0de0df037199660553d8cbd35dae7d8c7c1aa84b67508ccc7ad F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab @@ -467,10 +467,10 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 781e4594098dca97db672e52ed17c7f063b5b65db144c0c1bf1e9818e7be1ad4 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 14906ec302406e7ba50f5adf07942d1f4af9a7134a2d042b3ccd992787b98e56 +F src/build.c 9217f26f149a9dc3383018e85167187bc256198b29ab42ee5e02bc18fc1c757c F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c 37f3d21193c4f7d141d0691cced5b39c99951bfef78df9887faf9167b9c42f37 +F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 @@ -478,7 +478,7 @@ F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c 338a6f564f58158d3fe0c6cc71e33f95380f13b3c5e3c03c9f144d6c920c2c81 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e -F src/func.c 905c0424900979fade3731b4a271592059425c988cb7d5b245032253712dd7c8 +F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 F src/global.c 0c9c45844ae182b458610e4d427834deffcdcd45fbc8c957f6ad82051b8f161f F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -524,16 +524,16 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1c2c1d3ca6437349c5bceab29c9d3583f8fedb21ab3366d6f9d7381259af60cf -F src/shell.c.in 97714cd5e177b6d53fac83c74becf4b19fe0aa8f1a4ed6a4fa1eede4bafb96f7 -F src/sqlite.h.in dfe86c132b5085e00cf0539c78510b75e60d740191804c9848e8bb7aa850fff5 +F src/shell.c.in 3f2c64bf86bef3854bb4ee0a380a9fc05e9f92dafac2babbb929d5aad6f129ad +F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h e24c813896e6649d9ef42b85a83fb362b043858339f8c912979d519e69e3cd57 +F src/sqliteInt.h ffac9a2cb4944a09b589008106067fc40d3ad257facec76112f7d528561adefb F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c 18f980ceb2611d2cfc59da8bde7dfb4f12f235a6c91bf85ca6efdf855c34493f +F src/test1.c 42a527975c53d21bcf69a65bedff7b35f09a244b05ad096b7c3160ac0cd30253 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -548,7 +548,7 @@ F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0 F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857 F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 -F src/test_config.c 5ebafbcd5c75ac1c16bb0c8fe926dc325cc03e780943a88ca50e0d9a4fc4d2f5 +F src/test_config.c e25826d693039cdd45963de378cbf39e3af0e8aa7a8a6fc159876f4e7b5a4f8c F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 F src/test_devsym.c 6109b45c3db3ef7b002320947ed448c027356ab8b885156ff535fd8684d4a571 @@ -593,15 +593,15 @@ F src/trigger.c 563df58084fa50aaf22b13ac5b71fdb02c9ffc6f0bf5d262cfe07aade4e20b3f F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c aef606a78b85d042138a841babbc0f98471b19b9a340b962e8fae307bc8cf3da +F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c d0c302d9f58adfbb1f5fd3542cb49ac02a8cc1375808d2a4dcacdc2a8f1fd64b F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 -F src/vdbeInt.h 889c52272a02cea8af6e21b493b08bc9a043e3372a77fdfe838d25e73a47ac92 -F src/vdbeapi.c f9161e5c77f512fbb80091ce8af621d19c9556bda5e734cffaac1198407400da -F src/vdbeaux.c ffcdaf1ce887f00cc43c7fd74508ae6b9d287a65e87febc234c5cecdefeced00 +F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 +F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e +F src/vdbeaux.c a262a279d30bcddf851e5f836ac28de1d232062d409b9cf5562d28e66b986a98 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c f6f277d17d50972571d1394535d4c3d156fdea871d8f327f5b9479984054015a +F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 @@ -609,10 +609,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c b6055f471431fdb8e2fe388789aaac239823f85c3bd394d53be0e0f727e4cd1c -F src/whereInt.h 2bb9632f90a1a32952d43a52587209cdd536c3548715d7859bf0c1f9a65a2efd +F src/where.c bda7162bee2283ae9571c8e1654b67e9e2755525eddd8bd6523c8c6291d60595 +F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 -F src/whereexpr.c 5e559bdd24b06e3bc2e68f258bf751302954dc1e432daf71fdd8098a71462326 +F src/whereexpr.c 029222a0e267c682e6270832d2275b33a4447d397d2f7f147f07e408a6f54e9b F src/window.c 98b2571c66246bddadf42e76da45ed970fe7518a4c9c1ccc8cdace0711bfabba F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -621,7 +621,7 @@ F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 93dee7c0ff9106fbd53a8bbf519107904b884050a99c4565412c58c37d68c802 +F test/alter.test 16ed8d2470193f34bc711e51506ff1211ebfab8025ca3b9510ff2aef139874cb F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3 F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433 @@ -631,20 +631,18 @@ F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1 F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test b6901287474841cffbd8f90b098d3bd7d8445868b42caeb01b27034698f7245f +F test/altertab.test b2004ac589207fed7e19877bc3f1ad65142be482f269c176ee407e3b4a65f1a0 F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test 9b868b9fc643af9a7d70c0dca984fc6ea91cbb9c5b0bfc678243f3d296c4be48 +F test/altertab3.test c755ef31f8a61911331b46d71e43f6f3ef94af05c56314b168e47520355fa18e F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f -F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c -F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 +F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 +F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b F test/analyze4.test cdf88f3f72b0f0643a1ff6c730fc5af1e42464d47478d9fbac84c333f72c014e -F test/analyze5.test 765c4e284aa69ca172772aa940946f55629bc8c4 -F test/analyze6.test 7b2667b879976ac4b90d8df80d5456328684f1f6f6fdef9469d6e53401f2f469 -F test/analyze7.test a37f4d9cb699a8af068ae02df1bb08bf844df8e98a92a8126cbff89e226879d8 -F test/analyze8.test e32a970564271114786703750e6939cf81dea4b8580874e38e9213ee092f6936 +F test/analyze5.test fa5131952303ac4146aba101b116b9c8cb89e2637531c334a6df7f7d19dddc0d +F test/analyze6.test 6c3f7df2996cb6872f355a6ac1eb6d5de00a5a9288214bad7ef25c97d9cc72dc +F test/analyze7.test 6ef0b12369f61ddeadc7d8a705c40e6b52cb29f63de3a4c56581b510b46b5783 +F test/analyze8.test 36ce54947710bd44e4f9484e1ad07e725ef01a9d7078b417c1bc884356febe4d F test/analyze9.test 9fbf0e0101eef4f5dc149769aa14e10b76ee06e7c28598264b32173cd1999a54 -F test/analyzeA.test 22a892d67bd2223126335b99774cce56ba91122cfe82446d2927afc43ad667dc -F test/analyzeB.test a4c1c3048f6d9e090eb76e83eecb18bcf6d31a70 F test/analyzeC.test 555a6cc388b9818b6eda6df816f01ce0a75d3a93 F test/analyzeD.test e50cd0b3e6063216cc0c88a1776e8645dc0bd65a6bb275769cbee33b7fd8d90c F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d @@ -664,7 +662,7 @@ F test/attach2.test 256bd240da1835fb8408dd59fb7ef71f8358c7a756c46662434d11d07ba3 F test/attach3.test c59d92791070c59272e00183b7353eeb94915976 F test/attach4.test 53bf502f17647c6d6c5add46dda6bac8b6f4665c F test/attachmalloc.test 12c4f028e570acf9e0a4b0b7fe6f536e21f3d5ebddcece423603d0569beaf438 -F test/auth.test 3310d9c08e928beca42d3eadaaf53cef619d9d275f598565a3758a21ce63138e +F test/auth.test 2154625c05bc79f0e0ea72cb2358395a8041243caa0fd7ce7617d50da4331794 F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec @@ -799,7 +797,7 @@ F test/dbfuzz001.test e32d14465f1c77712896fda6a1ccc0f037b481c191c1696a9c44f6c9e4 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c c2c9cb40082a77b7e95ffb8b2da1e93322efadfb1c8c1e0001c95a0af1e156c2 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 -F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e +F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef F test/default.test 3e46c421eebefd2787c2f96673efabf792d360f3a1d5073918cbe450ce672a62 F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0 @@ -858,7 +856,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test b6d80d882bc2dfc8f5e6eff3799a2b24f23681cae18a5dc7c1770929cd5bc47e +F test/filter1.test 94a6d26588db0e4e7305e1f0985a99405e98dd034dc393dd6264603eed6645d4 F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b @@ -869,7 +867,7 @@ F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0 F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031 -F test/fkey8.test 1d44df25d3b9cba72db4b4324201daf6ae1fc8a85cb68146bd6669a977d8867d +F test/fkey8.test 48ef829d63f5f7b37aabd4df9363ac05f65539d1da8c4a44251631769d920579 F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 F test/fordelete.test eb93a2f34137bb87bdab88fcab06c0bd92719aff F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb @@ -936,8 +934,8 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 97a930e0f2fee35b3fdf21d31637865abc892526160136f92962556bf07d7473 -F test/fts3corrupt5.test 1911bd38381fe7eb28b204e7171937d09e113e5ceb018399ded9f42ec7e6ae66 +F test/fts3corrupt4.test 9c21ef823a72b0b4a09428d78e63a44c961c19b0821682f4e99cdfe147ac105b +F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -949,7 +947,7 @@ F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c7 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938 -F test/fts3expr5.test 1368738e3298a7ce0dee3a44d6ebb8f468b2a76f3d1dd18d4ea6d8bc2eeccc1b +F test/fts3expr5.test a5b9a053becbdb8e973fbf4d6d3abaabeb42d511d1848bd57931f3e0a1cf983e F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 @@ -987,7 +985,7 @@ F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309 F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7 F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a -F test/fts4rename.test 6015a355ec3a11a51eb5b88802b3b2c1788786c54b77b17f3e077b7c93ff8611 +F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3cfd0c880 F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d @@ -1048,8 +1046,8 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test a6cf96bb70bf57b2221e102060a18af46bc366f704722f410d6f42c13a75534a -F test/index7.test 2222ccd1858097f734d6ac3d39117334fd1cc26460f92fced4ef57cd15c940c1 +F test/index6.test 7883c35749e3f38282572194ffdbe7d025b1e2938c1e67da2d408ff3c27d9a46 +F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e @@ -1093,13 +1091,13 @@ F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa F test/json101.test 8f8977b00ba02f9a26c1d1f52f29f540f6d5eb162cbd5eb78bb805366d4ab26d F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b -F test/json104.test cf0dbd220cba81e6c3cf8bc326e2321049cec05ab0b529308d76f28a52529800 +F test/json104.test 317f4ec4b2d87afbba4d2460cf5be297aea76f2285eb618d276dbcd40a50950f F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 -F test/like.test 5013f18e7242fe118524fcf8e484b8827bcd5906b509d106f3587c7bfcf274ae +F test/like.test 3d702d79bf871fa32985b1ce334294c587e3948d3ab972001e811a58577e8b3c F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da F test/like3.test 62bf82ac674b7d4126e73532e1ad96cdcd8e1752a4ed90b28a6f98305f5a66aa F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e @@ -1125,7 +1123,7 @@ F test/malloc6.test 2f039d9821927eacae43e1831f815e157659a151 F test/malloc7.test 7c68a32942858bc715284856c5507446bba88c3a F test/malloc8.test 9b7a3f8cb9cf0b12fff566e80a980b1767bd961d F test/malloc9.test 2307c6ee3703b0a21391f3ea92388b4b73f9105e -F test/mallocA.test 672cd7dedb63771bade3a6f557f851a4ad161d4a +F test/mallocA.test aea76f2dd8bcc2d19748f6b911e876cefda74a563753bf26af046e9d34bb97e6 F test/mallocAll.test 98f1be74bc9f49a858bc4f361fc58e26486798be F test/mallocB.test bc475ab850cda896142ab935bbfbc74c24e51ed6 F test/mallocC.test 3dffe16532f109293ce1ccecd0c31dca55ef08c4 @@ -1151,7 +1149,7 @@ F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063 F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 -F test/minmax4.test 325f0fccb12f3d36049105817a0152a3e9bbf7f194b2610744de899e636c7d69 +F test/minmax4.test 838fe32b812dc50778be3799767cefb5ff59bb04cff81d4f12c0708642f65151 F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d @@ -1329,7 +1327,7 @@ F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test acbde73b530bfc6618626abebad8868d86cc737c61a52a204fdcd02ded049936 +F test/skipscan1.test 2a64ca7b3e6246bb86b47c9051bfd324603b1b60675fe606513535267713e080 F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 @@ -1391,7 +1389,7 @@ F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 F test/tclsqlite.test 5a06962d8f18edf4703931f6b7dacd83678d02fa5c8ced9a7958c007ad58626a F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 -F test/tempdb2.test 2479226e4cb96f4c663eccd2d12c077cf6bda29ca5cc69a8a58a06127105dd62 +F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a @@ -1457,7 +1455,7 @@ F test/tkt-bd484a090c.test 60460bf946f79a79712b71f202eda501ca99b898 F test/tkt-bdc6bbbb38.test fc38bb09bdd440e3513a1f5f98fc60a075182d7d F test/tkt-c48d99d690.test ba61977d62ab612fc515b3c488a6fbd6464a2447 F test/tkt-c694113d5.test 82c461924ada5c14866c47e85535b0b0923ba16a2e907e370061a5ca77f65d77 -F test/tkt-cbd054fa6b.test 06ccd57af3c0c7895d0f7dc844f13c51f8258885 +F test/tkt-cbd054fa6b.test 708475ef4d730a6853512c8ce363bcbd3becf0e26826e1f4cd46e2f52ff38edf F test/tkt-d11f09d36e.test d999b548fef885d1d1afa49a0e8544ecf436869d F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09 F test/tkt-d82e3f3721.test bcc0dfba658d15bab30fd4a9320c9e35d214ce30 @@ -1572,7 +1570,7 @@ F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4 F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41 F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe -F test/triggerC.test f1210921924f3a6aaa8c1538115fe56c9c448e8e3033bf0dab38ae78db937c41 +F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad @@ -1668,10 +1666,10 @@ F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cf F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 -F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 +F test/walvfs.test f1accd66c876e3a0f6b4bef5b18d13411062d0ff0a0016e32bb41570474e99fc F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec F test/wapptest.tcl 3090239c59379d41e1a0644feb6683082fdb86edfab0c668973f8003f22c0e5d x -F test/where.test 0607caa5a1fbfe7b93b95705981b463a3a0408038f22ae6e9dc11b36902b0e95 +F test/where.test d640c16d33ae671c7583fd575d1a64fd55194dcc4393b877b3028db9ddba5a3b F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 @@ -1679,7 +1677,7 @@ F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test 4fb43ad451758d9535693e110d4398fb6a6e3e153dc57bba5e61f884566c725f +F test/where9.test 2c554b97bbdb2fdf26c57099f60db8a52bfcf7c147f2c256f9798fa0e267ca85 F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 @@ -1696,7 +1694,6 @@ F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864 F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3 F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd962edb0 F test/wherelimit2.test 9bf0aa56cca40ea0e4c5e2915341355a2bbc0859ec4ce1589197fe2a9d94635f -F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d @@ -1709,12 +1706,12 @@ F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856e F test/window4.tcl 5fbaab489677914ee5686b2008426e336daf88a2f58be7df92757f780a5ebf91 F test/window4.test bf8f86586ce101bf98e2306e597fa24aadc96c58d70ba4d11f956cf8ca4e0be3 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e -F test/window6.test 465e608c021020fb0948a90200e154cd787bc910449e3dafee44c9ca5bd407fe +F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f -F test/window9.test 7ba6c69d3034b51db4ff680e552dbc01e945850a3e2ae74237581cc00f618978 +F test/window9.test 1fd3ff49119c28006e8f55e48e8425bf4d5bf560195c4df470ef147641004f56 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5 @@ -1723,7 +1720,7 @@ F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1 F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test edfccaea4c7d15d9f8ca1c6d7e58df5a7e64969140bcb4598a95edfe1bfd7e7e +F test/without_rowid1.test f40c2757272ce171b88e4227f14450db2c4d42800d447baa7656a65562d2f8d9 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591dba765a3691 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a @@ -1838,7 +1835,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 7f2246a17be9915b3492624a3d8deff56694bdc372f7627e3f16c1869415b1a3 -R 993358d1d5d49cd9c39a3b9f8a7f3cb8 +P 30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525 +R 08be8d4bfd5cad932cdfe93307e785c1 +T *branch * omit-stat3 +T *sym-omit-stat3 * +T -sym-trunk * U drh -Z 096154c22e200783c49c846795c77c40 +Z f97a070727dd7ccae3c1e0f571407df0 diff --git a/manifest.uuid b/manifest.uuid index 94549f2843..e23b2eed1f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525 \ No newline at end of file +1e17ea2fd1df4ad49138c787c8fe3207dd0c25c93f9001d52a9b69f8c12e841c \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index e6b27aaade..8d792267f5 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -27,13 +27,13 @@ ** is between 3.6.18 and 3.7.8, inclusive, and unless SQLite is compiled ** with SQLITE_ENABLE_STAT2. The sqlite_stat2 table is deprecated. ** The sqlite_stat2 table is superseded by sqlite_stat3, which is only -** created and used by SQLite versions 3.7.9 and later and with +** created and used by SQLite versions 3.7.9 through 3.29.0 when ** SQLITE_ENABLE_STAT3 defined. The functionality of sqlite_stat3 -** is a superset of sqlite_stat2. The sqlite_stat4 is an enhanced -** version of sqlite_stat3 and is only available when compiled with -** SQLITE_ENABLE_STAT4 and in SQLite versions 3.8.1 and later. It is -** not possible to enable both STAT3 and STAT4 at the same time. If they -** are both enabled, then STAT4 takes precedence. +** is a superset of sqlite_stat2 and is also now deprecated. The +** sqlite_stat4 is an enhanced version of sqlite_stat3 and is only +** available when compiled with SQLITE_ENABLE_STAT4 and in SQLite +** versions 3.8.1 and later. STAT4 is the only variant that is still +** supported. ** ** For most applications, sqlite_stat1 provides all the statistics required ** for the query planner to make good choices. @@ -144,17 +144,11 @@ #if defined(SQLITE_ENABLE_STAT4) # define IsStat4 1 -# define IsStat3 0 -#elif defined(SQLITE_ENABLE_STAT3) -# define IsStat4 0 -# define IsStat3 1 #else # define IsStat4 0 -# define IsStat3 0 # undef SQLITE_STAT4_SAMPLES # define SQLITE_STAT4_SAMPLES 1 #endif -#define IsStat34 (IsStat3+IsStat4) /* 1 for STAT3 or STAT4. 0 otherwise */ /* ** This routine generates code that opens the sqlite_statN tables. @@ -183,14 +177,10 @@ static void openStatTable( { "sqlite_stat1", "tbl,idx,stat" }, #if defined(SQLITE_ENABLE_STAT4) { "sqlite_stat4", "tbl,idx,neq,nlt,ndlt,sample" }, - { "sqlite_stat3", 0 }, -#elif defined(SQLITE_ENABLE_STAT3) - { "sqlite_stat3", "tbl,idx,neq,nlt,ndlt,sample" }, - { "sqlite_stat4", 0 }, #else - { "sqlite_stat3", 0 }, { "sqlite_stat4", 0 }, #endif + { "sqlite_stat3", 0 }, }; int i; sqlite3 *db = pParse->db; @@ -271,7 +261,7 @@ typedef struct Stat4Sample Stat4Sample; struct Stat4Sample { tRowcnt *anEq; /* sqlite_stat4.nEq */ tRowcnt *anDLt; /* sqlite_stat4.nDLt */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 tRowcnt *anLt; /* sqlite_stat4.nLt */ union { i64 iRowid; /* Rowid in main table of the key */ @@ -302,7 +292,7 @@ struct Stat4Accum { /* Reclaim memory used by a Stat4Sample */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static void sampleClear(sqlite3 *db, Stat4Sample *p){ assert( db!=0 ); if( p->nRowid ){ @@ -314,7 +304,7 @@ static void sampleClear(sqlite3 *db, Stat4Sample *p){ /* Initialize the BLOB value of a ROWID */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){ assert( db!=0 ); if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); @@ -330,7 +320,7 @@ static void sampleSetRowid(sqlite3 *db, Stat4Sample *p, int n, const u8 *pData){ /* Initialize the INTEGER value of a ROWID. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static void sampleSetRowidInt64(sqlite3 *db, Stat4Sample *p, i64 iRowid){ assert( db!=0 ); if( p->nRowid ) sqlite3DbFree(db, p->u.aRowid); @@ -343,7 +333,7 @@ static void sampleSetRowidInt64(sqlite3 *db, Stat4Sample *p, i64 iRowid){ /* ** Copy the contents of object (*pFrom) into (*pTo). */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static void sampleCopy(Stat4Accum *p, Stat4Sample *pTo, Stat4Sample *pFrom){ pTo->isPSample = pFrom->isPSample; pTo->iCol = pFrom->iCol; @@ -364,7 +354,7 @@ static void sampleCopy(Stat4Accum *p, Stat4Sample *pTo, Stat4Sample *pFrom){ */ static void stat4Destructor(void *pOld){ Stat4Accum *p = (Stat4Accum*)pOld; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int i; for(i=0; inCol; i++) sampleClear(p->db, p->aBest+i); for(i=0; imxSample; i++) sampleClear(p->db, p->a+i); @@ -384,7 +374,7 @@ static void stat4Destructor(void *pOld){ ** WITHOUT ROWID table, N is the number of PRIMARY KEY columns, not the ** total number of columns in the table. ** -** Note 2: C is only used for STAT3 and STAT4. +** Note 2: C is only used for STAT4. ** ** For indexes on ordinary rowid tables, N==K+1. But for indexes on ** WITHOUT ROWID tables, N=K+P where P is the number of columns in the @@ -407,7 +397,7 @@ static void statInit( int nColUp; /* nCol rounded up for alignment */ int n; /* Bytes of space to allocate */ sqlite3 *db; /* Database connection */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int mxSample = SQLITE_STAT4_SAMPLES; #endif @@ -424,7 +414,7 @@ static void statInit( n = sizeof(*p) + sizeof(tRowcnt)*nColUp /* Stat4Accum.anEq */ + sizeof(tRowcnt)*nColUp /* Stat4Accum.anDLt */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 + sizeof(tRowcnt)*nColUp /* Stat4Accum.anLt */ + sizeof(Stat4Sample)*(nCol+mxSample) /* Stat4Accum.aBest[], a[] */ + sizeof(tRowcnt)*3*nColUp*(nCol+mxSample) @@ -444,7 +434,7 @@ static void statInit( p->current.anDLt = (tRowcnt*)&p[1]; p->current.anEq = &p->current.anDLt[nColUp]; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 { u8 *pSpace; /* Allocated space not yet assigned */ int i; /* Used to iterate through p->aSample[] */ @@ -479,7 +469,7 @@ static void statInit( sqlite3_result_blob(context, p, sizeof(*p), stat4Destructor); } static const FuncDef statInitFuncdef = { - 2+IsStat34, /* nArg */ + 2+IsStat4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ @@ -519,7 +509,7 @@ static int sampleIsBetterPost( } #endif -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Return true if pNew is to be preferred over pOld. ** @@ -538,15 +528,11 @@ static int sampleIsBetter( assert( IsStat4 || (pNew->iCol==0 && pOld->iCol==0) ); if( (nEqNew>nEqOld) ) return 1; -#ifdef SQLITE_ENABLE_STAT4 if( nEqNew==nEqOld ){ if( pNew->iColiCol ) return 1; return (pNew->iCol==pOld->iCol && sampleIsBetterPost(pAccum, pNew, pOld)); } return 0; -#else - return (nEqNew==nEqOld && pNew->iHash>pOld->iHash); -#endif } /* @@ -559,7 +545,6 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ assert( IsStat4 || nEqZero==0 ); -#ifdef SQLITE_ENABLE_STAT4 /* Stat4Accum.nMaxEqZero is set to the maximum number of leading 0 ** values in the anEq[] array of any sample in Stat4Accum.a[]. In ** other words, if nMaxEqZero is n, then it is guaranteed that there @@ -593,7 +578,6 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ goto find_new_min; } } -#endif /* If necessary, remove sample iMin to make room for the new sample. */ if( p->nSample>=p->mxSample ){ @@ -614,10 +598,8 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ /* The "rows less-than" for the rowid column must be greater than that ** for the last sample in the p->a[] array. Otherwise, the samples would ** be out of order. */ -#ifdef SQLITE_ENABLE_STAT4 assert( p->nSample==0 || pNew->anLt[p->nCol-1] > p->a[p->nSample-1].anLt[p->nCol-1] ); -#endif /* Insert the new sample */ pSample = &p->a[p->nSample]; @@ -627,9 +609,7 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ /* Zero the first nEqZero entries in the anEq[] array. */ memset(pSample->anEq, 0, sizeof(tRowcnt)*nEqZero); -#ifdef SQLITE_ENABLE_STAT4 - find_new_min: -#endif +find_new_min: if( p->nSample>=p->mxSample ){ int iMin = -1; for(i=0; imxSample; i++){ @@ -642,7 +622,7 @@ static void sampleInsert(Stat4Accum *p, Stat4Sample *pNew, int nEqZero){ p->iMin = iMin; } } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* ** Field iChng of the index being scanned has changed. So at this point @@ -683,28 +663,7 @@ static void samplePushPrevious(Stat4Accum *p, int iChng){ } #endif -#if defined(SQLITE_ENABLE_STAT3) && !defined(SQLITE_ENABLE_STAT4) - if( iChng==0 ){ - tRowcnt nLt = p->current.anLt[0]; - tRowcnt nEq = p->current.anEq[0]; - - /* Check if this is to be a periodic sample. If so, add it. */ - if( (nLt/p->nPSample)!=(nLt+nEq)/p->nPSample ){ - p->current.isPSample = 1; - sampleInsert(p, &p->current, 0); - p->current.isPSample = 0; - }else - - /* Or if it is a non-periodic sample. Add it in this case too. */ - if( p->nSamplemxSample - || sampleIsBetter(p, &p->current, &p->a[p->iMin]) - ){ - sampleInsert(p, &p->current, 0); - } - } -#endif - -#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifndef SQLITE_ENABLE_STAT4 UNUSED_PARAMETER( p ); UNUSED_PARAMETER( iChng ); #endif @@ -724,7 +683,7 @@ static void samplePushPrevious(Stat4Accum *p, int iChng){ ** index being analyzed. The stat_get() SQL function will later be used to ** extract relevant information for constructing the sqlite_statN tables. ** -** The R parameter is only used for STAT3 and STAT4 +** The R parameter is only used for STAT4 */ static void statPush( sqlite3_context *context, @@ -756,14 +715,14 @@ static void statPush( } for(i=iChng; inCol; i++){ p->current.anDLt[i]++; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 p->current.anLt[i] += p->current.anEq[i]; #endif p->current.anEq[i] = 1; } } p->nRow++; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( sqlite3_value_type(argv[2])==SQLITE_INTEGER ){ sampleSetRowidInt64(p->db, &p->current, sqlite3_value_int64(argv[2])); }else{ @@ -796,7 +755,7 @@ static void statPush( #endif } static const FuncDef statPushFuncdef = { - 2+IsStat34, /* nArg */ + 2+IsStat4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ @@ -827,7 +786,7 @@ static const FuncDef statPushFuncdef = { ** parameter will always be a poiner to a Stat4Accum object, never a ** NULL. ** -** If neither STAT3 nor STAT4 are enabled, then J is always +** If STAT4 is not enabled, then J is always ** STAT_GET_STAT1 and is hence omitted and this routine becomes ** a one-parameter function, stat_get(P), that always returns the ** stat1 table entry information. @@ -838,8 +797,8 @@ static void statGet( sqlite3_value **argv ){ Stat4Accum *p = (Stat4Accum*)sqlite3_value_blob(argv[0]); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 - /* STAT3 and STAT4 have a parameter on this routine. */ +#ifdef SQLITE_ENABLE_STAT4 + /* STAT4 has a parameter on this routine. */ int eCall = sqlite3_value_int(argv[1]); assert( argc==2 ); assert( eCall==STAT_GET_STAT1 || eCall==STAT_GET_NEQ @@ -894,7 +853,7 @@ static void statGet( sqlite3_result_text(context, zRet, -1, sqlite3_free); } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 else if( eCall==STAT_GET_ROWID ){ if( p->iGet<0 ){ samplePushPrevious(p, 0); @@ -923,9 +882,7 @@ static void statGet( } } - if( IsStat3 ){ - sqlite3_result_int64(context, (i64)aCnt[0]); - }else{ + { char *zRet = sqlite3MallocZero(p->nCol * 25); if( zRet==0 ){ sqlite3_result_error_nomem(context); @@ -942,13 +899,13 @@ static void statGet( } } } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ #ifndef SQLITE_DEBUG UNUSED_PARAMETER( argc ); #endif } static const FuncDef statGetFuncdef = { - 1+IsStat34, /* nArg */ + 1+IsStat4, /* nArg */ SQLITE_UTF8, /* funcFlags */ 0, /* pUserData */ 0, /* pNext */ @@ -961,7 +918,7 @@ static const FuncDef statGetFuncdef = { static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){ assert( regOut!=regStat4 && regOut!=regStat4+1 ); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3VdbeAddOp2(v, OP_Integer, iParam, regStat4+1); #elif SQLITE_DEBUG assert( iParam==STAT_GET_STAT1 ); @@ -970,7 +927,7 @@ static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){ #endif sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4, regOut, (char*)&statGetFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 1 + IsStat34); + sqlite3VdbeChangeP5(v, 1 + IsStat4); } /* @@ -997,7 +954,7 @@ static void analyzeOneTable( int regNewRowid = iMem++; /* Rowid for the inserted record */ int regStat4 = iMem++; /* Register to hold Stat4Accum object */ int regChng = iMem++; /* Index of changed index field */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int regRowid = iMem++; /* Rowid argument passed to stat_push() */ #endif int regTemp = iMem++; /* Temporary use register */ @@ -1131,16 +1088,16 @@ static void analyzeOneTable( ** (3) the number of rows in the index, ** ** - ** The third argument is only used for STAT3 and STAT4 + ** The third argument is only used for STAT4 */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat4+3); #endif sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2); sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4+1, regStat4, (char*)&statInitFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 2+IsStat34); + sqlite3VdbeChangeP5(v, 2+IsStat4); /* Implementation of the following: ** @@ -1211,12 +1168,12 @@ static void analyzeOneTable( /* ** chng_addr_N: - ** regRowid = idx(rowid) // STAT34 only - ** stat_push(P, regChng, regRowid) // 3rd parameter STAT34 only + ** regRowid = idx(rowid) // STAT4 only + ** stat_push(P, regChng, regRowid) // 3rd parameter STAT4 only ** Next csr ** if !eof(csr) goto next_row; */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 assert( regRowid==(regStat4+2) ); if( HasRowid(pTab) ){ sqlite3VdbeAddOp2(v, OP_IdxRowid, iIdxCur, regRowid); @@ -1237,7 +1194,7 @@ static void analyzeOneTable( assert( regChng==(regStat4+1) ); sqlite3VdbeAddOp4(v, OP_Function0, 1, regStat4, regTemp, (char*)&statPushFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 2+IsStat34); + sqlite3VdbeChangeP5(v, 2+IsStat4); sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); /* Add the entry to the stat1 table. */ @@ -1251,8 +1208,8 @@ static void analyzeOneTable( #endif sqlite3VdbeChangeP5(v, OPFLAG_APPEND); - /* Add the entries to the stat3 or stat4 table. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 + /* Add the entries to the stat4 table. */ +#ifdef SQLITE_ENABLE_STAT4 { int regEq = regStat1; int regLt = regStat1+1; @@ -1275,21 +1232,17 @@ static void analyzeOneTable( callStatGet(v, regStat4, STAT_GET_NDLT, regDLt); sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); VdbeCoverage(v); -#ifdef SQLITE_ENABLE_STAT3 - sqlite3ExprCodeLoadIndexColumn(pParse, pIdx, iTabCur, 0, regSample); -#else for(i=0; inKeyCol+1; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* Index.aiRowEst may already be set here if there are duplicate ** sqlite_stat1 entries for this index. In that case just clobber ** the old data with the new instead of allocating a new array. */ @@ -1587,7 +1540,7 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){ ** and its contents. */ void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pIdx->aSample ){ int j; for(j=0; jnSample; j++){ @@ -1603,10 +1556,10 @@ void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){ #else UNUSED_PARAMETER(db); UNUSED_PARAMETER(pIdx); -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Populate the pIdx->aAvgEq[] array based on the samples currently ** stored in pIdx->aSample[]. @@ -1684,12 +1637,11 @@ static Index *findIndexOrPrimaryKey( } /* -** Load the content from either the sqlite_stat4 or sqlite_stat3 table +** Load the content from either the sqlite_stat4 ** into the relevant Index.aSample[] arrays. ** ** Arguments zSql1 and zSql2 must point to SQL statements that return -** data equivalent to the following (statements are different for stat3, -** see the caller of this function for details): +** data equivalent to the following: ** ** zSql1: SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx ** zSql2: SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4 @@ -1698,7 +1650,6 @@ static Index *findIndexOrPrimaryKey( */ static int loadStatTbl( sqlite3 *db, /* Database handle */ - int bStat3, /* Assume single column records only */ const char *zSql1, /* SQL statement 1 (see above) */ const char *zSql2, /* SQL statement 2 (see above) */ const char *zDb /* Database name (e.g. "main") */ @@ -1732,17 +1683,15 @@ static int loadStatTbl( if( zIndex==0 ) continue; nSample = sqlite3_column_int(pStmt, 1); pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); - assert( pIdx==0 || bStat3 || pIdx->nSample==0 ); + assert( pIdx==0 || pIdx->nSample==0 ); /* Index.nSample is non-zero at this point if data has already been - ** loaded from the stat4 table. In this case ignore stat3 data. */ + ** loaded from the stat4 table. */ if( pIdx==0 || pIdx->nSample ) continue; - if( bStat3==0 ){ - assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); - if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ - nIdxCol = pIdx->nKeyCol; - }else{ - nIdxCol = pIdx->nColumn; - } + assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); + if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ + nIdxCol = pIdx->nKeyCol; + }else{ + nIdxCol = pIdx->nColumn; } pIdx->nSampleCol = nIdxCol; nByte = sizeof(IndexSample) * nSample; @@ -1784,9 +1733,8 @@ static int loadStatTbl( pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); if( pIdx==0 ) continue; /* This next condition is true if data has already been loaded from - ** the sqlite_stat4 table. In this case ignore stat3 data. */ + ** the sqlite_stat4 table. */ nCol = pIdx->nSampleCol; - if( bStat3 && nCol>1 ) continue; if( pIdx!=pPrevIdx ){ initAvgEq(pPrevIdx); pPrevIdx = pIdx; @@ -1819,7 +1767,7 @@ static int loadStatTbl( } /* -** Load content from the sqlite_stat4 and sqlite_stat3 tables into +** Load content from the sqlite_stat4 table into ** the Index.aSample[] arrays of all indices. */ static int loadStat4(sqlite3 *db, const char *zDb){ @@ -1827,37 +1775,28 @@ static int loadStat4(sqlite3 *db, const char *zDb){ assert( db->lookaside.bDisable ); if( sqlite3FindTable(db, "sqlite_stat4", zDb) ){ - rc = loadStatTbl(db, 0, + rc = loadStatTbl(db, "SELECT idx,count(*) FROM %Q.sqlite_stat4 GROUP BY idx", "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat4", zDb ); } - - if( rc==SQLITE_OK && sqlite3FindTable(db, "sqlite_stat3", zDb) ){ - rc = loadStatTbl(db, 1, - "SELECT idx,count(*) FROM %Q.sqlite_stat3 GROUP BY idx", - "SELECT idx,neq,nlt,ndlt,sqlite_record(sample) FROM %Q.sqlite_stat3", - zDb - ); - } - return rc; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* -** Load the content of the sqlite_stat1 and sqlite_stat3/4 tables. The +** Load the content of the sqlite_stat1 and sqlite_stat4 tables. The ** contents of sqlite_stat1 are used to populate the Index.aiRowEst[] -** arrays. The contents of sqlite_stat3/4 are used to populate the +** arrays. The contents of sqlite_stat4 are used to populate the ** Index.aSample[] arrays. ** ** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR -** is returned. In this case, even if SQLITE_ENABLE_STAT3/4 was defined -** during compilation and the sqlite_stat3/4 table is present, no data is +** is returned. In this case, even if SQLITE_ENABLE_STAT4 was defined +** during compilation and the sqlite_stat4 table is present, no data is ** read from it. ** -** If SQLITE_ENABLE_STAT3/4 was defined during compilation and the +** If SQLITE_ENABLE_STAT4 was defined during compilation and the ** sqlite_stat4 table is not present in the database, SQLITE_ERROR is ** returned. However, in this case, data is read from the sqlite_stat1 ** table (if it is present) before returning. @@ -1885,7 +1824,7 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ Index *pIdx = sqliteHashData(i); pIdx->hasStat1 = 0; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3DeleteIndexSamples(db, pIdx); pIdx->aSample = 0; #endif @@ -1913,7 +1852,7 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ } /* Load the statistics from the sqlite_stat4 table. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( rc==SQLITE_OK ){ db->lookaside.bDisable++; rc = loadStat4(db, sInfo.zDatabase); diff --git a/src/build.c b/src/build.c index a2cd4afeb0..57491005a2 100644 --- a/src/build.c +++ b/src/build.c @@ -456,7 +456,7 @@ void sqlite3FreeIndex(sqlite3 *db, Index *p){ sqlite3ExprListDelete(db, p->aColExpr); sqlite3DbFree(db, p->zColAff); if( p->isResized ) sqlite3DbFree(db, (void *)p->azColl); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3_free(p->aiRowEst); #endif sqlite3DbFree(db, p); diff --git a/src/ctime.c b/src/ctime.c index ebb6e85915..013a0c2670 100644 --- a/src/ctime.c +++ b/src/ctime.c @@ -306,8 +306,6 @@ static const char * const sqlite3azCompileOpt[] = { #endif #if defined(SQLITE_ENABLE_STAT4) "ENABLE_STAT4", -#elif defined(SQLITE_ENABLE_STAT3) - "ENABLE_STAT3", #endif #if SQLITE_ENABLE_STMTVTAB "ENABLE_STMTVTAB", diff --git a/src/func.c b/src/func.c index 5aea2d74b8..34cf6175b4 100644 --- a/src/func.c +++ b/src/func.c @@ -1986,9 +1986,6 @@ void sqlite3RegisterBuiltinFunctions(void){ sqlite3AlterFunctions(); #endif sqlite3WindowFunctions(); -#if defined(SQLITE_ENABLE_STAT3) || defined(SQLITE_ENABLE_STAT4) - sqlite3AnalyzeFunctions(); -#endif sqlite3RegisterDateTimeFunctions(); sqlite3InsertBuiltinFuncs(aBuiltinFunc, ArraySize(aBuiltinFunc)); diff --git a/src/shell.c.in b/src/shell.c.in index 916b11283b..47b35907eb 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7507,8 +7507,6 @@ static int do_meta_command(char *zLine, ShellState *p){ data.cMode = data.mode = MODE_Insert; data.zDestTable = "sqlite_stat1"; shell_exec(&data, "SELECT * FROM sqlite_stat1", &zErrMsg); - data.zDestTable = "sqlite_stat3"; - shell_exec(&data, "SELECT * FROM sqlite_stat3", &zErrMsg); data.zDestTable = "sqlite_stat4"; shell_exec(&data, "SELECT * FROM sqlite_stat4", &zErrMsg); raw_printf(p->out, "ANALYZE sqlite_master;\n"); @@ -8929,8 +8927,7 @@ static int do_meta_command(char *zLine, ShellState *p){ }else if( strcmp(zTab, "sqlite_stat1")==0 ){ appendText(&sQuery,"SELECT tbl,idx,stat FROM sqlite_stat1" " ORDER BY tbl,idx;", 0); - }else if( strcmp(zTab, "sqlite_stat3")==0 - || strcmp(zTab, "sqlite_stat4")==0 ){ + }else if( strcmp(zTab, "sqlite_stat4")==0 ){ appendText(&sQuery, "SELECT * FROM ", 0); appendText(&sQuery, zTab, 0); appendText(&sQuery, " ORDER BY tbl, idx, rowid;\n", 0); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 5b3e5a15f3..20a62894fd 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3814,7 +3814,7 @@ int sqlite3_limit(sqlite3*, int id, int newVal); ** ^The specific value of WHERE-clause [parameter] might influence the ** choice of query plan if the parameter is the left-hand side of a [LIKE] ** or [GLOB] operator or if the parameter is compared to an indexed column -** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled. +** and the [SQLITE_ENABLE_STAT4] compile-time option is enabled. ** ** ** diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 86358a7251..4792919ac7 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -935,20 +935,6 @@ typedef INT16_TYPE LogEst; # define SQLITE_DEFAULT_MMAP_SIZE SQLITE_MAX_MMAP_SIZE #endif -/* -** Only one of SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4 can be defined. -** Priority is given to SQLITE_ENABLE_STAT4. If either are defined, also -** define SQLITE_ENABLE_STAT3_OR_STAT4 -*/ -#ifdef SQLITE_ENABLE_STAT4 -# undef SQLITE_ENABLE_STAT3 -# define SQLITE_ENABLE_STAT3_OR_STAT4 1 -#elif SQLITE_ENABLE_STAT3 -# define SQLITE_ENABLE_STAT3_OR_STAT4 1 -#elif SQLITE_ENABLE_STAT3_OR_STAT4 -# undef SQLITE_ENABLE_STAT3_OR_STAT4 -#endif - /* ** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not ** the Select query generator tracing logic is turned on. @@ -1587,7 +1573,7 @@ struct sqlite3 { #define SQLITE_OmitNoopJoin 0x0100 /* Omit unused tables in joins */ #define SQLITE_CountOfView 0x0200 /* The count-of-view optimization */ #define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */ -#define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */ +#define SQLITE_Stat34 0x0800 /* Use STAT4 data */ /* TH3 expects the Stat34 ^^^^^^ value to be 0x0800. Don't change it */ #define SQLITE_PushDown 0x1000 /* The push-down optimization */ #define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */ @@ -2258,7 +2244,7 @@ struct Index { unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ unsigned bNoQuery:1; /* Do not use this index to optimize queries */ unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int nSample; /* Number of elements in aSample[] */ int nSampleCol; /* Size of IndexSample.anEq[] and so on */ tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ @@ -2290,7 +2276,7 @@ struct Index { #define XN_EXPR (-2) /* Indexed column is an expression */ /* -** Each sample stored in the sqlite_stat3 table is represented in memory +** Each sample stored in the sqlite_stat4 table is represented in memory ** using a structure of this type. See documentation at the top of the ** analyze.c source file for additional information. */ @@ -4214,7 +4200,7 @@ LogEst sqlite3LogEstAdd(LogEst,LogEst); LogEst sqlite3LogEstFromDouble(double); #endif #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ - defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ + defined(SQLITE_ENABLE_STAT4) || \ defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) u64 sqlite3LogEstToInt(LogEst); #endif @@ -4401,8 +4387,7 @@ int sqlite3ExprCheckIN(Parse*, Expr*); # define sqlite3ExprCheckIN(x,y) SQLITE_OK #endif -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 -void sqlite3AnalyzeFunctions(void); +#ifdef SQLITE_ENABLE_STAT4 int sqlite3Stat4ProbeSetValue( Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*); int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**); diff --git a/src/test1.c b/src/test1.c index 808765ec17..503a270090 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7173,7 +7173,6 @@ static int SQLITE_TCLAPI optimization_control( { "order-by-idx-join", SQLITE_OrderByIdxJoin }, { "transitive", SQLITE_Transitive }, { "omit-noop-join", SQLITE_OmitNoopJoin }, - { "stat3", SQLITE_Stat34 }, { "stat4", SQLITE_Stat34 }, { "skip-scan", SQLITE_SkipScan }, }; diff --git a/src/test_config.c b/src/test_config.c index 05002349bd..e6c03308dc 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -585,12 +585,6 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); #else Tcl_SetVar2(interp, "sqlite_options", "stat4", "0", TCL_GLOBAL_ONLY); #endif -#if defined(SQLITE_ENABLE_STAT3) && !defined(SQLITE_ENABLE_STAT4) - Tcl_SetVar2(interp, "sqlite_options", "stat3", "1", TCL_GLOBAL_ONLY); -#else - Tcl_SetVar2(interp, "sqlite_options", "stat3", "0", TCL_GLOBAL_ONLY); -#endif - #if defined(SQLITE_ENABLE_STMTVTAB) && !defined(SQLITE_OMIT_VIRTUALTABLE) Tcl_SetVar2(interp, "sqlite_options", "stmtvtab", "1", TCL_GLOBAL_ONLY); #else diff --git a/src/util.c b/src/util.c index 764bfe919c..7adce4ef03 100644 --- a/src/util.c +++ b/src/util.c @@ -1498,7 +1498,7 @@ LogEst sqlite3LogEstFromDouble(double x){ #endif /* SQLITE_OMIT_VIRTUALTABLE */ #if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ - defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ + defined(SQLITE_ENABLE_STAT4) || \ defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) /* ** Convert a LogEst into an integer. @@ -1516,7 +1516,7 @@ u64 sqlite3LogEstToInt(LogEst x){ defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) if( x>60 ) return (u64)LARGEST_INT64; #else - /* If only SQLITE_ENABLE_STAT3_OR_STAT4 is on, then the largest input + /* If only SQLITE_ENABLE_STAT4 is on, then the largest input ** possible to this routine is 310, resulting in a maximum x of 31 */ assert( x<=60 ); #endif diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 3332b4838f..bd035535ab 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -486,9 +486,6 @@ int sqlite3VdbeCursorMoveto(VdbeCursor**, int*); int sqlite3VdbeCursorRestore(VdbeCursor*); u32 sqlite3VdbeSerialTypeLen(u32); u8 sqlite3VdbeOneByteSerialTypeLen(u8); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 -u32 sqlite3VdbeSerialType(Mem*, int, u32*); -#endif u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); u32 sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 83221d9724..c7968ee60d 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -844,7 +844,7 @@ int sqlite3_vtab_nochange(sqlite3_context *p){ */ sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context *p){ int rc; -#ifndef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifndef SQLITE_ENABLE_STAT4 sqlite3_int64 *piTime = &p->pVdbe->iCurrentTime; assert( p->pVdbe!=0 ); #else @@ -909,7 +909,7 @@ void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){ AuxData *pAuxData; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); -#if SQLITE_ENABLE_STAT3_OR_STAT4 +#if SQLITE_ENABLE_STAT4 if( pCtx->pVdbe==0 ) return 0; #else assert( pCtx->pVdbe!=0 ); @@ -943,7 +943,7 @@ void sqlite3_set_auxdata( Vdbe *pVdbe = pCtx->pVdbe; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pVdbe==0 ) goto failed; #else assert( pVdbe!=0 ); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 4417cc63a1..828304780b 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3433,7 +3433,7 @@ int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ ** of SQLite will not understand those serial types. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#if 0 /* Inlined into the OP_MakeRecord opcode */ /* ** Return the serial-type for the value stored in pMem. ** @@ -3442,7 +3442,8 @@ int sqlite3VdbeCursorMoveto(VdbeCursor **pp, int *piCol){ ** 2019-07-11: The primary user of this subroutine was the OP_MakeRecord ** opcode in the byte-code engine. But by moving this routine in-line, we ** can omit some redundant tests and make that opcode a lot faster. So -** this routine is now only used by the STAT3/4 logic. +** this routine is now only used by the STAT3 logic and STAT3 support has +** ended. The code is kept here for historical reference only. */ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ int flags = pMem->flags; @@ -3503,7 +3504,7 @@ u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ *pLen = n; return ((n*2) + 12 + ((flags&MEM_Str)!=0)); } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* inlined into OP_MakeRecord */ /* ** The sizes for serial types less than 128 @@ -4908,7 +4909,7 @@ void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ ** features such as 'now'. */ int sqlite3NotPureFunc(sqlite3_context *pCtx){ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pCtx->pVdbe==0 ) return 1; #endif if( pCtx->pVdbe->aOp[pCtx->iOp].opcode==OP_PureFunc ){ diff --git a/src/vdbemem.c b/src/vdbemem.c index af6d41a382..241d6f2ff3 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1303,7 +1303,7 @@ struct ValueNewStat4Ctx { ** an sqlite3_value within the UnpackedRecord.a[] array. */ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( p ){ UnpackedRecord *pRec = p->ppRec[0]; @@ -1339,7 +1339,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ } #else UNUSED_PARAMETER(p); -#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ +#endif /* defined(SQLITE_ENABLE_STAT4) */ return sqlite3ValueNew(db); } @@ -1363,7 +1363,7 @@ static sqlite3_value *valueNew(sqlite3 *db, struct ValueNewStat4Ctx *p){ ** and sets (*ppVal) to NULL. Or, if an error occurs, (*ppVal) is set to ** NULL and an SQLite error code returned. */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 static int valueFromFunction( sqlite3 *db, /* The database connection */ Expr *p, /* The expression to evaluate */ @@ -1446,7 +1446,7 @@ static int valueFromFunction( } #else # define valueFromFunction(a,b,c,d,e,f) SQLITE_OK -#endif /* defined(SQLITE_ENABLE_STAT3_OR_STAT4) */ +#endif /* defined(SQLITE_ENABLE_STAT4) */ /* ** Extract a value from the supplied expression in the manner described @@ -1475,7 +1475,7 @@ static int valueFromExpr( assert( pExpr!=0 ); while( (op = pExpr->op)==TK_UPLUS || op==TK_SPAN ) pExpr = pExpr->pLeft; -#if defined(SQLITE_ENABLE_STAT3_OR_STAT4) +#if defined(SQLITE_ENABLE_STAT4) if( op==TK_REGISTER ) op = pExpr->op2; #else if( NEVER(op==TK_REGISTER) ) op = pExpr->op2; @@ -1568,7 +1568,7 @@ static int valueFromExpr( 0, SQLITE_DYNAMIC); } #endif -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 else if( op==TK_FUNCTION && pCtx!=0 ){ rc = valueFromFunction(db, pExpr, enc, affinity, &pVal, pCtx); } @@ -1585,13 +1585,13 @@ static int valueFromExpr( return rc; no_mem: -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pCtx==0 || pCtx->pParse->nErr==0 ) #endif sqlite3OomFault(db); sqlite3DbFree(db, zVal); assert( *ppVal==0 ); -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 if( pCtx==0 ) sqlite3ValueFree(pVal); #else assert( pCtx==0 ); sqlite3ValueFree(pVal); @@ -1619,56 +1619,7 @@ int sqlite3ValueFromExpr( return pExpr ? valueFromExpr(db, pExpr, enc, affinity, ppVal, 0) : 0; } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 -/* -** The implementation of the sqlite_record() function. This function accepts -** a single argument of any type. The return value is a formatted database -** record (a blob) containing the argument value. -** -** This is used to convert the value stored in the 'sample' column of the -** sqlite_stat3 table to the record format SQLite uses internally. -*/ -static void recordFunc( - sqlite3_context *context, - int argc, - sqlite3_value **argv -){ - const int file_format = 1; - u32 iSerial; /* Serial type */ - int nSerial; /* Bytes of space for iSerial as varint */ - u32 nVal; /* Bytes of space required for argv[0] */ - int nRet; - sqlite3 *db; - u8 *aRet; - - UNUSED_PARAMETER( argc ); - iSerial = sqlite3VdbeSerialType(argv[0], file_format, &nVal); - nSerial = sqlite3VarintLen(iSerial); - db = sqlite3_context_db_handle(context); - - nRet = 1 + nSerial + nVal; - aRet = sqlite3DbMallocRawNN(db, nRet); - if( aRet==0 ){ - sqlite3_result_error_nomem(context); - }else{ - aRet[0] = nSerial+1; - putVarint32(&aRet[1], iSerial); - sqlite3VdbeSerialPut(&aRet[1+nSerial], argv[0], iSerial); - sqlite3_result_blob(context, aRet, nRet, SQLITE_TRANSIENT); - sqlite3DbFreeNN(db, aRet); - } -} - -/* -** Register built-in functions used to help read ANALYZE data. -*/ -void sqlite3AnalyzeFunctions(void){ - static FuncDef aAnalyzeTableFuncs[] = { - FUNCTION(sqlite_record, 1, 0, 0, recordFunc), - }; - sqlite3InsertBuiltinFuncs(aAnalyzeTableFuncs, ArraySize(aAnalyzeTableFuncs)); -} - +#ifdef SQLITE_ENABLE_STAT4 /* ** Attempt to extract a value from pExpr and use it to construct *ppVal. ** diff --git a/src/where.c b/src/where.c index 4d23deb255..ebf447a31c 100644 --- a/src/where.c +++ b/src/where.c @@ -1077,7 +1077,7 @@ static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ } #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Estimate the location of a particular key among all keys in an ** index. Store the results in aStat as follows: @@ -1270,7 +1270,7 @@ static int whereKeyStats( pRec->nField = nField; return i; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* ** If it is not NULL, pTerm is a term that provides an upper or lower @@ -1296,7 +1296,7 @@ static LogEst whereRangeAdjust(WhereTerm *pTerm, LogEst nNew){ } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Return the affinity for a single column of an index. */ @@ -1311,7 +1311,7 @@ char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){ #endif -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** This function is called to estimate the number of rows visited by a ** range-scan on a skip-scan index. For example: @@ -1417,7 +1417,7 @@ static int whereRangeSkipScanEst( return rc; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* ** This function is used to estimate the number of rows that will be visited @@ -1470,7 +1470,7 @@ static int whereRangeScanEst( int nOut = pLoop->nOut; LogEst nNew; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 Index *p = pLoop->u.btree.pIndex; int nEq = pLoop->u.btree.nEq; @@ -1573,7 +1573,7 @@ static int whereRangeScanEst( /* TUNING: If both iUpper and iLower are derived from the same ** sample, then assume they are 4x more selective. This brings ** the estimated selectivity more in line with what it would be - ** if estimated without the use of STAT3/4 tables. */ + ** if estimated without the use of STAT4 tables. */ if( iLwrIdx==iUprIdx ) nNew -= 20; assert( 20==sqlite3LogEst(4) ); }else{ nNew = 10; assert( 10==sqlite3LogEst(2) ); @@ -1622,12 +1622,12 @@ static int whereRangeScanEst( return rc; } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Estimate the number of rows that will be returned based on ** an equality constraint x=VALUE and where that VALUE occurs in ** the histogram data. This only works when x is the left-most -** column of an index and sqlite_stat3 histogram data is available +** column of an index and sqlite_stat4 histogram data is available ** for that index. When pExpr==NULL that means the constraint is ** "x IS NULL" instead of "x=VALUE". ** @@ -1685,9 +1685,9 @@ static int whereEqualScanEst( return rc; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 /* ** Estimate the number of rows that will be returned based on ** an IN constraint where the right-hand side of the IN operator @@ -1734,7 +1734,7 @@ static int whereInScanEst( assert( pBuilder->nRecValid==nRecValid ); return rc; } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ #ifdef WHERETRACE_ENABLED @@ -2455,7 +2455,7 @@ static int whereLoopAddBtreeIndex( LogEst rCostIdx; LogEst nOutUnadjusted; /* nOut before IN() and WHERE adjustments */ int nIn = 0; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 int nRecValid = pBuilder->nRecValid; #endif if( (eOp==WO_ISNULL || (pTerm->wtFlags&TERM_VNULL)!=0) @@ -2613,7 +2613,7 @@ static int whereLoopAddBtreeIndex( ** the value of pNew->nOut to account for pTerm (but not nIn/nInMul). */ assert( pNew->nOut==saved_nOut ); if( pNew->wsFlags & WHERE_COLUMN_RANGE ){ - /* Adjust nOut using stat3/stat4 data. Or, if there is no stat3/stat4 + /* Adjust nOut using stat4 data. Or, if there is no stat4 ** data, using some other estimate. */ whereRangeScanEst(pParse, pBuilder, pBtm, pTop, pNew); }else{ @@ -2627,7 +2627,7 @@ static int whereLoopAddBtreeIndex( pNew->nOut += pTerm->truthProb; pNew->nOut -= nIn; }else{ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 tRowcnt nOut = 0; if( nInMul==0 && pProbe->nSample @@ -2695,7 +2695,7 @@ static int whereLoopAddBtreeIndex( whereLoopAddBtreeIndex(pBuilder, pSrc, pProbe, nInMul+nIn); } pNew->nOut = saved_nOut; -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 pBuilder->nRecValid = nRecValid; #endif } @@ -3068,7 +3068,7 @@ static int whereLoopAddBtree( ** plan */ pTab->tabFlags |= TF_StatsUsed; } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 sqlite3Stat4ProbeFree(pBuilder->pRec); pBuilder->nRecValid = 0; pBuilder->pRec = 0; diff --git a/src/whereInt.h b/src/whereInt.h index 9c90f62a1b..09e45024c1 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -279,10 +279,10 @@ struct WhereTerm { #define TERM_ORINFO 0x10 /* Need to free the WhereTerm.u.pOrInfo object */ #define TERM_ANDINFO 0x20 /* Need to free the WhereTerm.u.pAndInfo obj */ #define TERM_OR_OK 0x40 /* Used during OR-clause processing */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 # define TERM_VNULL 0x80 /* Manufactured x>NULL or x<=NULL term */ #else -# define TERM_VNULL 0x00 /* Disabled if not using stat3 */ +# define TERM_VNULL 0x00 /* Disabled if not using stat4 */ #endif #define TERM_LIKEOPT 0x100 /* Virtual terms from the LIKE optimization */ #define TERM_LIKECOND 0x200 /* Conditionally this LIKE operator term */ @@ -399,7 +399,7 @@ struct WhereLoopBuilder { ExprList *pOrderBy; /* ORDER BY clause */ WhereLoop *pNew; /* Template WhereLoop */ WhereOrSet *pOrSet; /* Record best loops here, if not NULL */ -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 +#ifdef SQLITE_ENABLE_STAT4 UnpackedRecord *pRec; /* Probe for stat4 (if required) */ int nRecValid; /* Number of valid fields currently in pRec */ #endif diff --git a/src/whereexpr.c b/src/whereexpr.c index 9ac940c5a0..155cef7155 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1381,8 +1381,8 @@ static void exprAnalyze( } } -#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 - /* When sqlite_stat3 histogram data is available an operator of the +#ifdef SQLITE_ENABLE_STAT4 + /* When sqlite_stat4 histogram data is available an operator of the ** form "x IS NOT NULL" can sometimes be evaluated more efficiently ** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a ** virtual term of that form. @@ -1418,7 +1418,7 @@ static void exprAnalyze( pNewTerm->prereqAll = pTerm->prereqAll; } } -#endif /* SQLITE_ENABLE_STAT3_OR_STAT4 */ +#endif /* SQLITE_ENABLE_STAT4 */ /* Prevent ON clause terms of a LEFT JOIN from being used to drive ** an index for tables to the left of the join. diff --git a/test/alter.test b/test/alter.test index d20e5ebccd..a82456d47b 100644 --- a/test/alter.test +++ b/test/alter.test @@ -856,7 +856,6 @@ do_test alter-14.2 { set system_table_list {1 sqlite_master} catchsql ANALYZE ifcapable analyze { lappend system_table_list 2 sqlite_stat1 } -ifcapable stat3 { lappend system_table_list 3 sqlite_stat3 } ifcapable stat4 { lappend system_table_list 4 sqlite_stat4 } foreach {tn tbl} $system_table_list { diff --git a/test/altertab.test b/test/altertab.test index 602f75345d..2eed636e0d 100644 --- a/test/altertab.test +++ b/test/altertab.test @@ -594,4 +594,3 @@ do_execsql_test 18.2.2 { } {{CREATE TABLE t0 (c1 INTEGER, PRIMARY KEY(c1))}} finish_test - diff --git a/test/altertab3.test b/test/altertab3.test index 1472c92c5f..948a351e70 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -383,4 +383,3 @@ do_execsql_test 17.2 { finish_test - diff --git a/test/analyze.test b/test/analyze.test index 683542f127..ca6c9b096d 100644 --- a/test/analyze.test +++ b/test/analyze.test @@ -288,7 +288,7 @@ do_test analyze-4.3 { } {} # Verify that DROP TABLE and DROP INDEX remove entries from the -# sqlite_stat1, sqlite_stat3 and sqlite_stat4 tables. +# sqlite_stat1 and sqlite_stat4 tables. # do_test analyze-5.0 { execsql { @@ -306,13 +306,12 @@ do_test analyze-5.0 { SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1; } } {t3i1 t3i2 t3i3 t4i1 t4i2 t3 t4} -ifcapable stat4||stat3 { - ifcapable stat4 {set stat sqlite_stat4} else {set stat sqlite_stat3} +ifcapable stat4 { do_test analyze-5.1 { - execsql " - SELECT DISTINCT idx FROM $stat ORDER BY 1; - SELECT DISTINCT tbl FROM $stat ORDER BY 1; - " + execsql { + SELECT DISTINCT idx FROM sqlite_stat4 ORDER BY 1; + SELECT DISTINCT tbl FROM sqlite_stat4 ORDER BY 1; + } } {t3i1 t3i2 t3i3 t4i1 t4i2 t3 t4} } do_test analyze-5.2 { @@ -322,12 +321,12 @@ do_test analyze-5.2 { SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1; } } {t3i1 t3i3 t4i1 t4i2 t3 t4} -ifcapable stat4||stat3 { +ifcapable stat4 { do_test analyze-5.3 { - execsql " - SELECT DISTINCT idx FROM $stat ORDER BY 1; - SELECT DISTINCT tbl FROM $stat ORDER BY 1; - " + execsql { + SELECT DISTINCT idx FROM sqlite_stat4 ORDER BY 1; + SELECT DISTINCT tbl FROM sqlite_stat4 ORDER BY 1; + } } {t3i1 t3i3 t4i1 t4i2 t3 t4} } do_test analyze-5.4 { @@ -337,12 +336,12 @@ do_test analyze-5.4 { SELECT DISTINCT tbl FROM sqlite_stat1 ORDER BY 1; } } {t4i1 t4i2 t4} -ifcapable stat4||stat3 { +ifcapable stat4 { do_test analyze-5.5 { - execsql " - SELECT DISTINCT idx FROM $stat ORDER BY 1; - SELECT DISTINCT tbl FROM $stat ORDER BY 1; - " + execsql { + SELECT DISTINCT idx FROM sqlite_stat4 ORDER BY 1; + SELECT DISTINCT tbl FROM sqlite_stat4 ORDER BY 1; + } } {t4i1 t4i2 t4} } diff --git a/test/analyze3.test b/test/analyze3.test index b7b324a868..8cc344e22b 100644 --- a/test/analyze3.test +++ b/test/analyze3.test @@ -18,7 +18,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix analyze3 -ifcapable !stat4&&!stat3 { +ifcapable !stat4 { finish_test return } @@ -100,11 +100,7 @@ do_test analyze3-1.1.1 { ANALYZE; } - ifcapable stat4 { - execsql { SELECT count(*)>0 FROM sqlite_stat4; } - } else { - execsql { SELECT count(*)>0 FROM sqlite_stat3; } - } + execsql { SELECT count(*)>0 FROM sqlite_stat4; } } {1} do_execsql_test analyze3-1.1.x { diff --git a/test/analyze5.test b/test/analyze5.test index ac175c07b5..e58457a677 100644 --- a/test/analyze5.test +++ b/test/analyze5.test @@ -17,7 +17,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -ifcapable !stat4&&!stat3 { +ifcapable !stat4 { finish_test return } @@ -67,39 +67,21 @@ do_test analyze5-1.0 { CREATE INDEX t1z ON t1(z); -- integers 0, 1, 2, and 3 ANALYZE; } - ifcapable stat4 { - db eval { - SELECT DISTINCT lindex(test_decode(sample),0) - FROM sqlite_stat4 WHERE idx='t1u' ORDER BY nlt; - } - } else { - db eval { - SELECT sample FROM sqlite_stat3 WHERE idx='t1u' ORDER BY nlt; - } + db eval { + SELECT DISTINCT lindex(test_decode(sample),0) + FROM sqlite_stat4 WHERE idx='t1u' ORDER BY nlt; } } {alpha bravo charlie delta} do_test analyze5-1.1 { - ifcapable stat4 { - db eval { - SELECT DISTINCT lower(lindex(test_decode(sample), 0)) - FROM sqlite_stat4 WHERE idx='t1v' ORDER BY 1 - } - } else { - db eval { - SELECT lower(sample) FROM sqlite_stat3 WHERE idx='t1v' ORDER BY 1 - } + db eval { + SELECT DISTINCT lower(lindex(test_decode(sample), 0)) + FROM sqlite_stat4 WHERE idx='t1v' ORDER BY 1 } } {alpha bravo charlie delta} -ifcapable stat4 { - do_test analyze5-1.2 { - db eval {SELECT idx, count(*) FROM sqlite_stat4 GROUP BY 1 ORDER BY 1} - } {t1t 8 t1u 8 t1v 8 t1w 8 t1x 8 t1y 9 t1z 8} -} else { - do_test analyze5-1.2 { - db eval {SELECT idx, count(*) FROM sqlite_stat3 GROUP BY 1 ORDER BY 1} - } {t1t 4 t1u 4 t1v 4 t1w 4 t1x 4 t1y 2 t1z 4} -} +do_test analyze5-1.2 { + db eval {SELECT idx, count(*) FROM sqlite_stat4 GROUP BY 1 ORDER BY 1} +} {t1t 8 t1u 8 t1v 8 t1w 8 t1x 8 t1y 9 t1z 8} # Verify that range queries generate the correct row count estimates # diff --git a/test/analyze6.test b/test/analyze6.test index 34d00f56ec..b6353f2668 100644 --- a/test/analyze6.test +++ b/test/analyze6.test @@ -17,7 +17,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -ifcapable !stat4&&!stat3 { +ifcapable !stat4 { finish_test return } diff --git a/test/analyze7.test b/test/analyze7.test index d6da6c1510..b3dba02563 100644 --- a/test/analyze7.test +++ b/test/analyze7.test @@ -82,7 +82,7 @@ do_test analyze7-3.1 { do_test analyze7-3.2.1 { execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=?;} } {/*SEARCH TABLE t1 USING INDEX t1cd (c=?)*/} -ifcapable stat4||stat3 { +ifcapable stat4 { # If ENABLE_STAT4 is defined, SQLite comes up with a different estimated # row count for (c=2) than it does for (c=?). do_test analyze7-3.2.2 { @@ -99,7 +99,7 @@ do_test analyze7-3.3 { execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=123 AND b=123} } {/*SEARCH TABLE t1 USING INDEX t1a (a=?)*/} -ifcapable {!stat4 && !stat3} { +ifcapable {!stat4} { do_test analyze7-3.4 { execsql {EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE c=123 AND b=123} } {/*SEARCH TABLE t1 USING INDEX t1b (b=?)*/} diff --git a/test/analyze8.test b/test/analyze8.test index daa83ef427..7c61652e51 100644 --- a/test/analyze8.test +++ b/test/analyze8.test @@ -10,13 +10,13 @@ #*********************************************************************** # # This file implements tests for SQLite library. The focus of the tests -# in this file is testing the capabilities of sqlite_stat3. +# in this file is testing the capabilities of sqlite_stat4. # set testdir [file dirname $argv0] source $testdir/tester.tcl -ifcapable !stat4&&!stat3 { +ifcapable !stat4 { finish_test return } diff --git a/test/analyzeA.test b/test/analyzeA.test deleted file mode 100644 index afcbe84b83..0000000000 --- a/test/analyzeA.test +++ /dev/null @@ -1,186 +0,0 @@ -# 2013 August 3 -# -# The author disclaims copyright to this source code. In place of -# a legal notice, here is a blessing: -# -# May you do good and not evil. -# May you find forgiveness for yourself and forgive others. -# May you share freely, never taking more than you give. -# -#*********************************************************************** -# -# This file contains automated tests used to verify that the current build -# (which must be either ENABLE_STAT3 or ENABLE_STAT4) works with both stat3 -# and stat4 data. -# - -set testdir [file dirname $argv0] -source $testdir/tester.tcl -set testprefix analyzeA - -ifcapable !stat4&&!stat3 { - finish_test - return -} - -# Populate the stat3 table according to the current contents of the db -# -proc populate_stat3 {{bDropTable 1}} { - # Open a second connection on database "test.db" and run ANALYZE. If this - # is an ENABLE_STAT3 build, this is all that is required to create and - # populate the sqlite_stat3 table. - # - sqlite3 db2 test.db - execsql { ANALYZE } - - # Now, if this is an ENABLE_STAT4 build, create and populate the - # sqlite_stat3 table based on the stat4 data gathered by the ANALYZE - # above. Then drop the sqlite_stat4 table. - # - ifcapable stat4 { - db2 func lindex lindex - execsql { - PRAGMA writable_schema = on; - CREATE TABLE sqlite_stat3(tbl,idx,neq,nlt,ndlt,sample); - INSERT INTO sqlite_stat3 - SELECT DISTINCT tbl, idx, - lindex(neq,0), lindex(nlt,0), lindex(ndlt,0), test_extract(sample, 0) - FROM sqlite_stat4; - } db2 - if {$bDropTable} { execsql {DROP TABLE sqlite_stat4} db2 } - execsql { PRAGMA writable_schema = off } - } - - # Modify the database schema cookie to ensure that the other connection - # reloads the schema. - # - execsql { - CREATE TABLE obscure_tbl_nm(x); - DROP TABLE obscure_tbl_nm; - } db2 - db2 close -} - -# Populate the stat4 table according to the current contents of the db -# -proc populate_stat4 {{bDropTable 1}} { - sqlite3 db2 test.db - execsql { ANALYZE } - - ifcapable stat3 { - execsql { - PRAGMA writable_schema = on; - CREATE TABLE sqlite_stat4(tbl,idx,neq,nlt,ndlt,sample); - INSERT INTO sqlite_stat4 - SELECT tbl, idx, neq, nlt, ndlt, sqlite_record(sample) - FROM sqlite_stat3; - } db2 - if {$bDropTable} { execsql {DROP TABLE sqlite_stat3} db2 } - execsql { PRAGMA writable_schema = off } - } - - # Modify the database schema cookie to ensure that the other connection - # reloads the schema. - # - execsql { - CREATE TABLE obscure_tbl_nm(x); - DROP TABLE obscure_tbl_nm; - } db2 - db2 close -} - -# Populate the stat4 table according to the current contents of the db. -# Leave deceptive data in the stat3 table. This data should be ignored -# in favour of that from the stat4 table. -# -proc populate_both {} { - ifcapable stat4 { populate_stat3 0 } - ifcapable stat3 { populate_stat4 0 } - - sqlite3 db2 test.db - execsql { - PRAGMA writable_schema = on; - UPDATE sqlite_stat3 SET idx = - CASE idx WHEN 't1b' THEN 't1c' ELSE 't1b' - END; - PRAGMA writable_schema = off; - CREATE TABLE obscure_tbl_nm(x); - DROP TABLE obscure_tbl_nm; - } db2 - db2 close -} - -foreach {tn analyze_cmd} { - 1 populate_stat4 - 2 populate_stat3 - 3 populate_both -} { - reset_db - do_test 1.$tn.1 { - execsql { CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT) } - for {set i 0} {$i < 100} {incr i} { - set c [expr int(pow(1.1,$i)/100)] - set b [expr 125 - int(pow(1.1,99-$i))/100] - execsql {INSERT INTO t1 VALUES($i, $b, $c)} - } - } {} - - execsql { CREATE INDEX t1b ON t1(b) } - execsql { CREATE INDEX t1c ON t1(c) } - $analyze_cmd - - do_execsql_test 1.$tn.2.1 { SELECT count(*) FROM t1 WHERE b=31 } 1 - do_execsql_test 1.$tn.2.2 { SELECT count(*) FROM t1 WHERE c=0 } 49 - do_execsql_test 1.$tn.2.3 { SELECT count(*) FROM t1 WHERE b=125 } 49 - do_execsql_test 1.$tn.2.4 { SELECT count(*) FROM t1 WHERE c=16 } 1 - - do_eqp_test 1.$tn.2.5 { - SELECT * FROM t1 WHERE b = 31 AND c = 0; - } {SEARCH TABLE t1 USING INDEX t1b (b=?)} - do_eqp_test 1.$tn.2.6 { - SELECT * FROM t1 WHERE b = 125 AND c = 16; - } {SEARCH TABLE t1 USING INDEX t1c (c=?)} - - do_execsql_test 1.$tn.3.1 { - SELECT count(*) FROM t1 WHERE b BETWEEN 0 AND 50 - } {6} - do_execsql_test 1.$tn.3.2 { - SELECT count(*) FROM t1 WHERE c BETWEEN 0 AND 50 - } {90} - do_execsql_test 1.$tn.3.3 { - SELECT count(*) FROM t1 WHERE b BETWEEN 75 AND 125 - } {90} - do_execsql_test 1.$tn.3.4 { - SELECT count(*) FROM t1 WHERE c BETWEEN 75 AND 125 - } {6} - - do_eqp_test 1.$tn.3.5 { - SELECT * FROM t1 WHERE b BETWEEN 0 AND 50 AND c BETWEEN 0 AND 50 - } {SEARCH TABLE t1 USING INDEX t1b (b>? AND b? AND c? AND b? AND b? AND c? AND c90} { set a $i } else { set a NULL } - set b [expr $i % 5] - execsql "INSERT INTO t3 VALUES($a, $b)" - } - execsql ANALYZE -} {} -do_eqp_test 10.1.3 { - SELECT * FROM t3 WHERE a IS NULL AND b = 2 -} {/t3 USING INDEX t3b/} -do_eqp_test 10.1.4 { - SELECT * FROM t3 WHERE a IS NOT NULL AND b = 2 -} {/t3 USING INDEX t3a/} - -#------------------------------------------------------------------------- -# Check that stat3 data is used correctly with non-default collation -# sequences. -# -foreach {tn schema} { - 1 { - CREATE TABLE t4(a COLLATE nocase, b); - CREATE INDEX t4a ON t4(a); - CREATE INDEX t4b ON t4(b); - } - 2 { - CREATE TABLE t4(a, b); - CREATE INDEX t4a ON t4(a COLLATE nocase); - CREATE INDEX t4b ON t4(b); - } -} { - drop_all_tables - do_test 11.$tn.1 { execsql $schema } {} - - do_test 11.$tn.2 { - for {set i 0} {$i < 100} {incr i} { - if { ($i % 10)==0 } { set a ABC } else { set a DEF } - set b [expr $i % 5] - execsql { INSERT INTO t4 VALUES($a, $b) } - } - execsql ANALYZE - } {} - - do_eqp_test 11.$tn.3 { - SELECT * FROM t4 WHERE a = 'def' AND b = 3; - } {/t4 USING INDEX t4b/} - - if {$tn==1} { - set sql "SELECT * FROM t4 WHERE a = 'abc' AND b = 3;" - do_eqp_test 11.$tn.4 $sql {/t4 USING INDEX t4a/} - } else { - - set sql "SELECT * FROM t4 WHERE a = 'abc' COLLATE nocase AND b = 3;" - do_eqp_test 11.$tn.5 $sql {/t4 USING INDEX t4a/} - - set sql "SELECT * FROM t4 WHERE a COLLATE nocase = 'abc' AND b = 3;" - do_eqp_test 11.$tn.6 $sql {/t4 USING INDEX t4a/} - } -} - -#------------------------------------------------------------------------- -# Test that nothing untoward happens if the stat3 table contains entries -# for indexes that do not exist. Or NULL values in the idx column. -# Or NULL values in any of the other columns. -# -drop_all_tables -do_execsql_test 15.1 { - CREATE TABLE x1(a, b, UNIQUE(a, b)); - INSERT INTO x1 VALUES(1, 2); - INSERT INTO x1 VALUES(3, 4); - INSERT INTO x1 VALUES(5, 6); - ANALYZE; - INSERT INTO sqlite_stat3 VALUES(NULL, NULL, NULL, NULL, NULL, NULL); -} -db close -sqlite3 db test.db -do_execsql_test 15.2 { SELECT * FROM x1 } {1 2 3 4 5 6} - -do_execsql_test 15.3 { - INSERT INTO sqlite_stat3 VALUES(42, 42, 42, 42, 42, 42); -} -db close -sqlite3 db test.db -do_execsql_test 15.4 { SELECT * FROM x1 } {1 2 3 4 5 6} - -do_execsql_test 15.5 { - UPDATE sqlite_stat1 SET stat = NULL; -} -db close -sqlite3 db test.db -do_execsql_test 15.6 { SELECT * FROM x1 } {1 2 3 4 5 6} - -do_execsql_test 15.7 { - ANALYZE; - UPDATE sqlite_stat1 SET tbl = 'no such tbl'; -} -db close -sqlite3 db test.db -do_execsql_test 15.8 { SELECT * FROM x1 } {1 2 3 4 5 6} - -do_execsql_test 15.9 { - ANALYZE; - UPDATE sqlite_stat3 SET neq = NULL, nlt=NULL, ndlt=NULL; -} -db close -sqlite3 db test.db -do_execsql_test 15.10 { SELECT * FROM x1 } {1 2 3 4 5 6} - -# This is just for coverage.... -do_execsql_test 15.11 { - ANALYZE; - UPDATE sqlite_stat1 SET stat = stat || ' unordered'; -} -db close -sqlite3 db test.db -do_execsql_test 15.12 { SELECT * FROM x1 } {1 2 3 4 5 6} - -#------------------------------------------------------------------------- -# Test that allocations used for sqlite_stat3 samples are included in -# the quantity returned by SQLITE_DBSTATUS_SCHEMA_USED. -# -set one [string repeat x 1000] -set two [string repeat x 2000] -do_test 16.1 { - reset_db - execsql { - CREATE TABLE t1(a, UNIQUE(a)); - INSERT INTO t1 VALUES($one); - ANALYZE; - } - set nByte [lindex [sqlite3_db_status db SCHEMA_USED 0] 1] - - reset_db - execsql { - CREATE TABLE t1(a, UNIQUE(a)); - INSERT INTO t1 VALUES($two); - ANALYZE; - } - set nByte2 [lindex [sqlite3_db_status db SCHEMA_USED 0] 1] - - expr {$nByte2 > $nByte+950 && $nByte2 < $nByte+1050} -} {1} - -#------------------------------------------------------------------------- -# Test that stat3 data may be used with partial indexes. -# -do_test 17.1 { - reset_db - execsql { - CREATE TABLE t1(a, b, c, d); - CREATE INDEX i1 ON t1(a, b) WHERE d IS NOT NULL; - INSERT INTO t1 VALUES(-1, -1, -1, NULL); - INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1; - INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1; - INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1; - INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1; - INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1; - INSERT INTO t1 SELECT 2*a,2*b,2*c,d FROM t1; - } - - for {set i 0} {$i < 32} {incr i} { - execsql { INSERT INTO t1 VALUES($i%2, $b, $i/2, 'abc') } - } - execsql {ANALYZE main.t1} -} {} - -do_catchsql_test 17.1.2 { - ANALYZE temp.t1; -} {1 {no such table: temp.t1}} - -do_eqp_test 17.2 { - SELECT * FROM t1 WHERE d IS NOT NULL AND a=0; -} {/USING INDEX i1/} -do_eqp_test 17.3 { - SELECT * FROM t1 WHERE d IS NOT NULL AND a=0; -} {/USING INDEX i1/} - -do_execsql_test 17.4 { - CREATE INDEX i2 ON t1(c) WHERE d IS NOT NULL; - ANALYZE main.i2; -} -do_eqp_test 17.5 { - SELECT * FROM t1 WHERE d IS NOT NULL AND a=0; -} {/USING INDEX i1/} -do_eqp_test 17.6 { - SELECT * FROM t1 WHERE d IS NOT NULL AND a=0 AND b=0 AND c=10; -} {/USING INDEX i2/} - -#------------------------------------------------------------------------- -# -do_test 18.1 { - reset_db - execsql { - CREATE TABLE t1(a, b); - CREATE INDEX i1 ON t1(a, b); - } - for {set i 0} {$i < 9} {incr i} { - execsql { - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - INSERT INTO t1 VALUES($i, 0); - } - } - execsql ANALYZE - execsql { SELECT count(*) FROM sqlite_stat3 } -} {9} - -#------------------------------------------------------------------------- -# For coverage. -# -ifcapable view { - do_test 19.1 { - reset_db - execsql { - CREATE TABLE t1(x, y); - CREATE INDEX i1 ON t1(x, y); - CREATE VIEW v1 AS SELECT * FROM t1; - ANALYZE; - } - } {} -} -ifcapable auth { - proc authproc {op args} { - if {$op == "SQLITE_ANALYZE"} { return "SQLITE_DENY" } - return "SQLITE_OK" - } - do_test 19.2 { - reset_db - db auth authproc - execsql { - CREATE TABLE t1(x, y); - CREATE VIEW v1 AS SELECT * FROM t1; - } - catchsql ANALYZE - } {1 {not authorized}} -} - -#------------------------------------------------------------------------- -# -reset_db -proc r {args} { expr rand() } -db func r r -db func lrange lrange -do_test 20.1 { - execsql { - CREATE TABLE t1(a,b,c,d); - CREATE INDEX i1 ON t1(a,b,c,d); - } - for {set i 0} {$i < 16} {incr i} { - execsql { - INSERT INTO t1 VALUES($i, r(), r(), r()); - INSERT INTO t1 VALUES($i, $i, r(), r()); - INSERT INTO t1 VALUES($i, $i, $i, r()); - INSERT INTO t1 VALUES($i, $i, $i, $i); - INSERT INTO t1 VALUES($i, $i, $i, $i); - INSERT INTO t1 VALUES($i, $i, $i, r()); - INSERT INTO t1 VALUES($i, $i, r(), r()); - INSERT INTO t1 VALUES($i, r(), r(), r()); - } - } -} {} -do_execsql_test 20.2 { ANALYZE } -for {set i 0} {$i<16} {incr i} { - set val $i - do_execsql_test 20.3.$i { - SELECT count(*) FROM sqlite_stat3 WHERE sample=$val - } {1} -} - -finish_test diff --git a/test/auth.test b/test/auth.test index 354acba64a..cc48fdb9aa 100644 --- a/test/auth.test +++ b/test/auth.test @@ -2450,11 +2450,7 @@ ifcapable compound&&subquery { ifcapable stat4 { set stat4 "sqlite_stat4 " } else { - ifcapable stat3 { - set stat4 "sqlite_stat3 " - } else { - set stat4 "" - } + set stat4 "" } do_test auth-5.2 { execsql { diff --git a/test/dbstatus.test b/test/dbstatus.test index 564b9c5966..8d5d8349cf 100644 --- a/test/dbstatus.test +++ b/test/dbstatus.test @@ -63,7 +63,7 @@ proc lookaside {db} { } } -ifcapable stat4||stat3 { +ifcapable stat4 { set STAT3 1 } else { set STAT3 0 diff --git a/test/filter1.test b/test/filter1.test index b4a7ba8e6b..e15022fd6f 100644 --- a/test/filter1.test +++ b/test/filter1.test @@ -102,5 +102,3 @@ do_catchsql_test 2.3 { } {1 {misuse of aggregate function count()}} finish_test - - diff --git a/test/fkey8.test b/test/fkey8.test index 42f997f06f..085190e675 100644 --- a/test/fkey8.test +++ b/test/fkey8.test @@ -229,4 +229,3 @@ do_execsql_test 5.3 { } {ok} finish_test - diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index b312b7754f..fdcfa969f2 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -5319,4 +5319,3 @@ do_catchsql_test 29.1 { } {1 {database disk image is malformed}} finish_test - diff --git a/test/fts3corrupt5.test b/test/fts3corrupt5.test index d60a8c0caa..a8a3b0168e 100644 --- a/test/fts3corrupt5.test +++ b/test/fts3corrupt5.test @@ -57,4 +57,3 @@ foreach {tn val q bCorrupt} { } finish_test - diff --git a/test/fts3expr5.test b/test/fts3expr5.test index 8673abb73b..1317befb1c 100644 --- a/test/fts3expr5.test +++ b/test/fts3expr5.test @@ -64,4 +64,3 @@ do_test 2.2 { } {1 {Error parsing expression}} finish_test - diff --git a/test/fts4rename.test b/test/fts4rename.test index 1c711e74e6..c647d6928e 100644 --- a/test/fts4rename.test +++ b/test/fts4rename.test @@ -41,4 +41,3 @@ do_catchsql_test 1.3 { } {0 {}} finish_test - diff --git a/test/index6.test b/test/index6.test index b271954b28..5faf0f02ac 100644 --- a/test/index6.test +++ b/test/index6.test @@ -159,7 +159,7 @@ do_test index6-2.2 { SELECT * FROM t2 WHERE a=5; } } {/.* TABLE t2 USING INDEX t2a1 .*/} -ifcapable stat4||stat3 { +ifcapable stat4 { execsql ANALYZE do_test index6-2.3stat4 { execsql { @@ -438,4 +438,3 @@ do_execsql_test index6-14.2 { } {{} row} finish_test - diff --git a/test/index7.test b/test/index7.test index 33abbafd95..f57792e4c2 100644 --- a/test/index7.test +++ b/test/index7.test @@ -203,7 +203,7 @@ do_test index7-2.2 { SELECT * FROM t2 WHERE a=5; } } {/.* TABLE t2 USING COVERING INDEX t2a1 .*/} -ifcapable stat4||stat3 { +ifcapable stat4 { do_test index7-2.3stat4 { execsql { EXPLAIN QUERY PLAN diff --git a/test/json104.test b/test/json104.test index 23864d53dc..e56e7edeff 100644 --- a/test/json104.test +++ b/test/json104.test @@ -153,5 +153,3 @@ do_execsql_test 405 { finish_test - - diff --git a/test/like.test b/test/like.test index 75ddf9ccc0..0fc80254ba 100644 --- a/test/like.test +++ b/test/like.test @@ -1114,4 +1114,3 @@ do_execsql_test 16.2 { } {{ 1-}} finish_test - diff --git a/test/mallocA.test b/test/mallocA.test index a78073d833..ff91d2af26 100644 --- a/test/mallocA.test +++ b/test/mallocA.test @@ -96,24 +96,6 @@ do_faultsim_test 6.2 -faults oom* -body { } -test { faultsim_test_result [list 0 {1 2}] } -ifcapable stat3 { - do_test 6.3-prep { - execsql { - PRAGMA writable_schema = 1; - CREATE TABLE sqlite_stat4 AS - SELECT tbl, idx, neq, nlt, ndlt, sqlite_record(sample) AS sample - FROM sqlite_stat3; - } - } {} - do_faultsim_test 6.3 -faults oom* -body { - execsql { - ANALYZE sqlite_master; - SELECT rowid FROM t1 WHERE a='abc' AND b<'y'; - } - } -test { - faultsim_test_result [list 0 {1 2}] - } -} do_execsql_test 7.0 { PRAGMA cache_size = 5; diff --git a/test/minmax4.test b/test/minmax4.test index 351e528664..eeb8bff0bb 100644 --- a/test/minmax4.test +++ b/test/minmax4.test @@ -201,4 +201,3 @@ do_execsql_test 5.1 { } {123} finish_test - diff --git a/test/skipscan1.test b/test/skipscan1.test index 3722cbda06..da9df8fe5e 100644 --- a/test/skipscan1.test +++ b/test/skipscan1.test @@ -234,7 +234,6 @@ do_execsql_test skipscan1-5.2 { ANALYZE; DELETE FROM sqlite_stat1; DROP TABLE IF EXISTS sqlite_stat4; - DROP TABLE IF EXISTS sqlite_stat3; INSERT INTO sqlite_stat1 VALUES('t5','t5i1','2702931 3 2 2 2 2'); INSERT INTO sqlite_stat1 VALUES('t5','t5i2','2702931 686 2 2 2'); ANALYZE sqlite_master; diff --git a/test/tempdb2.test b/test/tempdb2.test index d814f842bf..37cb4b33ba 100644 --- a/test/tempdb2.test +++ b/test/tempdb2.test @@ -97,4 +97,3 @@ do_execsql_test 2.2 { } "[int2str 1001][int2str 1001][int2str 1001]" finish_test - diff --git a/test/tkt-cbd054fa6b.test b/test/tkt-cbd054fa6b.test index 2951233a5b..86248ca21d 100644 --- a/test/tkt-cbd054fa6b.test +++ b/test/tkt-cbd054fa6b.test @@ -16,7 +16,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -ifcapable !stat4&&!stat3 { +ifcapable !stat4 { finish_test return } @@ -55,19 +55,12 @@ do_test tkt-cbd05-1.1 { } {10} do_test tkt-cbd05-1.2 { db eval { ANALYZE; } - ifcapable stat4 { - db eval { - PRAGMA writable_schema = 1; - CREATE VIEW vvv AS - SELECT tbl,idx,neq,nlt,ndlt,test_extract(sample,0) AS sample - FROM sqlite_stat4; - PRAGMA writable_schema = 0; - } - } else { - db eval { - CREATE VIEW vvv AS - SELECT tbl,idx,neq,nlt,ndlt,sample FROM sqlite_stat3; - } + db eval { + PRAGMA writable_schema = 1; + CREATE VIEW vvv AS + SELECT tbl,idx,neq,nlt,ndlt,test_extract(sample,0) AS sample + FROM sqlite_stat4; + PRAGMA writable_schema = 0; } } {} do_test tkt-cbd05-1.3 { diff --git a/test/triggerC.test b/test/triggerC.test index d5fd884d05..a2a0603873 100644 --- a/test/triggerC.test +++ b/test/triggerC.test @@ -1072,4 +1072,3 @@ do_catchsql_test 17.1 { finish_test - diff --git a/test/walvfs.test b/test/walvfs.test index cb8005c1c6..8ffc6f9ba2 100644 --- a/test/walvfs.test +++ b/test/walvfs.test @@ -426,4 +426,3 @@ db close db2 close tvfs delete finish_test - diff --git a/test/where.test b/test/where.test index 264866fa61..5997498839 100644 --- a/test/where.test +++ b/test/where.test @@ -1539,4 +1539,3 @@ do_catchsql_test where-25.5 { } {1 {corrupt database}} finish_test - diff --git a/test/where9.test b/test/where9.test index 7a019d3170..b274609364 100644 --- a/test/where9.test +++ b/test/where9.test @@ -787,7 +787,7 @@ do_test where9-6.8.2 { } {1 {no query solution}} set solution_possible 0 -ifcapable stat4||stat3 { +ifcapable stat4 { if {[permutation] != "no_optimization"} { set solution_possible 1 } } if $solution_possible { @@ -860,11 +860,6 @@ do_test where9-7.0 { INSERT INTO t6 SELECT * FROM t5; ANALYZE t5; } - ifcapable stat3 { - sqlite3 db2 test.db - db2 eval { DROP TABLE IF EXISTS sqlite_stat3 } - db2 close - } } {} do_test where9-7.1.1 { count_steps { diff --git a/test/wild001.test b/test/wild001.test deleted file mode 100644 index 7fe1404294..0000000000 --- a/test/wild001.test +++ /dev/null @@ -1,311 +0,0 @@ -# 2013-07-01 -# -# The author disclaims copyright to this source code. In place of -# a legal notice, here is a blessing: -# -# May you do good and not evil. -# May you find forgiveness for yourself and forgive others. -# May you share freely, never taking more than you give. -# -#*********************************************************************** -# -# This is a test case from content taken "from the wild". In this -# particular instance, the query was provided with permission by -# Elan Feingold on 2013-06-27. His message on the SQLite mailing list -# on that date reads: -# -#------------------------------------------------------------------------------ -# > Can you send (1) the schema (2) the query that is giving problems, and (3) -# > the content of the sqlite_stat1 table after you have run ANALYZE? If you -# > can combine all of the above into a script, that would be great! -# > -# > If you send (1..3) above and you give us written permission to include the -# > query in our test suite, that would be off-the-chain terrific. -# -# Please find items 1..3 in this file: http://www.plexapp.com/elan/sqlite_bug.txt -# -# You have our permission to include the query in your test suite. -# -# Thanks for an amazing product. -#----------------------------------------------------------------------------- -# -# This test case merely creates the schema and populates SQLITE_STAT1 and -# SQLITE_STAT3 then runs an EXPLAIN QUERY PLAN to ensure that the right plan -# is discovered. This test case may need to be adjusted for future revisions -# of the query planner manage to select a better query plan. The query plan -# shown here is known to be very fast with the original data. -# -# This test should work the same with and without SQLITE_ENABLE_STAT3 -# -############################################################################### - -set testdir [file dirname $argv0] -source $testdir/tester.tcl - -ifcapable !stat3 { - finish_test - return -} - -do_execsql_test wild001.01 { - CREATE TABLE "items" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "secid" integer, "parent_id" integer, "metadata_type" integer, "guid" varchar(255), "media_item_count" integer, "title" varchar(255), "title_sort" varchar(255) COLLATE NOCASE, "original_title" varchar(255), "studio" varchar(255), "rating" float, "rating_count" integer, "tagline" varchar(255), "summary" text, "trivia" text, "quotes" text, "content_rating" varchar(255), "content_rating_age" integer, "index" integer, "absolute_index" integer, "duration" integer, "user_thumb_url" varchar(255), "user_art_url" varchar(255), "user_banner_url" varchar(255), "user_music_url" varchar(255), "user_fields" varchar(255), "tags_genre" varchar(255), "tags_collection" varchar(255), "tags_director" varchar(255), "tags_writer" varchar(255), "tags_star" varchar(255), "originally_available_at" datetime, "available_at" datetime, "expires_at" datetime, "refreshed_at" datetime, "year" integer, "added_at" datetime, "created_at" datetime, "updated_at" datetime, "deleted_at" datetime, "tags_country" varchar(255), "extra_data" varchar(255), "hash" varchar(255)); - CREATE INDEX "i_secid" ON "items" ("secid" ); - CREATE INDEX "i_parent_id" ON "items" ("parent_id" ); - CREATE INDEX "i_created_at" ON "items" ("created_at" ); - CREATE INDEX "i_index" ON "items" ("index" ); - CREATE INDEX "i_title" ON "items" ("title" ); - CREATE INDEX "i_title_sort" ON "items" ("title_sort" ); - CREATE INDEX "i_guid" ON "items" ("guid" ); - CREATE INDEX "i_metadata_type" ON "items" ("metadata_type" ); - CREATE INDEX "i_deleted_at" ON "items" ("deleted_at" ); - CREATE INDEX "i_secid_ex1" ON "items" ("secid", "metadata_type", "added_at" ); - CREATE INDEX "i_hash" ON "items" ("hash" ); - CREATE TABLE "settings" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "account_id" integer, "guid" varchar(255), "rating" float, "view_offset" integer, "view_count" integer, "last_viewed_at" datetime, "created_at" datetime, "updated_at" datetime); - CREATE INDEX "s_account_id" ON "settings" ("account_id" ); - CREATE INDEX "s_guid" ON "settings" ("guid" ); - ANALYZE; - INSERT INTO sqlite_stat1 VALUES('settings','s_guid','4740 1'); - INSERT INTO sqlite_stat1 VALUES('settings','s_account_id','4740 4740'); - INSERT INTO sqlite_stat1 VALUES('items','i_hash','27316 2'); - INSERT INTO sqlite_stat1 VALUES('items','i_secid_ex1','27316 6829 4553 3'); - INSERT INTO sqlite_stat1 VALUES('items','i_deleted_at','27316 27316'); - INSERT INTO sqlite_stat1 VALUES('items','i_metadata_type','27316 6829'); - INSERT INTO sqlite_stat1 VALUES('items','i_guid','27316 2'); - INSERT INTO sqlite_stat1 VALUES('items','i_title_sort','27316 2'); - INSERT INTO sqlite_stat1 VALUES('items','i_title','27316 2'); - INSERT INTO sqlite_stat1 VALUES('items','i_index','27316 144'); - INSERT INTO sqlite_stat1 VALUES('items','i_created_at','27316 2'); - INSERT INTO sqlite_stat1 VALUES('items','i_parent_id','27316 15'); - INSERT INTO sqlite_stat1 VALUES('items','i_secid','27316 6829'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,150,150,'com.plexapp.agents.thetvdb://153021/2/9?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,198,198,'com.plexapp.agents.thetvdb://194031/1/10?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,526,526,'com.plexapp.agents.thetvdb://71256/12/92?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,923,923,'com.plexapp.agents.thetvdb://71256/15/16?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1008,1008,'com.plexapp.agents.thetvdb://71256/15/93?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1053,1053,'com.plexapp.agents.thetvdb://71256/16/21?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1068,1068,'com.plexapp.agents.thetvdb://71256/16/35?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1235,1235,'com.plexapp.agents.thetvdb://71256/17/44?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1255,1255,'com.plexapp.agents.thetvdb://71256/17/62?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1573,1573,'com.plexapp.agents.thetvdb://71663/20/9?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,1580,1580,'com.plexapp.agents.thetvdb://71663/21/16?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2000,2000,'com.plexapp.agents.thetvdb://73141/9/8?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2107,2107,'com.plexapp.agents.thetvdb://73244/6/17?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2256,2256,'com.plexapp.agents.thetvdb://74845/4/7?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2408,2408,'com.plexapp.agents.thetvdb://75978/2/21?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2634,2634,'com.plexapp.agents.thetvdb://79126/1/1?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,2962,2962,'com.plexapp.agents.thetvdb://79274/3/94?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3160,3160,'com.plexapp.agents.thetvdb://79274/5/129?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3161,3161,'com.plexapp.agents.thetvdb://79274/5/12?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3688,3688,'com.plexapp.agents.thetvdb://79274/8/62?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,3714,3714,'com.plexapp.agents.thetvdb://79274/8/86?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4002,4002,'com.plexapp.agents.thetvdb://79590/13/17?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4215,4215,'com.plexapp.agents.thetvdb://80727/3/6?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_guid',1,4381,4381,'com.plexapp.agents.thetvdb://83462/3/24?lang=en'); - INSERT INTO sqlite_stat3 VALUES('settings','s_account_id',4740,0,0,1); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,1879,1879,'1113f632ccd52ec8b8d7ca3d6d56da4701e48018'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,2721,2721,'1936154b97bb5567163edaebc2806830ae419ccf'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,3035,3035,'1c122331d4b7bfa0dc2c003ab5fb4f7152b9987a'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,3393,3393,'1f81bdbc9acc3321dc592b1a109ca075731b549a'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,6071,6070,'393cf7713efb4519c7a3d1d5403f0d945d15a16a'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,7462,7461,'4677dd37011f8bd9ae7fbbdd3af6dcd8a5b4ab2d'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,8435,8434,'4ffa339485334e81a5e12e03a63b6508d76401cf'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,8716,8714,'52a093852e6599dd5004857b7ff5b5b82c7cdb25'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,9107,9104,'561183e39f866d97ec728e9ff16ac4ad01466111'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,10942,10939,'66e99b72e29610f49499ae09ee04a376210d1f08'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,12143,12139,'71f0602427e173dc2c551535f73fdb6885fe4302'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,14962,14958,'8ca8e4dfba696019830c19ab8a32c7ece9d8534b'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,15179,15174,'8ebf1a5cf33f8ada1fc5853ac06ac4d7e074f825'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,15375,15370,'908bc211bebdf21c79d2d2b54ebaa442ac1f5cae'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18215,18210,'ab29e4e18ec5a14fef95aa713d69e31c045a22c1'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18615,18610,'ae84c008cc0c338bf4f28d798a88575746452f6d'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,18649,18644,'aec7c901353e115aa5307e94018ba7507bec3a45'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,19517,19512,'b75025fbf2e9c504e3c1197ff1b69250402a31f8'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,21251,21245,'c7d32f0e3a8f3a0a3dbd00833833d2ccee62f0fd'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,23616,23610,'dd5ff61479a9bd4100de802515d9dcf72d46f07a'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,24287,24280,'e3db00034301b7555419d4ef6f64769298d5845e'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,24949,24942,'ea336abd197ecd7013854a25a4f4eb9dea7927c6'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',1,25574,25567,'f018ea5182ec3f32768ca1c3cefbf3ad160ec20b'); - INSERT INTO sqlite_stat3 VALUES('items','i_hash',2,26139,26132,'f53709a8d81c12cb0f4f8d58004a25dd063de67c'); - INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',25167,0,0,2); - INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',736,25167,1,3); - INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',15,25903,2,4); - INSERT INTO sqlite_stat3 VALUES('items','i_secid_ex1',1398,25918,3,5); - INSERT INTO sqlite_stat3 VALUES('items','i_deleted_at',27316,0,0,NULL); - INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',2149,0,0,1); - INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',411,2149,1,2); - INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',1440,2560,2,3); - INSERT INTO sqlite_stat3 VALUES('items','i_metadata_type',23316,4000,3,4); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,215,215,'com.plexapp.agents.imdb://tt0065702?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,711,711,'com.plexapp.agents.imdb://tt0198781?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,987,986,'com.plexapp.agents.imdb://tt0454876?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1004,1002,'com.plexapp.agents.imdb://tt0464154?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1056,1053,'com.plexapp.agents.imdb://tt0499549?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1120,1116,'com.plexapp.agents.imdb://tt0903624?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1250,1245,'com.plexapp.agents.imdb://tt1268799?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1270,1264,'com.plexapp.agents.imdb://tt1320261?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',2,1376,1369,'com.plexapp.agents.imdb://tt1772341?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,3035,3027,'com.plexapp.agents.thetvdb://153021/3/14?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,6071,6063,'com.plexapp.agents.thetvdb://71173/1/18?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,6342,6334,'com.plexapp.agents.thetvdb://71256/13/4?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,9107,9099,'com.plexapp.agents.thetvdb://72389/2/19?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,11740,11732,'com.plexapp.agents.thetvdb://73893/2/13?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,12143,12135,'com.plexapp.agents.thetvdb://73976/4/23?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,15179,15171,'com.plexapp.agents.thetvdb://75897/16/12?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,17408,17400,'com.plexapp.agents.thetvdb://76808/2/16?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,17984,17976,'com.plexapp.agents.thetvdb://77068/1/16?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,18215,18207,'com.plexapp.agents.thetvdb://77259/1/1?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,21251,21243,'com.plexapp.agents.thetvdb://78957/8/2?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,24287,24279,'com.plexapp.agents.thetvdb://80337/5/8?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,25513,25505,'com.plexapp.agents.thetvdb://82226/6?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,25548,25540,'com.plexapp.agents.thetvdb://82339/2/10?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_guid',1,26770,26762,'com.plexapp.agents.thetvdb://86901/1/3?lang=en'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1524,0,0,''); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',2,3034,1391,'Attack of the Giant Squid'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',51,4742,2895,'Brad Sherwood'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',11,4912,2996,'Brian Williams'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',39,5847,3857,'Chip Esten'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,6071,4015,'Chuck Versus the DeLorean'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',12,7625,5436,'Denny Siegel'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',30,8924,6618,'Episode 1'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',29,9015,6629,'Episode 2'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',32,9082,6643,'Episode 3'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',28,9135,6654,'Episode 4'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',26,9183,6665,'Episode 5'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',27,9229,6677,'Episode 6'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',22,9266,6688,'Episode 7'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',20,9298,6699,'Episode 8'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',55,11750,8817,'Greg Proops'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,12143,9120,'Hardware Jungle'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',33,14712,11435,'Kathy Greenwood'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',3,15179,11840,'Last Call'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,18215,14601,'Nature or Nurture?'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',12,18241,14623,'Neil DeGrasse Tyson'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',68,19918,16144,'Pilot'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',7,21251,17298,'Reza Aslan'); - INSERT INTO sqlite_stat3 VALUES('items','i_title_sort',1,24287,20035,'Technoviking'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',1524,0,0,''); - INSERT INTO sqlite_stat3 VALUES('items','i_title',1,3035,1429,'Anderson Can''t Dance'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',51,4782,2991,'Brad Sherwood'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',11,4936,3079,'Brian Williams'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',39,5694,3783,'Chip Esten'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',1,6071,4100,'Clive Warren'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',12,7144,5078,'Denny Siegel'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',30,8249,6097,'Episode 1'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',29,8340,6108,'Episode 2'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',32,8407,6122,'Episode 3'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',28,8460,6133,'Episode 4'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',26,8508,6144,'Episode 5'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',27,8554,6156,'Episode 6'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',22,8591,6167,'Episode 7'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',20,8623,6178,'Episode 8'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',1,9107,6537,'Fat Albert and the Cosby Kids'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',55,10539,7843,'Greg Proops'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',1,12143,9276,'Iron Age Remains'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',33,13118,10143,'Kathy Greenwood'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',1,15179,11972,'Mink'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',68,17411,14035,'Pilot'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',2,18214,14727,'Reflections'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',4,21250,17481,'The Apartment'); - INSERT INTO sqlite_stat3 VALUES('items','i_title',1,24287,20283,'The Simpsons Already Did It'); - INSERT INTO sqlite_stat3 VALUES('items','i_index',4315,95,2,1); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1553,4410,3,2); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1485,5963,4,3); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1414,7448,5,4); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1367,8862,6,5); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1328,10229,7,6); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1161,11557,8,7); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1108,12718,9,8); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1033,13826,10,9); - INSERT INTO sqlite_stat3 VALUES('items','i_index',1014,14859,11,10); - INSERT INTO sqlite_stat3 VALUES('items','i_index',929,15873,12,11); - INSERT INTO sqlite_stat3 VALUES('items','i_index',906,16802,13,12); - INSERT INTO sqlite_stat3 VALUES('items','i_index',844,17708,14,13); - INSERT INTO sqlite_stat3 VALUES('items','i_index',690,18552,15,14); - INSERT INTO sqlite_stat3 VALUES('items','i_index',655,19242,16,15); - INSERT INTO sqlite_stat3 VALUES('items','i_index',625,19897,17,16); - INSERT INTO sqlite_stat3 VALUES('items','i_index',579,20522,18,17); - INSERT INTO sqlite_stat3 VALUES('items','i_index',555,21101,19,18); - INSERT INTO sqlite_stat3 VALUES('items','i_index',526,21656,20,19); - INSERT INTO sqlite_stat3 VALUES('items','i_index',501,22182,21,20); - INSERT INTO sqlite_stat3 VALUES('items','i_index',459,22683,22,21); - INSERT INTO sqlite_stat3 VALUES('items','i_index',439,23142,23,22); - INSERT INTO sqlite_stat3 VALUES('items','i_index',315,23581,24,23); - INSERT INTO sqlite_stat3 VALUES('items','i_index',192,24177,26,25); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1851,0,0,NULL); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',373,1857,2,'2011-10-22 14:54:39'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',595,2230,3,'2011-10-22 14:54:41'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',337,2825,4,'2011-10-22 14:54:43'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',361,3378,8,'2011-10-22 14:54:54'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',160,3739,9,'2011-10-22 14:54:56'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',315,4000,11,'2011-10-22 14:54:59'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',321,4334,13,'2011-10-22 14:55:02'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1292,4723,16,'2011-10-22 14:55:06'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',161,6015,17,'2011-10-22 14:55:07'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,9107,2677,'2012-09-04 18:07:50'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',313,9717,3270,'2012-10-18 16:50:21'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',450,10030,3271,'2012-10-18 16:50:22'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',389,10668,3275,'2012-10-18 16:50:26'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',796,11057,3276,'2012-10-18 16:51:06'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',161,12041,3280,'2012-10-19 19:52:37'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',135,13281,4186,'2013-02-19 00:56:10'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1063,13416,4187,'2013-02-19 00:56:11'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',797,14479,4188,'2013-02-19 00:56:13'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',147,15276,4189,'2013-02-19 00:56:15'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',346,15423,4190,'2013-02-19 00:56:16'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,18215,6436,'2013-05-05 14:09:54'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',2,21251,8122,'2013-05-24 15:25:45'); - INSERT INTO sqlite_stat3 VALUES('items','i_created_at',1,24287,11116,'2013-05-26 14:17:39'); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',2560,0,0,NULL); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',18,3022,31,2350); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',10,6068,285,8150); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',158,6346,315,8949); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',34,9094,562,18831); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',20,12139,794,22838); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',134,14033,886,24739); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',159,14167,887,24740); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,14326,888,24741); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,14487,889,24742); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',124,14648,890,24743); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',157,14772,891,24744); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',126,15043,894,24747); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',40,15169,895,24748); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15243,898,24753); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',138,15404,899,24754); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',160,15542,900,24755); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15702,901,24756); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',161,15863,902,24757); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',124,16024,903,24758); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',155,16148,904,24759); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',26,18208,1043,29704); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',2,21251,1282,32952); - INSERT INTO sqlite_stat3 VALUES('items','i_parent_id',13,24279,1583,36068); - INSERT INTO sqlite_stat3 VALUES('items','i_secid',25167,0,0,2); - INSERT INTO sqlite_stat3 VALUES('items','i_secid',736,25167,1,3); - INSERT INTO sqlite_stat3 VALUES('items','i_secid',15,25903,2,4); - INSERT INTO sqlite_stat3 VALUES('items','i_secid',1398,25918,3,5); - ANALYZE sqlite_master; - - explain query plan - select items.title - from items - join items as child on child.parent_id=items.id - join items as grandchild on grandchild.parent_id=child.id - join settings - on settings.guid=grandchild.guid - and settings.account_id=1 - where items.metadata_type=2 - and items.secid=2 - and settings.last_viewed_at is not null - group by items.id - order by settings.last_viewed_at desc - limit 10; -} [list \ - 0 0 3 {SEARCH TABLE settings USING INDEX s_account_id (account_id=?)} \ - 0 1 2 {SEARCH TABLE items AS grandchild USING INDEX i_guid (guid=?)} \ - 0 2 1 {SEARCH TABLE items AS child USING INTEGER PRIMARY KEY (rowid=?)} \ - 0 3 0 {SEARCH TABLE items USING INTEGER PRIMARY KEY (rowid=?)} \ - 0 0 0 {USE TEMP B-TREE FOR GROUP BY} \ - 0 0 0 {USE TEMP B-TREE FOR ORDER BY}] - - -finish_test diff --git a/test/window6.test b/test/window6.test index d732dea124..c6889c72ac 100644 --- a/test/window6.test +++ b/test/window6.test @@ -368,4 +368,3 @@ do_execsql_test 11.4.1 { } finish_test - diff --git a/test/window9.test b/test/window9.test index 754761b78b..cf4d83ae8e 100644 --- a/test/window9.test +++ b/test/window9.test @@ -174,4 +174,3 @@ foreach {tn sql} { finish_test - diff --git a/test/without_rowid1.test b/test/without_rowid1.test index 6c04e87ca4..294b13c77a 100644 --- a/test/without_rowid1.test +++ b/test/without_rowid1.test @@ -102,11 +102,6 @@ do_execsql_test without_rowid1-1.50 { ANALYZE; SELECT * FROM sqlite_stat1 ORDER BY idx; } {t1 t1 {4 2 1} t1 t1bd {4 2 2}} -ifcapable stat3 { - do_execsql_test without_rowid1-1.51 { - SELECT DISTINCT tbl, idx FROM sqlite_stat3 ORDER BY idx; - } {t1 t1 t1 t1bd} -} ifcapable stat4 { do_execsql_test without_rowid1-1.52 { SELECT DISTINCT tbl, idx FROM sqlite_stat4 ORDER BY idx; From 5eae1d1b33b376fab31497cbdb129e2e065568c8 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Aug 2019 16:23:12 +0000 Subject: [PATCH 096/221] More legacy STAT3 code removed. FossilOrigin-Name: 845d2f17de5b4740f95884307d9efec3223737bb0f2c4a74693666caf5f61c21 --- manifest | 23 ++++++++++------------- manifest.uuid | 2 +- src/analyze.c | 4 +--- src/sqliteInt.h | 4 ++-- src/test1.c | 2 +- src/where.c | 6 +++--- src/whereexpr.c | 2 +- 7 files changed, 19 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 4b9a15dfc3..563bb22576 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\ssupport\sfor\sSTAT3.\s\sThe\ssqlite_stat3\stables\sare\signored,\sif\sthey\nexist.\s\sSTAT4\scontinues\sto\swork\sas\sit\salways\shas,\sand\sas\sit\sis\sa\ssuperset\sof\nSTAT3\sis\sthe\srecommended\sreplacement. -D 2019-08-08T15:24:17.512 +C More\slegacy\sSTAT3\scode\sremoved. +D 2019-08-08T16:23:12.537 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -458,7 +458,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c c1b5e5639b88dcc146db326315f2dea4f7f1c599e524eeb421d544927a0b1e86 -F src/analyze.c eed90d1d757cd0de0df037199660553d8cbd35dae7d8c7c1aa84b67508ccc7ad +F src/analyze.c 0278dbf6dbc0be90dc5391cb020772b461d789af17c390f857a34308c7ac9858 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab @@ -528,12 +528,12 @@ F src/shell.c.in 3f2c64bf86bef3854bb4ee0a380a9fc05e9f92dafac2babbb929d5aad6f129a F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h ffac9a2cb4944a09b589008106067fc40d3ad257facec76112f7d528561adefb +F src/sqliteInt.h 9286c237c240e578eac0dac23d7a4cd030c8eb5ecb6d549ae211b288382c22fd F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c 42a527975c53d21bcf69a65bedff7b35f09a244b05ad096b7c3160ac0cd30253 +F src/test1.c 87059457fb90b73a74044b379fe2cb0aefbb53c010c646ecaff23179a423638c F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -609,10 +609,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c bda7162bee2283ae9571c8e1654b67e9e2755525eddd8bd6523c8c6291d60595 +F src/where.c 90cb93dc8eb9383e72f661b2074551d47ff21e5379f7167f7e078bed436989e9 F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 -F src/whereexpr.c 029222a0e267c682e6270832d2275b33a4447d397d2f7f147f07e408a6f54e9b +F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc F src/window.c 98b2571c66246bddadf42e76da45ed970fe7518a4c9c1ccc8cdace0711bfabba F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1835,10 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525 -R 08be8d4bfd5cad932cdfe93307e785c1 -T *branch * omit-stat3 -T *sym-omit-stat3 * -T -sym-trunk * +P 1e17ea2fd1df4ad49138c787c8fe3207dd0c25c93f9001d52a9b69f8c12e841c +R 47ee4575144fd0a9a8df67d32ca1390a U drh -Z f97a070727dd7ccae3c1e0f571407df0 +Z b905391cab37e9fb5f47472fde6dd23e diff --git a/manifest.uuid b/manifest.uuid index e23b2eed1f..5418bdd5aa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1e17ea2fd1df4ad49138c787c8fe3207dd0c25c93f9001d52a9b69f8c12e841c \ No newline at end of file +845d2f17de5b4740f95884307d9efec3223737bb0f2c4a74693666caf5f61c21 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 8d792267f5..31fb6f5b51 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1684,9 +1684,7 @@ static int loadStatTbl( nSample = sqlite3_column_int(pStmt, 1); pIdx = findIndexOrPrimaryKey(db, zIndex, zDb); assert( pIdx==0 || pIdx->nSample==0 ); - /* Index.nSample is non-zero at this point if data has already been - ** loaded from the stat4 table. */ - if( pIdx==0 || pIdx->nSample ) continue; + if( pIdx==0 ) continue; assert( !HasRowid(pIdx->pTable) || pIdx->nColumn==pIdx->nKeyCol+1 ); if( !HasRowid(pIdx->pTable) && IsPrimaryKeyIndex(pIdx) ){ nIdxCol = pIdx->nKeyCol; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4792919ac7..efe8e1b970 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1573,8 +1573,8 @@ struct sqlite3 { #define SQLITE_OmitNoopJoin 0x0100 /* Omit unused tables in joins */ #define SQLITE_CountOfView 0x0200 /* The count-of-view optimization */ #define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */ -#define SQLITE_Stat34 0x0800 /* Use STAT4 data */ - /* TH3 expects the Stat34 ^^^^^^ value to be 0x0800. Don't change it */ +#define SQLITE_Stat4 0x0800 /* Use STAT4 data */ + /* TH3 expects the Stat4 ^^^^^^ value to be 0x0800. Don't change it */ #define SQLITE_PushDown 0x1000 /* The push-down optimization */ #define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */ #define SQLITE_SkipScan 0x4000 /* Skip-scans */ diff --git a/src/test1.c b/src/test1.c index 503a270090..6bc64e7626 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7173,7 +7173,7 @@ static int SQLITE_TCLAPI optimization_control( { "order-by-idx-join", SQLITE_OrderByIdxJoin }, { "transitive", SQLITE_Transitive }, { "omit-noop-join", SQLITE_OmitNoopJoin }, - { "stat4", SQLITE_Stat34 }, + { "stat4", SQLITE_Stat4 }, { "skip-scan", SQLITE_SkipScan }, }; diff --git a/src/where.c b/src/where.c index ebf447a31c..65c92863a5 100644 --- a/src/where.c +++ b/src/where.c @@ -1474,8 +1474,8 @@ static int whereRangeScanEst( Index *p = pLoop->u.btree.pIndex; int nEq = pLoop->u.btree.nEq; - if( p->nSample>0 && nEqnSampleCol - && OptimizationEnabled(pParse->db, SQLITE_Stat34) + if( p->nSample>0 && ALWAYS(nEqnSampleCol) + && OptimizationEnabled(pParse->db, SQLITE_Stat4) ){ if( nEq==pBuilder->nRecValid ){ UnpackedRecord *pRec = pBuilder->pRec; @@ -2633,7 +2633,7 @@ static int whereLoopAddBtreeIndex( && pProbe->nSample && pNew->u.btree.nEq<=pProbe->nSampleCol && ((eOp & WO_IN)==0 || !ExprHasProperty(pTerm->pExpr, EP_xIsSelect)) - && OptimizationEnabled(db, SQLITE_Stat34) + && OptimizationEnabled(db, SQLITE_Stat4) ){ Expr *pExpr = pTerm->pExpr; if( (eOp & (WO_EQ|WO_ISNULL|WO_IS))!=0 ){ diff --git a/src/whereexpr.c b/src/whereexpr.c index 155cef7155..252d924b85 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1393,7 +1393,7 @@ static void exprAnalyze( && pExpr->pLeft->op==TK_COLUMN && pExpr->pLeft->iColumn>=0 && !ExprHasProperty(pExpr, EP_FromJoin) - && OptimizationEnabled(db, SQLITE_Stat34) + && OptimizationEnabled(db, SQLITE_Stat4) ){ Expr *pNewExpr; Expr *pLeft = pExpr->pLeft; From af97c3f35a095166ee5406ed73a1790dae025db6 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Aug 2019 18:49:16 +0000 Subject: [PATCH 097/221] Fix a case of the Expr.affinity to Expr.affExpr refactor that was missed in the [a29f2a7d07beff64] check-in. FossilOrigin-Name: 83450d10707e2c7c075f3930a8c231c49c593b9cdf0e6097b0187eb877755d2d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/resolve.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 55625abaef..43c3c88b56 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sthat\sis\sreachable\sfrom\sa\scorrupt\sdatabase. -D 2019-08-08T01:39:07.548 +C Fix\sa\scase\sof\sthe\sExpr.affinity\sto\sExpr.affExpr\srefactor\sthat\swas\smissed\nin\sthe\s[a29f2a7d07beff64]\scheck-in. +D 2019-08-08T18:49:16.058 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -521,7 +521,7 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 3ed5a3de18b455366771a89241283fef16508a7f681af546296e95e81458efeb +F src/resolve.c bf7cbb8e9d33a39af67af8fd2416a3769815b4478a7ab1051a7adaf84b269a14 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1c2c1d3ca6437349c5bceab29c9d3583f8fedb21ab3366d6f9d7381259af60cf F src/shell.c.in 97714cd5e177b6d53fac83c74becf4b19fe0aa8f1a4ed6a4fa1eede4bafb96f7 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7f2246a17be9915b3492624a3d8deff56694bdc372f7627e3f16c1869415b1a3 -R 993358d1d5d49cd9c39a3b9f8a7f3cb8 +P 30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525 +R 512cee908b313724b2807c8a9eaa1da4 U drh -Z 096154c22e200783c49c846795c77c40 +Z 42b155863d11e880f0842b08a2882f92 diff --git a/manifest.uuid b/manifest.uuid index 94549f2843..be89323abc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -30e6ee27a9fb78291c324ac9b80db4579280140430804ecd4692e312f9938525 \ No newline at end of file +83450d10707e2c7c075f3930a8c231c49c593b9cdf0e6097b0187eb877755d2d \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 0ba8abd8bc..f3b73aa044 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -689,7 +689,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pExpr->y.pTab = pItem->pTab; pExpr->iTable = pItem->iCursor; pExpr->iColumn = -1; - pExpr->affinity = SQLITE_AFF_INTEGER; + pExpr->affExpr = SQLITE_AFF_INTEGER; break; } #endif /* defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) From 51755a78a95e122963dcd8c74525aed965837da0 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Aug 2019 19:40:29 +0000 Subject: [PATCH 098/221] Fix harmless compiler warnings. FossilOrigin-Name: 1eef4ddea9a2a8c97b97183402c774caa40ef906ea9cccade307381b29a9785d --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/os.c | 2 +- src/resolve.c | 1 + src/shell.c.in | 5 +++-- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 4252b9fe22..534f4d32e8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\ssupport\sfor\sSQLITE_ENABLE_STAT3.\s\sThe\ssqlite_stat3\stable\sis\snow\signored,\nif\sit\sexists.\s\sRun\sANALYZE\susing\sSTAT4\sto\sget\sthe\sequivalent\sfunctionality,\nwhich\spresumably\severybody\shas\sbeen\sdoing\sfor\sa\slong\stime\snow. -D 2019-08-08T19:19:42.118 +C Fix\sharmless\scompiler\swarnings. +D 2019-08-08T19:40:29.910 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -503,7 +503,7 @@ F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58 F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 -F src/os.c 66948e071d5ba7ae9ca5839799fdf68159f059cb97cada8a07eaf95a56edce79 +F src/os.c 20f7b32c1e8839999fa7e79756a6cdc3041b44d7fc635c25a1b9399180d1fbd9 F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 @@ -521,10 +521,10 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c bf7cbb8e9d33a39af67af8fd2416a3769815b4478a7ab1051a7adaf84b269a14 +F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 1c2c1d3ca6437349c5bceab29c9d3583f8fedb21ab3366d6f9d7381259af60cf -F src/shell.c.in 3f2c64bf86bef3854bb4ee0a380a9fc05e9f92dafac2babbb929d5aad6f129ad +F src/shell.c.in 920360b4cde1a0d65a182564abacaaa8c6a54ef52fe224065019006dad76f685 F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1835,8 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 83450d10707e2c7c075f3930a8c231c49c593b9cdf0e6097b0187eb877755d2d 845d2f17de5b4740f95884307d9efec3223737bb0f2c4a74693666caf5f61c21 -R f18358a2647a61095ce357bfd10682c8 -T +closed 845d2f17de5b4740f95884307d9efec3223737bb0f2c4a74693666caf5f61c21 +P f1cd234c9888142e0ac542d866d7fb55a81fb7edd0a5cd810191b4e0395ffc7d +R 2118f843552fd333fdf1585596027161 U drh -Z 3f9560f67541a69c8a07bb2d6ae86f3e +Z 80499b5055250e9dbbad6c68fd8191cd diff --git a/manifest.uuid b/manifest.uuid index f02421647b..a71f57d2ea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f1cd234c9888142e0ac542d866d7fb55a81fb7edd0a5cd810191b4e0395ffc7d \ No newline at end of file +1eef4ddea9a2a8c97b97183402c774caa40ef906ea9cccade307381b29a9785d \ No newline at end of file diff --git a/src/os.c b/src/os.c index adfa520e25..b9ad29d4f8 100644 --- a/src/os.c +++ b/src/os.c @@ -260,7 +260,7 @@ void sqlite3OsDlClose(sqlite3_vfs *pVfs, void *pHandle){ int sqlite3OsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ if( sqlite3Config.iPrngSeed ){ memset(zBufOut, 0, nByte); - if( ALWAYS(nByte>sizeof(unsigned)) ) nByte = sizeof(unsigned int); + if( ALWAYS(nByte>(signed)sizeof(unsigned)) ) nByte = sizeof(unsigned int); memcpy(zBufOut, &sqlite3Config.iPrngSeed, nByte); return SQLITE_OK; }else{ diff --git a/src/resolve.c b/src/resolve.c index f3b73aa044..d88abc4a4b 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1303,6 +1303,7 @@ int sqlite3ResolveOrderGroupBy( ** Walker callback for windowRemoveExprFromSelect(). */ static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + UNUSED_PARAMETER(pWalker); if( ExprHasProperty(pExpr, EP_WinFunc) ){ Window *pWin = pExpr->y.pWin; sqlite3WindowUnlinkFromSelect(pWin); diff --git a/src/shell.c.in b/src/shell.c.in index 47b35907eb..9233101a0a 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3987,6 +3987,7 @@ static void shellIdQuote( sqlite3_value **argv ){ const char *zName = (const char*)sqlite3_value_text(argv[0]); + UNUSED_PARAMETER(argc); if( zName ){ char *z = sqlite3_mprintf("\"%w\"", zName); sqlite3_result_text(context, z, -1, sqlite3_free); @@ -9261,7 +9262,7 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(int, int, sqlite3*) */ case SQLITE_TESTCTRL_PRNG_SEED: if( nArg==3 || nArg==4 ){ - int i = (int)integerValue(azArg[2]); + int ii = (int)integerValue(azArg[2]); sqlite3 *db; if( nArg==3 ){ db = 0; @@ -9270,7 +9271,7 @@ static int do_meta_command(char *zLine, ShellState *p){ /* Make sure the schema has been loaded */ sqlite3_table_column_metadata(db, 0, "x", 0, 0, 0, 0, 0, 0); } - rc2 = sqlite3_test_control(testctrl, i, db); + rc2 = sqlite3_test_control(testctrl, ii, db); isOk = 3; } break; From 3728b84c03807c310fe6aacdf7211f9255ec0d4a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Aug 2019 01:11:32 +0000 Subject: [PATCH 099/221] Fix more compiler warnings. FossilOrigin-Name: 1b85442b614df0808c10c34ec281282e5dfd93d6d5f9737b51263ffaa4da5c72 --- ext/rbu/sqlite3rbu.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.h | 6 +++--- src/vdbeaux.c | 6 +++--- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index ee49ff361b..7409618499 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -1697,7 +1697,7 @@ static char *rbuObjIterGetIndexCols( int iCid = sqlite3_column_int(pXInfo, 1); int bDesc = sqlite3_column_int(pXInfo, 3); const char *zCollate = (const char*)sqlite3_column_text(pXInfo, 4); - const char *zCol; + const char *zCol = 0; const char *zType; if( iCid==-2 ){ diff --git a/manifest b/manifest index 534f4d32e8..fa46e3f810 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2019-08-08T19:40:29.910 +C Fix\smore\scompiler\swarnings. +D 2019-08-09T01:11:32.871 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -363,7 +363,7 @@ F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c b254d13ae0058a07ee6322d01370fa15d4679e734a8962e923324e51b5cab556 +F ext/rbu/sqlite3rbu.c 4261ba8d5dc1c4aa1c9cf4c8c60f8ba4df3780d1516720771d2bbc292892e11b F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -596,10 +596,10 @@ F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c d0c302d9f58adfbb1f5fd3542cb49ac02a8cc1375808d2a4dcacdc2a8f1fd64b -F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 +F src/vdbe.h d6ef44a2e1d3e3bcc28b45acabd614eaef1beef1b605b9bbc65f140a09ba8832 F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e -F src/vdbeaux.c a262a279d30bcddf851e5f836ac28de1d232062d409b9cf5562d28e66b986a98 +F src/vdbeaux.c 701d026ff3bed9a80ca52c293753eebc76e0bfa3e19a8df456ae08c61cdf25ff F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f1cd234c9888142e0ac542d866d7fb55a81fb7edd0a5cd810191b4e0395ffc7d -R 2118f843552fd333fdf1585596027161 +P 1eef4ddea9a2a8c97b97183402c774caa40ef906ea9cccade307381b29a9785d +R a3ffa4c91d5b5947d75437182c3b8dd4 U drh -Z 80499b5055250e9dbbad6c68fd8191cd +Z a1aa1a72e10d9d977e46cecba99fec82 diff --git a/manifest.uuid b/manifest.uuid index a71f57d2ea..0ccdee02f5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1eef4ddea9a2a8c97b97183402c774caa40ef906ea9cccade307381b29a9785d \ No newline at end of file +1b85442b614df0808c10c34ec281282e5dfd93d6d5f9737b51263ffaa4da5c72 \ No newline at end of file diff --git a/src/vdbe.h b/src/vdbe.h index 041a91c51f..a57901af95 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -223,9 +223,9 @@ VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); #endif void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); -void sqlite3VdbeChangeP1(Vdbe*, u32 addr, int P1); -void sqlite3VdbeChangeP2(Vdbe*, u32 addr, int P2); -void sqlite3VdbeChangeP3(Vdbe*, u32 addr, int P3); +void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); +void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); +void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); void sqlite3VdbeChangeP5(Vdbe*, u16 P5); void sqlite3VdbeJumpHere(Vdbe*, int addr); int sqlite3VdbeChangeToNoop(Vdbe*, int addr); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 828304780b..6edb1b5915 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -980,13 +980,13 @@ void sqlite3VdbeScanStatus( void sqlite3VdbeChangeOpcode(Vdbe *p, u32 addr, u8 iNewOpcode){ sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; } -void sqlite3VdbeChangeP1(Vdbe *p, u32 addr, int val){ +void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ sqlite3VdbeGetOp(p,addr)->p1 = val; } -void sqlite3VdbeChangeP2(Vdbe *p, u32 addr, int val){ +void sqlite3VdbeChangeP2(Vdbe *p, int addr, int val){ sqlite3VdbeGetOp(p,addr)->p2 = val; } -void sqlite3VdbeChangeP3(Vdbe *p, u32 addr, int val){ +void sqlite3VdbeChangeP3(Vdbe *p, int addr, int val){ sqlite3VdbeGetOp(p,addr)->p3 = val; } void sqlite3VdbeChangeP5(Vdbe *p, u16 p5){ From 044388cf98a1e6c1ab61cbecf3e48f3c8f56d8a4 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 9 Aug 2019 01:59:14 +0000 Subject: [PATCH 100/221] Modify signature of sqlite3VdbeChangeOpcode() to accept int instead of u32. FossilOrigin-Name: 68b7f2acf4d228f32250e37cbc0eb5d275b512d49071bbb38e1f5634b705f7d3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.h | 2 +- src/vdbeaux.c | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index fa46e3f810..cd9cd29aaa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\smore\scompiler\swarnings. -D 2019-08-09T01:11:32.871 +C Modify\ssignature\sof\ssqlite3VdbeChangeOpcode()\sto\saccept\sint\sinstead\sof\su32. +D 2019-08-09T01:59:14.998 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -596,10 +596,10 @@ F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c d0c302d9f58adfbb1f5fd3542cb49ac02a8cc1375808d2a4dcacdc2a8f1fd64b -F src/vdbe.h d6ef44a2e1d3e3bcc28b45acabd614eaef1beef1b605b9bbc65f140a09ba8832 +F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e -F src/vdbeaux.c 701d026ff3bed9a80ca52c293753eebc76e0bfa3e19a8df456ae08c61cdf25ff +F src/vdbeaux.c 8eeb9799d80bc6b37f2bcb23b3519234b596c530046c2cd0261f9ef1a1ba6c37 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1eef4ddea9a2a8c97b97183402c774caa40ef906ea9cccade307381b29a9785d -R a3ffa4c91d5b5947d75437182c3b8dd4 -U drh -Z a1aa1a72e10d9d977e46cecba99fec82 +P 1b85442b614df0808c10c34ec281282e5dfd93d6d5f9737b51263ffaa4da5c72 +R b062fb32a2096cd3828b4110ff96b19e +U mistachkin +Z 08b284f8d5d221f42e2712aad95446b9 diff --git a/manifest.uuid b/manifest.uuid index 0ccdee02f5..58a1db0c85 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1b85442b614df0808c10c34ec281282e5dfd93d6d5f9737b51263ffaa4da5c72 \ No newline at end of file +68b7f2acf4d228f32250e37cbc0eb5d275b512d49071bbb38e1f5634b705f7d3 \ No newline at end of file diff --git a/src/vdbe.h b/src/vdbe.h index a57901af95..e3aaaa1ce2 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -222,7 +222,7 @@ VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); # define sqlite3ExplainBreakpoint(A,B) /*no-op*/ #endif void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); -void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); +void sqlite3VdbeChangeOpcode(Vdbe*, int addr, u8); void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1); void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2); void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 6edb1b5915..2e9fcc1250 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -977,7 +977,7 @@ void sqlite3VdbeScanStatus( ** Change the value of the opcode, or P1, P2, P3, or P5 operands ** for a specific instruction. */ -void sqlite3VdbeChangeOpcode(Vdbe *p, u32 addr, u8 iNewOpcode){ +void sqlite3VdbeChangeOpcode(Vdbe *p, int addr, u8 iNewOpcode){ sqlite3VdbeGetOp(p,addr)->opcode = iNewOpcode; } void sqlite3VdbeChangeP1(Vdbe *p, int addr, int val){ From cb99c57a66d64e2d00234f0989299f8a644f03c7 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Aug 2019 20:26:01 +0000 Subject: [PATCH 101/221] Allow the RHS of a row-value IN operator to use a compound query with an ORDER BY clause. FossilOrigin-Name: eaf15d9bae6773058341d6219241f44ce728ad1cb9cf649f2efd4dddd81ec461 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 9 ++++++--- test/rowvalue.test | 13 +++++++++++++ 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index cd9cd29aaa..a40d0a94d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\ssignature\sof\ssqlite3VdbeChangeOpcode()\sto\saccept\sint\sinstead\sof\su32. -D 2019-08-09T01:59:14.998 +C Allow\sthe\sRHS\sof\sa\srow-value\sIN\soperator\sto\suse\sa\scompound\squery\swith\nan\sORDER\sBY\sclause. +D 2019-08-09T20:26:01.927 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 1c2c1d3ca6437349c5bceab29c9d3583f8fedb21ab3366d6f9d7381259af60cf +F src/select.c 164270b9b1ce06dbada9225e5dfaed08d61f96da0d98dfd2a93460f62414d620 F src/shell.c.in 920360b4cde1a0d65a182564abacaaa8c6a54ef52fe224065019006dad76f685 F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1253,7 +1253,7 @@ F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test b8680f07d19c8c5223b808bba998faffcec6d505f5689ff6070280119173bb51 +F test/rowvalue.test a3e729d5c1f32da03bba15af1e3128218d2ba3c40d4f4ed5fa0497a713df68ea F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1b85442b614df0808c10c34ec281282e5dfd93d6d5f9737b51263ffaa4da5c72 -R b062fb32a2096cd3828b4110ff96b19e -U mistachkin -Z 08b284f8d5d221f42e2712aad95446b9 +P 68b7f2acf4d228f32250e37cbc0eb5d275b512d49071bbb38e1f5634b705f7d3 +R 932bd8e106b14bf6ec94287594ab7143 +U drh +Z 67ac6d6f5f4c238e1c1f9344651159e0 diff --git a/manifest.uuid b/manifest.uuid index 58a1db0c85..b9f11958de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -68b7f2acf4d228f32250e37cbc0eb5d275b512d49071bbb38e1f5634b705f7d3 \ No newline at end of file +eaf15d9bae6773058341d6219241f44ce728ad1cb9cf649f2efd4dddd81ec461 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 059c6ea9ae..229138ebd6 100644 --- a/src/select.c +++ b/src/select.c @@ -2967,11 +2967,14 @@ static int generateOutputSubroutine( /* If this is a scalar select that is part of an expression, then ** store the results in the appropriate memory cell and break out - ** of the scan loop. + ** of the scan loop. Note that the select might return multiple columns + ** if it is the RHS of a row-value IN operator. */ case SRT_Mem: { - assert( pIn->nSdst==1 || pParse->nErr>0 ); testcase( pIn->nSdst!=1 ); - sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, 1); + if( pParse->nErr==0 ){ + testcase( pIn->nSdst>1 ); + sqlite3ExprCodeMove(pParse, pIn->iSdst, pDest->iSDParm, pIn->nSdst); + } /* The LIMIT clause will jump out of the loop for us */ break; } diff --git a/test/rowvalue.test b/test/rowvalue.test index 2a2f8a9d13..e859024711 100644 --- a/test/rowvalue.test +++ b/test/rowvalue.test @@ -557,4 +557,17 @@ do_execsql_test 21.0 { SELECT * FROM t1 WHERE (a,b) IN (VALUES(1,2)); } {1 2} +# 2019-08-09: Multi-column subquery on the RHS of an IN operator. +# +do_execsql_test 22.100 { + SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 3,4); + SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 5,6); + SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 3,4); + SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 5,6); + SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 3,4); + SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 5,6); + SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 3,4); + SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 5,6); +} {1 0 1 0 0 1 0 1} + finish_test From 3251a2031bfd29f338a5fda1a08c18878296d354 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 10 Aug 2019 14:16:17 +0000 Subject: [PATCH 102/221] Remove two incorrect assert() statements from the logic used to derive column names and types from subqueries. FossilOrigin-Name: 712e47714863a8ed7ff73324d9fec569633e8b901c436c633b0220d16a7a9302 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 3 --- test/colname.test | 6 ++++++ 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index a40d0a94d2..be8add86fe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sthe\sRHS\sof\sa\srow-value\sIN\soperator\sto\suse\sa\scompound\squery\swith\nan\sORDER\sBY\sclause. -D 2019-08-09T20:26:01.927 +C Remove\stwo\sincorrect\sassert()\sstatements\sfrom\sthe\slogic\sused\sto\sderive\ncolumn\snames\sand\stypes\sfrom\ssubqueries. +D 2019-08-10T14:16:17.492 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 164270b9b1ce06dbada9225e5dfaed08d61f96da0d98dfd2a93460f62414d620 +F src/select.c 11087458ec2af5c4b377559ea0462c2ab842e02badd35b21a8d67257c4e0b117 F src/shell.c.in 920360b4cde1a0d65a182564abacaaa8c6a54ef52fe224065019006dad76f685 F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -742,7 +742,7 @@ F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 -F test/colname.test fb28b3687e03625425bc216edf8b186ce974aa71008e2aa1f426a7dcb75a601d +F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e F test/conflict.test c7cc007e2af151516ddf38f7412fe10d473a694f55e3df437e2c7b31c2590e8d F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 68b7f2acf4d228f32250e37cbc0eb5d275b512d49071bbb38e1f5634b705f7d3 -R 932bd8e106b14bf6ec94287594ab7143 +P eaf15d9bae6773058341d6219241f44ce728ad1cb9cf649f2efd4dddd81ec461 +R 0b7ad257f273d5f1351d21c4f8c4f975 U drh -Z 67ac6d6f5f4c238e1c1f9344651159e0 +Z 2cfb417ff7d2d592ac6c825a80f69aff diff --git a/manifest.uuid b/manifest.uuid index b9f11958de..11c57dc187 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eaf15d9bae6773058341d6219241f44ce728ad1cb9cf649f2efd4dddd81ec461 \ No newline at end of file +712e47714863a8ed7ff73324d9fec569633e8b901c436c633b0220d16a7a9302 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 229138ebd6..ca1256d160 100644 --- a/src/select.c +++ b/src/select.c @@ -1644,8 +1644,6 @@ static const char *columnTypeImpl( assert( pExpr!=0 ); assert( pNC->pSrcList!=0 ); - assert( pExpr->op!=TK_AGG_COLUMN ); /* This routine runes before aggregates - ** are processed */ switch( pExpr->op ){ case TK_COLUMN: { /* The expression is a column. Locate the table the column is being @@ -1967,7 +1965,6 @@ int sqlite3ColumnsFromExprList( pColExpr = pColExpr->pRight; assert( pColExpr!=0 ); } - assert( pColExpr->op!=TK_AGG_COLUMN ); if( pColExpr->op==TK_COLUMN ){ /* For columns use the column name name */ int iCol = pColExpr->iColumn; diff --git a/test/colname.test b/test/colname.test index f314f94f6e..5fa0b601f9 100644 --- a/test/colname.test +++ b/test/colname.test @@ -399,6 +399,12 @@ ifcapable vtab { SELECT name FROM pragma_table_info('t2'); } {Bbb} } +do_execsql_test colname-9.330 { -- added 2019-08-10 to invalidate + DROP TABLE IF EXISTS t1; -- a couple assert()s that were + CREATE TABLE t1(a); -- added by ticket 3b44500725 + INSERT INTO t1 VALUES(17),(2),(99),(-3),(7); + SELECT (SELECT avg(a) UNION SELECT min(a) OVER()) FROM t1; +} {17} # Issue detected by OSSFuzz on 2017-12-24 (Christmas Eve) # caused by check-in https://sqlite.org/src/info/6b2ff26c25 From b6299681c63e5ea8b61892f4e5dffaac25031723 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 10 Aug 2019 14:35:06 +0000 Subject: [PATCH 103/221] Add extra test cases related to the previous commit. FossilOrigin-Name: 3c690b2b05b7338f3325c50a0750c6023e1173afa4388e836ecb2cc49f19a0ac --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/window4.tcl | 20 ++++++++++++++++++++ test/window4.test | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index be8add86fe..f49e8b91ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\stwo\sincorrect\sassert()\sstatements\sfrom\sthe\slogic\sused\sto\sderive\ncolumn\snames\sand\stypes\sfrom\ssubqueries. -D 2019-08-10T14:16:17.492 +C Add\sextra\stest\scases\srelated\sto\sthe\sprevious\scommit. +D 2019-08-10T14:35:06.771 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1703,8 +1703,8 @@ F test/window2.tcl a44834af6267be6e14882311ef8790bf5047f1b9bc25685ee1762d48dc24f F test/window2.test 2f3ae63e171dce7f2ac29a41020f4da413b1d7bdaba48ee124fd336b152e34c5 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb -F test/window4.tcl 5fbaab489677914ee5686b2008426e336daf88a2f58be7df92757f780a5ebf91 -F test/window4.test bf8f86586ce101bf98e2306e597fa24aadc96c58d70ba4d11f956cf8ca4e0be3 +F test/window4.tcl d732df0e81beedc0ba8a563ade68611d322d27303ad0c0c8e4444107c39e84ec +F test/window4.test 807f3e6b15f9338e5b9742b87c5c7ca825b42b9657fde6096e890119370848e0 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eaf15d9bae6773058341d6219241f44ce728ad1cb9cf649f2efd4dddd81ec461 -R 0b7ad257f273d5f1351d21c4f8c4f975 -U drh -Z 2cfb417ff7d2d592ac6c825a80f69aff +P 712e47714863a8ed7ff73324d9fec569633e8b901c436c633b0220d16a7a9302 +R a0457a43e068ffbfda63ad720ecea4a8 +U dan +Z d9221ce1b4f7e01428bffb0f7cc0c03e diff --git a/manifest.uuid b/manifest.uuid index 11c57dc187..ebaa612c71 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -712e47714863a8ed7ff73324d9fec569633e8b901c436c633b0220d16a7a9302 \ No newline at end of file +3c690b2b05b7338f3325c50a0750c6023e1173afa4388e836ecb2cc49f19a0ac \ No newline at end of file diff --git a/test/window4.tcl b/test/window4.tcl index a0229db6b8..1b2b2ef623 100644 --- a/test/window4.tcl +++ b/test/window4.tcl @@ -385,6 +385,26 @@ execsql_test 11.4 { ) sub; } +execsql_test 12.0 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER); + INSERT INTO t2 VALUES(1), (2), (3); +} + +execsql_test 12.1 { + SELECT (SELECT min(a) OVER ()) FROM t2 +} + +execsql_float_test 12.2 { + SELECT (SELECT avg(a)) FROM t2 ORDER BY 1 +} + +execsql_float_test 12.3 { + SELECT + (SELECT avg(a) UNION SELECT min(a) OVER ()) + FROM t2 GROUP BY a + ORDER BY 1 +} finish_test diff --git a/test/window4.test b/test/window4.test index 1fb5b5d82a..6951a23432 100644 --- a/test/window4.test +++ b/test/window4.test @@ -1324,4 +1324,51 @@ do_execsql_test 11.4 { ) sub; } {0 1 2} +do_execsql_test 12.0 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER); + INSERT INTO t2 VALUES(1), (2), (3); +} {} + +do_execsql_test 12.1 { + SELECT (SELECT min(a) OVER ()) FROM t2 +} {1 2 3} + + +do_test 12.2 { + set myres {} + foreach r [db eval {SELECT (SELECT avg(a)) FROM t2 ORDER BY 1}] { + lappend myres [format %.4f [set r]] + } + set res2 {2.0000} + set i 0 + foreach r [set myres] r2 [set res2] { + if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} { + error "list element [set i] does not match: got=[set r] expected=[set r2]" + } + incr i + } + set {} {} +} {} + + +do_test 12.3 { + set myres {} + foreach r [db eval {SELECT + (SELECT avg(a) UNION SELECT min(a) OVER ()) + FROM t2 GROUP BY a + ORDER BY 1}] { + lappend myres [format %.4f [set r]] + } + set res2 {1.0000 2.0000 3.0000} + set i 0 + foreach r [set myres] r2 [set res2] { + if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} { + error "list element [set i] does not match: got=[set r] expected=[set r2]" + } + incr i + } + set {} {} +} {} + finish_test From 14c865e8592ff73e1e1ca2070ff660771ba20e78 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 10 Aug 2019 15:06:03 +0000 Subject: [PATCH 104/221] Fix the sqliteExprImpliesExpr() routine so that it recognizes that "(NULL IS FALSE) IS FALSE" doe not implie "NULL NOT NULL". Ticket [9080b6227fabb466] FossilOrigin-Name: da01ba4fa47c6508b31533ccd769e637af04bd37f51463372fbc6c848d892a4d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 4 +++- test/indexexpr1.test | 11 +++++++++++ 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f49e8b91ab..efdd178006 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sextra\stest\scases\srelated\sto\sthe\sprevious\scommit. -D 2019-08-10T14:35:06.771 +C Fix\sthe\ssqliteExprImpliesExpr()\sroutine\sso\sthat\sit\srecognizes\sthat\n"(NULL\sIS\sFALSE)\sIS\sFALSE"\sdoe\snot\simplie\s"NULL\sNOT\sNULL".\nTicket\s[9080b6227fabb466] +D 2019-08-10T15:06:03.156 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 338a6f564f58158d3fe0c6cc71e33f95380f13b3c5e3c03c9f144d6c920c2c81 +F src/expr.c 85239130e25f54279b1dfb3641984a335ce5a38709af29f9b62b555ed1459d07 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1051,7 +1051,7 @@ F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e -F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e +F test/indexexpr1.test 0f293369ed6f56764cfc3db05685d45469d9e685ba87e3698527049ba359ae24 F test/indexexpr2.test d319e7d1b1043403f39a20c892d512e02b5549c6004806b977030f2430c60208 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 @@ -1835,7 +1835,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 712e47714863a8ed7ff73324d9fec569633e8b901c436c633b0220d16a7a9302 -R a0457a43e068ffbfda63ad720ecea4a8 -U dan -Z d9221ce1b4f7e01428bffb0f7cc0c03e +P 3c690b2b05b7338f3325c50a0750c6023e1173afa4388e836ecb2cc49f19a0ac +R 3a0949f6ed843046decb4932366a96b4 +U drh +Z 90179c1f86c2ec8e084fc171c5a0f968 diff --git a/manifest.uuid b/manifest.uuid index ebaa612c71..3835f381b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c690b2b05b7338f3325c50a0750c6023e1173afa4388e836ecb2cc49f19a0ac \ No newline at end of file +da01ba4fa47c6508b31533ccd769e637af04bd37f51463372fbc6c848d892a4d \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 376da57cf8..e00b319ed2 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4938,7 +4938,9 @@ static int exprImpliesNotNull( ){ assert( p ); assert( pNN ); - if( sqlite3ExprCompare(pParse, p, pNN, iTab)==0 ) return 1; + if( sqlite3ExprCompare(pParse, p, pNN, iTab)==0 ){ + return pNN->op!=TK_NULL; + } switch( p->op ){ case TK_IN: { if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0; diff --git a/test/indexexpr1.test b/test/indexexpr1.test index e93dcc0cd1..ed7d9ffbc2 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -445,5 +445,16 @@ do_execsql_test indexexpr-1620 { SELECT b FROM t1 WHERE lower(a)='01234' ORDER BY +b; } {} +# 2019-08-09 https://www.sqlite.org/src/info/9080b6227fabb466 +# ExprImpliesExpr theorem prover bug: +# "(NULL IS FALSE) IS FALSE" does not imply "NULL IS NULL" +# +do_execsql_test indexexpr-1700 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0); + INSERT INTO t0(c0) VALUES (0); + CREATE INDEX i0 ON t0(NULL > c0) WHERE (NULL NOT NULL); + SELECT * FROM t0 WHERE ((NULL IS FALSE) IS FALSE); +} {0} finish_test From c5a93d4c85ef5b7c4219ec251d60a37306b625a6 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 12 Aug 2019 00:08:07 +0000 Subject: [PATCH 105/221] Validate the type, name, and tbl_name fields of the sqlite_master table when loading the schema, unless writable_schema is engaged. FossilOrigin-Name: 724f4df9ccc2b683f7091a3f7a8c20ee210f44d7a610cd1b4c49da1c274add08 --- manifest | 27 +++--- manifest.uuid | 2 +- src/alter.c | 4 +- src/build.c | 41 +++++++-- src/prepare.c | 51 ++++++----- src/sqliteInt.h | 3 +- src/trigger.c | 6 +- src/vdbe.c | 2 +- test/corruptL.test | 7 +- test/corruptM.test | 202 ++++++++++++++++++++++++++++++++++++++++++++ test/dbfuzz001.test | 2 +- 11 files changed, 295 insertions(+), 52 deletions(-) create mode 100644 test/corruptM.test diff --git a/manifest b/manifest index efdd178006..cd87a0298a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\ssqliteExprImpliesExpr()\sroutine\sso\sthat\sit\srecognizes\sthat\n"(NULL\sIS\sFALSE)\sIS\sFALSE"\sdoe\snot\simplie\s"NULL\sNOT\sNULL".\nTicket\s[9080b6227fabb466] -D 2019-08-10T15:06:03.156 +C Validate\sthe\stype,\sname,\sand\stbl_name\sfields\sof\sthe\ssqlite_master\stable\swhen\nloading\sthe\sschema,\sunless\swritable_schema\sis\sengaged. +D 2019-08-12T00:08:07.534 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -457,7 +457,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c c1b5e5639b88dcc146db326315f2dea4f7f1c599e524eeb421d544927a0b1e86 +F src/alter.c 5c3031e45e80f79d7d54c2d32dd3c44926544d4f6a478858bfe4ee3191570190 F src/analyze.c 0278dbf6dbc0be90dc5391cb020772b461d789af17c390f857a34308c7ac9858 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -467,7 +467,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 781e4594098dca97db672e52ed17c7f063b5b65db144c0c1bf1e9818e7be1ad4 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 9217f26f149a9dc3383018e85167187bc256198b29ab42ee5e02bc18fc1c757c +F src/build.c d38b82d2cc13a8a80abaae12af64c4e134a15591cb6d52d841691d3f20797d7d F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -518,7 +518,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 F src/pragma.c a42d4c6040893a59b69a0c987e5ed0402730c444ee451fde9bbe6203e7f73b1d F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 -F src/prepare.c 1fdf68a8add154bd1de978dde5a4819478e2576d5701b93db2c65d78c3daf1c8 +F src/prepare.c 1dcd92a57f63f7ba02ece7997c0cd36647f6ea05c05726f02d7709b18bd368ac F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 @@ -528,7 +528,7 @@ F src/shell.c.in 920360b4cde1a0d65a182564abacaaa8c6a54ef52fe224065019006dad76f68 F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 9286c237c240e578eac0dac23d7a4cd030c8eb5ecb6d549ae211b288382c22fd +F src/sqliteInt.h 10b44ee37e2ec15e36f8ec2f73f801389090d379cae564646ac622739ba50673 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -589,13 +589,13 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c 06e65db6ffa14dd583f90403192190dfe3855c0e3acfcbac0e82109a46e2b16c -F src/trigger.c 563df58084fa50aaf22b13ac5b71fdb02c9ffc6f0bf5d262cfe07aade4e20b3f +F src/trigger.c 2305271878e95addc1c01361e5e8e342e87cba5efefdd7d3032687e5d67e05d1 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c d0c302d9f58adfbb1f5fd3542cb49ac02a8cc1375808d2a4dcacdc2a8f1fd64b +F src/vdbe.c 1041610254502572bcc79ce6f61d9364fb93c154a4935fbaeaa7fd2e158e5205 F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e @@ -767,7 +767,8 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test 15882a75d06de29df9ad33a3503eb0fe21efbd1afcd676949c0d82e1f4e55360 +F test/corruptL.test 865cb75ed971b72b5ee9ad9017befee6bd38794011cae69f00676d82c5a5dd69 +F test/corruptM.test 04a4061b1979283851953217e411187be79e50f5e5e3ef340c3f8e564173aae1 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 @@ -793,7 +794,7 @@ F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b10 F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbfuzz001.test e32d14465f1c77712896fda6a1ccc0f037b481c191c1696a9c44f6c9e4964faf +F test/dbfuzz001.test 42aad1dcef6219fbee86a9b7d08832c9bbb2e41508f6f128ae91745927276292 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c c2c9cb40082a77b7e95ffb8b2da1e93322efadfb1c8c1e0001c95a0af1e156c2 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 @@ -1835,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3c690b2b05b7338f3325c50a0750c6023e1173afa4388e836ecb2cc49f19a0ac -R 3a0949f6ed843046decb4932366a96b4 +P da01ba4fa47c6508b31533ccd769e637af04bd37f51463372fbc6c848d892a4d +R e233f3c1c14b81564e9774e7c104cb1c U drh -Z 90179c1f86c2ec8e084fc171c5a0f968 +Z 900804f532f967b21532d61caa969e9b diff --git a/manifest.uuid b/manifest.uuid index 3835f381b1..b5c0a60f13 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -da01ba4fa47c6508b31533ccd769e637af04bd37f51463372fbc6c848d892a4d \ No newline at end of file +724f4df9ccc2b683f7091a3f7a8c20ee210f44d7a610cd1b4c49da1c274add08 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 3957edefa0..8c3fefd1bf 100644 --- a/src/alter.c +++ b/src/alter.c @@ -136,8 +136,8 @@ void sqlite3AlterRenameTable( if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_rename_table; } - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto - exit_rename_table; + if( SQLITE_OK!=sqlite3CheckObjectName(pParse,zName,"table",zName) ){ + goto exit_rename_table; } #ifndef SQLITE_OMIT_VIEW diff --git a/src/build.c b/src/build.c index 57491005a2..0fe8019d6b 100644 --- a/src/build.c +++ b/src/build.c @@ -829,13 +829,38 @@ int sqlite3WritableSchema(sqlite3 *db){ ** trigger). All names are legal except those that begin with the string ** "sqlite_" (in upper, lower or mixed case). This portion of the namespace ** is reserved for internal use. +** +** When parsing the sqlite_master table, this routine also checks to +** make sure the "type", "name", and "tbl_name" columns are consistent +** with the SQL. */ -int sqlite3CheckObjectName(Parse *pParse, const char *zName){ - if( !pParse->db->init.busy && pParse->nested==0 - && sqlite3WritableSchema(pParse->db)==0 - && 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ - sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", zName); - return SQLITE_ERROR; +int sqlite3CheckObjectName( + Parse *pParse, /* Parsing context */ + const char *zName, /* Name of the object to check */ + const char *zType, /* Type of this object */ + const char *zTblName /* Parent table name for triggers and indexes */ +){ + sqlite3 *db = pParse->db; + if( sqlite3WritableSchema(db) || db->init.imposterTable ){ + /* Skip these error checks for writable_schema=ON */ + return SQLITE_OK; + } + if( db->init.busy ){ + if( sqlite3_stricmp(zType, db->init.azInit[0]) + || sqlite3_stricmp(zName, db->init.azInit[1]) + || sqlite3_stricmp(zTblName, db->init.azInit[2]) + ){ + sqlite3ErrorMsg(pParse, ""); /* corruptSchema() will supply the error */ + return SQLITE_ERROR; + } + }else{ + if( pParse->nested==0 + && 0==sqlite3StrNICmp(zName, "sqlite_", 7) + ){ + sqlite3ErrorMsg(pParse, "object name reserved for internal use: %s", + zName); + return SQLITE_ERROR; + } } return SQLITE_OK; } @@ -916,7 +941,7 @@ void sqlite3StartTable( } pParse->sNameToken = *pName; if( zName==0 ) return; - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + if( sqlite3CheckObjectName(pParse, zName, isView?"view":"table", zName) ){ goto begin_table_error; } if( db->init.iDb==1 ) isTemp = 1; @@ -3275,7 +3300,7 @@ void sqlite3CreateIndex( zName = sqlite3NameFromToken(db, pName); if( zName==0 ) goto exit_create_index; assert( pName->z!=0 ); - if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName,"index",pTab->zName) ){ goto exit_create_index; } if( !IN_RENAME_OBJECT ){ diff --git a/src/prepare.c b/src/prepare.c index 396df7bda2..c6d7fba703 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -64,9 +64,11 @@ int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ ** ** Each callback contains the following information: ** -** argv[0] = name of thing being created -** argv[1] = root page number for table or index. 0 for trigger or view. -** argv[2] = SQL text for the CREATE statement. +** argv[0] = type of object: "table", "index", "trigger", or "view". +** argv[1] = name of thing being created +** argv[2] = associated table if an index or trigger +** argv[3] = root page number for table or index. 0 for trigger or view. +** argv[4] = SQL text for the CREATE statement. ** */ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ @@ -74,21 +76,21 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ sqlite3 *db = pData->db; int iDb = pData->iDb; - assert( argc==3 ); + assert( argc==5 ); UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); DbClearProperty(db, iDb, DB_Empty); pData->nInitRow++; if( db->mallocFailed ){ - corruptSchema(pData, argv[0], 0); + corruptSchema(pData, argv[1], 0); return 1; } assert( iDb>=0 && iDbnDb ); if( argv==0 ) return 0; /* Might happen if EMPTY_RESULT_CALLBACKS are on */ - if( argv[1]==0 ){ - corruptSchema(pData, argv[0], 0); - }else if( sqlite3_strnicmp(argv[2],"create ",7)==0 ){ + if( argv[3]==0 ){ + corruptSchema(pData, argv[1], 0); + }else if( sqlite3_strnicmp(argv[4],"create ",7)==0 ){ /* Call the parser to process a CREATE TABLE, INDEX or VIEW. ** But because db->init.busy is set to 1, no VDBE code is generated ** or executed. All the parser does is build the internal data @@ -101,9 +103,10 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ assert( db->init.busy ); db->init.iDb = iDb; - db->init.newTnum = sqlite3Atoi(argv[1]); + db->init.newTnum = sqlite3Atoi(argv[3]); db->init.orphanTrigger = 0; - TESTONLY(rcp = ) sqlite3_prepare(db, argv[2], -1, &pStmt, 0); + db->init.azInit = argv; + TESTONLY(rcp = ) sqlite3_prepare(db, argv[4], -1, &pStmt, 0); rc = db->errCode; assert( (rc&0xFF)==(rcp&0xFF) ); db->init.iDb = saved_iDb; @@ -116,13 +119,13 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ if( rc==SQLITE_NOMEM ){ sqlite3OomFault(db); }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){ - corruptSchema(pData, argv[0], sqlite3_errmsg(db)); + corruptSchema(pData, argv[1], sqlite3_errmsg(db)); } } } sqlite3_finalize(pStmt); - }else if( argv[0]==0 || (argv[2]!=0 && argv[2][0]!=0) ){ - corruptSchema(pData, argv[0], 0); + }else if( argv[1]==0 || (argv[4]!=0 && argv[4][0]!=0) ){ + corruptSchema(pData, argv[1], 0); }else{ /* If the SQL column is blank it means this is an index that ** was created to be the PRIMARY KEY or to fulfill a UNIQUE @@ -131,13 +134,13 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ ** to do here is record the root page number for that index. */ Index *pIndex; - pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); + pIndex = sqlite3FindIndex(db, argv[1], db->aDb[iDb].zDbSName); if( pIndex==0 - || sqlite3GetInt32(argv[1],&pIndex->tnum)==0 + || sqlite3GetInt32(argv[3],&pIndex->tnum)==0 || pIndex->tnum<2 || sqlite3IndexHasDuplicateRootPage(pIndex) ){ - corruptSchema(pData, argv[0], pIndex?"invalid rootpage":"orphan index"); + corruptSchema(pData, argv[1], pIndex?"invalid rootpage":"orphan index"); } } return 0; @@ -158,7 +161,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ int size; #endif Db *pDb; - char const *azArg[4]; + char const *azArg[6]; int meta[5]; InitData initData; const char *zMasterName; @@ -177,18 +180,20 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ ** table name will be inserted automatically by the parser so we can just ** use the abbreviation "x" here. The parser will also automatically tag ** the schema table as read-only. */ - azArg[0] = zMasterName = SCHEMA_TABLE(iDb); - azArg[1] = "1"; - azArg[2] = "CREATE TABLE x(type text,name text,tbl_name text," + azArg[0] = "table"; + azArg[1] = zMasterName = SCHEMA_TABLE(iDb); + azArg[2] = azArg[1]; + azArg[3] = "1"; + azArg[4] = "CREATE TABLE x(type text,name text,tbl_name text," "rootpage int,sql text)"; - azArg[3] = 0; + azArg[5] = 0; initData.db = db; initData.iDb = iDb; initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; initData.nInitRow = 0; - sqlite3InitCallback(&initData, 3, (char **)azArg, 0); + sqlite3InitCallback(&initData, 5, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; goto error_out; @@ -314,7 +319,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ { char *zSql; zSql = sqlite3MPrintf(db, - "SELECT name, rootpage, sql FROM \"%w\".%s ORDER BY rowid", + "SELECT*FROM\"%w\".%s ORDER BY rowid", db->aDb[iDb].zDbSName, zMasterName); #ifndef SQLITE_OMIT_AUTHORIZATION { diff --git a/src/sqliteInt.h b/src/sqliteInt.h index efe8e1b970..55172aac8b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1398,6 +1398,7 @@ struct sqlite3 { unsigned orphanTrigger : 1; /* Last statement is orphaned TEMP trigger */ unsigned imposterTable : 1; /* Building an imposter table */ unsigned reopenMemdb : 1; /* ATTACH is really a reopen using MemDB */ + char **azInit; /* "type", "name", and "tbl_name" columns */ } init; int nVdbeActive; /* Number of VDBEs currently running */ int nVdbeRead; /* Number of active VDBEs that read or write */ @@ -4268,7 +4269,7 @@ Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); Expr *sqlite3ExprSkipCollate(Expr*); int sqlite3CheckCollSeq(Parse *, CollSeq *); int sqlite3WritableSchema(sqlite3*); -int sqlite3CheckObjectName(Parse *, const char *); +int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*); void sqlite3VdbeSetChanges(sqlite3 *, int); int sqlite3AddInt64(i64*,i64); int sqlite3SubInt64(i64*,i64); diff --git a/src/trigger.c b/src/trigger.c index 638d53dace..989df9678a 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -177,7 +177,11 @@ void sqlite3BeginTrigger( /* Check that the trigger name is not reserved and that no trigger of the ** specified name exists */ zName = sqlite3NameFromToken(db, pName); - if( !zName || SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ + if( zName==0 ){ + assert( db->mallocFailed ); + goto trigger_cleanup; + } + if( sqlite3CheckObjectName(pParse, zName, "trigger", pTab->zName) ){ goto trigger_cleanup; } assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); diff --git a/src/vdbe.c b/src/vdbe.c index 89ef666f17..0bba39a667 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5963,7 +5963,7 @@ case OP_ParseSchema: { initData.pzErrMsg = &p->zErrMsg; initData.mInitFlags = 0; zSql = sqlite3MPrintf(db, - "SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid", + "SELECT*FROM\"%w\".%s WHERE %s ORDER BY rowid", db->aDb[iDb].zDbSName, zMaster, pOp->p4.z); if( zSql==0 ){ rc = SQLITE_NOMEM_BKPT; diff --git a/test/corruptL.test b/test/corruptL.test index 53a68a0258..9351d9f6ea 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -228,6 +228,7 @@ do_test 2.0 { }]} {} do_execsql_test 2.1 { + PRAGMA writable_schema=ON; -- bypass improved sqlite_master consistency checking INSERT INTO t1(b) VALUES(X'a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bfef346e6ac8ae0d0e7c3175946e62ba2b'); } @@ -377,6 +378,7 @@ do_test 4.0 { }]} {} do_catchsql_test 4.1 { + PRAGMA writable_schema=ON; -- bypass improved sqlite_master consistency checking INSERT INTO t3 SELECT * FROM t2; } {1 {database disk image is malformed}} @@ -605,7 +607,7 @@ do_test 6.0 { | 3872: 75 65 6e 63 65 04 43 52 45 41 54 45 20 54 41 42 uence.CREATE TAB | 3888: 4c 45 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e LE sqlite_sequen | 3904: 63 65 28 6e 61 6d 65 2c 73 65 71 29 81 04 01 07 ce(name,seq).... -| 3920: 17 11 11 01 81 73 74 61 c2 6c 65 74 31 74 31 02 .....sta.let1t1. +| 3920: 17 11 11 01 81 73 74 61 62 6c 65 74 31 74 31 02 .....stablet1t1. | 3936: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 CREATE TABLE t1( | 3952: 61 20 52 45 41 4c 20 4e 4f 54 20 4e 55 4c 4c 20 a REAL NOT NULL | 3968: 44 45 46 41 55 4c 54 28 32 35 2b 33 32 29 2c 62 DEFAULT(25+32),b @@ -835,6 +837,7 @@ do_test 8.0 { do_catchsql_test 8.1 { + PRAGMA writable_schema=ON; -- bypass improved sqlite_master consistency checking INSERT INTO t3 SELECT * FROM t2; } {1 {database disk image is malformed}} @@ -1004,6 +1007,7 @@ do_test 10.0 { }]} {} do_catchsql_test 10.1 { + PRAGMA writable_schema=ON; -- bypass improved sqlite_master consistency checking SELECT * FROM t1 WHERE a<='2019-05-09' ORDER BY a DESC; } {1 {database disk image is malformed}} @@ -1057,6 +1061,7 @@ do_test 11.0 { }]} {} do_catchsql_test 11.1 { + PRAGMA writable_schema=ON; -- bypass improved sqlite_master consistency checking DELETE FROM t3 WHERE x IN (SELECT x FROM t4); } {1 {database disk image is malformed}} diff --git a/test/corruptM.test b/test/corruptM.test new file mode 100644 index 0000000000..0b9f5e4983 --- /dev/null +++ b/test/corruptM.test @@ -0,0 +1,202 @@ +# 2019-08-12 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Check to ensure that the type, name, and tbl_name fields of the +# sqlite_master table are validated and errors are reported if they +# are inconsistent with the sql. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix corruptM + +# These tests deal with corrupt database files +# +database_may_be_corrupt + +db close +forcedelete test.db +sqlite3 db test.db +do_execsql_test corruptM-100 { + CREATE TABLE t1(a,b,c); + INSERT INTO t1 VALUES(111,222,333); + CREATE INDEX i1 ON t1(b); + CREATE VIEW v2 AS SELECT 15,22; + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN SELECT 5; END; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |} +do_execsql_test corruptM-101 { + PRAGMA writable_schema=on; + UPDATE sqlite_master SET tbl_name=NULL WHERE name='t1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 {} | index i1 t1 | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-102 { + catchsql { + PRAGMA quick_check; + } db2 +} {1 {malformed database schema (t1)}} +db2 close + +do_execsql_test corruptM-110 { + UPDATE sqlite_master SET tbl_name='tx' WHERE name='t1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 tx | index i1 t1 | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-111 { + catchsql { + PRAGMA quick_check; + } db2 +} {1 {malformed database schema (t1)}} +db2 close +do_execsql_test corruptM-112 { + UPDATE sqlite_master SET tbl_name='t1', type='tabl' WHERE name='t1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {tabl t1 t1 | index i1 t1 | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-113 { + catchsql { + PRAGMA quick_check; + } db2 +} {1 {malformed database schema (t1)}} +db2 close +do_execsql_test corruptM-114 { + UPDATE sqlite_master SET tbl_name='t9',type='table',name='t9'WHERE name='t1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t9 t9 | index i1 t1 | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-114 { + catchsql { + PRAGMA quick_check; + } db2 +} {1 {malformed database schema (t9)}} +db2 close + +do_execsql_test corruptM-120 { + UPDATE sqlite_master SET name='t1',tbl_name='T1' WHERE name='t9'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-121 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {0 {ok 111 222 333 15 22}} +db2 close + +do_execsql_test corruptM-130 { + UPDATE sqlite_master SET type='view' WHERE name='t1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {view t1 T1 | index i1 t1 | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-131 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {1 {malformed database schema (t1)}} +db2 close + +do_execsql_test corruptM-140 { + UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='t1'; + UPDATE sqlite_master SET tbl_name='tx' WHERE name='i1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 t1 | index i1 tx | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-141 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {1 {malformed database schema (i1)}} +db2 close + +do_execsql_test corruptM-150 { + UPDATE sqlite_master SET type='table', tbl_name='t1' WHERE name='i1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 t1 | table i1 t1 | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-151 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {1 {malformed database schema (i1)}} +db2 close + +do_execsql_test corruptM-160 { + UPDATE sqlite_master SET type='view', tbl_name='t1' WHERE name='i1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 t1 | view i1 t1 | view v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-161 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {1 {malformed database schema (i1)}} +db2 close + +do_execsql_test corruptM-170 { + UPDATE sqlite_master SET type='index', tbl_name='t1' WHERE name='i1'; + UPDATE sqlite_master SET type='table', tbl_name='v2' WHERE name='v2'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 t1 | index i1 t1 | table v2 v2 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-171 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {1 {malformed database schema (v2)}} +db2 close + +do_execsql_test corruptM-180 { + UPDATE sqlite_master SET type='view',name='v3',tbl_name='v3' WHERE name='v2'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 t1 | index i1 t1 | view v3 v3 | trigger r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-181 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {1 {malformed database schema (v3)}} +db2 close + +do_execsql_test corruptM-190 { + UPDATE sqlite_master SET type='view',name='v2',tbl_name='v2' WHERE name='v3'; + UPDATE sqlite_master SET type='view' WHERE name='r1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 t1 | index i1 t1 | view v2 v2 | view r1 t1 |} +sqlite3 db2 test.db +do_test corruptM-191 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {1 {malformed database schema (r1)}} +db2 close +do_execsql_test corruptM-192 { + UPDATE sqlite_master SET type='trigger',tbl_name='v2' WHERE name='r1'; + SELECT type, name, tbl_name, '|' FROM sqlite_master; +} {table t1 t1 | index i1 t1 | view v2 v2 | trigger r1 v2 |} +sqlite3 db2 test.db +do_test corruptM-193 { + catchsql { + PRAGMA quick_check; + SELECT * FROM t1, v2; + } db2 +} {1 {malformed database schema (r1)}} +db2 close + +finish_test diff --git a/test/dbfuzz001.test b/test/dbfuzz001.test index 77df86b30e..7ef4cd2a3f 100644 --- a/test/dbfuzz001.test +++ b/test/dbfuzz001.test @@ -305,7 +305,7 @@ do_test dbfuzz001-310 { | 384: 32 28 63 2c 64 29 28 05 06 17 11 11 01 3d 74 61 2(c,d)(......=ta | 400: 62 6c 65 74 33 74 33 07 43 52 45 41 54 45 20 54 blet3t3.CREATE T | 416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29 ABLE t3(c,x,e,f) -| 432: 28 02 06 17 11 11 01 3d 74 61 74 65 6c 03 62 74 (......=tatel.bt +| 432: 28 02 06 17 11 11 01 3d 74 61 62 6c 65 74 32 74 (......=tablet2t | 448: 32 32 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 22CREATE TABLE t | 464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11 2(c,d,e,f)$..... | 480: 01 35 74 61 62 6c 65 74 31 74 31 02 43 52 45 41 .5tablet1t1.CREA From 30842990b27387423009c9c96e34fd3e0d3c66de Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 12 Aug 2019 14:17:43 +0000 Subject: [PATCH 106/221] Add a TESTCTRL that disables the verification of type, name, and tbl_name in the sqlite_master table. FossilOrigin-Name: 48d9b48ab4ace234eb1a055cf33cb533a1c3aa82d0a6e086d96226bd9474ceca --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/build.c | 6 ++++-- src/global.c | 1 + src/main.c | 11 +++++++++++ src/shell.c.in | 1 + src/sqlite.h.in | 3 ++- src/sqliteInt.h | 11 ++++++----- 8 files changed, 37 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index cd87a0298a..a11bae5803 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Validate\sthe\stype,\sname,\sand\stbl_name\sfields\sof\sthe\ssqlite_master\stable\swhen\nloading\sthe\sschema,\sunless\swritable_schema\sis\sengaged. -D 2019-08-12T00:08:07.534 +C Add\sa\sTESTCTRL\sthat\sdisables\sthe\sverification\sof\stype,\sname,\sand\stbl_name\nin\sthe\ssqlite_master\stable. +D 2019-08-12T14:17:43.606 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -467,7 +467,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 781e4594098dca97db672e52ed17c7f063b5b65db144c0c1bf1e9818e7be1ad4 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c d38b82d2cc13a8a80abaae12af64c4e134a15591cb6d52d841691d3f20797d7d +F src/build.c 7fb6ad35d162517d6bfa196f4fb2a1d7c3a362531e84c59f3a0479e0de511556 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -479,7 +479,7 @@ F src/expr.c 85239130e25f54279b1dfb3641984a335ce5a38709af29f9b62b555ed1459d07 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 -F src/global.c 0c9c45844ae182b458610e4d427834deffcdcd45fbc8c957f6ad82051b8f161f +F src/global.c d7a7a45a78ffe01302d61c271ed50474ef1b9d2d23bf17a46a58c8a1926424ee F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da @@ -487,7 +487,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c c2194dd2886337b870226fcb31c13e7df8c4b5e0ea85140e510a6f1daf1ad65b F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c ddba2dd3c8b11ad1d2ecc146a85a459c50a9a6b592ff154246a5db44d601d64f +F src/main.c 3add6433e077635dac5579edaf7b3942e3ff3dda5588c49c0edd7abea2096482 F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -524,11 +524,11 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 11087458ec2af5c4b377559ea0462c2ab842e02badd35b21a8d67257c4e0b117 -F src/shell.c.in 920360b4cde1a0d65a182564abacaaa8c6a54ef52fe224065019006dad76f685 -F src/sqlite.h.in c6bba28018378b6b43fcf4db7e9f1a3e84b0157ff54dc22ed3977acdac88e051 +F src/shell.c.in 1b9efc93f912a714bed08977d16b3f363c632132b9b6c8564be59e9f2c4807da +F src/sqlite.h.in 1fe019ae55182040e6ea10c89ddbb8d24c1b1015c423da53e55205398a65a906 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 10b44ee37e2ec15e36f8ec2f73f801389090d379cae564646ac622739ba50673 +F src/sqliteInt.h 0598c87a995d63b09bcc408552bf38205cd902b577e74b7c3237bde71093c28b F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P da01ba4fa47c6508b31533ccd769e637af04bd37f51463372fbc6c848d892a4d -R e233f3c1c14b81564e9774e7c104cb1c +P 724f4df9ccc2b683f7091a3f7a8c20ee210f44d7a610cd1b4c49da1c274add08 +R e52d4e08443796a700878ad995be892e U drh -Z 900804f532f967b21532d61caa969e9b +Z a1bdff4fd0620b61d82942631950a69a diff --git a/manifest.uuid b/manifest.uuid index b5c0a60f13..b784b190f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -724f4df9ccc2b683f7091a3f7a8c20ee210f44d7a610cd1b4c49da1c274add08 \ No newline at end of file +48d9b48ab4ace234eb1a055cf33cb533a1c3aa82d0a6e086d96226bd9474ceca \ No newline at end of file diff --git a/src/build.c b/src/build.c index 0fe8019d6b..1c8ef33c9c 100644 --- a/src/build.c +++ b/src/build.c @@ -850,8 +850,10 @@ int sqlite3CheckObjectName( || sqlite3_stricmp(zName, db->init.azInit[1]) || sqlite3_stricmp(zTblName, db->init.azInit[2]) ){ - sqlite3ErrorMsg(pParse, ""); /* corruptSchema() will supply the error */ - return SQLITE_ERROR; + if( sqlite3Config.bExtraSchemaChecks ){ + sqlite3ErrorMsg(pParse, ""); /* corruptSchema() will supply the error */ + return SQLITE_ERROR; + } } }else{ if( pParse->nested==0 diff --git a/src/global.c b/src/global.c index 79b1d427a4..a2979e2e56 100644 --- a/src/global.c +++ b/src/global.c @@ -214,6 +214,7 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { SQLITE_USE_URI, /* bOpenUri */ SQLITE_ALLOW_COVERING_INDEX_SCAN, /* bUseCis */ 0, /* bSmallMalloc */ + 1, /* bExtraSchemaChecks */ 0x7ffffffe, /* mxStrlen */ 0, /* neverCorrupt */ SQLITE_DEFAULT_LOOKASIDE, /* szLookaside, nLookaside */ diff --git a/src/main.c b/src/main.c index 2262e9aa09..06a55eca02 100644 --- a/src/main.c +++ b/src/main.c @@ -4063,6 +4063,17 @@ int sqlite3_test_control(int op, ...){ break; } + /* sqlite3_test_control(SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS, int); + ** + ** Set or clear a flag that causes SQLite to verify that type, name, + ** and tbl_name fields of the sqlite_master table. This is normally + ** on, but it is sometimes useful to turn it off for testing. + */ + case SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS: { + sqlite3GlobalConfig.bExtraSchemaChecks = va_arg(ap, int); + break; + } + /* Set the threshold at which OP_Once counters reset back to zero. ** By default this is 0x7ffffffe (over 2 billion), but that value is ** too big to test in a reasonable amount of time, so this control is diff --git a/src/shell.c.in b/src/shell.c.in index 9233101a0a..2524faf9d0 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9165,6 +9165,7 @@ static int do_meta_command(char *zLine, ShellState *p){ /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/ /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/ { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" }, + { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" }, */ { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN" }, diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 20a62894fd..d68cef2490 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -7359,7 +7359,8 @@ int sqlite3_test_control(int op, ...); #define SQLITE_TESTCTRL_PARSER_COVERAGE 26 #define SQLITE_TESTCTRL_RESULT_INTREAL 27 #define SQLITE_TESTCTRL_PRNG_SEED 28 -#define SQLITE_TESTCTRL_LAST 28 /* Largest TESTCTRL */ +#define SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS 29 +#define SQLITE_TESTCTRL_LAST 29 /* Largest TESTCTRL */ /* ** CAPI3REF: SQL Keyword Checking diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 55172aac8b..1104b771f3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3397,11 +3397,12 @@ typedef struct { */ struct Sqlite3Config { int bMemstat; /* True to enable memory status */ - int bCoreMutex; /* True to enable core mutexing */ - int bFullMutex; /* True to enable full mutexing */ - int bOpenUri; /* True to interpret filenames as URIs */ - int bUseCis; /* Use covering indices for full-scans */ - int bSmallMalloc; /* Avoid large memory allocations if true */ + u8 bCoreMutex; /* True to enable core mutexing */ + u8 bFullMutex; /* True to enable full mutexing */ + u8 bOpenUri; /* True to interpret filenames as URIs */ + u8 bUseCis; /* Use covering indices for full-scans */ + u8 bSmallMalloc; /* Avoid large memory allocations if true */ + u8 bExtraSchemaChecks; /* Verify type,name,tbl_name in schema */ int mxStrlen; /* Maximum string length */ int neverCorrupt; /* Database is always well-formed */ int szLookaside; /* Default lookaside buffer size */ From 41428a97b86b89395e9bdf0f38cf7d83ab2b451b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 12 Aug 2019 16:25:11 +0000 Subject: [PATCH 107/221] For the ".testctrl prng_seed" command in the CLI, if the argument is "random" then select a random integer seed and print the seed value on stdout. FossilOrigin-Name: 636ca4472c9f41eb3989f28854d4968867837399a2092f389d1b814d98cccbae --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index a11bae5803..89ec0e6944 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sTESTCTRL\sthat\sdisables\sthe\sverification\sof\stype,\sname,\sand\stbl_name\nin\sthe\ssqlite_master\stable. -D 2019-08-12T14:17:43.606 +C For\sthe\s".testctrl\sprng_seed"\scommand\sin\sthe\sCLI,\sif\sthe\sargument\sis\s"random"\nthen\sselect\sa\srandom\sinteger\sseed\sand\sprint\sthe\sseed\svalue\son\sstdout. +D 2019-08-12T16:25:11.731 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 11087458ec2af5c4b377559ea0462c2ab842e02badd35b21a8d67257c4e0b117 -F src/shell.c.in 1b9efc93f912a714bed08977d16b3f363c632132b9b6c8564be59e9f2c4807da +F src/shell.c.in 66cd8289adbcd159ca67872c242990ca6bed29fe80be7ebf9c6a1c068249a41e F src/sqlite.h.in 1fe019ae55182040e6ea10c89ddbb8d24c1b1015c423da53e55205398a65a906 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 724f4df9ccc2b683f7091a3f7a8c20ee210f44d7a610cd1b4c49da1c274add08 -R e52d4e08443796a700878ad995be892e +P 48d9b48ab4ace234eb1a055cf33cb533a1c3aa82d0a6e086d96226bd9474ceca +R 5a141faa1c39cc955778f126f1aabd0f U drh -Z a1bdff4fd0620b61d82942631950a69a +Z 779c2cf81842090ecdd5432af318ddb5 diff --git a/manifest.uuid b/manifest.uuid index b784b190f1..74af8f947f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -48d9b48ab4ace234eb1a055cf33cb533a1c3aa82d0a6e086d96226bd9474ceca \ No newline at end of file +636ca4472c9f41eb3989f28854d4968867837399a2092f389d1b814d98cccbae \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 2524faf9d0..19280e318d 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9265,6 +9265,10 @@ static int do_meta_command(char *zLine, ShellState *p){ if( nArg==3 || nArg==4 ){ int ii = (int)integerValue(azArg[2]); sqlite3 *db; + if( ii==0 && strcmp(azArg[2],"random")==0 ){ + sqlite3_randomness(sizeof(ii),&ii); + printf("-- random seed: %d\n", ii); + } if( nArg==3 ){ db = 0; }else{ From 6e11892db8919592352b20228b9c9c36f31bf1a8 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 12 Aug 2019 16:36:38 +0000 Subject: [PATCH 108/221] Experimental implementation of NULLS FIRST/LAST. This branch still has problems - the most significant of which is that ORDER BY clauses with a non-default NULLS FIRST/LAST qualifier can never use an index. FossilOrigin-Name: 07babb0f897fc8c9cb5b30481899c32fdd743f3f3ca508d8d957826252107dd5 --- manifest | 39 ++++++++++++++++++-------------- manifest.uuid | 2 +- src/build.c | 11 ++++----- src/expr.c | 26 +++++++++++++++------- src/parse.y | 14 ++++++++---- src/select.c | 12 +++++----- src/sqliteInt.h | 9 +++++--- src/vdbe.c | 7 +++++- src/vdbeaux.c | 36 +++++++++++++++++++++--------- src/vdbesort.c | 7 ++++-- src/where.c | 8 ++++--- src/window.c | 8 +++---- test/nulls1.test | 53 ++++++++++++++++++++++++++++++++++++++++++++ tool/mkkeywordhash.c | 3 +++ 14 files changed, 171 insertions(+), 64 deletions(-) create mode 100644 test/nulls1.test diff --git a/manifest b/manifest index 89ec0e6944..168990dfe6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sthe\s".testctrl\sprng_seed"\scommand\sin\sthe\sCLI,\sif\sthe\sargument\sis\s"random"\nthen\sselect\sa\srandom\sinteger\sseed\sand\sprint\sthe\sseed\svalue\son\sstdout. -D 2019-08-12T16:25:11.731 +C Experimental\simplementation\sof\sNULLS\sFIRST/LAST.\sThis\sbranch\sstill\shas\sproblems\s-\sthe\smost\ssignificant\sof\swhich\sis\sthat\sORDER\sBY\sclauses\swith\sa\snon-default\sNULLS\sFIRST/LAST\squalifier\scan\snever\suse\san\sindex. +D 2019-08-12T16:36:38.041 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -467,7 +467,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 781e4594098dca97db672e52ed17c7f063b5b65db144c0c1bf1e9818e7be1ad4 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 7fb6ad35d162517d6bfa196f4fb2a1d7c3a362531e84c59f3a0479e0de511556 +F src/build.c 3584e598dd232b182bb657576a4b7ee0c2bd20afa59ad2fe0c4e65ed74e57b64 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 85239130e25f54279b1dfb3641984a335ce5a38709af29f9b62b555ed1459d07 +F src/expr.c 7cc60cb97c0ddda825cc8bd2de4d3f51f183e894316c74225729ecfa8823aa05 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -512,7 +512,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 6d03a24bc0dcd15b93c480ea8a87f7ccd25313fe826485726d9ef13b82f2378d +F src/parse.y 61e979ce7f860df902b21b16ed40504ddd58fe4546fb15908a51538b3062e8e0 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -523,12 +523,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 11087458ec2af5c4b377559ea0462c2ab842e02badd35b21a8d67257c4e0b117 +F src/select.c a8f5a4993c4ca59c68c55717f7f41e89cff6084b368f33cfd284dcf78262b9ad F src/shell.c.in 66cd8289adbcd159ca67872c242990ca6bed29fe80be7ebf9c6a1c068249a41e F src/sqlite.h.in 1fe019ae55182040e6ea10c89ddbb8d24c1b1015c423da53e55205398a65a906 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 0598c87a995d63b09bcc408552bf38205cd902b577e74b7c3237bde71093c28b +F src/sqliteInt.h f1ee0017108d34ecccd30301415be7861816877e3e9a01088df081fbcfbf908c F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -595,25 +595,25 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 1041610254502572bcc79ce6f61d9364fb93c154a4935fbaeaa7fd2e158e5205 +F src/vdbe.c bc43c994a18290b4022eb3751d510df1e070d92fa669e51de515fdd529ef105e F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e -F src/vdbeaux.c 8eeb9799d80bc6b37f2bcb23b3519234b596c530046c2cd0261f9ef1a1ba6c37 +F src/vdbeaux.c 68fd90976d0550bd9ab9ba03befba1f182aadce8bfca7d4b4eb33a2587c925bd F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 -F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 +F src/vdbesort.c da75f505aba230060ce6472605a4aa6494f73eeb1071e1cc2643c3d4035e671b F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 90cb93dc8eb9383e72f661b2074551d47ff21e5379f7167f7e078bed436989e9 +F src/where.c 83fc2acadfbb1c86501fc0847fd068040ecd9a250a2fc0b81bab5698aa4bc72d F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc -F src/window.c 98b2571c66246bddadf42e76da45ed970fe7518a4c9c1ccc8cdace0711bfabba +F src/window.c 4d56fc1e3dbd3a4fa0653b3f48a3ad7066d0da91d0273cff8bab13c3412ddaf5 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1182,6 +1182,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 +F test/nulls1.test eac9f46d9bf7a3883700bbc063e8a64fa2f4677ea64f12e173d3052d635f6b23 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1764,7 +1765,7 @@ F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 -F tool/mkkeywordhash.c 537b1a11ec1829b51b633da3ba2cc889b4a3f7356b06a07423b6d4cce92c2350 +F tool/mkkeywordhash.c bc5bcc92ebcaf15345346be7cf2204b83ed649b5208234adb5e543c061209bbf F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6a13ea F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 @@ -1836,7 +1837,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 48d9b48ab4ace234eb1a055cf33cb533a1c3aa82d0a6e086d96226bd9474ceca -R 5a141faa1c39cc955778f126f1aabd0f -U drh -Z 779c2cf81842090ecdd5432af318ddb5 +P 636ca4472c9f41eb3989f28854d4968867837399a2092f389d1b814d98cccbae +R 6d8a33d8edc53ea630705f876c1c3795 +T *branch * nulls-last +T *sym-nulls-last * +T +closed 8174b2ca587e87083950ab21a47b4b4fe4bf309a8e16a82d4dc26d2c471e28cc +T -sym-trunk * +U dan +Z 02a41ef53191d3d08ca3291791a40934 diff --git a/manifest.uuid b/manifest.uuid index 74af8f947f..3ff2df6757 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -636ca4472c9f41eb3989f28854d4968867837399a2092f389d1b814d98cccbae \ No newline at end of file +07babb0f897fc8c9cb5b30481899c32fdd743f3f3ca508d8d957826252107dd5 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 1c8ef33c9c..71c04299b6 100644 --- a/src/build.c +++ b/src/build.c @@ -1443,7 +1443,7 @@ void sqlite3AddPrimaryKey( pTab->keyConf = (u8)onError; assert( autoInc==0 || autoInc==1 ); pTab->tabFlags |= autoInc*TF_Autoincrement; - if( pList ) pParse->iPkSortOrder = pList->a[0].sortOrder; + if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; }else if( autoInc ){ #ifndef SQLITE_OMIT_AUTOINCREMENT sqlite3ErrorMsg(pParse, "AUTOINCREMENT is only allowed on an " @@ -1894,7 +1894,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); } - pList->a[0].sortOrder = pParse->iPkSortOrder; + pList->a[0].sortFlags = pParse->iPkSortOrder; assert( pParse->pNewTable==pTab ); pTab->iPKey = -1; sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, @@ -3368,7 +3368,7 @@ void sqlite3CreateIndex( sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); if( pList==0 ) goto exit_create_index; assert( pList->nExpr==1 ); - sqlite3ExprListSetSortOrder(pList, sortOrder); + sqlite3ExprListSetSortOrder(pList, sortOrder, 0); }else{ sqlite3ExprListCheckLength(pParse, pList, "index"); if( pParse->nErr ) goto exit_create_index; @@ -3486,7 +3486,7 @@ void sqlite3CreateIndex( goto exit_create_index; } pIndex->azColl[i] = zColl; - requestedSortOrder = pListItem->sortOrder & sortOrderMask; + requestedSortOrder = pListItem->sortFlags & sortOrderMask; pIndex->aSortOrder[i] = (u8)requestedSortOrder; } @@ -4704,7 +4704,8 @@ KeyInfo *sqlite3KeyInfoOfIndex(Parse *pParse, Index *pIdx){ const char *zColl = pIdx->azColl[i]; pKey->aColl[i] = zColl==sqlite3StrBINARY ? 0 : sqlite3LocateCollSeq(pParse, zColl); - pKey->aSortOrder[i] = pIdx->aSortOrder[i]; + pKey->aSortFlags[i] = pIdx->aSortOrder[i]; + assert( 0==(pKey->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) ); } if( pParse->nErr ){ assert( pParse->rc==SQLITE_ERROR_MISSING_COLLSEQ ); diff --git a/src/expr.c b/src/expr.c index e00b319ed2..4307c08daa 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1404,7 +1404,7 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ } pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); - pItem->sortOrder = pOldItem->sortOrder; + pItem->sortFlags = pOldItem->sortFlags; pItem->done = 0; pItem->bSpanIsTab = pOldItem->bSpanIsTab; pItem->bSorterRef = pOldItem->bSorterRef; @@ -1657,15 +1657,25 @@ vector_append_error: /* ** Set the sort order for the last element on the given ExprList. */ -void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder){ +void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ if( p==0 ) return; - assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC>=0 && SQLITE_SO_DESC>0 ); assert( p->nExpr>0 ); - if( iSortOrder<0 ){ - assert( p->a[p->nExpr-1].sortOrder==SQLITE_SO_ASC ); - return; + + assert( SQLITE_SO_UNDEFINED<0 && SQLITE_SO_ASC==0 && SQLITE_SO_DESC>0 ); + assert( iSortOrder==SQLITE_SO_UNDEFINED + || iSortOrder==SQLITE_SO_ASC + || iSortOrder==SQLITE_SO_DESC + ); + assert( eNulls==SQLITE_SO_UNDEFINED + || eNulls==SQLITE_SO_ASC + || eNulls==SQLITE_SO_DESC + ); + + if( iSortOrder==SQLITE_SO_UNDEFINED ) iSortOrder = SQLITE_SO_ASC; + p->a[p->nExpr-1].sortFlags = (u8)iSortOrder; + if( eNulls!=SQLITE_SO_UNDEFINED && iSortOrder!=eNulls ){ + p->a[p->nExpr-1].sortFlags |= KEYINFO_ORDER_BIGNULL; } - p->a[p->nExpr-1].sortOrder = (u8)iSortOrder; } /* @@ -4909,7 +4919,7 @@ int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ for(i=0; inExpr; i++){ Expr *pExprA = pA->a[i].pExpr; Expr *pExprB = pB->a[i].pExpr; - if( pA->a[i].sortOrder!=pB->a[i].sortOrder ) return 1; + if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; if( sqlite3ExprCompare(0, pExprA, pExprB, iTab) ) return 1; } return 0; diff --git a/src/parse.y b/src/parse.y index 648e79d9e3..a919c41175 100644 --- a/src/parse.y +++ b/src/parse.y @@ -211,6 +211,7 @@ columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);} IGNORE IMMEDIATE INITIALLY INSTEAD LIKE_KW MATCH NO PLAN QUERY KEY OF OFFSET PRAGMA RAISE RECURSIVE RELEASE REPLACE RESTRICT ROW ROWS ROLLBACK SAVEPOINT TEMP TRIGGER VACUUM VIEW VIRTUAL WITH WITHOUT + NULLS FIRST LAST %ifdef SQLITE_OMIT_COMPOUND_SELECT EXCEPT INTERSECT UNION %endif SQLITE_OMIT_COMPOUND_SELECT @@ -781,13 +782,13 @@ using_opt(U) ::= . {U = 0;} orderby_opt(A) ::= . {A = 0;} orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} -sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z). { +sortlist(A) ::= sortlist(A) COMMA expr(Y) sortorder(Z) nulls(X). { A = sqlite3ExprListAppend(pParse,A,Y); - sqlite3ExprListSetSortOrder(A,Z); + sqlite3ExprListSetSortOrder(A,Z,X); } -sortlist(A) ::= expr(Y) sortorder(Z). { +sortlist(A) ::= expr(Y) sortorder(Z) nulls(X). { A = sqlite3ExprListAppend(pParse,0,Y); /*A-overwrites-Y*/ - sqlite3ExprListSetSortOrder(A,Z); + sqlite3ExprListSetSortOrder(A,Z,X); } %type sortorder {int} @@ -796,6 +797,11 @@ sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} sortorder(A) ::= . {A = SQLITE_SO_UNDEFINED;} +%type nulls {int} +nulls(A) ::= NULLS FIRST. {A = SQLITE_SO_ASC;} +nulls(A) ::= NULLS LAST. {A = SQLITE_SO_DESC;} +nulls(A) ::= . {A = SQLITE_SO_UNDEFINED;} + %type groupby_opt {ExprList*} %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} groupby_opt(A) ::= . {A = 0;} diff --git a/src/select.c b/src/select.c index ca1256d160..db2667e2ab 100644 --- a/src/select.c +++ b/src/select.c @@ -664,7 +664,7 @@ static void pushOntoSorter( if( pParse->db->mallocFailed ) return; pOp->p2 = nKey + nData; pKI = pOp->p4.pKeyInfo; - memset(pKI->aSortOrder, 0, pKI->nKeyField); /* Makes OP_Jump testable */ + memset(pKI->aSortFlags, 0, pKI->nKeyField); /* Makes OP_Jump testable */ sqlite3VdbeChangeP4(v, -1, (char*)pKI, P4_KEYINFO); testcase( pKI->nAllField > pKI->nKeyField+2 ); pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat, @@ -1275,7 +1275,7 @@ KeyInfo *sqlite3KeyInfoAlloc(sqlite3 *db, int N, int X){ int nExtra = (N+X)*(sizeof(CollSeq*)+1) - sizeof(CollSeq*); KeyInfo *p = sqlite3DbMallocRawNN(db, sizeof(KeyInfo) + nExtra); if( p ){ - p->aSortOrder = (u8*)&p->aColl[N+X]; + p->aSortFlags = (u8*)&p->aColl[N+X]; p->nKeyField = (u16)N; p->nAllField = (u16)(N+X); p->enc = ENC(db); @@ -1352,7 +1352,7 @@ KeyInfo *sqlite3KeyInfoFromExprList( assert( sqlite3KeyInfoIsWriteable(pInfo) ); for(i=iStart, pItem=pList->a+iStart; iaColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); - pInfo->aSortOrder[i-iStart] = pItem->sortOrder; + pInfo->aSortFlags[i-iStart] = pItem->sortFlags; } } return pInfo; @@ -2253,7 +2253,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ } assert( sqlite3KeyInfoIsWriteable(pRet) ); pRet->aColl[i] = pColl; - pRet->aSortOrder[i] = pOrderBy->a[i].sortOrder; + pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags; } } @@ -3228,7 +3228,7 @@ static int multiSelectOrderBy( assert( sqlite3KeyInfoIsWriteable(pKeyDup) ); for(i=0; iaColl[i] = multiSelectCollSeq(pParse, p, i); - pKeyDup->aSortOrder[i] = 0; + pKeyDup->aSortFlags[i] = 0; } } } @@ -4425,7 +4425,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ } *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); assert( pOrderBy!=0 || db->mallocFailed ); - if( pOrderBy ) pOrderBy->a[0].sortOrder = sortOrder; + if( pOrderBy ) pOrderBy->a[0].sortFlags = sortOrder; return eRet; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1104b771f3..f036092bad 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2134,10 +2134,13 @@ struct KeyInfo { u16 nKeyField; /* Number of key columns in the index */ u16 nAllField; /* Total columns, including key plus others */ sqlite3 *db; /* The database connection */ - u8 *aSortOrder; /* Sort order for each column. */ + u8 *aSortFlags; /* Sort order for each column. */ CollSeq *aColl[1]; /* Collating sequence for each term of the key */ }; +#define KEYINFO_ORDER_DESC 0x01 +#define KEYINFO_ORDER_BIGNULL 0x02 + /* ** This object holds a record which has been parsed out into individual ** fields, for the purposes of doing a comparison. @@ -2597,7 +2600,7 @@ struct ExprList { Expr *pExpr; /* The parse tree for this expression */ char *zName; /* Token associated with this expression */ char *zSpan; /* Original text of the expression */ - u8 sortOrder; /* 1 for DESC or 0 for ASC */ + u8 sortFlags; /* 1 for DESC or 0 for ASC */ unsigned done :1; /* A flag to indicate when processing is finished */ unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */ unsigned reusable :1; /* Constant expression is reusable */ @@ -3881,7 +3884,7 @@ void sqlite3ExprDelete(sqlite3*, Expr*); void sqlite3ExprUnmapAndDelete(Parse*, Expr*); ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); -void sqlite3ExprListSetSortOrder(ExprList*,int); +void sqlite3ExprListSetSortOrder(ExprList*,int,int); void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); void sqlite3ExprListDelete(sqlite3*, ExprList*); diff --git a/src/vdbe.c b/src/vdbe.c index 0bba39a667..de9c24bef7 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2227,9 +2227,14 @@ case OP_Compare: { REGISTER_TRACE(p2+idx, &aMem[p2+idx]); assert( inKeyField ); pColl = pKeyInfo->aColl[i]; - bRev = pKeyInfo->aSortOrder[i]; + bRev = (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC); iCompare = sqlite3MemCompare(&aMem[p1+idx], &aMem[p2+idx], pColl); if( iCompare ){ + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + && ((aMem[p1+idx].flags & MEM_Null) || (aMem[p2+idx].flags & MEM_Null)) + ){ + iCompare = -iCompare; + } if( bRev ) iCompare = -iCompare; break; } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 2e9fcc1250..6b1f34fb71 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1493,14 +1493,16 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ case P4_KEYINFO: { int j; KeyInfo *pKeyInfo = pOp->p4.pKeyInfo; - assert( pKeyInfo->aSortOrder!=0 ); + assert( pKeyInfo->aSortFlags!=0 ); sqlite3_str_appendf(&x, "k(%d", pKeyInfo->nKeyField); for(j=0; jnKeyField; j++){ CollSeq *pColl = pKeyInfo->aColl[j]; const char *zColl = pColl ? pColl->zName : ""; if( strcmp(zColl, "BINARY")==0 ) zColl = "B"; - sqlite3_str_appendf(&x, ",%s%s", - pKeyInfo->aSortOrder[j] ? "-" : "", zColl); + sqlite3_str_appendf(&x, ",%s%s%s", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_DESC) ? "-" : "", + (pKeyInfo->aSortFlags[j] & KEYINFO_ORDER_BIGNULL)? "N." : "", + zColl); } sqlite3_str_append(&x, ")", 1); break; @@ -3813,7 +3815,7 @@ UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); if( !p ) return 0; p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; - assert( pKeyInfo->aSortOrder!=0 ); + assert( pKeyInfo->aSortFlags!=0 ); p->pKeyInfo = pKeyInfo; p->nField = pKeyInfo->nKeyField + 1; return p; @@ -3912,7 +3914,7 @@ static int vdbeRecordCompareDebug( if( szHdr1>98307 ) return SQLITE_CORRUPT; d1 = szHdr1; assert( pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); - assert( pKeyInfo->aSortOrder!=0 ); + assert( pKeyInfo->aSortFlags!=0 ); assert( pKeyInfo->nKeyField>0 ); assert( idx1<=szHdr1 || CORRUPT_DB ); do{ @@ -3943,7 +3945,12 @@ static int vdbeRecordCompareDebug( pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); if( rc!=0 ){ assert( mem1.szMalloc==0 ); /* See comment below */ - if( pKeyInfo->aSortOrder[i] ){ + if( (pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_BIGNULL) + && ((mem1.flags & MEM_Null) || (pPKey2->aMem[i].flags & MEM_Null)) + ){ + rc = -rc; + } + if( pKeyInfo->aSortFlags[i] & KEYINFO_ORDER_DESC ){ rc = -rc; /* Invert the result for DESC sort order. */ } goto debugCompareEnd; @@ -4319,7 +4326,7 @@ int sqlite3VdbeRecordCompareWithSkip( VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField || CORRUPT_DB ); - assert( pPKey2->pKeyInfo->aSortOrder!=0 ); + assert( pPKey2->pKeyInfo->aSortFlags!=0 ); assert( pPKey2->pKeyInfo->nKeyField>0 ); assert( idx1<=szHdr1 || CORRUPT_DB ); do{ @@ -4442,8 +4449,14 @@ int sqlite3VdbeRecordCompareWithSkip( } if( rc!=0 ){ - if( pPKey2->pKeyInfo->aSortOrder[i] ){ - rc = -rc; + int sortFlags = pPKey2->pKeyInfo->aSortFlags[i]; + if( sortFlags ){ + if( (sortFlags & KEYINFO_ORDER_BIGNULL)==0 + || ((sortFlags & KEYINFO_ORDER_DESC) + !=(serial_type==0 || (pRhs->flags&MEM_Null))) + ){ + rc = -rc; + } } assert( vdbeRecordCompareDebug(nKey1, pKey1, pPKey2, rc) ); assert( mem1.szMalloc==0 ); /* See comment below */ @@ -4660,7 +4673,10 @@ RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ ** header size is (12*5 + 1 + 1) bytes. */ if( p->pKeyInfo->nAllField<=13 ){ int flags = p->aMem[0].flags; - if( p->pKeyInfo->aSortOrder[0] ){ + if( p->pKeyInfo->aSortFlags[0] ){ + if( p->pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL ){ + return sqlite3VdbeRecordCompare; + } p->r1 = 1; p->r2 = -1; }else{ diff --git a/src/vdbesort.c b/src/vdbesort.c index 05590da7ee..7d60ee5116 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -829,7 +829,8 @@ static int vdbeSorterCompareText( ); } }else{ - if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); + if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ res = res * -1; } } @@ -897,7 +898,8 @@ static int vdbeSorterCompareInt( pTask, pbKey2Cached, pKey1, nKey1, pKey2, nKey2 ); } - }else if( pTask->pSorter->pKeyInfo->aSortOrder[0] ){ + }else if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ + assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); res = res * -1; } @@ -1012,6 +1014,7 @@ int sqlite3VdbeSorterInit( if( pKeyInfo->nAllField<13 && (pKeyInfo->aColl[0]==0 || pKeyInfo->aColl[0]==db->pDfltColl) + && (pKeyInfo->aSortFlags[0] & KEYINFO_ORDER_BIGNULL)==0 ){ pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; } diff --git a/src/where.c b/src/where.c index 65c92863a5..202db50bfc 100644 --- a/src/where.c +++ b/src/where.c @@ -1031,7 +1031,7 @@ static sqlite3_index_info *allocateIndexInfo( for(i=0; ia[i].pExpr; pIdxOrderBy[i].iColumn = pExpr->iColumn; - pIdxOrderBy[i].desc = pOrderBy->a[i].sortOrder; + pIdxOrderBy[i].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; } *pmNoOmit = mNoOmit; @@ -3836,6 +3836,7 @@ static i8 wherePathSatisfiesOrderBy( continue; } } + if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) continue; if( iColumn!=XN_ROWID ){ pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; @@ -3849,10 +3850,11 @@ static i8 wherePathSatisfiesOrderBy( if( isMatch && (wctrlFlags & WHERE_GROUPBY)==0 ){ /* Make sure the sort order is compatible in an ORDER BY clause. ** Sort order is irrelevant for a GROUP BY clause. */ + assert( (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL)==0 ); if( revSet ){ - if( (rev ^ revIdx)!=pOrderBy->a[i].sortOrder ) isMatch = 0; + if( (rev ^ revIdx)!=pOrderBy->a[i].sortFlags ) isMatch = 0; }else{ - rev = revIdx ^ pOrderBy->a[i].sortOrder; + rev = revIdx ^ pOrderBy->a[i].sortFlags; if( rev ) *pRevMask |= MASKBIT(iLoop); revSet = 1; } diff --git a/src/window.c b/src/window.c index ebcb576bb5..287bb114cc 100644 --- a/src/window.c +++ b/src/window.c @@ -888,7 +888,7 @@ static ExprList *exprListAppendList( pDup->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); } pList = sqlite3ExprListAppend(pParse, pList, pDup); - if( pList ) pList->a[nInit+i].sortOrder = pAppend->a[i].sortOrder; + if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; } } return pList; @@ -1296,8 +1296,8 @@ void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ pWin->regApp = pParse->nMem+1; pParse->nMem += 3; if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){ - assert( pKeyInfo->aSortOrder[0]==0 ); - pKeyInfo->aSortOrder[0] = 1; + assert( pKeyInfo->aSortFlags[0]==0 ); + pKeyInfo->aSortFlags[0] = KEYINFO_ORDER_DESC; } sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pWin->csrApp, 2); sqlite3VdbeAppendP4(v, pKeyInfo, P4_KEYINFO); @@ -1860,7 +1860,7 @@ static void windowCodeRangeTest( assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); assert( p->pMWin->pOrderBy && p->pMWin->pOrderBy->nExpr==1 ); - if( p->pMWin->pOrderBy->a[0].sortOrder ){ + if( p->pMWin->pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ switch( op ){ case OP_Ge: op = OP_Le; break; case OP_Gt: op = OP_Lt; break; diff --git a/test/nulls1.test b/test/nulls1.test new file mode 100644 index 0000000000..7b355e9a85 --- /dev/null +++ b/test/nulls1.test @@ -0,0 +1,53 @@ +# 2019 August 10 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +#################################################### +# DO NOT EDIT! THIS FILE IS AUTOMATICALLY GENERATED! +#################################################### + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix nulls1 + +do_execsql_test 1.0 { + DROP TABLE IF EXISTS t3; + CREATE TABLE t3(a INTEGER); + INSERT INTO t3 VALUES(NULL), (10), (30), (20), (NULL); +} {} + +for {set a 0} {$a < 2} {incr a} { + foreach {tn limit} { + 1 "" + 2 "LIMIT 10" + } { + do_execsql_test 1.$a.$tn.1 " + SELECT a FROM t3 ORDER BY a nULLS FIRST $limit + " {{} {} 10 20 30} + + do_execsql_test 1.$a.$tn.2 " + SELECT a FROM t3 ORDER BY a nULLS LAST $limit + " {10 20 30 {} {}} + + do_execsql_test 1.$a.$tn.3 " + SELECT a FROM t3 ORDER BY a DESC nULLS FIRST $limit + " {{} {} 30 20 10} + + do_execsql_test 1.$a.$tn.4 " + SELECT a FROM t3 ORDER BY a DESC nULLS LAST $limit + " {30 20 10 {} {}} + } + + catchsql { CREATE INDEX i1 ON t3(a) } +} + +finish_test diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index ece8b63e19..77bc4ac5c0 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -210,6 +210,7 @@ static Keyword aKeywordTable[] = { { "EXPLAIN", "TK_EXPLAIN", EXPLAIN }, { "FAIL", "TK_FAIL", CONFLICT|TRIGGER }, { "FILTER", "TK_FILTER", WINDOWFUNC }, + { "FIRST", "TK_FIRST", ALWAYS }, { "FOLLOWING", "TK_FOLLOWING", WINDOWFUNC }, { "FOR", "TK_FOR", TRIGGER }, { "FOREIGN", "TK_FOREIGN", FKEY }, @@ -235,6 +236,7 @@ static Keyword aKeywordTable[] = { { "ISNULL", "TK_ISNULL", ALWAYS }, { "JOIN", "TK_JOIN", ALWAYS }, { "KEY", "TK_KEY", ALWAYS }, + { "LAST", "TK_LAST", ALWAYS }, { "LEFT", "TK_JOIN_KW", ALWAYS }, { "LIKE", "TK_LIKE_KW", ALWAYS }, { "LIMIT", "TK_LIMIT", ALWAYS }, @@ -245,6 +247,7 @@ static Keyword aKeywordTable[] = { { "NOTHING", "TK_NOTHING", UPSERT }, { "NOTNULL", "TK_NOTNULL", ALWAYS }, { "NULL", "TK_NULL", ALWAYS }, + { "NULLS", "TK_NULLS", ALWAYS }, { "OF", "TK_OF", ALWAYS }, { "OFFSET", "TK_OFFSET", ALWAYS }, { "ON", "TK_ON", ALWAYS }, From 554a19dbeef3c45d5f52c540a79920403c54170a Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 12 Aug 2019 18:26:46 +0000 Subject: [PATCH 109/221] Make sure the btree cursor overflow cache is cleared when overwriting a cell in sqlite3BtreeInsert(). Ticket [3cf9bb227e9a5d32] FossilOrigin-Name: 7dae7b969ed314605a3a2da2cfdce4d81152740f5d3bfbc2a6e311b13ee325a7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 ++ test/insert.test | 16 ++++++++++++++++ 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 89ec0e6944..138066f7d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sthe\s".testctrl\sprng_seed"\scommand\sin\sthe\sCLI,\sif\sthe\sargument\sis\s"random"\nthen\sselect\sa\srandom\sinteger\sseed\sand\sprint\sthe\sseed\svalue\son\sstdout. -D 2019-08-12T16:25:11.731 +C Make\ssure\sthe\sbtree\scursor\soverflow\scache\sis\scleared\swhen\soverwriting\na\scell\sin\ssqlite3BtreeInsert().\s\sTicket\s[3cf9bb227e9a5d32] +D 2019-08-12T18:26:46.324 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -464,7 +464,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 781e4594098dca97db672e52ed17c7f063b5b65db144c0c1bf1e9818e7be1ad4 +F src/btree.c 6061323b98cc794a1e3ad6907f683f1ad2b8c48d7c7d486072b21f18efe73761 F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 7fb6ad35d162517d6bfa196f4fb2a1d7c3a362531e84c59f3a0479e0de511556 @@ -1056,7 +1056,7 @@ F test/indexexpr1.test 0f293369ed6f56764cfc3db05685d45469d9e685ba87e3698527049ba F test/indexexpr2.test d319e7d1b1043403f39a20c892d512e02b5549c6004806b977030f2430c60208 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 +F test/insert.test 72004f6a900a25bd3f1ce9a72e73d02749644666a8ce6d6d2dba061137e5aa63 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test 7802ada6ba8738661b9f6c0e26858d3375b40cc7180289fd350644cd7a08fec9 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 48d9b48ab4ace234eb1a055cf33cb533a1c3aa82d0a6e086d96226bd9474ceca -R 5a141faa1c39cc955778f126f1aabd0f +P 636ca4472c9f41eb3989f28854d4968867837399a2092f389d1b814d98cccbae +R 35de1073023e10ac023f683a008bdac4 U drh -Z 779c2cf81842090ecdd5432af318ddb5 +Z 4e3a468c24aea8e9967dfc838bb1156b diff --git a/manifest.uuid b/manifest.uuid index 74af8f947f..187033b4b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -636ca4472c9f41eb3989f28854d4968867837399a2092f389d1b814d98cccbae \ No newline at end of file +7dae7b969ed314605a3a2da2cfdce4d81152740f5d3bfbc2a6e311b13ee325a7 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 30cd0d128c..932ce04359 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8716,6 +8716,8 @@ int sqlite3BtreeInsert( memcpy(newCell, oldCell, 4); } rc = clearCell(pPage, oldCell, &info); + testcase( pCur->curFlags & BTCF_ValidOvfl ); + invalidateOverflowCache(pCur); if( info.nSize==szNew && info.nLocal==info.nPayload && (!ISAUTOVACUUM || szNewminLocal) ){ diff --git a/test/insert.test b/test/insert.test index 01c7016d84..397a0e6ff9 100644 --- a/test/insert.test +++ b/test/insert.test @@ -460,4 +460,20 @@ do_execsql_test insert-14.1 { integrity_check insert-99.0 +# 2019-08-12. +# +do_execsql_test insert-15.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); + CREATE INDEX i1 ON t1(b); + CREATE TABLE t2(a, b); + INSERT INTO t2 VALUES(4, randomblob(31000)); + INSERT INTO t2 VALUES(4, randomblob(32000)); + INSERT INTO t2 VALUES(4, randomblob(33000)); + REPLACE INTO t1 SELECT a, b FROM t2; + SELECT a, length(b) FROM t1; +} {4 33000} + + finish_test From b8a8d523cbfa1371e35a4e5d1fc4727128e74ead Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 13 Aug 2019 15:11:25 +0000 Subject: [PATCH 110/221] Fix a problem with RBU function sqlite3rbu_bp_progress() when used during an RBU vacuum. FossilOrigin-Name: 8c44b02f1479cec61554800702a3c1d806e4ee64b41ba2af17320f62794a02fe --- ext/rbu/rbuprogress.test | 32 ++++++++++++++++++++++++++++++++ ext/rbu/sqlite3rbu.c | 9 +++++---- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 46 insertions(+), 13 deletions(-) diff --git a/ext/rbu/rbuprogress.test b/ext/rbu/rbuprogress.test index db479e32e5..bf37b4e505 100644 --- a/ext/rbu/rbuprogress.test +++ b/ext/rbu/rbuprogress.test @@ -414,5 +414,37 @@ foreach {bReopen} { 0 1 } { } } +#------------------------------------------------------------------------- +# Test that sqlite3_bp_progress() works with an RBU vacuum if there +# is an rbu_count table in the db being vacuumed. +# +reset_db +do_execsql_test 6.0 { + CREATE TABLE t1(a, b, c); + CREATE INDEX i1 ON t1(a); + CREATE INDEX i2 ON t1(b); + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 + ) + INSERT INTO t1 SELECT i, i, i FROM s; + CREATE TABLE rbu_count(tbl TEXT PRIMARY KEY, cnt INTEGER) WITHOUT ROWID; + INSERT INTO rbu_count VALUES('t1', (SELECT count(*) FROM t1)); + INSERT INTO rbu_count VALUES('rbu_count', 2); +} + +forcedelete state.db +do_test 6.1 { + set maxA 0 + set maxB 0 + sqlite3rbu_vacuum rbu test.db state.db + while {[rbu step]=="SQLITE_OK"} { + foreach {a b} [rbu bp_progress] { + if {$a > $maxA} { set maxA $a } + if {$b > $maxB} { set maxB $b } + } + } + list [rbu close] $maxA $maxB +} {SQLITE_DONE 10000 10000} + finish_test diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index 7409618499..5c2ae95453 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -944,8 +944,8 @@ static void rbuTargetNameFunc( zIn = (const char*)sqlite3_value_text(argv[0]); if( zIn ){ if( rbuIsVacuum(p) ){ - assert( argc==2 ); - if( 0==sqlite3_value_int(argv[1]) ){ + assert( argc==2 || argc==1 ); + if( argc==1 || 0==sqlite3_value_int(argv[1]) ){ sqlite3_result_text(pCtx, zIn, -1, SQLITE_STATIC); } }else{ @@ -3860,10 +3860,11 @@ static void rbuIndexCntFunc( sqlite3_stmt *pStmt = 0; char *zErrmsg = 0; int rc; + sqlite3 *db = (rbuIsVacuum(p) ? p->dbRbu : p->dbMain); assert( nVal==1 ); - rc = prepareFreeAndCollectError(p->dbMain, &pStmt, &zErrmsg, + rc = prepareFreeAndCollectError(db, &pStmt, &zErrmsg, sqlite3_mprintf("SELECT count(*) FROM sqlite_master " "WHERE type='index' AND tbl_name = %Q", sqlite3_value_text(apVal[0])) ); @@ -3878,7 +3879,7 @@ static void rbuIndexCntFunc( if( rc==SQLITE_OK ){ sqlite3_result_int(pCtx, nIndex); }else{ - sqlite3_result_error(pCtx, sqlite3_errmsg(p->dbMain), -1); + sqlite3_result_error(pCtx, sqlite3_errmsg(db), -1); } } diff --git a/manifest b/manifest index 138066f7d7..349b4244e6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\sbtree\scursor\soverflow\scache\sis\scleared\swhen\soverwriting\na\scell\sin\ssqlite3BtreeInsert().\s\sTicket\s[3cf9bb227e9a5d32] -D 2019-08-12T18:26:46.324 +C Fix\sa\sproblem\swith\sRBU\sfunction\ssqlite3rbu_bp_progress()\swhen\sused\sduring\san\sRBU\svacuum. +D 2019-08-13T15:11:25.734 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -354,7 +354,7 @@ F ext/rbu/rbufts.test 0ae8d1da191c75bd776b86e24456db0fb6e97b7c944259fae5407ea55d F ext/rbu/rbumisc.test 329986cf5dd51890c4eb906c2f960ebb773a79a64bed90f506b7c417825b37eb F ext/rbu/rbumulti.test 5fb139058f37ddc5a113c5b93238de915b769b7792de41b44c983bc7c18cf5b9 F ext/rbu/rbupartial.test f25df014b8dbe3c5345851fba6e66f79ab237f57dc201b2d5f0dbae658ae5a4c -F ext/rbu/rbuprogress.test 04614ff8820bab9c1ec1b7dbec1edc4b45474421d4fe7abbd2a879a9c02884f9 +F ext/rbu/rbuprogress.test 857cf1f8166c83ef977edb9ef4fc42d80f71fbd798652b46ae2f3a7031870f8d F ext/rbu/rburesume.test dbdc4ca504e9c76375a69e5f0d91205db967dcc509a5166ca80231f8fda49eb1 F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d1cdd926 F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f407051e8 @@ -363,7 +363,7 @@ F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c 4261ba8d5dc1c4aa1c9cf4c8c60f8ba4df3780d1516720771d2bbc292892e11b +F ext/rbu/sqlite3rbu.c f3a3e09f575157052813be667d6ab3b54f47fb02e6e1c9f767ad7bb8f1fb90b3 F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 636ca4472c9f41eb3989f28854d4968867837399a2092f389d1b814d98cccbae -R 35de1073023e10ac023f683a008bdac4 -U drh -Z 4e3a468c24aea8e9967dfc838bb1156b +P 7dae7b969ed314605a3a2da2cfdce4d81152740f5d3bfbc2a6e311b13ee325a7 +R 860238736fdd0447f200637ad8b8114e +U dan +Z 5966eddfdd5804ca0c3aea69442d9a4f diff --git a/manifest.uuid b/manifest.uuid index 187033b4b5..da1d8fd8e3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7dae7b969ed314605a3a2da2cfdce4d81152740f5d3bfbc2a6e311b13ee325a7 \ No newline at end of file +8c44b02f1479cec61554800702a3c1d806e4ee64b41ba2af17320f62794a02fe \ No newline at end of file From 3c1970fceeecef6da620c37cdd0755f31af646a7 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 13 Aug 2019 17:27:43 +0000 Subject: [PATCH 111/221] Update some corruption test cases to take [724f4df9c] into account. FossilOrigin-Name: 927cd7b4c52fae665e57fb6039c6829e339cff5ad5c405800cac3ee149ef5be1 --- ext/rtree/rtreefuzz001.test | 2 ++ manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3corrupt4.test | 13 ++++++++++++- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/ext/rtree/rtreefuzz001.test b/ext/rtree/rtreefuzz001.test index f4a91264c7..db9df205af 100644 --- a/ext/rtree/rtreefuzz001.test +++ b/ext/rtree/rtreefuzz001.test @@ -465,6 +465,7 @@ do_test rtreefuzz001-100 { | end c1b.db }] catchsql { + PRAGMA writable_schema = 1; SELECT rtreecheck('t1'); } } {1 {SQL logic error}} @@ -1040,6 +1041,7 @@ do_test rtreefuzz001-500 { | 2880: ff ff ff 06 00 00 00 0c 00 00 00 01 00 00 00 0b ................ | 2896: 00 00 00 00 00 00 00 02 40 00 00 00 00 00 00 00 ........@....... | end crash-2e81f5dce5cbd4.db}] + execsql { PRAGMA writable_schema = 1;} catchsql {UPDATE t1 SET ex= ex ISNULL} } {1 {database disk image is malformed}} diff --git a/manifest b/manifest index 349b4244e6..6acb6a9831 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sRBU\sfunction\ssqlite3rbu_bp_progress()\swhen\sused\sduring\san\sRBU\svacuum. -D 2019-08-13T15:11:25.734 +C Update\ssome\scorruption\stest\scases\sto\stake\s[724f4df9c]\sinto\saccount. +D 2019-08-13T17:27:43.409 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -401,7 +401,7 @@ F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b5879 F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreefuzz001.test f9fecd174fc6475174d876f78f77b538122c1db296a96dca4615918953a892be +F ext/rtree/rtreefuzz001.test eef1ed593bb15886cd5d5367a2f2492f81e315848896cdf7afb6e21454978827 F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff @@ -935,7 +935,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 9c21ef823a72b0b4a09428d78e63a44c961c19b0821682f4e99cdfe147ac105b +F test/fts3corrupt4.test d5389e14950e57333bfc972f262c90b5ba0e864a958df9e437e3aacd3a5570a7 F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7dae7b969ed314605a3a2da2cfdce4d81152740f5d3bfbc2a6e311b13ee325a7 -R 860238736fdd0447f200637ad8b8114e +P 8c44b02f1479cec61554800702a3c1d806e4ee64b41ba2af17320f62794a02fe +R 7c1844eb7914622ca55e2a5e5ecac9a6 U dan -Z 5966eddfdd5804ca0c3aea69442d9a4f +Z 44af29e1f24cdb5aeb5d48277738f602 diff --git a/manifest.uuid b/manifest.uuid index da1d8fd8e3..dcd9c2344a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c44b02f1479cec61554800702a3c1d806e4ee64b41ba2af17320f62794a02fe \ No newline at end of file +927cd7b4c52fae665e57fb6039c6829e339cff5ad5c405800cac3ee149ef5be1 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index fdcfa969f2..d693702bf5 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -2147,6 +2147,7 @@ do_test 14.0 { }]} {} do_execsql_test 14.1 { + PRAGMA writable_schema = 1; WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) INSERT INTO t1(a) SELECT randomblob(3000) FROM c; } @@ -3049,6 +3050,7 @@ do_test 19.0 { }]} {} do_catchsql_test 19.1 { + PRAGMA writable_schema = 1; SELECT rowid,a,c,snippet(t1,85101090932165,-1,10) FROM t1 WHERE a MATCH 'rtree'; } {1 {database disk image is malformed}} @@ -3250,6 +3252,7 @@ do_test 20.0 { }]} {} do_execsql_test 20.1 { + PRAGMA writable_schema = 1; BEGIN; WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) INSERT INTO t1(a) SELECT randomblob(3000) FROM c; @@ -3472,8 +3475,8 @@ do_test 21.0 { | end crash-18cc014e42e828.db }]} {} -breakpoint do_catchsql_test 21.1 { + PRAGMA writable_schema = 1; SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'R*'; } {1 {database disk image is malformed}} @@ -3694,6 +3697,7 @@ do_test 22.0 { }]} {} do_catchsql_test 22.1 { + PRAGMA writable_schema = 1; SELECT snippet(t1,'', '', '--',-1,01)==0 FROM t1 WHERE a MATCH 'rtree OR json1rtree OR json1'; } {0 {0 0 0 0 0 0 0}} @@ -3913,6 +3917,7 @@ do_test 23.0 { }]} {} do_catchsql_test 23.1 { + PRAGMA writable_schema = 1; SELECT 'FyzLy'FROM t1 WHERE t1 MATCH 'j'; } {1 {database disk image is malformed}} @@ -4131,6 +4136,7 @@ do_test 24.0 { }]} {} do_catchsql_test 24.1 { + PRAGMA writable_schema = 1; WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT '4hE'+x FROM c WHERE x<72) INSERT INTO t1(a) SELECT randomblob(2829) FROM c; } {0 {}} @@ -4374,6 +4380,7 @@ do_test 25.0 { }]} {} do_catchsql_test 25.1 { + PRAGMA writable_schema = 1; WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x%1 FROM c WHERE x<599237) INSERT INTO t1( a ) SELECT randomblob(3000) FROM t2 ; } {0 {}} @@ -4608,6 +4615,7 @@ do_test 26.0 { }]} {} do_execsql_test 26.1 { + PRAGMA writable_schema = 1; SELECT count(*) FROM ( SELECT t1, (t1) FROM t1 WHERE b MATCH 'x' ) @@ -4826,6 +4834,7 @@ do_test 27.0 { }]} {} do_catchsql_test 27.2 { + PRAGMA writable_schema = 1; WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x GLOB 2.16770 FROM x) INSERT INTO t1(a) SELECT randomblob(3000) FROM t2 ; } {0 {}} @@ -5058,6 +5067,7 @@ do_test 28.0 { }]} {} do_catchsql_test 28.1 { + PRAGMA writable_schema = 1; WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT 3+x FROM c WHERE x<72) INSERT INTO t1(a) SELECT randomblob(2829) FROM c; } {0 {}} @@ -5312,6 +5322,7 @@ do_test 29.0 { }]} {} do_catchsql_test 29.1 { + PRAGMA writable_schema = 1; INSERT INTO t1(a) SELECT X'819192E578DE3F'; UPDATE t1 SET b=quote(zeroblob(current_date)) WHERE t1 MATCH 't*'; INSERT INTO t1(b) VALUES(x'78'); From 7c2321fdf38986cbf72e656aad204c2b10f5067d Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 13 Aug 2019 17:56:56 +0000 Subject: [PATCH 112/221] Update test cases so that they work with ICU enabled. FossilOrigin-Name: 408144a1832569ced8e04840f0dd36a3867405f36b13631b0f13c0f7b8a0fb01 --- manifest | 14 ++++++------ manifest.uuid | 2 +- test/vtab1.test | 40 +++++++++++++++++---------------- test/vtabH.test | 60 +++++++++++++++++++++++++------------------------ 4 files changed, 60 insertions(+), 56 deletions(-) diff --git a/manifest b/manifest index 6acb6a9831..494df1beb8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\ssome\scorruption\stest\scases\sto\stake\s[724f4df9c]\sinto\saccount. -D 2019-08-13T17:27:43.409 +C Update\stest\scases\sso\sthat\sthey\swork\swith\sICU\senabled. +D 2019-08-13T17:56:56.995 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1611,7 +1611,7 @@ F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 F test/view.test c1e64ff5a860fdbb7b52add0996af2ee1af563ddf2e86b964d15d04d81a001be -F test/vtab1.test fa6baded08fdadd6f416a9c54956c049ae327b9bdd05d25bf8163f65e65e849c +F test/vtab1.test efb4c4a45146193d6d55fb85f7162febd6423f29c72ede09bb96383f49e3abc1 F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 @@ -1626,7 +1626,7 @@ F test/vtabC.test 4528f459a13136f982e75614d120aef165f17292 F test/vtabD.test 05b3f1d77117271671089e48719524b676842e96 F test/vtabE.test 2a143fe75a11275781d1fd1988d86b66a3f69cb98f4add62e3da8fd0f637b45f F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b -F test/vtabH.test e65540eed0f7434cdf0b160374570b51f3e3179548f0fa5e99b1d33f8dcdf9a0 +F test/vtabH.test 2efb5a24b0bb50796b21eca23032cfb77abfa4b0c03938e38ce5897abac404ca F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca6757f F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8c44b02f1479cec61554800702a3c1d806e4ee64b41ba2af17320f62794a02fe -R 7c1844eb7914622ca55e2a5e5ecac9a6 +P 927cd7b4c52fae665e57fb6039c6829e339cff5ad5c405800cac3ee149ef5be1 +R c967e09641613ccf8efee454c9ec6fe8 U dan -Z 44af29e1f24cdb5aeb5d48277738f602 +Z 9b0309a4ce7be165e70467c33152a3d5 diff --git a/manifest.uuid b/manifest.uuid index dcd9c2344a..8829389704 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -927cd7b4c52fae665e57fb6039c6829e339cff5ad5c405800cac3ee149ef5be1 \ No newline at end of file +408144a1832569ced8e04840f0dd36a3867405f36b13631b0f13c0f7b8a0fb01 \ No newline at end of file diff --git a/test/vtab1.test b/test/vtab1.test index fd7c1fd41d..0a45c4e2d9 100644 --- a/test/vtab1.test +++ b/test/vtab1.test @@ -1311,25 +1311,27 @@ do_execsql_test 18.1.0 { CREATE VIRTUAL TABLE e6 USING echo(t6); } -foreach {tn sql res filter} { - 1.1 "SELECT a FROM e6 WHERE b>'8James'" {4 2 6 1 5} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b > ?} 8James} - - 1.2 "SELECT a FROM e6 WHERE b>='8' AND b<'9'" {3 4} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ?} 8 9} - - 1.3 "SELECT a FROM e6 WHERE b LIKE '8J%'" {3 4} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8J%} - - 1.4 "SELECT a FROM e6 WHERE b LIKE '8j%'" {3 4} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8j%} - - 1.5 "SELECT a FROM e6 WHERE b LIKE '8%'" {3 4} - {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8%} -} { - set echo_module {} - do_execsql_test 18.$tn.1 $sql $res - do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter +ifcapable !icu { + foreach {tn sql res filter} { + 1.1 "SELECT a FROM e6 WHERE b>'8James'" {4 2 6 1 5} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b > ?} 8James} + + 1.2 "SELECT a FROM e6 WHERE b>='8' AND b<'9'" {3 4} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ?} 8 9} + + 1.3 "SELECT a FROM e6 WHERE b LIKE '8J%'" {3 4} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8J%} + + 1.4 "SELECT a FROM e6 WHERE b LIKE '8j%'" {3 4} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8j%} + + 1.5 "SELECT a FROM e6 WHERE b LIKE '8%'" {3 4} + {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8%} + } { + set echo_module {} + do_execsql_test 18.$tn.1 $sql $res + do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter + } } do_execsql_test 18.2.0 { PRAGMA case_sensitive_like = ON } diff --git a/test/vtabH.test b/test/vtabH.test index 78b156cb63..f1a0466554 100644 --- a/test/vtabH.test +++ b/test/vtabH.test @@ -30,36 +30,38 @@ do_execsql_test 1.0 { CREATE VIRTUAL TABLE e6 USING echo(t6); } -foreach {tn sql expect} { - 1 "SELECT * FROM e6 WHERE b LIKE '8abc'" { - xBestIndex - {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} - xFilter - {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} - 8ABC 8abd 8abc +ifcapable !icu { + foreach {tn sql expect} { + 1 "SELECT * FROM e6 WHERE b LIKE '8abc'" { + xBestIndex + {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} + xFilter + {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} + 8ABC 8abd 8abc + } + + 2 "SELECT * FROM e6 WHERE b GLOB '8abc'" { + xBestIndex + {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?} + xFilter + {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?} + 8abc 8abd 8abc + } + 3 "SELECT * FROM e6 WHERE b LIKE '8e/'" { + xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?} + xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8e/ + } + 4 "SELECT * FROM e6 WHERE b GLOB '8e/'" { + xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b glob ?} + xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 8e/ + } + } { + do_test 1.$tn { + set echo_module {} + execsql $sql + set ::echo_module + } [list {*}$expect] } - - 2 "SELECT * FROM e6 WHERE b GLOB '8abc'" { - xBestIndex - {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?} - xFilter - {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?} - 8abc 8abd 8abc - } - 3 "SELECT * FROM e6 WHERE b LIKE '8e/'" { - xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?} - xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8e/ - } - 4 "SELECT * FROM e6 WHERE b GLOB '8e/'" { - xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b glob ?} - xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 8e/ - } -} { - do_test 1.$tn { - set echo_module {} - execsql $sql - set ::echo_module - } [list {*}$expect] } From 87ae34ba1ab96e0e6811c0c49324d562bbb9e6a0 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 13 Aug 2019 20:34:35 +0000 Subject: [PATCH 113/221] Add some static to the 'regexp' extension. FossilOrigin-Name: a21d1dde73f811244b5b43f9fed5877263a9c5061470221f417e501f5530edfa --- ext/misc/regexp.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index bd82aa5d10..3359109ab3 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -610,7 +610,7 @@ static const char *re_subcompile_string(ReCompiled *p){ ** regular expression. Applications should invoke this routine once ** for every call to re_compile() to avoid memory leaks. */ -void re_free(ReCompiled *pRe){ +static void re_free(ReCompiled *pRe){ if( pRe ){ sqlite3_free(pRe->aOp); sqlite3_free(pRe->aArg); @@ -624,7 +624,7 @@ void re_free(ReCompiled *pRe){ ** compiled regular expression in *ppRe. Return NULL on success or an ** error message if something goes wrong. */ -const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){ +static const char *re_compile(ReCompiled **ppRe, const char *zIn, int noCase){ ReCompiled *pRe; const char *zErr; int i, j; diff --git a/manifest b/manifest index 494df1beb8..4183e3a60b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\stest\scases\sso\sthat\sthey\swork\swith\sICU\senabled. -D 2019-08-13T17:56:56.995 +C Add\ssome\sstatic\sto\sthe\s'regexp'\sextension. +D 2019-08-13T20:34:35.045 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -302,7 +302,7 @@ F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c9203 F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c F ext/misc/percentile.c 148dd07286b16e50f232bb638a47850085ad37d51f270429905bd865e595d1ca F ext/misc/prefixes.c 7be86d17525cfae6ed462fc3c519efc44488ac329890f77491c8f82871f57e17 -F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 +F ext/misc/regexp.c 653b6ab5e89bcb5d45f9ebe0747d7f8f3f5706cac963fcbc9a3ddbe5fdc1efa2 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 927cd7b4c52fae665e57fb6039c6829e339cff5ad5c405800cac3ee149ef5be1 -R c967e09641613ccf8efee454c9ec6fe8 -U dan -Z 9b0309a4ce7be165e70467c33152a3d5 +P 408144a1832569ced8e04840f0dd36a3867405f36b13631b0f13c0f7b8a0fb01 +R e1eff49797b82e19658f2ee082875e36 +U mistachkin +Z ca11739ed6199651720067a09b5d23b0 diff --git a/manifest.uuid b/manifest.uuid index 8829389704..4123f2650e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -408144a1832569ced8e04840f0dd36a3867405f36b13631b0f13c0f7b8a0fb01 \ No newline at end of file +a21d1dde73f811244b5b43f9fed5877263a9c5061470221f417e501f5530edfa \ No newline at end of file From 908e7c43a7386594926bdfce4029884cd20ea012 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 14 Aug 2019 15:17:21 +0000 Subject: [PATCH 114/221] Always check for reads past the end of the file on the in-memory journal driver. This used to be an assert(). FossilOrigin-Name: 4d41ca7d6efbdac70890a8d4159488fc7f59bf78a550b00597b4df990c4fcaef --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/memjournal.c | 5 ----- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 4183e3a60b..d3d9df741e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssome\sstatic\sto\sthe\s'regexp'\sextension. -D 2019-08-13T20:34:35.045 +C Always\scheck\sfor\sreads\spast\sthe\send\sof\sthe\sfile\son\sthe\sin-memory\sjournal\ndriver.\s\sThis\sused\sto\sbe\san\sassert(). +D 2019-08-14T15:17:21.194 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 F src/memdb.c 02a5fcec19b9d40dd449ca802dc1b2e8f93f255fbf2a886277a3c3800d8d35db -F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 +F src/memjournal.c 7561c01c90958f3ba9bc6cb2d857123d932bdfa5539ea34427a0957b2e35154d F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604 F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 408144a1832569ced8e04840f0dd36a3867405f36b13631b0f13c0f7b8a0fb01 -R e1eff49797b82e19658f2ee082875e36 -U mistachkin -Z ca11739ed6199651720067a09b5d23b0 +P a21d1dde73f811244b5b43f9fed5877263a9c5061470221f417e501f5530edfa +R ed8fa0e6bed90bb78f3894955acd52ae +U drh +Z 721554492d795644318a412d01d91bde diff --git a/manifest.uuid b/manifest.uuid index 4123f2650e..9d7ba8cea8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a21d1dde73f811244b5b43f9fed5877263a9c5061470221f417e501f5530edfa \ No newline at end of file +4d41ca7d6efbdac70890a8d4159488fc7f59bf78a550b00597b4df990c4fcaef \ No newline at end of file diff --git a/src/memjournal.c b/src/memjournal.c index 3b0e7a6728..0a14e847a2 100644 --- a/src/memjournal.c +++ b/src/memjournal.c @@ -96,14 +96,9 @@ static int memjrnlRead( int iChunkOffset; FileChunk *pChunk; -#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \ - || defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE) if( (iAmt+iOfst)>p->endpoint.iOffset ){ return SQLITE_IOERR_SHORT_READ; } -#endif - - assert( (iAmt+iOfst)<=p->endpoint.iOffset ); assert( p->readpoint.iOffset==0 || p->readpoint.pChunk!=0 ); if( p->readpoint.iOffset!=iOfst || iOfst==0 ){ sqlite3_int64 iOff = 0; From b9fc45534dec6b6a5e8047285d8d8527ac963bdb Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 15 Aug 2019 00:04:44 +0000 Subject: [PATCH 115/221] Early detection out-of-bounds page numbers on the direct-overflow-read optimization gives consistent error messages regardless of whether or not the optimization is enabled. FossilOrigin-Name: b517a52fa36df0a0854a75858b5e81861771d2e9032a5a0ad79aa76ae64130a2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d3d9df741e..5c813276b7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\scheck\sfor\sreads\spast\sthe\send\sof\sthe\sfile\son\sthe\sin-memory\sjournal\ndriver.\s\sThis\sused\sto\sbe\san\sassert(). -D 2019-08-14T15:17:21.194 +C Early\sdetection\sout-of-bounds\spage\snumbers\son\sthe\sdirect-overflow-read\noptimization\sgives\sconsistent\serror\smessages\sregardless\sof\swhether\sor\snot\nthe\soptimization\sis\senabled. +D 2019-08-15T00:04:44.923 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -464,7 +464,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 6061323b98cc794a1e3ad6907f683f1ad2b8c48d7c7d486072b21f18efe73761 +F src/btree.c a6b6f4730862a4c3b92c903ecebac309626788ac8a977394198d69cd613fbf2b F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 7fb6ad35d162517d6bfa196f4fb2a1d7c3a362531e84c59f3a0479e0de511556 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a21d1dde73f811244b5b43f9fed5877263a9c5061470221f417e501f5530edfa -R ed8fa0e6bed90bb78f3894955acd52ae +P 4d41ca7d6efbdac70890a8d4159488fc7f59bf78a550b00597b4df990c4fcaef +R cbbc98ec5ac255f891702508ca882f04 U drh -Z 721554492d795644318a412d01d91bde +Z 5ba220c2acba929340df86e7b8719d9b diff --git a/manifest.uuid b/manifest.uuid index 9d7ba8cea8..a6c01e5fd0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d41ca7d6efbdac70890a8d4159488fc7f59bf78a550b00597b4df990c4fcaef \ No newline at end of file +b517a52fa36df0a0854a75858b5e81861771d2e9032a5a0ad79aa76ae64130a2 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 932ce04359..dd441aef50 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4879,6 +4879,7 @@ static int accessPayload( assert( aWrite>=pBufStart ); /* due to (6) */ memcpy(aSave, aWrite, 4); rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); + if( rc && nextPage>pBt->nPage ) rc = SQLITE_CORRUPT_BKPT; nextPage = get4byte(aWrite); memcpy(aWrite, aSave, 4); }else From 27e80a3b68010d7ece74ed4a6836ab9f0b2fb9ac Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 15 Aug 2019 13:17:49 +0000 Subject: [PATCH 116/221] Ensure that the cell overwrite optimization does not overwrite the header of the b-tree page. FossilOrigin-Name: 4cc5694cbd69749c146679c367860952fdf3f5356426ddfd1dce470569702bc1 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 6 ++++-- test/fuzzdata8.db | Bin 1288192 -> 1311744 bytes 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 5c813276b7..64901db7c3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Early\sdetection\sout-of-bounds\spage\snumbers\son\sthe\sdirect-overflow-read\noptimization\sgives\sconsistent\serror\smessages\sregardless\sof\swhether\sor\snot\nthe\soptimization\sis\senabled. -D 2019-08-15T00:04:44.923 +C Ensure\sthat\sthe\scell\soverwrite\soptimization\sdoes\snot\soverwrite\sthe\sheader\nof\sthe\sb-tree\spage. +D 2019-08-15T13:17:49.826 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -464,7 +464,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c a6b6f4730862a4c3b92c903ecebac309626788ac8a977394198d69cd613fbf2b +F src/btree.c 5cf994516c1b74928b9d15971573a8bc8595e1afec129184099976da603402de F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 7fb6ad35d162517d6bfa196f4fb2a1d7c3a362531e84c59f3a0479e0de511556 @@ -1011,7 +1011,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 2f1375f053b772a48e0820fd3684eac0e109bc37d5612b72b0bb4bcebc1f0133 +F test/fuzzdata8.db dc52be9b732f5bc1cdc0db0ff5b8e69b87bc8989b13a94eb8acaef63897a007c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4d41ca7d6efbdac70890a8d4159488fc7f59bf78a550b00597b4df990c4fcaef -R cbbc98ec5ac255f891702508ca882f04 +P b517a52fa36df0a0854a75858b5e81861771d2e9032a5a0ad79aa76ae64130a2 +R 99504bb8346f69a0c987562da440ce64 U drh -Z 5ba220c2acba929340df86e7b8719d9b +Z c6c5cb19819200b45c3cd69274447def diff --git a/manifest.uuid b/manifest.uuid index a6c01e5fd0..ae239c6fc7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b517a52fa36df0a0854a75858b5e81861771d2e9032a5a0ad79aa76ae64130a2 \ No newline at end of file +4cc5694cbd69749c146679c367860952fdf3f5356426ddfd1dce470569702bc1 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index dd441aef50..6e6a9b2797 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7675,7 +7675,7 @@ static int balance_nonroot( */ memset(&b.szCell[b.nCell], 0, sizeof(b.szCell[0])*(limit+pOld->nOverflow)); if( pOld->nOverflow>0 ){ - if( limitaiOvfl[0] ){ + if( NEVER(limitaiOvfl[0]) ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; } @@ -8476,7 +8476,9 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ Pgno ovflPgno; /* Next overflow page to write */ u32 ovflPageSize; /* Size to write on overflow page */ - if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd ){ + if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd + || pCur->info.pPayload < pPage->aData + pPage->cellOffset + ){ return SQLITE_CORRUPT_BKPT; } /* Overwrite the local portion first */ diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 353f39ba70cedd99c078d243654615c4ea9f1d46..5abaf46cb98d6bcbf04076d2ff6971ad0521efa7 100644 GIT binary patch delta 31498 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 delta 23251 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 Date: Thu, 15 Aug 2019 13:46:39 +0000 Subject: [PATCH 117/221] Avoid downgrading SQLITE_CORRUPT errors detected by the schema parser into SQLITE_NOMEM or SQLITE_ERROR errors. FossilOrigin-Name: b2e79f8ff0836fcc98a2df9377aad9137307c34058030ecd1b5d4ec3277ed36a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/prepare.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 64901db7c3..394b53716c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\scell\soverwrite\soptimization\sdoes\snot\soverwrite\sthe\sheader\nof\sthe\sb-tree\spage. -D 2019-08-15T13:17:49.826 +C Avoid\sdowngrading\sSQLITE_CORRUPT\serrors\sdetected\sby\sthe\sschema\sparser\sinto\nSQLITE_NOMEM\sor\sSQLITE_ERROR\serrors. +D 2019-08-15T13:46:39.741 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -518,7 +518,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 F src/pragma.c a42d4c6040893a59b69a0c987e5ed0402730c444ee451fde9bbe6203e7f73b1d F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 -F src/prepare.c 1dcd92a57f63f7ba02ece7997c0cd36647f6ea05c05726f02d7709b18bd368ac +F src/prepare.c 132484635a30f873ee7eccd47f93ed1932503863b93b28423b42332d81adffaf F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b517a52fa36df0a0854a75858b5e81861771d2e9032a5a0ad79aa76ae64130a2 -R 99504bb8346f69a0c987562da440ce64 +P 4cc5694cbd69749c146679c367860952fdf3f5356426ddfd1dce470569702bc1 +R 8d34b75339aca80871316bc3b34ad384 U drh -Z c6c5cb19819200b45c3cd69274447def +Z 6594db806a9430ef05667df996896231 diff --git a/manifest.uuid b/manifest.uuid index ae239c6fc7..191b74e093 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4cc5694cbd69749c146679c367860952fdf3f5356426ddfd1dce470569702bc1 \ No newline at end of file +b2e79f8ff0836fcc98a2df9377aad9137307c34058030ecd1b5d4ec3277ed36a \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index c6d7fba703..70c162658a 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -115,7 +115,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ if( db->init.orphanTrigger ){ assert( iDb==1 ); }else{ - pData->rc = rc; + if( rc > pData->rc ) pData->rc = rc; if( rc==SQLITE_NOMEM ){ sqlite3OomFault(db); }else if( rc!=SQLITE_INTERRUPT && (rc&0xFF)!=SQLITE_LOCKED ){ From a3fcc000cb7bd5b12816512834e6484c68658576 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 15 Aug 2019 13:53:22 +0000 Subject: [PATCH 118/221] Ensure that SQLite does not attempt to process incompatible window functions in a single scan. Fix for [256741a1]. FossilOrigin-Name: 4f5b2d938194fab7627486e2ced633def2c90d9d3328e3700612feb9dbfa3d9a --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/expr.c | 7 +------ src/resolve.c | 11 +---------- src/sqliteInt.h | 1 + src/window.c | 21 +++++++++++++++++++++ test/window9.test | 23 +++++++++++++++++++++++ 7 files changed, 59 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index 394b53716c..ade3aa6fda 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sdowngrading\sSQLITE_CORRUPT\serrors\sdetected\sby\sthe\sschema\sparser\sinto\nSQLITE_NOMEM\sor\sSQLITE_ERROR\serrors. -D 2019-08-15T13:46:39.741 +C Ensure\sthat\sSQLite\sdoes\snot\sattempt\sto\sprocess\sincompatible\swindow\sfunctions\sin\sa\ssingle\sscan.\sFix\sfor\s[256741a1]. +D 2019-08-15T13:53:22.869 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 85239130e25f54279b1dfb3641984a335ce5a38709af29f9b62b555ed1459d07 +F src/expr.c 1b4f5a53a5f48ba3f718413586e0f9715cf90c684fba9038186a62728e2ebe72 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -521,14 +521,14 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 132484635a30f873ee7eccd47f93ed1932503863b93b28423b42332d81adffaf F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c d49679d55d3cf529bbdff8734c4ac02cedfb2fc785545b89815ddb79680b9198 +F src/resolve.c 14ae3326af3d8b94bd64a29e0369986f3125cf4c0dcb8f8dc1b8be2cd1bcdbaa F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 11087458ec2af5c4b377559ea0462c2ab842e02badd35b21a8d67257c4e0b117 F src/shell.c.in 66cd8289adbcd159ca67872c242990ca6bed29fe80be7ebf9c6a1c068249a41e F src/sqlite.h.in 1fe019ae55182040e6ea10c89ddbb8d24c1b1015c423da53e55205398a65a906 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 0598c87a995d63b09bcc408552bf38205cd902b577e74b7c3237bde71093c28b +F src/sqliteInt.h 4875fb443102c9d92ed1cb23b7fb6e2d97714591f02725d595576ef316596b94 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -613,7 +613,7 @@ F src/where.c 90cb93dc8eb9383e72f661b2074551d47ff21e5379f7167f7e078bed436989e9 F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc -F src/window.c 98b2571c66246bddadf42e76da45ed970fe7518a4c9c1ccc8cdace0711bfabba +F src/window.c 07e1c15081a735750218185c6b17053c87ecb764d06ab2c0a1ce568a2b4688e5 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1712,7 +1712,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f -F test/window9.test 1fd3ff49119c28006e8f55e48e8425bf4d5bf560195c4df470ef147641004f56 +F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4cc5694cbd69749c146679c367860952fdf3f5356426ddfd1dce470569702bc1 -R 8d34b75339aca80871316bc3b34ad384 -U drh -Z 6594db806a9430ef05667df996896231 +P b2e79f8ff0836fcc98a2df9377aad9137307c34058030ecd1b5d4ec3277ed36a +R b2cc9a11d7f17926cd103784a544e4bc +U dan +Z a8ef7cc1d7134e3e2d9b097acd8c412a diff --git a/manifest.uuid b/manifest.uuid index 191b74e093..2c85f9837b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b2e79f8ff0836fcc98a2df9377aad9137307c34058030ecd1b5d4ec3277ed36a \ No newline at end of file +4f5b2d938194fab7627486e2ced633def2c90d9d3328e3700612feb9dbfa3d9a \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e00b319ed2..8f02ae569a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1325,12 +1325,7 @@ static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ assert( pWin ); assert( IsWindowFunc(pExpr) ); assert( pWin->ppThis==0 ); - if( pSelect->pWin ){ - pSelect->pWin->ppThis = &pWin->pNextWin; - } - pWin->pNextWin = pSelect->pWin; - pWin->ppThis = &pSelect->pWin; - pSelect->pWin = pWin; + sqlite3WindowLink(pSelect, pWin); } return WRC_Continue; } diff --git a/src/resolve.c b/src/resolve.c index d88abc4a4b..31600382fb 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -908,16 +908,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ sqlite3WalkExprList(pWalker, pWin->pPartition); sqlite3WalkExprList(pWalker, pWin->pOrderBy); sqlite3WalkExpr(pWalker, pWin->pFilter); - if( 0==pSel->pWin - || 0==sqlite3WindowCompare(pParse, pSel->pWin, pWin, 0) - ){ - pWin->pNextWin = pSel->pWin; - if( pSel->pWin ){ - pSel->pWin->ppThis = &pWin->pNextWin; - } - pSel->pWin = pWin; - pWin->ppThis = &pSel->pWin; - } + sqlite3WindowLink(pSel, pWin); pNC->ncFlags |= NC_HasWin; }else #endif /* SQLITE_OMIT_WINDOWFUNC */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1104b771f3..d6746aadca 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3609,6 +3609,7 @@ void sqlite3WindowUnlinkFromSelect(Window*); void sqlite3WindowListDelete(sqlite3 *db, Window *p); Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); void sqlite3WindowAttach(Parse*, Expr*, Window*); +void sqlite3WindowLink(Select *pSel, Window *pWin); int sqlite3WindowCompare(Parse*, Window*, Window*, int); void sqlite3WindowCodeInit(Parse*, Window*); void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); diff --git a/src/window.c b/src/window.c index ebcb576bb5..e2f0b62276 100644 --- a/src/window.c +++ b/src/window.c @@ -1229,6 +1229,25 @@ void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){ } } +/* +** Possibly link window pWin into the list at pSel->pWin (window functions +** to be processed as part of SELECT statement pSel). The window is linked +** in if either (a) there are no other windows already linked to this +** SELECT, or (b) the windows already linked use a compatible window frame. +*/ +void sqlite3WindowLink(Select *pSel, Window *pWin){ + if( 0==pSel->pWin + || 0==sqlite3WindowCompare(0, pSel->pWin, pWin, 0) + ){ + pWin->pNextWin = pSel->pWin; + if( pSel->pWin ){ + pSel->pWin->ppThis = &pWin->pNextWin; + } + pSel->pWin = pWin; + pWin->ppThis = &pSel->pWin; + } +} + /* ** Return 0 if the two window objects are identical, or non-zero otherwise. ** Identical window objects can be processed in a single scan. @@ -1416,6 +1435,8 @@ static void windowAggStep( int nArg = windowArgCount(pWin); int i; + assert( bInverse==0 || pWin->eStart!=TK_UNBOUNDED ); + for(i=0; izName!=nth_valueName ){ sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+i, reg+i); diff --git a/test/window9.test b/test/window9.test index cf4d83ae8e..d79e5f3d00 100644 --- a/test/window9.test +++ b/test/window9.test @@ -171,6 +171,29 @@ foreach {tn sql} { } {~/ORDER/} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 6.0 { + CREATE TABLE t0(c0); + INSERT INTO t0(c0) VALUES (0); +} + +do_execsql_test 6.1 { + SELECT * FROM t0 WHERE + EXISTS ( + SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 + ) >=1 AND + EXISTS ( + SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 + ) <=1; +} {0} + +do_execsql_test 6.2 { + SELECT * FROM t0 WHERE EXISTS ( + SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 + ) + BETWEEN 1 AND 1; +} {0} finish_test From 725dd72400872da94dcfb6af48128905b93d57fe Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 15 Aug 2019 14:35:45 +0000 Subject: [PATCH 119/221] Ensure that the optional "sz=N" parameter that can be manually added to the end of an sqlite_stat1 entry does not have an N value that is too small. Ticket [e4598ecbdd18bd82] FossilOrigin-Name: 98357d8c1263920b33a3648ef9214a63c99728bafa7a8d3dd6a1241b2303fd42 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/analyze.c | 4 +++- src/where.c | 1 + test/analyzeC.test | 14 ++++++++++++++ 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index ade3aa6fda..7d4def8408 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sSQLite\sdoes\snot\sattempt\sto\sprocess\sincompatible\swindow\sfunctions\sin\sa\ssingle\sscan.\sFix\sfor\s[256741a1]. -D 2019-08-15T13:53:22.869 +C Ensure\sthat\sthe\soptional\s"sz=N"\sparameter\sthat\scan\sbe\smanually\sadded\sto\sthe\nend\sof\san\ssqlite_stat1\sentry\sdoes\snot\shave\san\sN\svalue\sthat\sis\stoo\ssmall.\nTicket\s[e4598ecbdd18bd82] +D 2019-08-15T14:35:45.987 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -458,7 +458,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 5c3031e45e80f79d7d54c2d32dd3c44926544d4f6a478858bfe4ee3191570190 -F src/analyze.c 0278dbf6dbc0be90dc5391cb020772b461d789af17c390f857a34308c7ac9858 +F src/analyze.c a3f4ea45cdb4e9df78d4ea7beb87ec8a7a46f494173b641cd28512a40a97bff2 F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 90cb93dc8eb9383e72f661b2074551d47ff21e5379f7167f7e078bed436989e9 +F src/where.c 2fac51d2420f05ab6f644f1813d4f73f6214304836fd9b22345738d943faad9b F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc @@ -643,7 +643,7 @@ F test/analyze6.test 6c3f7df2996cb6872f355a6ac1eb6d5de00a5a9288214bad7ef25c97d9c F test/analyze7.test 6ef0b12369f61ddeadc7d8a705c40e6b52cb29f63de3a4c56581b510b46b5783 F test/analyze8.test 36ce54947710bd44e4f9484e1ad07e725ef01a9d7078b417c1bc884356febe4d F test/analyze9.test 9fbf0e0101eef4f5dc149769aa14e10b76ee06e7c28598264b32173cd1999a54 -F test/analyzeC.test 555a6cc388b9818b6eda6df816f01ce0a75d3a93 +F test/analyzeC.test 489fe2ea3be3f17548e8dd895f1b41c9669b52de1b0861f5bffe6eec46eac710 F test/analyzeD.test e50cd0b3e6063216cc0c88a1776e8645dc0bd65a6bb275769cbee33b7fd8d90c F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d F test/analyzeF.test 9e1a0537949eb5483642b1140a5c39e5b4025939024b935398471fa552f4dabb @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b2e79f8ff0836fcc98a2df9377aad9137307c34058030ecd1b5d4ec3277ed36a -R b2cc9a11d7f17926cd103784a544e4bc -U dan -Z a8ef7cc1d7134e3e2d9b097acd8c412a +P 4f5b2d938194fab7627486e2ced633def2c90d9d3328e3700612feb9dbfa3d9a +R e211e009e748f2e64e3d39bc31b03be2 +U drh +Z bec392cb43d1df3c3b62ac4b05f24424 diff --git a/manifest.uuid b/manifest.uuid index 2c85f9837b..7672348cd3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4f5b2d938194fab7627486e2ced633def2c90d9d3328e3700612feb9dbfa3d9a \ No newline at end of file +98357d8c1263920b33a3648ef9214a63c99728bafa7a8d3dd6a1241b2303fd42 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 31fb6f5b51..1904b9be02 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1450,7 +1450,9 @@ static void decodeIntArray( if( sqlite3_strglob("unordered*", z)==0 ){ pIndex->bUnordered = 1; }else if( sqlite3_strglob("sz=[0-9]*", z)==0 ){ - pIndex->szIdxRow = sqlite3LogEst(sqlite3Atoi(z+3)); + int sz = sqlite3Atoi(z+3); + if( sz<2 ) sz = 2; + pIndex->szIdxRow = sqlite3LogEst(sz); }else if( sqlite3_strglob("noskipscan*", z)==0 ){ pIndex->noSkipScan = 1; } diff --git a/src/where.c b/src/where.c index 65c92863a5..a37a810a2b 100644 --- a/src/where.c +++ b/src/where.c @@ -2670,6 +2670,7 @@ static int whereLoopAddBtreeIndex( ** it to pNew->rRun, which is currently set to the cost of the index ** seek only. Then, if this is a non-covering index, add the cost of ** visiting the rows in the main table. */ + assert( pSrc->pTab->szTabRow>0 ); rCostIdx = pNew->nOut + 1 + (15*pProbe->szIdxRow)/pSrc->pTab->szTabRow; pNew->rRun = sqlite3LogEstAdd(rLogSize, rCostIdx); if( (pNew->wsFlags & (WHERE_IDX_ONLY|WHERE_IPK))==0 ){ diff --git a/test/analyzeC.test b/test/analyzeC.test index 02faa9c7e9..2a0a897810 100644 --- a/test/analyzeC.test +++ b/test/analyzeC.test @@ -132,6 +132,20 @@ do_execsql_test 4.3 { SELECT count(a) FROM t1; } {/.*INDEX t1ca.*/} +# 2019-08-15. +# Ticket https://www.sqlite.org/src/tktview/e4598ecbdd18bd82945f602901 +# The sz=N parameter in the sqlite_stat1 table needs to have a value of +# 2 or more to avoid a division by zero in the query planner. +# +do_execsql_test 4.4 { + DROP TABLE IF EXISTS t44; + CREATE TABLE t44(a PRIMARY KEY); + INSERT INTO sqlite_stat1 VALUES('t44',null,'sz=0'); + ANALYZE sqlite_master; + SELECT 0 FROM t44 WHERE a IN(1,2,3); +} {} + + # The sz=NNN parameter works even if there is other extraneous text # in the sqlite_stat1.stat column. From 42d2fce7f5b5e5776f3e881b4685deae2e0266ff Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 15 Aug 2019 20:04:09 +0000 Subject: [PATCH 120/221] Provide the SQLITE_DIRECTONLY flag for app-defined functions that prohibits the use of those functions within triggers or views. FossilOrigin-Name: fc745845d8d76adc165575e2192f4176e3c28e614c72571d56f4011560499fe1 --- manifest | 31 ++++++++++++---------- manifest.uuid | 2 +- src/attach.c | 1 + src/main.c | 4 ++- src/resolve.c | 9 +++++++ src/sqlite.h.in | 13 +++++++++- src/sqliteInt.h | 63 ++++++++++++++++++++++++--------------------- src/tclsqlite.c | 14 ++++++++-- src/treeview.c | 6 ++--- test/func.test | 40 +++++++++++++++++++++++++++- test/tclsqlite.test | 2 +- 11 files changed, 131 insertions(+), 54 deletions(-) diff --git a/manifest b/manifest index 7d4def8408..9b54e4ca09 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\soptional\s"sz=N"\sparameter\sthat\scan\sbe\smanually\sadded\sto\sthe\nend\sof\san\ssqlite_stat1\sentry\sdoes\snot\shave\san\sN\svalue\sthat\sis\stoo\ssmall.\nTicket\s[e4598ecbdd18bd82] -D 2019-08-15T14:35:45.987 +C Provide\sthe\sSQLITE_DIRECTONLY\sflag\sfor\sapp-defined\sfunctions\sthat\sprohibits\nthe\suse\sof\sthose\sfunctions\swithin\striggers\sor\sviews. +D 2019-08-15T20:04:09.316 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -459,7 +459,7 @@ F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 5c3031e45e80f79d7d54c2d32dd3c44926544d4f6a478858bfe4ee3191570190 F src/analyze.c a3f4ea45cdb4e9df78d4ea7beb87ec8a7a46f494173b641cd28512a40a97bff2 -F src/attach.c 78e986baee90cb7b83fb9eafa79c22581a8ada14030fd633b0683c95cf11213c +F src/attach.c a6f108eb7922fad920e8aba0cda56fb56d89d136d519be5177cd3bd3559f2566 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 @@ -487,7 +487,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c c2194dd2886337b870226fcb31c13e7df8c4b5e0ea85140e510a6f1daf1ad65b F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c 3add6433e077635dac5579edaf7b3942e3ff3dda5588c49c0edd7abea2096482 +F src/main.c ff418603f9435914e8bd2febd1d5dbfcbf2ece3a4e853481a81a50fc27b321ab F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -521,18 +521,18 @@ F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 F src/prepare.c 132484635a30f873ee7eccd47f93ed1932503863b93b28423b42332d81adffaf F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 14ae3326af3d8b94bd64a29e0369986f3125cf4c0dcb8f8dc1b8be2cd1bcdbaa +F src/resolve.c b2733d39a22f5023ab489b8535ca6854b51ff8667ca975815d004bb7388b0e41 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 11087458ec2af5c4b377559ea0462c2ab842e02badd35b21a8d67257c4e0b117 F src/shell.c.in 66cd8289adbcd159ca67872c242990ca6bed29fe80be7ebf9c6a1c068249a41e -F src/sqlite.h.in 1fe019ae55182040e6ea10c89ddbb8d24c1b1015c423da53e55205398a65a906 +F src/sqlite.h.in dfbb64c0b8e4b3de2958d8372208437509acdc523aed8ae90a164f3a5d9a5739 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 4875fb443102c9d92ed1cb23b7fb6e2d97714591f02725d595576ef316596b94 +F src/sqliteInt.h 12e8af40a561a3006b6996938c88cce1e24efe690955e193824571d20c3ef352 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 +F src/tclsqlite.c a65eb317f8b83f7ae546f88db56600f9a39550688d70501b8eb0cc3a4b4960c9 F src/test1.c 87059457fb90b73a74044b379fe2cb0aefbb53c010c646ecaff23179a423638c F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -588,7 +588,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e -F src/treeview.c 06e65db6ffa14dd583f90403192190dfe3855c0e3acfcbac0e82109a46e2b16c +F src/treeview.c fc8c6c0a8a26afb3a97e3f844d65403dd27cf1450baf4415034fa4ccf00c4d7e F src/trigger.c 2305271878e95addc1c01361e5e8e342e87cba5efefdd7d3032687e5d67e05d1 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 @@ -990,7 +990,7 @@ F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3c F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test e4313baba80bf933e58eb89a7c617bec0f0c348c862b096ec4387f36e05ad0a6 +F test/func.test 0889128141b99b38aa9ce78445acfc4c1f9fbe9aa4f51d4c6aff88ae43cf125b F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 F test/func4.test 6beacdfcb0e18c358e6c2dcacf1b65d1fa80955f @@ -1388,7 +1388,7 @@ F test/tabfunc01.test 20e98ffe55f35d8d33fd834ca8bf9d4b637e560af8fcd00464b4154d90 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 5a06962d8f18edf4703931f6b7dacd83678d02fa5c8ced9a7958c007ad58626a +F test/tclsqlite.test 6c7368554f15ea6df3852173c0f1d6353f824afb1896f6fc17fb21b057c0685a F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1836,7 +1836,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 4f5b2d938194fab7627486e2ced633def2c90d9d3328e3700612feb9dbfa3d9a -R e211e009e748f2e64e3d39bc31b03be2 +P 98357d8c1263920b33a3648ef9214a63c99728bafa7a8d3dd6a1241b2303fd42 +R ad310bbebd66791c892628fc8eec172c +T *branch * directonly +T *sym-directonly * +T -sym-trunk * U drh -Z bec392cb43d1df3c3b62ac4b05f24424 +Z 950f463a47bf34120eda446765855ee2 diff --git a/manifest.uuid b/manifest.uuid index 7672348cd3..bd2dbbdbb6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98357d8c1263920b33a3648ef9214a63c99728bafa7a8d3dd6a1241b2303fd42 \ No newline at end of file +fc745845d8d76adc165575e2192f4176e3c28e614c72571d56f4011560499fe1 \ No newline at end of file diff --git a/src/attach.c b/src/attach.c index 55e0eb5363..61f169ed76 100644 --- a/src/attach.c +++ b/src/attach.c @@ -560,6 +560,7 @@ int sqlite3FixExpr( Expr *pExpr /* The expression to be fixed to one database */ ){ while( pExpr ){ + ExprSetProperty(pExpr, EP_Indirect); if( pExpr->op==TK_VARIABLE ){ if( pFix->pParse->db->init.busy ){ pExpr->op = TK_NULL; diff --git a/src/main.c b/src/main.c index 06a55eca02..969bd570c4 100644 --- a/src/main.c +++ b/src/main.c @@ -1720,7 +1720,8 @@ int sqlite3CreateFunc( } assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); - extraFlags = enc & SQLITE_DETERMINISTIC; + assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY ); + extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY); enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); #ifndef SQLITE_OMIT_UTF16 @@ -1783,6 +1784,7 @@ int sqlite3CreateFunc( p->u.pDestructor = pDestructor; p->funcFlags = (p->funcFlags & SQLITE_FUNC_ENCMASK) | extraFlags; testcase( p->funcFlags & SQLITE_DETERMINISTIC ); + testcase( p->funcFlags & SQLITE_DIRECTONLY ); p->xSFunc = xSFunc ? xSFunc : xStep; p->xFinalize = xFinal; p->xValue = xValue; diff --git a/src/resolve.c b/src/resolve.c index 31600382fb..ab22664095 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -823,6 +823,15 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** SQL is being compiled using sqlite3NestedParse() */ no_such_func = 1; pDef = 0; + }else + if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 + && ExprHasProperty(pExpr, EP_Indirect) + && !IN_RENAME_OBJECT + ){ + /* Functions tagged with SQLITE_DIRECTONLY may not be used + ** inside of triggers and views */ + sqlite3ErrorMsg(pParse, "%s() prohibited in triggers and views", + pDef->zName); } } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index d68cef2490..d50f44e6cc 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4848,6 +4848,9 @@ int sqlite3_reset(sqlite3_stmt *pStmt); ** function that is not deterministic. The SQLite query planner is able to ** perform additional optimizations on deterministic functions, so use ** of the [SQLITE_DETERMINISTIC] flag is recommended where possible. +** ^The fourth parameter may also optionally include the [SQLITE_DIRECTONLY] +** flag, which if present prevents the function from being invoked from +** within VIEWs or TRIGGERs. ** ** ^(The fifth parameter is an arbitrary pointer. The implementation of the ** function can gain access to this pointer using [sqlite3_user_data()].)^ @@ -4965,8 +4968,16 @@ int sqlite3_create_window_function( ** [SQLITE_UTF8 | preferred text encoding] as the fourth argument ** to [sqlite3_create_function()], [sqlite3_create_function16()], or ** [sqlite3_create_function_v2()]. +** +** The SQLITE_DETERMINISTIC flag means that the new function will always +** maps the same inputs into the same output. The abs() function is +** deterministic, for example, but randomblob() is not. +** +** The SQLITE_DIRECTONLY flag means that the function may only be invoked +** from top-level SQL, and cannot be used in VIEWs or TRIGGERs. */ -#define SQLITE_DETERMINISTIC 0x800 +#define SQLITE_DETERMINISTIC 0x000000800 +#define SQLITE_DIRECTONLY 0x000080000 /* ** CAPI3REF: Deprecated Functions diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d6746aadca..47b4e749da 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1663,6 +1663,7 @@ struct FuncDestructor { ** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG ** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG ** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API +** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API ** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API */ #define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ @@ -1683,6 +1684,7 @@ struct FuncDestructor { #define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ +#define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -2494,36 +2496,37 @@ struct Expr { ** EP_Agg == NC_HasAgg == SF_HasAgg ** EP_Win == NC_HasWin */ -#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ -#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ -#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ -#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ -#define EP_Agg 0x000010 /* Contains one or more aggregate functions */ -#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ -#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ -#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ -#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ -#define EP_Generic 0x000200 /* Ignore COLLATE or affinity on this tree */ -#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ -#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ -#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ -#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ -#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ -#define EP_Win 0x008000 /* Contains window functions */ -#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ -#define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ -#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ -#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ -#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ -#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ -#define EP_Alias 0x400000 /* Is an alias for a result set column */ -#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ -#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ -#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ -#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ -#define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ -#define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ -#define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ +#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ +#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ +#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ +#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ +#define EP_Agg 0x000010 /* Contains one or more aggregate functions */ +#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ +#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ +#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ +#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ +#define EP_Generic 0x000200 /* Ignore COLLATE or affinity on this tree */ +#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ +#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ +#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ +#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ +#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_Win 0x008000 /* Contains window functions */ +#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ +#define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */ +#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ +#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ +#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ +#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ +#define EP_Alias 0x400000 /* Is an alias for a result set column */ +#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ +#define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ +#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ +#define EP_Static 0x8000000 /* Held in memory not obtained from malloc() */ +#define EP_IsTrue 0x10000000 /* Always has boolean value of TRUE */ +#define EP_IsFalse 0x20000000 /* Always has boolean value of FALSE */ +#define EP_Indirect 0x40000000 /* Contained within a TRIGGER or a VIEW */ /* ** The EP_Propagate mask is a set of properties that automatically propagate diff --git a/src/tclsqlite.c b/src/tclsqlite.c index a78d5676c7..511a9c8a66 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -2741,10 +2741,16 @@ deserialize_error: } /* - ** $db function NAME [-argcount N] [-deterministic] SCRIPT + ** $db function NAME [OPTIONS] SCRIPT ** ** Create a new SQL function called NAME. Whenever that function is ** called, invoke SCRIPT to evaluate the function. + ** + ** Options: + ** --argcount N Function has exactly N arguments + ** --deterministic The function is pure + ** --directonly Prohibit use inside triggers and views + ** --returntype TYPE Specify the return type of the function */ case DB_FUNCTION: { int flags = SQLITE_UTF8; @@ -2777,6 +2783,9 @@ deserialize_error: if( n>1 && strncmp(z, "-deterministic",n)==0 ){ flags |= SQLITE_DETERMINISTIC; }else + if( n>1 && strncmp(z, "-directonly",n)==0 ){ + flags |= SQLITE_DIRECTONLY; + }else if( n>1 && strncmp(z, "-returntype", n)==0 ){ const char *azType[] = {"integer", "real", "text", "blob", "any", 0}; assert( SQLITE_INTEGER==1 && SQLITE_FLOAT==2 && SQLITE_TEXT==3 ); @@ -2792,7 +2801,8 @@ deserialize_error: eType++; }else{ Tcl_AppendResult(interp, "bad option \"", z, - "\": must be -argcount, -deterministic or -returntype", (char*)0 + "\": must be -argcount, -deterministic, -directonly," + " or -returntype", (char*)0 ); return TCL_ERROR; } diff --git a/src/treeview.c b/src/treeview.c index 753f214899..6dfdccd7ee 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -557,10 +557,10 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ #endif } if( pExpr->op==TK_AGG_FUNCTION ){ - sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q", - pExpr->op2, pExpr->u.zToken); + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s", + pExpr->op2, pExpr->u.zToken, zFlgs); }else{ - sqlite3TreeViewLine(pView, "FUNCTION %Q", pExpr->u.zToken); + sqlite3TreeViewLine(pView, "FUNCTION %Q%s", pExpr->u.zToken, zFlgs); } if( pFarg ){ sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0); diff --git a/test/func.test b/test/func.test index 579bad8e44..7315af322a 100644 --- a/test/func.test +++ b/test/func.test @@ -1419,7 +1419,45 @@ do_execsql_test func-32.150 { SELECT test_frombind(x.a,y.b,x.c,:123,y.e,x.f,$xyz+y.f) FROM t1 x, t1 y; } {8} - +# 2019-08-15 +# Direct-only functions. +# +proc testdirectonly {x} {return [expr {$x*2}]} +do_test func-33.1 { + db func testdirectonly -directonly testdirectonly + db eval {SELECT testdirectonly(15)} +} {30} +do_catchsql_test func-33.2 { + CREATE VIEW v33(y) AS SELECT testdirectonly(15); + SELECT * FROM v33; +} {1 {testdirectonly() prohibited in triggers and views}} +do_execsql_test func-33.3 { + SELECT * FROM (SELECT testdirectonly(15)) AS v33; +} {30} +do_execsql_test func-33.4 { + WITH c(x) AS (SELECT testdirectonly(15)) + SELECT * FROM c; +} {30} +do_catchsql_test func-33.5 { + WITH c(x) AS (SELECT * FROM v33) + SELECT * FROM c; +} {1 {testdirectonly() prohibited in triggers and views}} +do_execsql_test func-33.10 { + CREATE TABLE t33a(a,b); + CREATE TABLE t33b(x,y); + CREATE TRIGGER r1 AFTER INSERT ON t33a BEGIN + INSERT INTO t33b(x,y) VALUES(testdirectonly(new.a),new.b); + END; +} {} +do_catchsql_test func-33.11 { + INSERT INTO t33a VALUES(1,2); +} {1 {testdirectonly() prohibited in triggers and views}} +do_execsql_test func-33.20 { + ALTER TABLE t33a RENAME COLUMN a TO aaa; + SELECT sql FROM sqlite_master WHERE name='r1'; +} {{CREATE TRIGGER r1 AFTER INSERT ON t33a BEGIN + INSERT INTO t33b(x,y) VALUES(testdirectonly(new.aaa),new.b); + END}} finish_test diff --git a/test/tclsqlite.test b/test/tclsqlite.test index 319737426f..ec0312254c 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -789,7 +789,7 @@ do_test 17.6.2 { do_test 17.6.3 { list [catch { db function xyz -n object ret } msg] $msg -} {1 {bad option "-n": must be -argcount, -deterministic or -returntype}} +} {1 {bad option "-n": must be -argcount, -deterministic, -directonly, or -returntype}} # 2019-02-28: The "bind_fallback" command. # From 11d88e68abdf23f131dca81ad8d3517a5cf8449b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 15 Aug 2019 21:27:20 +0000 Subject: [PATCH 121/221] Add the SQLITE_DBCONFIG_ENABLE_VIEW option, together with a "db config" command in the TCL interface that can access that option as well as all the other sqlite3_db_config() boolean options. FossilOrigin-Name: 61b4bccd2984f4c2cf50f58ef08677588e57aa7e079af07473b2e188d9ce4f52 --- manifest | 26 +++++----- manifest.uuid | 2 +- src/main.c | 2 + src/select.c | 4 ++ src/shell.c.in | 1 + src/sqlite.h.in | 14 +++++- src/sqliteInt.h | 13 ++--- src/tclsqlite.c | 114 +++++++++++++++++++++++++++++++++++--------- test/tclsqlite.test | 2 +- test/view.test | 12 +++++ 10 files changed, 146 insertions(+), 44 deletions(-) diff --git a/manifest b/manifest index 7d4def8408..de79942910 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\soptional\s"sz=N"\sparameter\sthat\scan\sbe\smanually\sadded\sto\sthe\nend\sof\san\ssqlite_stat1\sentry\sdoes\snot\shave\san\sN\svalue\sthat\sis\stoo\ssmall.\nTicket\s[e4598ecbdd18bd82] -D 2019-08-15T14:35:45.987 +C Add\sthe\sSQLITE_DBCONFIG_ENABLE_VIEW\soption,\stogether\swith\sa\s"db\sconfig"\ncommand\sin\sthe\sTCL\sinterface\sthat\scan\saccess\sthat\soption\sas\swell\sas\sall\sthe\nother\ssqlite3_db_config()\sboolean\soptions. +D 2019-08-15T21:27:20.669 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c c2194dd2886337b870226fcb31c13e7df8c4b5e0ea85140e510a6f1daf1ad65b F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c 3add6433e077635dac5579edaf7b3942e3ff3dda5588c49c0edd7abea2096482 +F src/main.c 9465ba2bfc021f5c2ec1f58fc97c55b123d277ad0993c49a2f333df9da483f8f F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -523,16 +523,16 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 14ae3326af3d8b94bd64a29e0369986f3125cf4c0dcb8f8dc1b8be2cd1bcdbaa F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 11087458ec2af5c4b377559ea0462c2ab842e02badd35b21a8d67257c4e0b117 -F src/shell.c.in 66cd8289adbcd159ca67872c242990ca6bed29fe80be7ebf9c6a1c068249a41e -F src/sqlite.h.in 1fe019ae55182040e6ea10c89ddbb8d24c1b1015c423da53e55205398a65a906 +F src/select.c 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8 +F src/shell.c.in b748cfb4277fe1952609d688b181b152dd5920425a83dab1baddbfdcb722346c +F src/sqlite.h.in fe09e2452f68148dcd2724fa1aefe0939802b4fab89355fb194aa40126ac4b51 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h 4875fb443102c9d92ed1cb23b7fb6e2d97714591f02725d595576ef316596b94 +F src/sqliteInt.h d8e878fa1cb949ee8943f51965cbb917acdb4cc1238af8481eb839d11bf34d0a F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 +F src/tclsqlite.c 172792eb66e9a8985e8a246e689318cadbda50e10c13f0e51eea32215c6c9161 F src/test1.c 87059457fb90b73a74044b379fe2cb0aefbb53c010c646ecaff23179a423638c F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1388,7 +1388,7 @@ F test/tabfunc01.test 20e98ffe55f35d8d33fd834ca8bf9d4b637e560af8fcd00464b4154d90 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 5a06962d8f18edf4703931f6b7dacd83678d02fa5c8ced9a7958c007ad58626a +F test/tclsqlite.test f7bacdbe12bc208e0fe81b5cf5d712331d52f724917a6b4810c4cd686202843e F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1610,7 +1610,7 @@ F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2 F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test c1e64ff5a860fdbb7b52add0996af2ee1af563ddf2e86b964d15d04d81a001be +F test/view.test 10ea54300a097d7c0337fd104abffe4a4786d1598b94017a37efe0e0d3e04dd5 F test/vtab1.test efb4c4a45146193d6d55fb85f7162febd6423f29c72ede09bb96383f49e3abc1 F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4f5b2d938194fab7627486e2ced633def2c90d9d3328e3700612feb9dbfa3d9a -R e211e009e748f2e64e3d39bc31b03be2 +P 98357d8c1263920b33a3648ef9214a63c99728bafa7a8d3dd6a1241b2303fd42 +R 039c157cf6533868154794e96c549de4 U drh -Z bec392cb43d1df3c3b62ac4b05f24424 +Z 9ba4f898522b0ea8e4f41f060393ee57 diff --git a/manifest.uuid b/manifest.uuid index 7672348cd3..6e0115e877 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98357d8c1263920b33a3648ef9214a63c99728bafa7a8d3dd6a1241b2303fd42 \ No newline at end of file +61b4bccd2984f4c2cf50f58ef08677588e57aa7e079af07473b2e188d9ce4f52 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 06a55eca02..ecc7e5c518 100644 --- a/src/main.c +++ b/src/main.c @@ -836,6 +836,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ } aFlagOp[] = { { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, + { SQLITE_DBCONFIG_ENABLE_VIEW, SQLITE_EnableView }, { SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_Fts3Tokenizer }, { SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_LoadExtension }, { SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_NoCkptOnClose }, @@ -3075,6 +3076,7 @@ static int openDatabase( db->nMaxSorterMmap = 0x7FFFFFFF; db->flags |= SQLITE_ShortColNames | SQLITE_EnableTrigger + | SQLITE_EnableView | SQLITE_CacheSpill /* The SQLITE_DQS compile-time option determines the default settings diff --git a/src/select.c b/src/select.c index ca1256d160..bd8fee87ed 100644 --- a/src/select.c +++ b/src/select.c @@ -4906,6 +4906,10 @@ static int selectExpander(Walker *pWalker, Select *p){ u8 eCodeOrig = pWalker->eCode; if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; assert( pFrom->pSelect==0 ); + if( pTab->pSelect && (db->flags & SQLITE_EnableView)==0 ){ + sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited", + pTab->zName); + } pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); nCol = pTab->nCol; pTab->nCol = -1; diff --git a/src/shell.c.in b/src/shell.c.in index 19280e318d..0ffd9aece7 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7135,6 +7135,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } aDbConfig[] = { { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, + { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, diff --git a/src/sqlite.h.in b/src/sqlite.h.in index d68cef2490..4b1d4723bb 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2093,6 +2093,17 @@ struct sqlite3_mem_methods { ** following this call. The second parameter may be a NULL pointer, in ** which case the trigger setting is not reported back. ** +** [[SQLITE_DBCONFIG_ENABLE_VIEW]] +**
SQLITE_DBCONFIG_ENABLE_VIEW
+**
^This option is used to enable or disable [CREATE VIEW | views]. +** There should be two additional arguments. +** The first argument is an integer which is 0 to disable views, +** positive to enable views or negative to leave the setting unchanged. +** The second parameter is a pointer to an integer into which +** is written 0 or 1 to indicate whether views are disabled or enabled +** following this call. The second parameter may be a NULL pointer, in +** which case the view setting is not reported back.
+** ** [[SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER]] **
SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
**
^This option is used to enable or disable the @@ -2265,7 +2276,8 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012 /* int int* */ #define SQLITE_DBCONFIG_DQS_DML 1013 /* int int* */ #define SQLITE_DBCONFIG_DQS_DDL 1014 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1014 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1015 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d6746aadca..52c982159b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1537,16 +1537,17 @@ struct sqlite3 { #define SQLITE_Defensive 0x10000000 /* Input SQL is likely hostile */ #define SQLITE_DqsDDL 0x20000000 /* dbl-quoted strings allowed in DDL*/ #define SQLITE_DqsDML 0x40000000 /* dbl-quoted strings allowed in DML*/ +#define SQLITE_EnableView 0x80000000 /* Enable the use of views */ /* Flags used only if debugging */ #define HI(X) ((u64)(X)<<32) #ifdef SQLITE_DEBUG -#define SQLITE_SqlTrace HI(0x0001) /* Debug print SQL as it executes */ -#define SQLITE_VdbeListing HI(0x0002) /* Debug listings of VDBE progs */ -#define SQLITE_VdbeTrace HI(0x0004) /* True to trace VDBE execution */ -#define SQLITE_VdbeAddopTrace HI(0x0008) /* Trace sqlite3VdbeAddOp() calls */ -#define SQLITE_VdbeEQP HI(0x0010) /* Debug EXPLAIN QUERY PLAN */ -#define SQLITE_ParserTrace HI(0x0020) /* PRAGMA parser_trace=ON */ +#define SQLITE_SqlTrace HI(0x0100000) /* Debug print SQL as it executes */ +#define SQLITE_VdbeListing HI(0x0200000) /* Debug listings of VDBE progs */ +#define SQLITE_VdbeTrace HI(0x0400000) /* True to trace VDBE execution */ +#define SQLITE_VdbeAddopTrace HI(0x0800000) /* Trace sqlite3VdbeAddOp() calls */ +#define SQLITE_VdbeEQP HI(0x1000000) /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_ParserTrace HI(0x2000000) /* PRAGMA parser_trace=ON */ #endif /* diff --git a/src/tclsqlite.c b/src/tclsqlite.c index a78d5676c7..d296af8f9f 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -1917,33 +1917,33 @@ static int SQLITE_TCLAPI DbObjCmd( "authorizer", "backup", "bind_fallback", "busy", "cache", "changes", "close", "collate", "collation_needed", - "commit_hook", "complete", "copy", - "deserialize", "enable_load_extension", "errorcode", - "eval", "exists", "function", - "incrblob", "interrupt", "last_insert_rowid", - "nullvalue", "onecolumn", "preupdate", - "profile", "progress", "rekey", - "restore", "rollback_hook", "serialize", - "status", "timeout", "total_changes", - "trace", "trace_v2", "transaction", - "unlock_notify", "update_hook", "version", - "wal_hook", 0 + "commit_hook", "complete", "config", + "copy", "deserialize", "enable_load_extension", + "errorcode", "eval", "exists", + "function", "incrblob", "interrupt", + "last_insert_rowid", "nullvalue", "onecolumn", + "preupdate", "profile", "progress", + "rekey", "restore", "rollback_hook", + "serialize", "status", "timeout", + "total_changes", "trace", "trace_v2", + "transaction", "unlock_notify", "update_hook", + "version", "wal_hook", 0 }; enum DB_enum { DB_AUTHORIZER, DB_BACKUP, DB_BIND_FALLBACK, DB_BUSY, DB_CACHE, DB_CHANGES, DB_CLOSE, DB_COLLATE, DB_COLLATION_NEEDED, - DB_COMMIT_HOOK, DB_COMPLETE, DB_COPY, - DB_DESERIALIZE, DB_ENABLE_LOAD_EXTENSION,DB_ERRORCODE, - DB_EVAL, DB_EXISTS, DB_FUNCTION, - DB_INCRBLOB, DB_INTERRUPT, DB_LAST_INSERT_ROWID, - DB_NULLVALUE, DB_ONECOLUMN, DB_PREUPDATE, - DB_PROFILE, DB_PROGRESS, DB_REKEY, - DB_RESTORE, DB_ROLLBACK_HOOK, DB_SERIALIZE, - DB_STATUS, DB_TIMEOUT, DB_TOTAL_CHANGES, - DB_TRACE, DB_TRACE_V2, DB_TRANSACTION, - DB_UNLOCK_NOTIFY, DB_UPDATE_HOOK, DB_VERSION, - DB_WAL_HOOK + DB_COMMIT_HOOK, DB_COMPLETE, DB_CONFIG, + DB_COPY, DB_DESERIALIZE, DB_ENABLE_LOAD_EXTENSION, + DB_ERRORCODE, DB_EVAL, DB_EXISTS, + DB_FUNCTION, DB_INCRBLOB, DB_INTERRUPT, + DB_LAST_INSERT_ROWID, DB_NULLVALUE, DB_ONECOLUMN, + DB_PREUPDATE, DB_PROFILE, DB_PROGRESS, + DB_REKEY, DB_RESTORE, DB_ROLLBACK_HOOK, + DB_SERIALIZE, DB_STATUS, DB_TIMEOUT, + DB_TOTAL_CHANGES, DB_TRACE, DB_TRACE_V2, + DB_TRANSACTION, DB_UNLOCK_NOTIFY, DB_UPDATE_HOOK, + DB_VERSION, DB_WAL_HOOK }; /* don't leave trailing commas on DB_enum, it confuses the AIX xlc compiler */ @@ -2331,6 +2331,76 @@ static int SQLITE_TCLAPI DbObjCmd( break; } + /* $db config ?OPTION? ?BOOLEAN? + ** + ** Configure the database connection using the sqlite3_db_config() + ** interface. + */ + case DB_CONFIG: { + static const struct DbConfigChoices { + const char *zName; + int op; + } aDbConfig[] = { + { "enable_fkey", SQLITE_DBCONFIG_ENABLE_FKEY }, + { "enable_trigger", SQLITE_DBCONFIG_ENABLE_TRIGGER }, + { "enable_view", SQLITE_DBCONFIG_ENABLE_VIEW }, + { "fts3_tokenizer", SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER }, + { "load_extension", SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION }, + { "no_ckpt_on_close", SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE }, + { "enable_qpsg", SQLITE_DBCONFIG_ENABLE_QPSG }, + { "trigger_eqp", SQLITE_DBCONFIG_TRIGGER_EQP }, + { "reset_database", SQLITE_DBCONFIG_RESET_DATABASE }, + { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, + { "writable_schema", SQLITE_DBCONFIG_WRITABLE_SCHEMA }, + { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, + { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, + { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, + }; + Tcl_Obj *pResult; + int ii; + if( objc>4 ){ + Tcl_WrongNumArgs(interp, 2, objv, "?OPTION? ?BOOLEAN?"); + return TCL_ERROR; + } + if( objc==2 ){ + /* With no arguments, list all configuration options and with the + ** current value */ + pResult = Tcl_NewListObj(0,0); + for(ii=0; iidb, aDbConfig[ii].op, -1, &v); + if( rc!=SQLITE_OK ) continue; + Tcl_ListObjAppendElement(interp, pResult, + Tcl_NewStringObj(aDbConfig[ii].zName,-1)); + Tcl_ListObjAppendElement(interp, pResult, + Tcl_NewIntObj(v)); + } + }else{ + const char *zOpt = Tcl_GetString(objv[2]); + int rc; + int onoff = -1; + int v = 0; + if( zOpt[0]=='-' ) zOpt++; + for(ii=0; ii=sizeof(aDbConfig)/sizeof(aDbConfig[0]) ){ + Tcl_AppendResult(interp, "unknown config option: \"", zOpt, + "\"", (void*)0); + return TCL_ERROR; + } + if( objc==4 ){ + if( Tcl_GetBooleanFromObj(interp, objv[3], &onoff) ){ + return TCL_ERROR; + } + } + rc = sqlite3_db_config(pDb->db, aDbConfig[ii].op, onoff, &v); + pResult = Tcl_NewIntObj(v); + } + Tcl_SetObjResult(interp, pResult); + break; + } + /* $db copy conflict-algorithm table filename ?SEPARATOR? ?NULLINDICATOR? ** ** Copy data into table from filename, optionally using SEPARATOR diff --git a/test/tclsqlite.test b/test/tclsqlite.test index 319737426f..02f8dd9db8 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -42,7 +42,7 @@ do_test tcl-1.1.1 { do_test tcl-1.2 { set v [catch {db bogus} msg] lappend v $msg -} {1 {bad option "bogus": must be authorizer, backup, bind_fallback, busy, cache, changes, close, collate, collation_needed, commit_hook, complete, copy, deserialize, enable_load_extension, errorcode, eval, exists, function, incrblob, interrupt, last_insert_rowid, nullvalue, onecolumn, preupdate, profile, progress, rekey, restore, rollback_hook, serialize, status, timeout, total_changes, trace, trace_v2, transaction, unlock_notify, update_hook, version, or wal_hook}} +} {1 {bad option "bogus": must be authorizer, backup, bind_fallback, busy, cache, changes, close, collate, collation_needed, commit_hook, complete, config, copy, deserialize, enable_load_extension, errorcode, eval, exists, function, incrblob, interrupt, last_insert_rowid, nullvalue, onecolumn, preupdate, profile, progress, rekey, restore, rollback_hook, serialize, status, timeout, total_changes, trace, trace_v2, transaction, unlock_notify, update_hook, version, or wal_hook}} do_test tcl-1.2.1 { set v [catch {db cache bogus} msg] lappend v $msg diff --git a/test/view.test b/test/view.test index 490dc65a68..b3f50dc008 100644 --- a/test/view.test +++ b/test/view.test @@ -38,6 +38,18 @@ do_test view-1.1 { SELECT * FROM v1 ORDER BY a; } } {1 2 4 5 7 8} +do_test view-1.1.100 { + db config enable_view off + catchsql { + SELECT * FROM v1 ORDER BY a; + } +} {1 {access to view "v1" prohibited}} +do_test view-1.1.110 { + db config enable_view on + catchsql { + SELECT * FROM v1 ORDER BY a; + } +} {0 {1 2 4 5 7 8}} do_test view-1.2 { catchsql { ROLLBACK; From 4043cfef7590c5a8b90cfbee44b45f6ca8bbf176 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 15 Aug 2019 23:11:42 +0000 Subject: [PATCH 122/221] Fix harmless compiler warnings in the TCL interface. FossilOrigin-Name: f17e72291f197a92b3e15e054271b997d45211a5a31ca4ea6c7fbb33026d5f1f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 6 ++---- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index de79942910..d1c778bab0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_DBCONFIG_ENABLE_VIEW\soption,\stogether\swith\sa\s"db\sconfig"\ncommand\sin\sthe\sTCL\sinterface\sthat\scan\saccess\sthat\soption\sas\swell\sas\sall\sthe\nother\ssqlite3_db_config()\sboolean\soptions. -D 2019-08-15T21:27:20.669 +C Fix\sharmless\scompiler\swarnings\sin\sthe\sTCL\sinterface. +D 2019-08-15T23:11:42.012 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -532,7 +532,7 @@ F src/sqliteInt.h d8e878fa1cb949ee8943f51965cbb917acdb4cc1238af8481eb839d11bf34d F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c 172792eb66e9a8985e8a246e689318cadbda50e10c13f0e51eea32215c6c9161 +F src/tclsqlite.c 2170b327318f888aa3ed861a6ef3e88c6906839f584ab2b01552c8b19db6f9e5 F src/test1.c 87059457fb90b73a74044b379fe2cb0aefbb53c010c646ecaff23179a423638c F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 98357d8c1263920b33a3648ef9214a63c99728bafa7a8d3dd6a1241b2303fd42 -R 039c157cf6533868154794e96c549de4 +P 61b4bccd2984f4c2cf50f58ef08677588e57aa7e079af07473b2e188d9ce4f52 +R ad07753edbdb65bae98d204ed9a7c2cb U drh -Z 9ba4f898522b0ea8e4f41f060393ee57 +Z f83b80ce99769ab61a563e51215a8c91 diff --git a/manifest.uuid b/manifest.uuid index 6e0115e877..5e9e71cf03 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61b4bccd2984f4c2cf50f58ef08677588e57aa7e079af07473b2e188d9ce4f52 \ No newline at end of file +f17e72291f197a92b3e15e054271b997d45211a5a31ca4ea6c7fbb33026d5f1f \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index d296af8f9f..8b32bf82de 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -2368,8 +2368,7 @@ static int SQLITE_TCLAPI DbObjCmd( pResult = Tcl_NewListObj(0,0); for(ii=0; iidb, aDbConfig[ii].op, -1, &v); - if( rc!=SQLITE_OK ) continue; + sqlite3_db_config(pDb->db, aDbConfig[ii].op, -1, &v); Tcl_ListObjAppendElement(interp, pResult, Tcl_NewStringObj(aDbConfig[ii].zName,-1)); Tcl_ListObjAppendElement(interp, pResult, @@ -2377,7 +2376,6 @@ static int SQLITE_TCLAPI DbObjCmd( } }else{ const char *zOpt = Tcl_GetString(objv[2]); - int rc; int onoff = -1; int v = 0; if( zOpt[0]=='-' ) zOpt++; @@ -2394,7 +2392,7 @@ static int SQLITE_TCLAPI DbObjCmd( return TCL_ERROR; } } - rc = sqlite3_db_config(pDb->db, aDbConfig[ii].op, onoff, &v); + sqlite3_db_config(pDb->db, aDbConfig[ii].op, onoff, &v); pResult = Tcl_NewIntObj(v); } Tcl_SetObjResult(interp, pResult); From 15750a26fa7127af7b1aa3e3a2046f5379eaca43 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 16 Aug 2019 21:07:19 +0000 Subject: [PATCH 123/221] Add support for using indexes for some ORDER BY clauses that use non-default NULL handling. Still some problems on this branch. FossilOrigin-Name: 81069d7196857e909c94195d67388f71bc9f832eafd9156d8c5cdddb63513b4a --- manifest | 22 +++++------- manifest.uuid | 2 +- src/where.c | 32 ++++++++++++----- src/whereInt.h | 6 ++-- src/wherecode.c | 94 ++++++++++++++++++++++++++++-------------------- test/nulls1.test | 46 ++++++++++++++++++++---- 6 files changed, 133 insertions(+), 69 deletions(-) diff --git a/manifest b/manifest index 168990dfe6..32086b8fc1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Experimental\simplementation\sof\sNULLS\sFIRST/LAST.\sThis\sbranch\sstill\shas\sproblems\s-\sthe\smost\ssignificant\sof\swhich\sis\sthat\sORDER\sBY\sclauses\swith\sa\snon-default\sNULLS\sFIRST/LAST\squalifier\scan\snever\suse\san\sindex. -D 2019-08-12T16:36:38.041 +C Add\ssupport\sfor\susing\sindexes\sfor\ssome\sORDER\sBY\sclauses\sthat\suse\snon-default\sNULL\shandling.\sStill\ssome\sproblems\son\sthis\sbranch. +D 2019-08-16T21:07:19.697 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,9 +609,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 83fc2acadfbb1c86501fc0847fd068040ecd9a250a2fc0b81bab5698aa4bc72d -F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb -F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 +F src/where.c c4ec116264555c512edf49ef7244113cad5028bd1ea70f3500982b7c10f9a121 +F src/whereInt.h 807766a6a92893dbba8a887e5b13466d2257ce07a84cf1be0aae2c41aee3bf4f +F src/wherecode.c 58889def15cb57375a5f4f83db6d2b28b372d87cf1b4f23e47928a4847a94ae4 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc F src/window.c 4d56fc1e3dbd3a4fa0653b3f48a3ad7066d0da91d0273cff8bab13c3412ddaf5 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1182,7 +1182,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test eac9f46d9bf7a3883700bbc063e8a64fa2f4677ea64f12e173d3052d635f6b23 +F test/nulls1.test 522f0da68881b6ac616b1361fbd5a9897bd366597809495143968af743e3318c F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1837,11 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 636ca4472c9f41eb3989f28854d4968867837399a2092f389d1b814d98cccbae -R 6d8a33d8edc53ea630705f876c1c3795 -T *branch * nulls-last -T *sym-nulls-last * -T +closed 8174b2ca587e87083950ab21a47b4b4fe4bf309a8e16a82d4dc26d2c471e28cc -T -sym-trunk * +P 07babb0f897fc8c9cb5b30481899c32fdd743f3f3ca508d8d957826252107dd5 +R 39b3bc3a5371ac212f22834b463e006c U dan -Z 02a41ef53191d3d08ca3291791a40934 +Z d691c31e642275ddd26770c7946ed411 diff --git a/manifest.uuid b/manifest.uuid index 3ff2df6757..ef8a25f596 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -07babb0f897fc8c9cb5b30481899c32fdd743f3f3ca508d8d957826252107dd5 \ No newline at end of file +81069d7196857e909c94195d67388f71bc9f832eafd9156d8c5cdddb63513b4a \ No newline at end of file diff --git a/src/where.c b/src/where.c index 202db50bfc..663dcdc4e0 100644 --- a/src/where.c +++ b/src/where.c @@ -3798,7 +3798,7 @@ static i8 wherePathSatisfiesOrderBy( */ if( pIndex ){ iColumn = pIndex->aiColumn[j]; - revIdx = pIndex->aSortOrder[j]; + revIdx = pIndex->aSortOrder[j] & KEYINFO_ORDER_DESC; if( iColumn==pIndex->pTable->iPKey ) iColumn = XN_ROWID; }else{ iColumn = XN_ROWID; @@ -3836,7 +3836,6 @@ static i8 wherePathSatisfiesOrderBy( continue; } } - if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) continue; if( iColumn!=XN_ROWID ){ pColl = sqlite3ExprNNCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) continue; @@ -3850,24 +3849,29 @@ static i8 wherePathSatisfiesOrderBy( if( isMatch && (wctrlFlags & WHERE_GROUPBY)==0 ){ /* Make sure the sort order is compatible in an ORDER BY clause. ** Sort order is irrelevant for a GROUP BY clause. */ - assert( (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL)==0 ); if( revSet ){ - if( (rev ^ revIdx)!=pOrderBy->a[i].sortFlags ) isMatch = 0; + if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){ + isMatch = 0; + } }else{ - rev = revIdx ^ pOrderBy->a[i].sortFlags; + rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC); if( rev ) *pRevMask |= MASKBIT(iLoop); revSet = 1; } } + if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){ + if( j==pLoop->u.btree.nEq ){ + pLoop->wsFlags |= WHERE_BIGNULL_SORT; + }else{ + isMatch = 0; + } + } if( isMatch ){ if( iColumn==XN_ROWID ){ testcase( distinctColumns==0 ); distinctColumns = 1; } obSat |= MASKBIT(i); - if( (wctrlFlags & WHERE_ORDERBY_MIN) && j==pLoop->u.btree.nEq ){ - pLoop->wsFlags |= WHERE_MIN_ORDERED; - } }else{ /* No match found */ if( j==0 || jwsFlags & WHERE_CONSTRAINT)!=0 && (pLoop->wsFlags & (WHERE_COLUMN_RANGE|WHERE_SKIPSCAN))==0 + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)==0 && (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 && pWInfo->eDistinct!=WHERE_DISTINCT_ORDERED ){ @@ -5202,6 +5207,17 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ VdbeCoverageIf(v, pLevel->op==OP_Next); VdbeCoverageIf(v, pLevel->op==OP_Prev); VdbeCoverageIf(v, pLevel->op==OP_VNext); + if( pLevel->regBignull ){ + sqlite3VdbeResolveLabel(v, pLevel->addrBignull); + addr = sqlite3VdbeAddOp1(v, OP_If, pLevel->regBignull); + sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->regBignull); + sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->p2-1); + sqlite3VdbeChangeP5(v, pLevel->p5); + VdbeCoverage(v); + VdbeCoverageIf(v, pLevel->op==OP_Next); + VdbeCoverageIf(v, pLevel->op==OP_Prev); + sqlite3VdbeJumpHere(v, addr); + } #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); #endif diff --git a/src/whereInt.h b/src/whereInt.h index 09e45024c1..f402a18f8c 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -71,13 +71,15 @@ struct WhereLevel { int addrCont; /* Jump here to continue with the next loop cycle */ int addrFirst; /* First instruction of interior of the loop */ int addrBody; /* Beginning of the body of this loop */ + int regBignull; /* big-null flag register */ + int addrBignull; /* Jump here for next part of big-null scan */ #ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ int addrLikeRep; /* LIKE range processing address */ #endif u8 iFrom; /* Which entry in the FROM clause */ u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ - int p1, p2; /* Operands of the opcode used to ends the loop */ + int p1, p2; /* Operands of the opcode used to end the loop */ union { /* Information that depends on pWLoop->wsFlags */ struct { int nIn; /* Number of entries in aInLoop[] */ @@ -586,6 +588,6 @@ void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereClause*); #define WHERE_UNQ_WANTED 0x00010000 /* WHERE_ONEROW would have been helpful*/ #define WHERE_PARTIALIDX 0x00020000 /* The automatic index is partial */ #define WHERE_IN_EARLYOUT 0x00040000 /* Perhaps quit IN loops early */ -#define WHERE_MIN_ORDERED 0x00080000 /* Column nEq of index is min() expr */ +#define WHERE_BIGNULL_SORT 0x00080000 /* Column nEq of index is BIGNULL */ #endif /* !defined(SQLITE_WHEREINT_H) */ diff --git a/src/wherecode.c b/src/wherecode.c index c781b06c15..d4f26a3af0 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1549,31 +1549,12 @@ Bitmask sqlite3WhereCodeOneLoopStart( u8 bSeekPastNull = 0; /* True to seek past initial nulls */ u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ int omitTable; /* True if we use the index only */ - + int regBignull = 0; pIdx = pLoop->u.btree.pIndex; iIdxCur = pLevel->iIdxCur; assert( nEq>=pLoop->nSkip ); - /* If this loop satisfies a sort order (pOrderBy) request that - ** was passed to this function to implement a "SELECT min(x) ..." - ** query, then the caller will only allow the loop to run for - ** a single iteration. This means that the first row returned - ** should not have a NULL value stored in 'x'. If column 'x' is - ** the first one after the nEq equality constraints in the index, - ** this requires some special handling. - */ - assert( (pWInfo->pOrderBy!=0 && pWInfo->pOrderBy->nExpr==1) - || (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)==0 ); - if( pLoop->wsFlags & WHERE_MIN_ORDERED ){ - assert( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN) ); - assert( pWInfo->nOBSat ); - assert( pIdx->nColumn>nEq ); - assert( pLoop->nSkip==0 ); - bSeekPastNull = 1; - nExtraReg = 1; - } - /* Find any inequality constraint terms for the start and end ** of the range. */ @@ -1614,6 +1595,26 @@ Bitmask sqlite3WhereCodeOneLoopStart( } assert( pRangeEnd==0 || (pRangeEnd->wtFlags & TERM_VNULL)==0 ); + /* If the WHERE_BIGNULL_SORT flag is set, then index column nEq uses + ** a non-default "big-null" sort (either ASC NULLS LAST or DESC NULLS + ** FIRST). In both cases separate ordered scans are made of those + ** index entries for which the column is null and for those for which + ** it is not. For an ASC sort, the non-NULL entries are scanned first. + ** For DESC, NULL entries are scanned first. + */ + addrNxt = pLevel->addrNxt; + if( (pLoop->wsFlags & (WHERE_TOP_LIMIT|WHERE_BTM_LIMIT))==0 + && (pLoop->wsFlags & WHERE_BIGNULL_SORT)!=0 + ){ + assert( bSeekPastNull==0 && nExtraReg==0 && nBtm==0 && nTop==0 ); + assert( pRangeEnd==0 && pRangeStart==0 ); + assert( pLoop->nSkip==0 ); + nExtraReg = 1; + bSeekPastNull = 1; + pLevel->regBignull = regBignull = ++pParse->nMem; + addrNxt = pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); + } + /* If we are doing a reverse order scan on an ascending index, or ** a forward order scan on a descending index, interchange the ** start and end terms (pRangeStart and pRangeEnd). @@ -1636,7 +1637,6 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( zStartAff && nTop ){ zEndAff = sqlite3DbStrDup(db, &zStartAff[nEq]); } - addrNxt = pLevel->addrNxt; testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); @@ -1674,6 +1674,10 @@ Bitmask sqlite3WhereCodeOneLoopStart( nConstraint++; startEq = 0; start_constraints = 1; + }else if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + start_constraints = 1; + nConstraint++; } codeApplyAffinity(pParse, regBase, nConstraint - bSeekPastNull, zStartAff); if( pLoop->nSkip>0 && nConstraint==pLoop->nSkip ){ @@ -1684,6 +1688,10 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){ sqlite3VdbeAddOp1(v, OP_SeekHit, iIdxCur); } + if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_Integer, 0, regBignull); + } + op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; assert( op!=0 ); sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); @@ -1695,23 +1703,16 @@ Bitmask sqlite3WhereCodeOneLoopStart( VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); - if( bSeekPastNull && (pLoop->wsFlags & WHERE_TOP_LIMIT)==0 ){ - /* If bSeekPastNull is set only to skip past the NULL values for - ** a query like "SELECT min(a), b FROM t1", then add code so that - ** if there are no rows with (a IS NOT NULL), then do the seek - ** without jumping past NULLs instead. This allows the code in - ** select.c to pick a value for "b" in the above query. */ - assert( startEq==0 && (op==OP_SeekGT || op==OP_SeekLT) ); - assert( (pWInfo->wctrlFlags&WHERE_ORDERBY_MIN)!=0 && pWInfo->nOBSat>0 ); - sqlite3VdbeChangeP2(v, -1, sqlite3VdbeCurrentAddr(v)+1); + if( regBignull ){ sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); - - op = aStartOp[(start_constraints<<2) + (1<<1) + bRev]; - assert( op==OP_SeekGE || op==OP_SeekLE ); - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - VdbeCoverage(v); - VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); - VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + if( bStopAtNull ){ + start_constraints = (nConstraint>1); + op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint-1); + }else{ + op = aStartOp[(start_constraints<<2) + ((!startEq)<<1) + bRev]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + } } } @@ -1744,8 +1745,10 @@ Bitmask sqlite3WhereCodeOneLoopStart( endEq = 1; } }else if( bStopAtNull ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); - endEq = 0; + if( regBignull==0 ){ + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); + endEq = 0; + } nConstraint++; } sqlite3DbFree(db, zStartAff); @@ -1756,6 +1759,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( /* Check if the index cursor is past the end of the range. */ if( nConstraint ){ + if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+3); + } op = aEndOp[bRev*2 + endEq]; sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); @@ -1763,6 +1769,16 @@ Bitmask sqlite3WhereCodeOneLoopStart( testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); } + if( regBignull ){ + sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+2); + if( bStopAtNull ){ + op = aEndOp[bRev*2 + 0]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + }else{ + op = aEndOp[bRev*2 + endEq]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint+1); + } + } if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){ sqlite3VdbeAddOp2(v, OP_SeekHit, iIdxCur, 1); diff --git a/test/nulls1.test b/test/nulls1.test index 7b355e9a85..866ed2b296 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -11,21 +11,19 @@ # This file implements regression tests for SQLite library. # -#################################################### -# DO NOT EDIT! THIS FILE IS AUTOMATICALLY GENERATED! -#################################################### - set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix nulls1 +if 1 { + do_execsql_test 1.0 { DROP TABLE IF EXISTS t3; CREATE TABLE t3(a INTEGER); INSERT INTO t3 VALUES(NULL), (10), (30), (20), (NULL); } {} -for {set a 0} {$a < 2} {incr a} { +for {set a 0} {$a < 3} {incr a} { foreach {tn limit} { 1 "" 2 "LIMIT 10" @@ -47,7 +45,43 @@ for {set a 0} {$a < 2} {incr a} { " {30 20 10 {} {}} } - catchsql { CREATE INDEX i1 ON t3(a) } + switch $a { + 0 { + execsql { CREATE INDEX i1 ON t3(a) } + } + 1 { + execsql { DROP INDEX i1 ; CREATE INDEX i1 ON t3(a DESC) } + } + } } +} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 2.0 { + CREATE TABLE t2(a, b, c); + CREATE INDEX i2 ON t2(a, b); + INSERT INTO t2 VALUES(1, 1, 1); + INSERT INTO t2 VALUES(1, NULL, 2); + INSERT INTO t2 VALUES(1, NULL, 3); + INSERT INTO t2 VALUES(1, 4, 4); +} + +do_execsql_test 2.1 { + SELECT * FROM t2 WHERE a=1 ORDER BY b NULLS LAST +} { + 1 1 1 1 4 4 1 {} 2 1 {} 3 +} + +do_execsql_test 2.2 { + SELECT * FROM t2 WHERE a=1 ORDER BY b DESC NULLS FIRST +} { + 1 {} 3 + 1 {} 2 + 1 4 4 + 1 1 1 +} + + finish_test From cc5979dbd384049c1efef847e5cc22082191024b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 16 Aug 2019 22:58:29 +0000 Subject: [PATCH 124/221] Add the ability to unregister a virtual table module by invoking sqlite3_create_module() with a NULL sqlite3_module pointer. FossilOrigin-Name: 31e34fa3390196cdc3178bf120224b08df5ec58fa2c77079ede6e9461a430dad --- manifest | 24 ++++++++++---------- manifest.uuid | 2 +- src/main.c | 5 +---- src/shell.c.in | 18 +++++++++++++++ src/sqlite.h.in | 4 ++++ src/sqliteInt.h | 3 +++ src/vtab.c | 55 ++++++++++++++++++++++++++++++++++------------ test/intarray.test | 8 +++---- test/vtab1.test | 4 ++-- 9 files changed, 86 insertions(+), 37 deletions(-) diff --git a/manifest b/manifest index d1c778bab0..5feb38ed1a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\sthe\sTCL\sinterface. -D 2019-08-15T23:11:42.012 +C Add\sthe\sability\sto\sunregister\sa\svirtual\stable\smodule\sby\sinvoking\nsqlite3_create_module()\swith\sa\sNULL\ssqlite3_module\spointer. +D 2019-08-16T22:58:29.636 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c c2194dd2886337b870226fcb31c13e7df8c4b5e0ea85140e510a6f1daf1ad65b F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c -F src/main.c 9465ba2bfc021f5c2ec1f58fc97c55b123d277ad0993c49a2f333df9da483f8f +F src/main.c 1ffcd1890908444567471e72246f22595a8f63cfa84fa8f5ee7fc80c0d2a1863 F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -524,11 +524,11 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 14ae3326af3d8b94bd64a29e0369986f3125cf4c0dcb8f8dc1b8be2cd1bcdbaa F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8 -F src/shell.c.in b748cfb4277fe1952609d688b181b152dd5920425a83dab1baddbfdcb722346c -F src/sqlite.h.in fe09e2452f68148dcd2724fa1aefe0939802b4fab89355fb194aa40126ac4b51 +F src/shell.c.in d2465e7747a014bd48a75c1bcf648e8e6cb46832dcc6e1293c5f285bc5542e8b +F src/sqlite.h.in fe836f566b3517201077f4ff69ec7379b626b311ccc6e24ad5ca11c262775ca7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h d8e878fa1cb949ee8943f51965cbb917acdb4cc1238af8481eb839d11bf34d0a +F src/sqliteInt.h a89fe72e4a00652fdad88911e73ad376a351a477ec86a822f602863f01a495d3 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -604,7 +604,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vtab.c 1fa256c6ddad7a81e2a4dc080d015d4b0a7135767717d311298e47f6fca64bb3 +F src/vtab.c 4d833811e3784409627919899e1fd75ee08f0e5db6d9924eac9a0bfe0cb762dc F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1064,7 +1064,7 @@ F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 F test/instr.test 9a8802f28437d8ade53fedfc47b2ca599b4e48ba F test/instrfault.test 0f870b218ea17cd477bb19ed330eecdb460dd53a -F test/intarray.test 8319986182af37c8eb4879c6bfe9cf0074e9d43b193a4c728a0efa3417c53fb7 +F test/intarray.test bb976b0b3df0ebb6a2eddfb61768280440e672beba5460ed49679ea984ccf440 F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 @@ -1611,7 +1611,7 @@ F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 F test/view.test 10ea54300a097d7c0337fd104abffe4a4786d1598b94017a37efe0e0d3e04dd5 -F test/vtab1.test efb4c4a45146193d6d55fb85f7162febd6423f29c72ede09bb96383f49e3abc1 +F test/vtab1.test c5d9e90ed02bcacd776dcbb7360199d290f7f53c26b484ddece543060c54319f F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 61b4bccd2984f4c2cf50f58ef08677588e57aa7e079af07473b2e188d9ce4f52 -R ad07753edbdb65bae98d204ed9a7c2cb +P f17e72291f197a92b3e15e054271b997d45211a5a31ca4ea6c7fbb33026d5f1f +R cde2fc12434d097e80f94e2e70c1f8fb U drh -Z f83b80ce99769ab61a563e51215a8c91 +Z bcecf677f5410a7291761a23528080f1 diff --git a/manifest.uuid b/manifest.uuid index 5e9e71cf03..b8c13348fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f17e72291f197a92b3e15e054271b997d45211a5a31ca4ea6c7fbb33026d5f1f \ No newline at end of file +31e34fa3390196cdc3178bf120224b08df5ec58fa2c77079ede6e9461a430dad \ No newline at end of file diff --git a/src/main.c b/src/main.c index ecc7e5c518..79a17e5a5c 100644 --- a/src/main.c +++ b/src/main.c @@ -1236,11 +1236,8 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3 *db){ #ifndef SQLITE_OMIT_VIRTUALTABLE for(i=sqliteHashFirst(&db->aModule); i; i=sqliteHashNext(i)){ Module *pMod = (Module *)sqliteHashData(i); - if( pMod->xDestroy ){ - pMod->xDestroy(pMod->pAux); - } sqlite3VtabEponymousTableClear(db, pMod); - sqlite3DbFree(db, pMod); + sqlite3VtabModuleUnref(db, pMod); } sqlite3HashClear(&db->aModule); #endif diff --git a/src/shell.c.in b/src/shell.c.in index 0ffd9aece7..494a3d7e21 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3649,6 +3649,9 @@ static const char *(azHelp[]) = { " --row Trace each row (SQLITE_TRACE_ROW)", " --close Trace connection close (SQLITE_TRACE_CLOSE)", #endif /* SQLITE_OMIT_TRACE */ +#ifdef SQLITE_DEBUG + ".unmodule NAME ... Unregister virtual table modules", +#endif ".vfsinfo ?AUX? Information about the top-level VFS", ".vfslist List all available VFSes", ".vfsname ?AUX? Print the name of the VFS stack", @@ -9401,6 +9404,21 @@ static int do_meta_command(char *zLine, ShellState *p){ }else #endif /* !defined(SQLITE_OMIT_TRACE) */ +#ifdef SQLITE_DEBUG + if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ + int ii; + if( nArg<2 ){ + raw_printf(stderr, "Usage: .unmodule NAME ...\n"); + rc = 1; + goto meta_command_exit; + } + open_db(p, 0); + for(ii=1; iidb, azArg[ii], 0, 0); + } + }else +#endif + #if SQLITE_USER_AUTHENTICATION if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ if( nArg<2 ){ diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 4b1d4723bb..e0d02b2722 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -6624,6 +6624,10 @@ struct sqlite3_index_info { ** ^The sqlite3_create_module() ** interface is equivalent to sqlite3_create_module_v2() with a NULL ** destructor. +** +** ^If the third parameter (the pointer to the sqlite3_module object) is +** NULL then no new module is create and any existing modules with the +** same name are dropped. */ int sqlite3_create_module( sqlite3 *db, /* SQLite connection to register module with */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 52c982159b..07e241a1c4 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1797,6 +1797,7 @@ struct Savepoint { struct Module { const sqlite3_module *pModule; /* Callback pointers */ const char *zName; /* Name passed to create_module() */ + int nRefModule; /* Number of pointers to this object */ void *pAux; /* pAux passed to create_module() */ void (*xDestroy)(void *); /* Module destructor function */ Table *pEpoTab; /* Eponymous table for this module */ @@ -4438,6 +4439,7 @@ void sqlite3AutoLoadExtensions(sqlite3*); # define sqlite3VtabInSync(db) 0 # define sqlite3VtabLock(X) # define sqlite3VtabUnlock(X) +# define sqlite3VtabModuleUnref(D,X) # define sqlite3VtabUnlockList(X) # define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK # define sqlite3GetVTable(X,Y) ((VTable*)0) @@ -4449,6 +4451,7 @@ void sqlite3AutoLoadExtensions(sqlite3*); int sqlite3VtabCommit(sqlite3 *db); void sqlite3VtabLock(VTable *); void sqlite3VtabUnlock(VTable *); + void sqlite3VtabModuleUnref(sqlite3*,Module*); void sqlite3VtabUnlockList(sqlite3*); int sqlite3VtabSavepoint(sqlite3 *, int, int); void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); diff --git a/src/vtab.c b/src/vtab.c index 41e26ef62f..a711a7be5f 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -32,6 +32,9 @@ struct VtabCtx { ** Construct and install a Module object for a virtual table. When this ** routine is called, it is guaranteed that all appropriate locks are held ** and the module is not already part of the connection. +** +** If there already exists a module with zName, replace it with the new one. +** If pModule==0, then delete the module zName if it exists. */ Module *sqlite3VtabCreateModule( sqlite3 *db, /* Database in which module is registered */ @@ -41,25 +44,35 @@ Module *sqlite3VtabCreateModule( void (*xDestroy)(void *) /* Module destructor function */ ){ Module *pMod; - int nName = sqlite3Strlen30(zName); - pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); - if( pMod==0 ){ - sqlite3OomFault(db); + Module *pDel; + char *zCopy; + if( pModule==0 ){ + zCopy = (char*)zName; + pMod = 0; }else{ - Module *pDel; - char *zCopy = (char *)(&pMod[1]); + int nName = sqlite3Strlen30(zName); + pMod = (Module *)sqlite3Malloc(sizeof(Module) + nName + 1); + if( pMod==0 ){ + sqlite3OomFault(db); + return 0; + } + zCopy = (char *)(&pMod[1]); memcpy(zCopy, zName, nName+1); pMod->zName = zCopy; pMod->pModule = pModule; pMod->pAux = pAux; pMod->xDestroy = xDestroy; pMod->pEpoTab = 0; - pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); - assert( pDel==0 || pDel==pMod ); - if( pDel ){ + pMod->nRefModule = 1; + } + pDel = (Module *)sqlite3HashInsert(&db->aModule,zCopy,(void*)pMod); + if( pDel ){ + if( pDel==pMod ){ sqlite3OomFault(db); sqlite3DbFree(db, pDel); pMod = 0; + }else{ + sqlite3VtabModuleUnref(db, pDel); } } return pMod; @@ -80,11 +93,7 @@ static int createModule( int rc = SQLITE_OK; sqlite3_mutex_enter(db->mutex); - if( sqlite3HashFind(&db->aModule, zName) ){ - rc = SQLITE_MISUSE_BKPT; - }else{ - (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); - } + (void)sqlite3VtabCreateModule(db, zName, pModule, pAux, xDestroy); rc = sqlite3ApiExit(db, rc); if( rc!=SQLITE_OK && xDestroy ) xDestroy(pAux); sqlite3_mutex_leave(db->mutex); @@ -123,6 +132,22 @@ int sqlite3_create_module_v2( return createModule(db, zName, pModule, pAux, xDestroy); } +/* +** Decrement the reference count on a Module object. Destroy the +** module when the reference count reaches zero. +*/ +void sqlite3VtabModuleUnref(sqlite3 *db, Module *pMod){ + assert( pMod->nRefModule>0 ); + pMod->nRefModule--; + if( pMod->nRefModule==0 ){ + if( pMod->xDestroy ){ + pMod->xDestroy(pMod->pAux); + } + assert( pMod->pEpoTab==0 ); + sqlite3DbFree(db, pMod); + } +} + /* ** Lock the virtual table so that it cannot be disconnected. ** Locks nest. Every lock should have a corresponding unlock. @@ -162,6 +187,7 @@ void sqlite3VtabUnlock(VTable *pVTab){ pVTab->nRef--; if( pVTab->nRef==0 ){ sqlite3_vtab *p = pVTab->pVtab; + sqlite3VtabModuleUnref(pVTab->db, pVTab->pMod); if( p ){ p->pModule->xDisconnect(p); } @@ -566,6 +592,7 @@ static int vtabCallConstructor( ** the sqlite3_vtab object if successful. */ memset(pVTable->pVtab, 0, sizeof(pVTable->pVtab[0])); pVTable->pVtab->pModule = pMod->pModule; + pMod->nRefModule++; pVTable->nRef = 1; if( sCtx.bDeclared==0 ){ const char *zFormat = "vtable constructor did not declare schema: %s"; diff --git a/test/intarray.test b/test/intarray.test index 049f117cc2..2250027c5d 100644 --- a/test/intarray.test +++ b/test/intarray.test @@ -47,12 +47,12 @@ do_test intarray-1.1 { } } {table ia1 table ia2 table ia3 table ia4} -# Verify the inability to DROP and recreate an intarray virtual table. +# Verify the ability to DROP and recreate an intarray virtual table. do_test intarray-1.1b { db eval {DROP TABLE ia1} - set rc [catch {sqlite3_intarray_create db ia1} msg] - lappend rc $msg -} {1 SQLITE_MISUSE} + set rc [catch {sqlite3_intarray_create db ia1} ia1] + lappend rc $ia1 +} {/0 [0-9A-Z]+/} do_test intarray-1.2 { db eval { diff --git a/test/vtab1.test b/test/vtab1.test index 0a45c4e2d9..e8891a632c 100644 --- a/test/vtab1.test +++ b/test/vtab1.test @@ -1352,7 +1352,7 @@ foreach {tn sql res filter} { do_execsql_test 18.2.x { PRAGMA case_sensitive_like = OFF } #------------------------------------------------------------------------- -# Test that an existing module may not be overridden. +# Test that it is ok to override and existing module. # do_test 19.1 { sqlite3 db2 test.db @@ -1360,7 +1360,7 @@ do_test 19.1 { } SQLITE_OK do_test 19.2 { register_echo_module [sqlite3_connection_pointer db2] -} SQLITE_MISUSE +} SQLITE_OK do_test 19.3 { db2 close } {} From cc3f3d1f055e5bce28d7c7fa122ac5f922a7706b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 17 Aug 2019 15:27:58 +0000 Subject: [PATCH 125/221] Activate introspection pragmas by default. The new option SQLITE_OMIT_INTROSPECTION_PRAGMAS must be provided to keep them out. FossilOrigin-Name: 9c4bca64fb5f635296a8d7d7c1bf2808e02ca734a9983e5cee9132f5352a9a6d --- Makefile.in | 1 - Makefile.msc | 1 - main.mk | 1 - manifest | 27 +++++++++++++-------------- manifest.uuid | 2 +- src/pragma.c | 2 +- src/pragma.h | 8 ++++---- src/shell.c.in | 2 +- test/pragma5.test | 4 ++-- tool/mkpragmatab.tcl | 6 +++--- 10 files changed, 25 insertions(+), 29 deletions(-) diff --git a/Makefile.in b/Makefile.in index 8df09826fc..cadc2eda99 100644 --- a/Makefile.in +++ b/Makefile.in @@ -609,7 +609,6 @@ SHELL_OPT += -DSQLITE_ENABLE_DBPAGE_VTAB SHELL_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB SHELL_OPT += -DSQLITE_ENABLE_OFFSET_SQL_FUNC SHELL_OPT += -DSQLITE_ENABLE_DESERIALIZE -SHELL_OPT += -DSQLITE_INTROSPECTION_PRAGMAS FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 diff --git a/Makefile.msc b/Makefile.msc index e9997bd9c5..01d20d2d65 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -351,7 +351,6 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_JSON1=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBSTAT_VTAB=1 -OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_INTROSPECTION_PRAGMAS=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 !ENDIF OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 diff --git a/main.mk b/main.mk index 508554d733..5462292023 100644 --- a/main.mk +++ b/main.mk @@ -527,7 +527,6 @@ SHELL_OPT += -DSQLITE_ENABLE_STMTVTAB SHELL_OPT += -DSQLITE_ENABLE_DBPAGE_VTAB SHELL_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB SHELL_OPT += -DSQLITE_ENABLE_OFFSET_SQL_FUNC -SHELL_OPT += -DSQLITE_INTROSPECTION_PRAGMAS FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 diff --git a/manifest b/manifest index 428b9dbdb0..e9dfb2d42c 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C The\sSQLITE_DIRECTONLY\sflag,\swhen\sadded\sto\ssqlite3_create_function()\sprevents\nthe\sfunction\sfrom\sbeing\sused\sinside\sa\strigger\sor\sview. -D 2019-08-17T00:53:29.797 +C Activate\sintrospection\spragmas\sby\sdefault.\s\sThe\snew\soption\nSQLITE_OMIT_INTROSPECTION_PRAGMAS\smust\sbe\sprovided\sto\skeep\sthem\sout. +D 2019-08-17T15:27:58.078 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 4640daf826b80947a924ac44275c451ffc13007c7c866a5730c8ce5cf9e1dc74 +F Makefile.in 578f123620087ea459aa08fa872810a25ca7c0aaf16331de985bfcddb5f1e747 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 1ce5a2f754201baf709132fe5b45027c73343fba2607107821f759d78cf136c0 +F Makefile.msc a463dca3c50d8a36094fe5c8c39077907f530b54edfc5388c66c85e2cfc8dc04 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -445,7 +445,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 125adda36bb32c99dc3a11340bd029ef373b9523eac2b2af76087bfe82d4fdf8 +F main.mk 09716d345766a55b25ed157b14786526cf67c761c61d99c53e117196fb3b391a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -516,15 +516,15 @@ F src/parse.y 6d03a24bc0dcd15b93c480ea8a87f7ccd25313fe826485726d9ef13b82f2378d F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c a42d4c6040893a59b69a0c987e5ed0402730c444ee451fde9bbe6203e7f73b1d -F src/pragma.h 4a9fabff14db4487a734dfeeb4be984ce662bfdccfae16145b9c732327735e13 +F src/pragma.c b47bc7db02ab13d04c680aee424466b4e34f4ef5aa7b2e464876ec005806f98f +F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 132484635a30f873ee7eccd47f93ed1932503863b93b28423b42332d81adffaf F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c b2733d39a22f5023ab489b8535ca6854b51ff8667ca975815d004bb7388b0e41 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8 -F src/shell.c.in d2465e7747a014bd48a75c1bcf648e8e6cb46832dcc6e1293c5f285bc5542e8b +F src/shell.c.in 48f7a9ee4bfc95aaea09f45c37f0cc305f56d4840c988565cdb92df2db689c32 F src/sqlite.h.in 5445ee2844c15bf277ebb64e910b56b0e6fb9377f184a81cd9bd78f0946be8c8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 @@ -1221,7 +1221,7 @@ F test/pragma.test cf066fe0f7f5d49f4758de4986407b8676c61aaa7871599340d64f42a8edc F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c0df9 F test/pragma4.test 1cb4b32f1a304ed9e291d7c4d49c91c2c8dc1b9450e6d2c1198b2cc895d40d77 -F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983 +F test/pragma5.test 2be6a44c91e8585ccb4c71c5f221ccebe0692a49557215a912916ed391188959 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 F test/printf.test 0300699733e53101b2ce48800518427249edd4053bb50fa0621c6607482f0fdb @@ -1769,7 +1769,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl 8250ef3df54aee09f6c6ed36cad390bb6dd20bbe71927d8bff069ed9fe0bbf98 +F tool/mkpragmatab.tcl f115d63ada8171f9da28dc8e34e043a1a159692d46b89f66b6e681140bc4683d F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1836,8 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 31e34fa3390196cdc3178bf120224b08df5ec58fa2c77079ede6e9461a430dad fc745845d8d76adc165575e2192f4176e3c28e614c72571d56f4011560499fe1 -R 3eb19b0b7177f98eb83ded0471cbec7c -T +closed fc745845d8d76adc165575e2192f4176e3c28e614c72571d56f4011560499fe1 +P de767376987f7668b0770c4920f1532e341b5a27f797d69c0f5e92b87d036170 +R ba0ddacef7e202b222af2845e11208f7 U drh -Z 353e54297be426c470f9f50229f09a1d +Z 608f836d0fe4bfadfea3872ae408e744 diff --git a/manifest.uuid b/manifest.uuid index d5baa3c05c..29f3d49d56 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de767376987f7668b0770c4920f1532e341b5a27f797d69c0f5e92b87d036170 \ No newline at end of file +9c4bca64fb5f635296a8d7d7c1bf2808e02ca734a9983e5cee9132f5352a9a6d \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 6899bad6be..858e314a1e 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1245,7 +1245,7 @@ void sqlite3Pragma( } break; -#ifdef SQLITE_INTROSPECTION_PRAGMAS +#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS case PragTyp_FUNCTION_LIST: { int i; HashElem *j; diff --git a/src/pragma.h b/src/pragma.h index 11e55ee9c7..b7f3282ded 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -311,7 +311,7 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_FullFSync }, #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) -#if defined(SQLITE_INTROSPECTION_PRAGMAS) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) {/* zName: */ "function_list", /* ePragTyp: */ PragTyp_FUNCTION_LIST, /* ePragFlg: */ PragFlg_Result0, @@ -435,7 +435,7 @@ static const PragmaName aPragmaName[] = { #endif #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) #if !defined(SQLITE_OMIT_VIRTUALTABLE) -#if defined(SQLITE_INTROSPECTION_PRAGMAS) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) {/* zName: */ "module_list", /* ePragTyp: */ PragTyp_MODULE_LIST, /* ePragFlg: */ PragFlg_Result0, @@ -470,7 +470,7 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_ParserTrace }, #endif #endif -#if defined(SQLITE_INTROSPECTION_PRAGMAS) +#if !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) {/* zName: */ "pragma_list", /* ePragTyp: */ PragTyp_PRAGMA_LIST, /* ePragFlg: */ PragFlg_Result0, @@ -668,4 +668,4 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; -/* Number of pragmas: 62 on by default, 81 total. */ +/* Number of pragmas: 65 on by default, 81 total. */ diff --git a/src/shell.c.in b/src/shell.c.in index 494a3d7e21..e2c49dd3ed 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8461,7 +8461,7 @@ static int do_meta_command(char *zLine, ShellState *p){ appendText(&sSelect, ".sqlite_master", 0); } sqlite3_finalize(pStmt); -#ifdef SQLITE_INTROSPECTION_PRAGMAS +#ifndef SQLITE_OMIT_INTROSPECTION_PRAGMAS if( zName ){ appendText(&sSelect, " UNION ALL SELECT shell_module_schema(name)," diff --git a/test/pragma5.test b/test/pragma5.test index d2c58000cf..f16e4627ba 100644 --- a/test/pragma5.test +++ b/test/pragma5.test @@ -11,9 +11,9 @@ # This file implements regression tests for SQLite library. # # This file implements tests for the PRAGMA command. Specifically, -# those pragmas enabled at build time by setting: +# those pragmas that are not disabled at build time by setting: # -# -DSQLITE_INTROSPECTION_PRAGMAS +# -DSQLITE_OMIT_INTROSPECTION_PRAGMAS # set testdir [file dirname $argv0] diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 85c8cc74f8..832153916e 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -264,19 +264,19 @@ set pragma_def { FLAG: Result0 COLS: name builtin IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) - IF: defined(SQLITE_INTROSPECTION_PRAGMAS) + IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) NAME: module_list FLAG: Result0 COLS: name IF: !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) IF: !defined(SQLITE_OMIT_VIRTUALTABLE) - IF: defined(SQLITE_INTROSPECTION_PRAGMAS) + IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) NAME: pragma_list FLAG: Result0 COLS: name - IF: defined(SQLITE_INTROSPECTION_PRAGMAS) + IF: !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS) NAME: collation_list FLAG: Result0 From 9e9a67adb059733e05e0791f2ec519985eaa333c Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 17 Aug 2019 17:07:15 +0000 Subject: [PATCH 126/221] Ensure the functions that appear to be constant are not factored out of expression that originate on the right-hand side of a LEFT JOIN. Ticket [6710d2f7a13a2997] FossilOrigin-Name: 500c9152daaf11cf69d778aa8592175f6088337c6667c59af6df3a24cd81eb0e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 13 +++++++++++++ test/join.test | 15 +++++++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e9dfb2d42c..1e155600d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Activate\sintrospection\spragmas\sby\sdefault.\s\sThe\snew\soption\nSQLITE_OMIT_INTROSPECTION_PRAGMAS\smust\sbe\sprovided\sto\skeep\sthem\sout. -D 2019-08-17T15:27:58.078 +C Ensure\sthe\sfunctions\sthat\sappear\sto\sbe\sconstant\sare\snot\sfactored\sout\sof\nexpression\sthat\soriginate\son\sthe\sright-hand\sside\sof\sa\sLEFT\sJOIN.\nTicket\s[6710d2f7a13a2997] +D 2019-08-17T17:07:15.587 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 1b4f5a53a5f48ba3f718413586e0f9715cf90c684fba9038186a62728e2ebe72 +F src/expr.c abb98379d53defc742ffbfb3f6260036fdeac775643b9d0c52490d717949327e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1077,7 +1077,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test d53a3662762eff50b65da8775201e609878a27dd0885a1ae7bcde9bb46cecbc5 +F test/join.test f505c78a793b0c807d534c1cacf71c7bf96aa734f78d091721f2a6859077b7e8 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P de767376987f7668b0770c4920f1532e341b5a27f797d69c0f5e92b87d036170 -R ba0ddacef7e202b222af2845e11208f7 +P 9c4bca64fb5f635296a8d7d7c1bf2808e02ca734a9983e5cee9132f5352a9a6d +R 522398ea68495c38ea0fcdb681aed94e U drh -Z 608f836d0fe4bfadfea3872ae408e744 +Z 11aed5fc406f7abcc5b902e904ad4203 diff --git a/manifest.uuid b/manifest.uuid index 29f3d49d56..74872cc0c3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9c4bca64fb5f635296a8d7d7c1bf2808e02ca734a9983e5cee9132f5352a9a6d \ No newline at end of file +500c9152daaf11cf69d778aa8592175f6088337c6667c59af6df3a24cd81eb0e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 8f02ae569a..ef4221ff8d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3994,10 +3994,23 @@ expr_code_doover: break; } + /* TK_IF_NULL_ROW Expr nodes are inserted ahead of expressions + ** that derive from the right-hand table of a LEFT JOIN. The + ** Expr.iTable value is the table number for the right-hand table. + ** The expression is only evaluated if that table is not currently + ** on a LEFT JOIN NULL row. + */ case TK_IF_NULL_ROW: { int addrINR; + u8 okConstFactor = pParse->okConstFactor; addrINR = sqlite3VdbeAddOp1(v, OP_IfNullRow, pExpr->iTable); + /* Temporarily disable factoring of constant expressions, since + ** even though expressions may appear to be constant, they are not + ** really constant because they originate from the right-hand side + ** of a LEFT JOIN. */ + pParse->okConstFactor = 0; inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + pParse->okConstFactor = okConstFactor; sqlite3VdbeJumpHere(v, addrINR); sqlite3VdbeChangeP3(v, addrINR, inReg); break; diff --git a/test/join.test b/test/join.test index f613df85b0..25c31705c8 100644 --- a/test/join.test +++ b/test/join.test @@ -864,4 +864,19 @@ do_execsql_test join-16.100 { WHERE (b IS NOT NULL)=0; } {1 {}} +# 2019-08-17 ticket https://sqlite.org/src/tktview/6710d2f7a13a299728ab +# Ensure that constants that derive from the right-hand table of a LEFT JOIN +# are never factored out, since they are not really constant. +# +do_execsql_test join-17.100 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x); + INSERT INTO t1(x) VALUES(0),(1); + SELECT * FROM t1 LEFT JOIN (SELECT abs(1) AS y FROM t1) ON x WHERE NOT(y='a'); +} {1 1 1 1} +do_execsql_test join-17.110 { + SELECT * FROM t1 LEFT JOIN (SELECT abs(1)+2 AS y FROM t1) ON x + WHERE NOT(y='a'); +} {1 3 1 3} + finish_test From cc491f4b1bd7a07d931cd36bf5b763f9007e9916 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 17 Aug 2019 17:55:54 +0000 Subject: [PATCH 127/221] Fix problem with DESC indexes on this branch. FossilOrigin-Name: b49df1fe9b7174ebc60023179e8da628c926e59df3dc01b15d4a28e17807bb97 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 55a84428cc..d9a93aa0b4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\strunk\schanges\sinto\sthis\sbranch. -D 2019-08-17T15:47:32.932 +C Fix\sproblem\swith\sDESC\sindexes\son\sthis\sbranch. +D 2019-08-17T17:55:54.575 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 52c433208eafdc7e1750ea4622cfffb5d14d906a0a9258e07bae4b6fee182fef F src/whereInt.h 807766a6a92893dbba8a887e5b13466d2257ce07a84cf1be0aae2c41aee3bf4f -F src/wherecode.c 58889def15cb57375a5f4f83db6d2b28b372d87cf1b4f23e47928a4847a94ae4 +F src/wherecode.c 81c5d1eb909f8e1284df58367d25f748d126c475725665e7bb9b10a9bf702242 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc F src/window.c 331cdac4992c7402da01c981861f3cc989bf7b4a97dd03eb122993e670f7a588 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 81069d7196857e909c94195d67388f71bc9f832eafd9156d8c5cdddb63513b4a de767376987f7668b0770c4920f1532e341b5a27f797d69c0f5e92b87d036170 -R f0ae3249555e7bff0d2d8fdff62897ad +P db1e60800bc260cdcd604739daaba72c6b486158123fc62a3898aca4ead33cd3 +R a80a5d388fedda22f42c8717a7ac1c28 U dan -Z 9638aef683da83fd6b6a17e587485fa1 +Z 58eff66993c9d8fc329438790f4752fe diff --git a/manifest.uuid b/manifest.uuid index 7034da3e9f..4935f00760 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db1e60800bc260cdcd604739daaba72c6b486158123fc62a3898aca4ead33cd3 \ No newline at end of file +b49df1fe9b7174ebc60023179e8da628c926e59df3dc01b15d4a28e17807bb97 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index d4f26a3af0..610c45001c 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1602,7 +1602,6 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** it is not. For an ASC sort, the non-NULL entries are scanned first. ** For DESC, NULL entries are scanned first. */ - addrNxt = pLevel->addrNxt; if( (pLoop->wsFlags & (WHERE_TOP_LIMIT|WHERE_BTM_LIMIT))==0 && (pLoop->wsFlags & WHERE_BIGNULL_SORT)!=0 ){ @@ -1612,7 +1611,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( nExtraReg = 1; bSeekPastNull = 1; pLevel->regBignull = regBignull = ++pParse->nMem; - addrNxt = pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); + pLevel->addrBignull = sqlite3VdbeMakeLabel(pParse); } /* If we are doing a reverse order scan on an ascending index, or @@ -1637,6 +1636,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( zStartAff && nTop ){ zEndAff = sqlite3DbStrDup(db, &zStartAff[nEq]); } + addrNxt = (regBignull ? pLevel->addrBignull : pLevel->addrNxt); testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 ); testcase( pRangeStart && (pRangeStart->eOperator & WO_GE)!=0 ); From 8328369740b33c1de8ed362fc70e76d07f1e1159 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 17 Aug 2019 18:16:59 +0000 Subject: [PATCH 128/221] Add tests to ensure that this branch really does fix ticket [f8a7060ece]. FossilOrigin-Name: f892066425671a8a0ac923e3ad4744677f6434a66f97b91afa8141f11f179975 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/minmax4.test | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d9a93aa0b4..2584ef1bad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblem\swith\sDESC\sindexes\son\sthis\sbranch. -D 2019-08-17T17:55:54.575 +C Add\stests\sto\sensure\sthat\sthis\sbranch\sreally\sdoes\sfix\sticket\s[f8a7060ece]. +D 2019-08-17T18:16:59.747 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1150,7 +1150,7 @@ F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063 F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 -F test/minmax4.test 838fe32b812dc50778be3799767cefb5ff59bb04cff81d4f12c0708642f65151 +F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87 F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P db1e60800bc260cdcd604739daaba72c6b486158123fc62a3898aca4ead33cd3 -R a80a5d388fedda22f42c8717a7ac1c28 +P b49df1fe9b7174ebc60023179e8da628c926e59df3dc01b15d4a28e17807bb97 +R 45771ddb0f2c68cf3dbfa90b9e4149c6 U dan -Z 58eff66993c9d8fc329438790f4752fe +Z 6452b2b9b9aca3f08bbef29f8e41e25a diff --git a/manifest.uuid b/manifest.uuid index 4935f00760..b6a8464c5f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b49df1fe9b7174ebc60023179e8da628c926e59df3dc01b15d4a28e17807bb97 \ No newline at end of file +f892066425671a8a0ac923e3ad4744677f6434a66f97b91afa8141f11f179975 \ No newline at end of file diff --git a/test/minmax4.test b/test/minmax4.test index eeb8bff0bb..775fee86be 100644 --- a/test/minmax4.test +++ b/test/minmax4.test @@ -200,4 +200,37 @@ do_execsql_test 5.1 { SELECT MIN(a) FROM t1 WHERE a=123; } {123} +#------------------------------------------------------------------------- +# Tests for ticket f8a7060ece. +# +reset_db +do_execsql_test 6.1.0 { + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(NULL, 1, 'x'); + CREATE INDEX i1 ON t1(a); +} +do_execsql_test 6.1.1 { + SELECT min(a), b, c FROM t1 WHERE c='x'; +} {{} 1 x} +do_execsql_test 6.1.2 { + INSERT INTO t1 VALUES(1, 2, 'y'); +} {} +do_execsql_test 6.1.3 { + SELECT min(a), b, c FROM t1 WHERE c='x'; +} {{} 1 x} + +do_execsql_test 6.2.0 { + CREATE TABLE t0(c0 UNIQUE, c1); + INSERT INTO t0(c1) VALUES (0); + INSERT INTO t0(c0) VALUES (0); + CREATE VIEW v0(c0, c1) AS + SELECT t0.c1, t0.c0 FROM t0 WHERE CAST(t0.rowid AS INT) = 1; +} +do_execsql_test 6.2.1 { + SELECT c0, c1 FROM v0; +} {0 {}} +do_execsql_test 6.2.2 { + SELECT v0.c0, MIN(v0.c1) FROM v0; +} {0 {}} + finish_test From c324d44690c7b6dc640c46670e358d7f939e24f5 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 17 Aug 2019 19:13:49 +0000 Subject: [PATCH 129/221] When populating an ephemeral b-tree for the RHS of an IN(...) clause, avoid applying an affinity to a value that may be used later on for some other purpose. Fix for [c7a117190]. FossilOrigin-Name: 43e8b14314d876178d487c3b519296ac1de065fdcaa70768e40d684015bceb9d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 8 ++++---- test/in5.test | 17 +++++++++++++++++ 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 1e155600d1..df03417876 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthe\sfunctions\sthat\sappear\sto\sbe\sconstant\sare\snot\sfactored\sout\sof\nexpression\sthat\soriginate\son\sthe\sright-hand\sside\sof\sa\sLEFT\sJOIN.\nTicket\s[6710d2f7a13a2997] -D 2019-08-17T17:07:15.587 +C When\spopulating\san\sephemeral\sb-tree\sfor\sthe\sRHS\sof\san\sIN(...)\sclause,\savoid\sapplying\san\saffinity\sto\sa\svalue\sthat\smay\sbe\sused\slater\son\sfor\ssome\sother\spurpose.\sFix\sfor\s[c7a117190]. +D 2019-08-17T19:13:49.573 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c abb98379d53defc742ffbfb3f6260036fdeac775643b9d0c52490d717949327e +F src/expr.c 66a844757e865624c51e3c23dedf7f650adf75f799947f202aacbb1c394c3cda F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1029,7 +1029,7 @@ F test/in.test 63e642e97bc22c8fd970752fb4f0b3992a957003ea87524fe69e5a700500c500 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 -F test/in5.test 7ae37fcd4a5e198291c6ab5f31a5bb3d15397efe8b75a6736d7a95a7b8dd9e08 +F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test 62d943a02f722948f4410ee0b53c3cb39acd7c41afb083df8d7004238fe90a20 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9c4bca64fb5f635296a8d7d7c1bf2808e02ca734a9983e5cee9132f5352a9a6d -R 522398ea68495c38ea0fcdb681aed94e -U drh -Z 11aed5fc406f7abcc5b902e904ad4203 +P 500c9152daaf11cf69d778aa8592175f6088337c6667c59af6df3a24cd81eb0e +R bed36c864428d4b8c6d5512dcb77ee7b +U dan +Z a90573f564583a398fa8c41c8ec06335 diff --git a/manifest.uuid b/manifest.uuid index 74872cc0c3..d076e59ff2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -500c9152daaf11cf69d778aa8592175f6088337c6667c59af6df3a24cd81eb0e \ No newline at end of file +43e8b14314d876178d487c3b519296ac1de065fdcaa70768e40d684015bceb9d \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ef4221ff8d..41cc2724f6 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2787,7 +2787,7 @@ void sqlite3CodeRhsOfIN( int i; ExprList *pList = pExpr->x.pList; struct ExprList_item *pItem; - int r1, r2, r3; + int r1, r2; affinity = sqlite3ExprAffinity(pLeft); if( affinity<=SQLITE_AFF_NONE ){ affinity = SQLITE_AFF_BLOB; @@ -2815,9 +2815,9 @@ void sqlite3CodeRhsOfIN( } /* Evaluate the expression and insert it into the temp table */ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); + sqlite3ExprCode(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r1, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r1, 1); } sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, r2); diff --git a/test/in5.test b/test/in5.test index a5ea7c1784..6680641ff3 100644 --- a/test/in5.test +++ b/test/in5.test @@ -248,5 +248,22 @@ do_execsql_test 9.1 { SELECT * FROM t9 WHERE a IN (44, 45, 44, 45) } {44 45} +#------------------------------------------------------------------------- +# Test that ticket c7a117190 is fixed. +# +reset_db +do_execsql_test 9.0 { + CREATE TABLE t0(c0); + CREATE VIEW v0(c0) AS SELECT LOWER(CAST('1e500' AS TEXT)) FROM t0; + INSERT INTO t0(c0) VALUES (NULL); +} + +do_execsql_test 9.1 { + SELECT lower('1e500') FROM t0 WHERE rowid NOT IN (0, 0, lower('1e500')); +} {1e500} + +do_execsql_test 9.2 { + SELECT lower('1e500') FROM t0 WHERE rowid != lower('1e500'); +} {1e500} finish_test From 87ca8067af3a0d3550eb339b06cac8bd47f010fa Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 17 Aug 2019 19:31:09 +0000 Subject: [PATCH 130/221] Fix the new ability to unregister virtual table modules so that it works for the automatic PRAGMA virtual tables. FossilOrigin-Name: 5d6f4dfeea75c7dcd8c511545accb9eb4b405a02db034332249ba54794e313d2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vtab.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index df03417876..32bd5fa7b7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\spopulating\san\sephemeral\sb-tree\sfor\sthe\sRHS\sof\san\sIN(...)\sclause,\savoid\sapplying\san\saffinity\sto\sa\svalue\sthat\smay\sbe\sused\slater\son\sfor\ssome\sother\spurpose.\sFix\sfor\s[c7a117190]. -D 2019-08-17T19:13:49.573 +C Fix\sthe\snew\sability\sto\sunregister\svirtual\stable\smodules\sso\sthat\sit\sworks\nfor\sthe\sautomatic\sPRAGMA\svirtual\stables. +D 2019-08-17T19:31:09.807 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -604,7 +604,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vtab.c 4d833811e3784409627919899e1fd75ee08f0e5db6d9924eac9a0bfe0cb762dc +F src/vtab.c 994a4686197c00cee75f4ade8645e7336d8bb612c80ed61f4b8b7ceecf0a32ea F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 500c9152daaf11cf69d778aa8592175f6088337c6667c59af6df3a24cd81eb0e -R bed36c864428d4b8c6d5512dcb77ee7b -U dan -Z a90573f564583a398fa8c41c8ec06335 +P 43e8b14314d876178d487c3b519296ac1de065fdcaa70768e40d684015bceb9d +R f1b8fe83962102831e60e3831104d937 +U drh +Z 2bda6aa8d3d9e8159fe6c0f170b565ec diff --git a/manifest.uuid b/manifest.uuid index d076e59ff2..3e15bb7e94 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -43e8b14314d876178d487c3b519296ac1de065fdcaa70768e40d684015bceb9d \ No newline at end of file +5d6f4dfeea75c7dcd8c511545accb9eb4b405a02db034332249ba54794e313d2 \ No newline at end of file diff --git a/src/vtab.c b/src/vtab.c index a711a7be5f..8f6db9f47b 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -72,6 +72,7 @@ Module *sqlite3VtabCreateModule( sqlite3DbFree(db, pDel); pMod = 0; }else{ + sqlite3VtabEponymousTableClear(db, pDel); sqlite3VtabModuleUnref(db, pDel); } } From 5df84280692df828b2c76d5a3a7ebf4c877f3900 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 17 Aug 2019 19:45:25 +0000 Subject: [PATCH 131/221] The experimental sqlite3_drop_modules_except() interface. FossilOrigin-Name: 0851db4d337a87f8b2d3ce2ae9f9c928b9483591ca41a9e39cc01548059b1888 --- manifest | 21 ++++++++++++--------- manifest.uuid | 2 +- src/shell.c.in | 20 +++++++++++++++----- src/sqlite.h.in | 15 +++++++++++++++ src/test1.c | 27 +++++++++++++++++++++++++++ src/vtab.c | 22 ++++++++++++++++++++++ 6 files changed, 92 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 32bd5fa7b7..97b204c96f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\snew\sability\sto\sunregister\svirtual\stable\smodules\sso\sthat\sit\sworks\nfor\sthe\sautomatic\sPRAGMA\svirtual\stables. -D 2019-08-17T19:31:09.807 +C The\sexperimental\ssqlite3_drop_modules_except()\sinterface. +D 2019-08-17T19:45:25.613 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,8 +524,8 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c b2733d39a22f5023ab489b8535ca6854b51ff8667ca975815d004bb7388b0e41 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8 -F src/shell.c.in 48f7a9ee4bfc95aaea09f45c37f0cc305f56d4840c988565cdb92df2db689c32 -F src/sqlite.h.in 5445ee2844c15bf277ebb64e910b56b0e6fb9377f184a81cd9bd78f0946be8c8 +F src/shell.c.in e0754f1d73c8e7d09548a29537e9e7d65fa0f4869c41722b7b89a64d9cdeff91 +F src/sqlite.h.in cbc4729565b6787c462fffac540b912acc24b32d22428f07d2cf3a937ba7a72e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 F src/sqliteInt.h b7d612d9c63abc8a8a7dcf7fbec5326b1770f40c81502c56f508e272154e7615 @@ -533,7 +533,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 50c93be3e1c03b4e6cf6756e5197afcfe7f5cd0497d83a7ac317cde09e19b290 -F src/test1.c 87059457fb90b73a74044b379fe2cb0aefbb53c010c646ecaff23179a423638c +F src/test1.c 17f5334199c02e69292d826ba660f0fcb75f50f7686a76553afb55a2c74e87f7 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -604,7 +604,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vtab.c 994a4686197c00cee75f4ade8645e7336d8bb612c80ed61f4b8b7ceecf0a32ea +F src/vtab.c 8849cbd67596bebe58e2095fb95309aa3c5bf330d5501ec2b2511109de5a8f13 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1836,7 +1836,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 43e8b14314d876178d487c3b519296ac1de065fdcaa70768e40d684015bceb9d -R f1b8fe83962102831e60e3831104d937 +P 5d6f4dfeea75c7dcd8c511545accb9eb4b405a02db034332249ba54794e313d2 +R 1452e34f48dd7f53a8de382ba3305e88 +T *branch * sqlite3_drop_modules_except +T *sym-sqlite3_drop_modules_except * +T -sym-trunk * U drh -Z 2bda6aa8d3d9e8159fe6c0f170b565ec +Z 3751a55606ec64d5cdbb771325aed7c0 diff --git a/manifest.uuid b/manifest.uuid index 3e15bb7e94..9cc49bf88f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d6f4dfeea75c7dcd8c511545accb9eb4b405a02db034332249ba54794e313d2 \ No newline at end of file +0851db4d337a87f8b2d3ce2ae9f9c928b9483591ca41a9e39cc01548059b1888 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index e2c49dd3ed..9bfca22e53 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3651,6 +3651,7 @@ static const char *(azHelp[]) = { #endif /* SQLITE_OMIT_TRACE */ #ifdef SQLITE_DEBUG ".unmodule NAME ... Unregister virtual table modules", + " --allexcept Unregister everything except those named", #endif ".vfsinfo ?AUX? Information about the top-level VFS", ".vfslist List all available VFSes", @@ -6892,7 +6893,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int nArg = 0; int n, c; int rc = 0; - char *azArg[50]; + char *azArg[52]; #ifndef SQLITE_OMIT_VIRTUALTABLE if( p->expert.pExpert ){ @@ -6902,7 +6903,7 @@ static int do_meta_command(char *zLine, ShellState *p){ /* Parse the input line into tokens. */ - while( zLine[h] && nArgdb, azArg[ii], 0, 0); + zOpt = azArg[1]; + if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; + if( strcmp(zOpt, "-allexcept")==0 ){ + assert( azArg[nArg]==0 ); + sqlite3_drop_modules_except(p->db, nArg>2 ? (const char**)(azArg+2) : 0); + }else{ + for(ii=1; iidb, azArg[ii], 0, 0); + } } }else #endif diff --git a/src/sqlite.h.in b/src/sqlite.h.in index ed5e2922c6..ace4da70b1 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -6654,6 +6654,21 @@ int sqlite3_create_module_v2( void(*xDestroy)(void*) /* Module destructor function */ ); +/* +** CAPI3REF: Remove Unnecessary Virtual Table Implementations +** METHOD: sqlite3 +** +** ^The sqlite3_drop_modules_except(D,L) interface removes all virtual +** table modules from database connection D except those named on list L. +** The L parameter must be either NULL or a pointer to an array of pointers +** to strings where the array is terminated by a single NULL pointer. +** ^If the L parameter is NULL, then all virtual table modules are removed. +*/ +int sqlite3_drop_modules_except( + sqlite3 *db, /* Remove modules from this connection */ + const char **azKeep /* Except, do not remove the ones named here */ +); + /* ** CAPI3REF: Virtual Table Instance Object ** KEYWORDS: sqlite3_vtab diff --git a/src/test1.c b/src/test1.c index 6bc64e7626..7243339056 100644 --- a/src/test1.c +++ b/src/test1.c @@ -1110,6 +1110,32 @@ static int SQLITE_TCLAPI test_create_function( return TCL_OK; } +/* +** Usage: sqlite3_drop_modules_except DB ?NAME ...? +** +** Invoke the sqlite3_drop_modules_except(D,L) interface on database +** connection DB, in order to drop all modules except those named in +** the argument. +*/ +static int SQLITE_TCLAPI test_drop_except( + void *NotUsed, + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ + int argc, /* Number of arguments */ + char **argv /* Text of each argument */ +){ + int rc; + sqlite3 *db; + + if( argc!=2 ){ + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " DB\"", 0); + return TCL_ERROR; + } + if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; + sqlite3_drop_modules_except(db, argc>2 ? (const char**)(argv+2) : 0); + return TCL_OK; +} + /* ** Routines to implement the x_count() aggregate function. ** @@ -7860,6 +7886,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_close_v2", (Tcl_CmdProc*)sqlite_test_close_v2 }, { "sqlite3_create_function", (Tcl_CmdProc*)test_create_function }, { "sqlite3_create_aggregate", (Tcl_CmdProc*)test_create_aggregate }, + { "sqlite3_drop_modules_except", (Tcl_CmdProc*)test_drop_except }, { "sqlite_register_test_function", (Tcl_CmdProc*)test_register_func }, { "sqlite_abort", (Tcl_CmdProc*)sqlite_abort }, { "sqlite_bind", (Tcl_CmdProc*)test_bind }, diff --git a/src/vtab.c b/src/vtab.c index 8f6db9f47b..760993120c 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -133,6 +133,28 @@ int sqlite3_create_module_v2( return createModule(db, zName, pModule, pAux, xDestroy); } +/* +** External API to drop all virtual-table modules, except those named +** on the azNames list. +*/ +int sqlite3_drop_modules_except(sqlite3 *db, const char** azNames){ + HashElem *pThis, *pNext; +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; +#endif + for(pThis=sqliteHashFirst(&db->aModule); pThis; pThis=pNext){ + Module *pMod = (Module*)sqliteHashData(pThis); + pNext = sqliteHashNext(pThis); + if( azNames ){ + int ii; + for(ii=0; azNames[ii]!=0 && strcmp(azNames[ii],pMod->zName)!=0; ii++){} + if( azNames[ii]!=0 ) continue; + } + createModule(db, pMod->zName, 0, 0, 0); + } + return SQLITE_OK; +} + /* ** Decrement the reference count on a Module object. Destroy the ** module when the reference count reaches zero. From 5976b2c80533728e974c2dfb2a6abc8f1acaf3b6 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 17 Aug 2019 19:55:26 +0000 Subject: [PATCH 132/221] Fix to the query planner for the LSM1 extension. FossilOrigin-Name: 7496e872a1a50ac65ad04709365a43038fb015ac9c690196de3cb02ce54c2e57 --- ext/lsm1/lsm_vtab.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/lsm1/lsm_vtab.c b/ext/lsm1/lsm_vtab.c index fe7c160b62..f96a6bbd71 100644 --- a/ext/lsm1/lsm_vtab.c +++ b/ext/lsm1/lsm_vtab.c @@ -842,7 +842,7 @@ static int lsm1BestIndex( const struct sqlite3_index_constraint *pConstraint; pConstraint = pIdxInfo->aConstraint; - for(i=0; inConstraint && idxNum<16; i++, pConstraint++){ + for(i=0; inConstraint; i++, pConstraint++){ if( pConstraint->usable==0 ) continue; if( pConstraint->iColumn!=0 ) continue; switch( pConstraint->op ){ diff --git a/manifest b/manifest index 32bd5fa7b7..1305dd6a16 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\snew\sability\sto\sunregister\svirtual\stable\smodules\sso\sthat\sit\sworks\nfor\sthe\sautomatic\sPRAGMA\svirtual\stables. -D 2019-08-17T19:31:09.807 +C Fix\sto\sthe\squery\splanner\sfor\sthe\sLSM1\sextension. +D 2019-08-17T19:55:26.642 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -269,7 +269,7 @@ F ext/lsm1/lsm_str.c 65e361b488c87b10bf3e5c0070b14ffc602cf84f094880bece77bbf6678 F ext/lsm1/lsm_tree.c 682679d7ef2b8b6f2fe77aeb532c8d29695bca671c220b0abac77069de5fb9fb F ext/lsm1/lsm_unix.c 57361bcf5b1a1a028f5d66571ee490e9064d2cfb145a2cc9e5ddade467bb551b F ext/lsm1/lsm_varint.c 43f954af668a66c7928b81597c14d6ad4be9fedbc276bbd80f52fa28a02fdb62 -F ext/lsm1/lsm_vtab.c 529255dc704289001b225d97e57e0cfa14b29c3f281c7349cfa8fdb655de79ae +F ext/lsm1/lsm_vtab.c 169bfe7ef8e6c9de9c77e17c4c50c9ae55fb0167d80be3d1be82c991184b6f35 F ext/lsm1/lsm_win32.c 0a4acbd7e8d136dd3a5753f0a9e7a9802263a9d96cef3278cf120bcaa724db7c F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1dedaf04a8774a6d8d82 F ext/lsm1/test/lsm1_simple.test ca949efefa102f4644231dcd9291d8cda7699a4ce1006b26e0e3fcb72233f422 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 43e8b14314d876178d487c3b519296ac1de065fdcaa70768e40d684015bceb9d -R f1b8fe83962102831e60e3831104d937 +P 5d6f4dfeea75c7dcd8c511545accb9eb4b405a02db034332249ba54794e313d2 +R bd11da9af99d4a05979e56c686a272e3 U drh -Z 2bda6aa8d3d9e8159fe6c0f170b565ec +Z e640ff9ea98c214eb3589753b7432e52 diff --git a/manifest.uuid b/manifest.uuid index 3e15bb7e94..0c50b90553 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d6f4dfeea75c7dcd8c511545accb9eb4b405a02db034332249ba54794e313d2 \ No newline at end of file +7496e872a1a50ac65ad04709365a43038fb015ac9c690196de3cb02ce54c2e57 \ No newline at end of file From dac7e69dc2bbfa895cb31c2f9305c11ff4fba51c Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 17 Aug 2019 19:58:26 +0000 Subject: [PATCH 133/221] Add some extra tests for the lsm virtual table module. FossilOrigin-Name: 4cb009b0f724f72eaea90e45488122f7c2a7d0caf31a8422da4060469507e921 --- ext/lsm1/Makefile | 4 +-- ext/lsm1/test/lsm1_simple.test | 59 ++++++++++++++++++++++++++++++++++ manifest | 16 ++++----- manifest.uuid | 2 +- 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/ext/lsm1/Makefile b/ext/lsm1/Makefile index 7022b5682c..7056432d2d 100644 --- a/ext/lsm1/Makefile +++ b/ext/lsm1/Makefile @@ -43,10 +43,10 @@ LSMTESTSRC = $(LSMDIR)/lsm-test/lsmtest1.c $(LSMDIR)/lsm-test/lsmtest2.c \ # all: lsm.so -LSMOPTS += -DLSM_MUTEX_PTHREADS=1 -I$(LSMDIR) -DHAVE_ZLIB +LSMOPTS += -fPIC -DLSM_MUTEX_PTHREADS=1 -I$(LSMDIR) -DHAVE_ZLIB lsm.so: $(LSMOBJ) - $(TCCX) -shared -o lsm.so $(LSMOBJ) + $(TCCX) -shared -fPIC -o lsm.so $(LSMOBJ) %.o: $(LSMDIR)/%.c $(LSMHDR) sqlite3.h $(TCCX) $(LSMOPTS) -c $< diff --git a/ext/lsm1/test/lsm1_simple.test b/ext/lsm1/test/lsm1_simple.test index bc0cb4c660..2eab50a83a 100644 --- a/ext/lsm1/test/lsm1_simple.test +++ b/ext/lsm1/test/lsm1_simple.test @@ -88,6 +88,65 @@ do_execsql_test 210 { do_execsql_test 211 { SELECT quote(a), quote(lsm1_key), quote(lsm1_value), '|' FROM x1; } {'12' X'3132' X'05320000000000000A401FFB42ABE9DB' | '15' X'3135' X'4284C6' | '8' X'38' X'2162616E6A6F1633323105' |} +do_execsql_test 212 { + SELECT quote(a), quote(lsm1_key), quote(lsm1_value) FROM x1 WHERE a='12'; +} {'12' X'3132' X'05320000000000000A401FFB42ABE9DB'} +#------------------------------------------------------------------------- +reset_db +forcedelete testlsm.db +load_lsm1_vtab db +do_execsql_test 300 { + CREATE VIRTUAL TABLE x1 USING lsm1(testlsm.db,a,TEXT,b,c,d); +} +do_eqp_test 310 { + SELECT * FROM x1 WHERE a=? +} {SCAN TABLE x1 VIRTUAL TABLE INDEX 0:} + +do_eqp_test 320 { + SELECT * FROM x1 WHERE a>? +} {SCAN TABLE x1 VIRTUAL TABLE INDEX 2:} + +do_eqp_test 330 { + SELECT * FROM x1 WHERE a 'five'; +} {4 1 3 2} +do_execsql_test 421 { + SELECT b FROM x1 WHERE a <= 'three'; +} {3 1 4 5} finish_test diff --git a/manifest b/manifest index 1305dd6a16..fe2eb7bdc4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sto\sthe\squery\splanner\sfor\sthe\sLSM1\sextension. -D 2019-08-17T19:55:26.642 +C Add\ssome\sextra\stests\sfor\sthe\slsm\svirtual\stable\smodule. +D 2019-08-17T19:58:26.438 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -229,7 +229,7 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c F ext/icu/README.txt a295e91db742b153e8dce8f7efd31d28ad1eea4df31ef4daa3eedc85be2f5138 F ext/icu/icu.c c2c7592574c08cd1270d909b8fb8797f6ea1f49e931e71dbcc25506b9b224580 F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 -F ext/lsm1/Makefile 98b0a24b45e248283d6bea4b6cb3e58d7b394edd8e96a0ac28c5fa5104813bad +F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9 F ext/lsm1/Makefile.msc f8c878b467232226de288da320e1ac71c131f5ec91e08b21f502303347260013 F ext/lsm1/lsm-test/README 87ea529d2abe615e856d4714bfe8bb185e6c2771b8612aa6298588b7b43e6f86 F ext/lsm1/lsm-test/lsmtest.h cf58528ffe0cfe535e91b44584e2ec5fb1caacdabecef0d8dcf83bf83168bf28 @@ -272,7 +272,7 @@ F ext/lsm1/lsm_varint.c 43f954af668a66c7928b81597c14d6ad4be9fedbc276bbd80f52fa28 F ext/lsm1/lsm_vtab.c 169bfe7ef8e6c9de9c77e17c4c50c9ae55fb0167d80be3d1be82c991184b6f35 F ext/lsm1/lsm_win32.c 0a4acbd7e8d136dd3a5753f0a9e7a9802263a9d96cef3278cf120bcaa724db7c F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1dedaf04a8774a6d8d82 -F ext/lsm1/test/lsm1_simple.test ca949efefa102f4644231dcd9291d8cda7699a4ce1006b26e0e3fcb72233f422 +F ext/lsm1/test/lsm1_simple.test a04d08e8661ae6fc53786c67f0bd102c6692f003e859dde03ed9ac3f12e066e5 F ext/lsm1/tool/mklsm1c.tcl f31561bbee5349f0a554d1ad7236ac1991fc09176626f529f6078e07335398b0 F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f238c240 F ext/misc/amatch.c 50a9ef2d38dabfa371f8c1904097d493271e63d58ccb0e9b79a4fa4a94e66660 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5d6f4dfeea75c7dcd8c511545accb9eb4b405a02db034332249ba54794e313d2 -R bd11da9af99d4a05979e56c686a272e3 -U drh -Z e640ff9ea98c214eb3589753b7432e52 +P 7496e872a1a50ac65ad04709365a43038fb015ac9c690196de3cb02ce54c2e57 +R 7c52be13cef9eee33da71a3e3a70b980 +U dan +Z 775a473efffe71d8a3fe393281372f17 diff --git a/manifest.uuid b/manifest.uuid index 0c50b90553..bfffac683c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7496e872a1a50ac65ad04709365a43038fb015ac9c690196de3cb02ce54c2e57 \ No newline at end of file +4cb009b0f724f72eaea90e45488122f7c2a7d0caf31a8422da4060469507e921 \ No newline at end of file From 9105fd51893062a8503c8850e5d88ad49de28495 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Aug 2019 17:26:32 +0000 Subject: [PATCH 134/221] Prevent NULLS FIRST/LAST from being used in CREATE INDEX and other statements. FossilOrigin-Name: bb9767a287097a615aeb4abdba689b10e1a1c36c016c8e55905b508075e62c86 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/build.c | 24 ++++++++++++++++++++++++ src/expr.c | 17 +++++++++++++---- src/insert.c | 3 +++ src/sqliteInt.h | 4 +++- src/trigger.c | 3 +++ test/nulls1.test | 38 ++++++++++++++++++++++++++++++++++++++ 8 files changed, 96 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 2584ef1bad..b8cb71e76a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sto\sensure\sthat\sthis\sbranch\sreally\sdoes\sfix\sticket\s[f8a7060ece]. -D 2019-08-17T18:16:59.747 +C Prevent\sNULLS\sFIRST/LAST\sfrom\sbeing\sused\sin\sCREATE\sINDEX\sand\sother\sstatements. +D 2019-08-19T17:26:32.202 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -467,7 +467,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 5cf994516c1b74928b9d15971573a8bc8595e1afec129184099976da603402de F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 39f448776a17f202e0d205bda9e2b0bb80853503268ceb36a48ff6d0d963fd7b +F src/build.c da5d5d82eb53cb004e9120277cfe93a9c3dd294871eae3d728ebd0faee84d969 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c bef29885d12c1b7ec4353fc07f61f18d044430fc4f9c1476fd5098a5834d17bd +F src/expr.c 0a3442b0df31f1eca86b2aa3634f61bca5f1a6781f543ca9a0d87e29961f7f4f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -484,7 +484,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c c2194dd2886337b870226fcb31c13e7df8c4b5e0ea85140e510a6f1daf1ad65b +F src/insert.c 81eec6acf4fbf0942bbab6804fe50df3e109acba40b8bbfb00fec9a14d0715a6 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c F src/main.c 51c55eb579eac4180bfcc6242741084710911350d2cd0c3fdd0f9fde55442128 @@ -528,7 +528,7 @@ F src/shell.c.in d2465e7747a014bd48a75c1bcf648e8e6cb46832dcc6e1293c5f285bc5542e8 F src/sqlite.h.in 5445ee2844c15bf277ebb64e910b56b0e6fb9377f184a81cd9bd78f0946be8c8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 -F src/sqliteInt.h ed60d41dbb600515abdd5bbfd7f826f0238153d7d70fc3383f5e1179e131b3b8 +F src/sqliteInt.h 84d3b381b515acfd098152bb2c9a91fb3ea72b55e15dfc2b86c031da222a910c F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -589,7 +589,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c fc8c6c0a8a26afb3a97e3f844d65403dd27cf1450baf4415034fa4ccf00c4d7e -F src/trigger.c 2305271878e95addc1c01361e5e8e342e87cba5efefdd7d3032687e5d67e05d1 +F src/trigger.c d115eb6c1e2a22e116e0c6e34c35e5b2029238238e05b9708fe1567434da3230 F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 @@ -1182,7 +1182,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 522f0da68881b6ac616b1361fbd5a9897bd366597809495143968af743e3318c +F test/nulls1.test 6d226787ee0d479bc009e00b7fa812fb261fbb3eab764de18ecb988f4ec69f4a F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b49df1fe9b7174ebc60023179e8da628c926e59df3dc01b15d4a28e17807bb97 -R 45771ddb0f2c68cf3dbfa90b9e4149c6 +P f892066425671a8a0ac923e3ad4744677f6434a66f97b91afa8141f11f179975 +R 453ca41ba88968d27d033b2c6ac5c131 U dan -Z 6452b2b9b9aca3f08bbef29f8e41e25a +Z d9760a7ecfe79d11a5b817a651ccacbf diff --git a/manifest.uuid b/manifest.uuid index b6a8464c5f..05637d33b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f892066425671a8a0ac923e3ad4744677f6434a66f97b91afa8141f11f179975 \ No newline at end of file +bb9767a287097a615aeb4abdba689b10e1a1c36c016c8e55905b508075e62c86 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 3f9ab0b975..106b995d31 100644 --- a/src/build.c +++ b/src/build.c @@ -3153,6 +3153,27 @@ Index *sqlite3AllocateIndexObject( return p; } +/* +** If expression list pList contains an expression that was parsed with +** an explicit "NULLS FIRST" or "NULLS LAST" clause, leave an error in +** pParse and return non-zero. Otherwise, return zero. +*/ +int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ + if( pList ){ + int i; + for(i=0; inExpr; i++){ + if( pList->a[i].bNulls ){ + u8 sf = pList->a[i].sortFlags; + sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", + (sf==0 || sf==3) ? "FIRST" : "LAST" + ); + return 1; + } + } + } + return 0; +} + /* ** Create a new index for an SQL table. pName1.pName2 is the name of the index ** and pTblList is the name of the table that is to be indexed. Both will @@ -3204,6 +3225,9 @@ void sqlite3CreateIndex( if( SQLITE_OK!=sqlite3ReadSchema(pParse) ){ goto exit_create_index; } + if( sqlite3HasExplicitNulls(pParse, pList) ){ + goto exit_create_index; + } /* ** Find the table that is to be indexed. Return early if not found. diff --git a/src/expr.c b/src/expr.c index c5072aa615..6948c5a0fe 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1653,6 +1653,7 @@ vector_append_error: ** Set the sort order for the last element on the given ExprList. */ void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ + struct ExprList_item *pItem; if( p==0 ) return; assert( p->nExpr>0 ); @@ -1666,10 +1667,18 @@ void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ || eNulls==SQLITE_SO_DESC ); - if( iSortOrder==SQLITE_SO_UNDEFINED ) iSortOrder = SQLITE_SO_ASC; - p->a[p->nExpr-1].sortFlags = (u8)iSortOrder; - if( eNulls!=SQLITE_SO_UNDEFINED && iSortOrder!=eNulls ){ - p->a[p->nExpr-1].sortFlags |= KEYINFO_ORDER_BIGNULL; + pItem = &p->a[p->nExpr-1]; + assert( pItem->bNulls==0 ); + if( iSortOrder==SQLITE_SO_UNDEFINED ){ + iSortOrder = SQLITE_SO_ASC; + } + pItem->sortFlags = (u8)iSortOrder; + + if( eNulls!=SQLITE_SO_UNDEFINED ){ + pItem->bNulls = 1; + if( iSortOrder!=eNulls ){ + pItem->sortFlags |= KEYINFO_ORDER_BIGNULL; + } } } diff --git a/src/insert.c b/src/insert.c index 53d7e89b2a..04d3d580f5 100644 --- a/src/insert.c +++ b/src/insert.c @@ -833,6 +833,9 @@ void sqlite3Insert( pTab->zName); goto insert_cleanup; } + if( sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget) ){ + goto insert_cleanup; + } pTabList->a[0].iCursor = iDataCur; pUpsert->pUpsertSrc = pTabList; pUpsert->regData = regData; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c47cc6ffc7..b777409179 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2605,11 +2605,12 @@ struct ExprList { Expr *pExpr; /* The parse tree for this expression */ char *zName; /* Token associated with this expression */ char *zSpan; /* Original text of the expression */ - u8 sortFlags; /* 1 for DESC or 0 for ASC */ + u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ unsigned done :1; /* A flag to indicate when processing is finished */ unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */ unsigned reusable :1; /* Constant expression is reusable */ unsigned bSorterRef :1; /* Defer evaluation until after sorting */ + unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ union { struct { u16 iOrderByCol; /* For ORDER BY, column number in result set */ @@ -4366,6 +4367,7 @@ void sqlite3KeyInfoUnref(KeyInfo*); KeyInfo *sqlite3KeyInfoRef(KeyInfo*); KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*); KeyInfo *sqlite3KeyInfoFromExprList(Parse*, ExprList*, int, int); +int sqlite3HasExplicitNulls(Parse*, ExprList*); #ifdef SQLITE_DEBUG int sqlite3KeyInfoIsWriteable(KeyInfo*); diff --git a/src/trigger.c b/src/trigger.c index 989df9678a..84f80c23ee 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -463,6 +463,9 @@ TriggerStep *sqlite3TriggerInsertStep( pTriggerStep->pIdList = pColumn; pTriggerStep->pUpsert = pUpsert; pTriggerStep->orconf = orconf; + if( pUpsert ){ + sqlite3HasExplicitNulls(pParse, pUpsert->pUpsertTarget); + } }else{ testcase( pColumn ); sqlite3IdListDelete(db, pColumn); diff --git a/test/nulls1.test b/test/nulls1.test index 866ed2b296..dc7fb6e86b 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -83,5 +83,43 @@ do_execsql_test 2.2 { 1 1 1 } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 3.0 { + CREATE TABLE t1(a, b, c, d, UNIQUE (b)); +} +foreach {tn sql err} { + 1 { CREATE INDEX i1 ON t1(a ASC NULLS LAST) } LAST + 2 { CREATE INDEX i1 ON t1(a ASC NULLS FIRST) } FIRST + 3 { CREATE INDEX i1 ON t1(a, b ASC NULLS LAST) } LAST + 4 { CREATE INDEX i1 ON t1(a, b ASC NULLS FIRST) } FIRST + 5 { CREATE INDEX i1 ON t1(a DESC NULLS LAST) } LAST + 6 { CREATE INDEX i1 ON t1(a DESC NULLS FIRST) } FIRST + 7 { CREATE INDEX i1 ON t1(a, b DESC NULLS LAST) } LAST + 8 { CREATE INDEX i1 ON t1(a, b DESC NULLS FIRST) } FIRST + 9 { CREATE TABLE t2(a, b, PRIMARY KEY(a DESC, b NULLS FIRST)) } FIRST + 10 { CREATE TABLE t2(a, b, UNIQUE(a DESC NULLS FIRST, b)) } FIRST + 11 { INSERT INTO t1 VALUES(1, 2, 3, 4) + ON CONFLICT (b DESC NULLS LAST) DO UPDATE SET a = a+1 } LAST + 12 { + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + INSERT INTO t1 VALUES(1, 2, 3, 4) + ON CONFLICT (b DESC NULLS FIRST) DO UPDATE SET a = a+1; + END + } FIRST +} { + do_catchsql_test 3.1.$tn $sql "1 {unsupported use of NULLS $err}" +} + +do_execsql_test 3.2 { + CREATE TABLE first(nulls, last); + INSERT INTO first(last, nulls) VALUES(100,200), (300,400), (200,300); + SELECT * FROM first ORDER BY nulls; +} { + 200 100 + 300 200 + 400 300 +} + finish_test From ae8e45cb0c26457c9c020055cc3f8421954670d3 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Aug 2019 19:59:50 +0000 Subject: [PATCH 135/221] Fix problems with window frames that use ORDER BY ... NULLS LAST etc. FossilOrigin-Name: 75d665a494dd7d6e77d5a80af386ee5accc0a53416d5493424dc0fef6c7b01a0 --- manifest | 24 +- manifest.uuid | 2 +- src/expr.c | 1 + src/window.c | 21 +- test/nulls1.test | 6 +- test/pg_common.tcl | 4 +- test/window7.test | 110 +++- test/window8.tcl | 41 +- test/window8.test | 1530 +++++++++++++++++++++++++++++++++++++++++--- 9 files changed, 1600 insertions(+), 139 deletions(-) diff --git a/manifest b/manifest index b8cb71e76a..2dac1918cc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\sNULLS\sFIRST/LAST\sfrom\sbeing\sused\sin\sCREATE\sINDEX\sand\sother\sstatements. -D 2019-08-19T17:26:32.202 +C Fix\sproblems\swith\swindow\sframes\sthat\suse\sORDER\sBY\s...\sNULLS\sLAST\setc. +D 2019-08-19T19:59:50.467 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 0a3442b0df31f1eca86b2aa3634f61bca5f1a6781f543ca9a0d87e29961f7f4f +F src/expr.c 223bd0d5132e217fc0967be55a0a31f5e06d4b61805176d487ffe4ce6b4c6a6e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -613,7 +613,7 @@ F src/where.c 52c433208eafdc7e1750ea4622cfffb5d14d906a0a9258e07bae4b6fee182fef F src/whereInt.h 807766a6a92893dbba8a887e5b13466d2257ce07a84cf1be0aae2c41aee3bf4f F src/wherecode.c 81c5d1eb909f8e1284df58367d25f748d126c475725665e7bb9b10a9bf702242 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc -F src/window.c 331cdac4992c7402da01c981861f3cc989bf7b4a97dd03eb122993e670f7a588 +F src/window.c 94dccce0568dbcc65658d762e5b11c390fd5509d40e73205cb7f0c22f0051532 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1182,7 +1182,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 6d226787ee0d479bc009e00b7fa812fb261fbb3eab764de18ecb988f4ec69f4a +F test/nulls1.test d2f1da489fd24d7af54aed9d7e117e4c7d6bb3e67f3a87ef54377cc088563073 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1217,7 +1217,7 @@ F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff F test/permutations.test 4282fb00e5ac0f8c2cd1be62652f6da4ac03ce3c58b7d785fa17f4684492a0e0 -F test/pg_common.tcl 4740dc35190d6acdab14c097783331361301ab504a94d948f6afbb56ce0a51e8 +F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 F test/pragma.test cf066fe0f7f5d49f4758de4986407b8676c61aaa7871599340d64f42a8edc352 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c0df9 @@ -1710,9 +1710,9 @@ F test/window4.test 807f3e6b15f9338e5b9742b87c5c7ca825b42b9657fde6096e8901193708 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f -F test/window7.test ce7f865241fdd1c5c4db869cd7bb2986c3be836bc2e73649a6846dd920f63e0f -F test/window8.tcl 9e9a82ae9eea90a4a83481d641a812b974980c38f9247f3b89a6e3c8bed45518 -F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91d43f +F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd +F test/window8.tcl 5884cc884f9605bf88c0d18a534894bf9342f72687bf1bc43ed0cab4c8af7973 +F test/window8.test 48590f3737d17eec503d77769c13ead15d12e8819820b1dc68afe8a3c5bc3250 F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f892066425671a8a0ac923e3ad4744677f6434a66f97b91afa8141f11f179975 -R 453ca41ba88968d27d033b2c6ac5c131 +P bb9767a287097a615aeb4abdba689b10e1a1c36c016c8e55905b508075e62c86 +R 0d189432ffc682f45a241a646815eff1 U dan -Z d9760a7ecfe79d11a5b817a651ccacbf +Z 3a5c6bb3c2c9a1118645ddff85026963 diff --git a/manifest.uuid b/manifest.uuid index 05637d33b1..7a21ed26bb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bb9767a287097a615aeb4abdba689b10e1a1c36c016c8e55905b508075e62c86 \ No newline at end of file +75d665a494dd7d6e77d5a80af386ee5accc0a53416d5493424dc0fef6c7b01a0 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6948c5a0fe..e0b55903d6 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1401,6 +1401,7 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); pItem->sortFlags = pOldItem->sortFlags; pItem->done = 0; + pItem->bNulls = pOldItem->bNulls; pItem->bSpanIsTab = pOldItem->bSpanIsTab; pItem->bSorterRef = pOldItem->bSorterRef; pItem->u = pOldItem->u; diff --git a/src/window.c b/src/window.c index b3a7cee1bc..80dfd612c4 100644 --- a/src/window.c +++ b/src/window.c @@ -1876,12 +1876,13 @@ static void windowCodeRangeTest( int reg2 = sqlite3GetTempReg(pParse); int arith = OP_Add; int addrGe; + ExprList *pOrderBy = p->pMWin->pOrderBy; int regString = ++pParse->nMem; assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); - assert( p->pMWin->pOrderBy && p->pMWin->pOrderBy->nExpr==1 ); - if( p->pMWin->pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ + assert( pOrderBy && pOrderBy->nExpr==1 ); + if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ switch( op ){ case OP_Ge: op = OP_Le; break; case OP_Gt: op = OP_Lt; break; @@ -1901,6 +1902,22 @@ static void windowCodeRangeTest( VdbeCoverage(v); sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1); sqlite3VdbeJumpHere(v, addrGe); + if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ + int addr; + addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); + switch( op ){ + case OP_Ge: sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); break; + case OP_Gt: sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); break; + case OP_Le: sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); break; + default: assert( op==OP_Lt ); /* no-op */ + } + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); + if( op==OP_Gt || op==OP_Ge ){ + sqlite3VdbeChangeP2(v, -1, sqlite3VdbeCurrentAddr(v)+1); + } + } sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le ); diff --git a/test/nulls1.test b/test/nulls1.test index dc7fb6e86b..e54d60856d 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -15,8 +15,6 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix nulls1 -if 1 { - do_execsql_test 1.0 { DROP TABLE IF EXISTS t3; CREATE TABLE t3(a INTEGER); @@ -55,8 +53,6 @@ for {set a 0} {$a < 3} {incr a} { } } -} - #------------------------------------------------------------------------- reset_db do_execsql_test 2.0 { @@ -84,6 +80,7 @@ do_execsql_test 2.2 { } #------------------------------------------------------------------------- +# reset_db do_execsql_test 3.0 { CREATE TABLE t1(a, b, c, d, UNIQUE (b)); @@ -121,5 +118,4 @@ do_execsql_test 3.2 { 400 300 } - finish_test diff --git a/test/pg_common.tcl b/test/pg_common.tcl index bbc52ebede..b3f35cd0ed 100644 --- a/test/pg_common.tcl +++ b/test/pg_common.tcl @@ -70,8 +70,8 @@ proc execsql {sql} { proc execsql_test {tn sql} { set res [execsql $sql] set sql [string map {string_agg group_concat} $sql] - set sql [string map [list {NULLS FIRST} {}] $sql] - set sql [string map [list {NULLS LAST} {}] $sql] + # set sql [string map [list {NULLS FIRST} {}] $sql] + # set sql [string map [list {NULLS LAST} {}] $sql] puts $::fd "do_execsql_test $tn {" puts $::fd " [string trim $sql]" puts $::fd "} {$res}" diff --git a/test/window7.test b/test/window7.test index fd04e23c43..441e2b126a 100644 --- a/test/window7.test +++ b/test/window7.test @@ -41,54 +41,146 @@ do_execsql_test 1.0 { do_execsql_test 1.1 { SELECT a, sum(b) FROM t3 GROUP BY a ORDER BY 1; -} {0 550 1 460 2 470 3 480 4 490 5 500 6 510 7 520 8 530 9 540} +} {0 550 1 460 2 470 3 480 4 490 5 500 6 510 7 520 8 530 + 9 540} do_execsql_test 1.2 { SELECT a, sum(b) OVER ( ORDER BY a GROUPS BETWEEN CURRENT ROW AND CURRENT ROW ) FROM t3 ORDER BY 1; -} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540} +} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 + 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 + 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 + 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 + 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 + 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 + 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 + 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 + 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 + 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 + 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 + 9 540} do_execsql_test 1.3 { SELECT a, sum(b) OVER ( ORDER BY a GROUPS BETWEEN 0 PRECEDING AND 0 FOLLOWING ) FROM t3 ORDER BY 1; -} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540} +} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 + 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 + 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 + 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 + 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 + 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 + 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 + 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 + 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 + 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 + 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 + 9 540} do_execsql_test 1.4 { SELECT a, sum(b) OVER ( ORDER BY a GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING ) FROM t3 ORDER BY 1; -} {0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590} +} {0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 + 0 1480 0 1480 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 + 1 1960 1 1960 1 1960 1 1960 2 2450 2 2450 2 2450 2 2450 + 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 3 2400 3 2400 + 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 + 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 + 4 2450 4 2450 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 + 5 2500 5 2500 5 2500 5 2500 6 2550 6 2550 6 2550 6 2550 + 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 7 2600 7 2600 + 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 + 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 + 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 + 9 1590 9 1590 9 1590 9 1590} do_execsql_test 1.5 { SELECT a, sum(b) OVER ( ORDER BY a RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING ) FROM t3 ORDER BY 1; -} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540} +} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 + 0 550 1 460 1 460 1 460 1 460 1 460 1 460 1 460 1 460 + 1 460 1 460 2 470 2 470 2 470 2 470 2 470 2 470 2 470 + 2 470 2 470 2 470 3 480 3 480 3 480 3 480 3 480 3 480 + 3 480 3 480 3 480 3 480 4 490 4 490 4 490 4 490 4 490 + 4 490 4 490 4 490 4 490 4 490 5 500 5 500 5 500 5 500 + 5 500 5 500 5 500 5 500 5 500 5 500 6 510 6 510 6 510 + 6 510 6 510 6 510 6 510 6 510 6 510 6 510 7 520 7 520 + 7 520 7 520 7 520 7 520 7 520 7 520 7 520 7 520 8 530 + 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 8 530 + 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 + 9 540} do_execsql_test 1.6 { SELECT a, sum(b) OVER ( ORDER BY a RANGE BETWEEN 2 PRECEDING AND 2 FOLLOWING ) FROM t3 ORDER BY 1; -} {0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590} +} {0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 0 1480 + 0 1480 0 1480 1 1960 1 1960 1 1960 1 1960 1 1960 1 1960 + 1 1960 1 1960 1 1960 1 1960 2 2450 2 2450 2 2450 2 2450 + 2 2450 2 2450 2 2450 2 2450 2 2450 2 2450 3 2400 3 2400 + 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 3 2400 + 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 4 2450 + 4 2450 4 2450 5 2500 5 2500 5 2500 5 2500 5 2500 5 2500 + 5 2500 5 2500 5 2500 5 2500 6 2550 6 2550 6 2550 6 2550 + 6 2550 6 2550 6 2550 6 2550 6 2550 6 2550 7 2600 7 2600 + 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 7 2600 + 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 + 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 + 9 1590 9 1590 9 1590 9 1590} do_execsql_test 1.7 { SELECT a, sum(b) OVER ( ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1; -} {0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590} +} {0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 + 0 1010 0 1010 1 1480 1 1480 1 1480 1 1480 1 1480 1 1480 + 1 1480 1 1480 1 1480 1 1480 2 1960 2 1960 2 1960 2 1960 + 2 1960 2 1960 2 1960 2 1960 2 1960 2 1960 3 1900 3 1900 + 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 3 1900 + 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 4 1940 + 4 1940 4 1940 5 1980 5 1980 5 1980 5 1980 5 1980 5 1980 + 5 1980 5 1980 5 1980 5 1980 6 2020 6 2020 6 2020 6 2020 + 6 2020 6 2020 6 2020 6 2020 6 2020 6 2020 7 2060 7 2060 + 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 7 2060 + 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 8 2100 + 8 2100 8 2100 9 1590 9 1590 9 1590 9 1590 9 1590 9 1590 + 9 1590 9 1590 9 1590 9 1590} do_execsql_test 1.8.1 { SELECT a, sum(b) OVER ( ORDER BY a RANGE BETWEEN 0 PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1; -} {0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 1 930 1 930 1 930 1 930 1 930 1 930 1 930 1 930 1 930 1 930 2 950 2 950 2 950 2 950 2 950 2 950 2 950 2 950 2 950 2 950 3 970 3 970 3 970 3 970 3 970 3 970 3 970 3 970 3 970 3 970 4 990 4 990 4 990 4 990 4 990 4 990 4 990 4 990 4 990 4 990 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 8 1070 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540 9 540} +} {0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 0 1010 + 0 1010 0 1010 1 930 1 930 1 930 1 930 1 930 1 930 1 930 + 1 930 1 930 1 930 2 950 2 950 2 950 2 950 2 950 2 950 + 2 950 2 950 2 950 2 950 3 970 3 970 3 970 3 970 3 970 + 3 970 3 970 3 970 3 970 3 970 4 990 4 990 4 990 4 990 + 4 990 4 990 4 990 4 990 4 990 4 990 5 1010 5 1010 5 1010 + 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 5 1010 6 1030 + 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 6 1030 + 6 1030 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 7 1050 + 7 1050 7 1050 7 1050 8 1070 8 1070 8 1070 8 1070 8 1070 + 8 1070 8 1070 8 1070 8 1070 8 1070 9 540 9 540 9 540 9 540 + 9 540 9 540 9 540 9 540 9 540 9 540} do_execsql_test 1.8.2 { SELECT a, sum(b) OVER ( ORDER BY a DESC RANGE BETWEEN 0 PRECEDING AND 1 FOLLOWING ) FROM t3 ORDER BY 1; -} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 2 930 2 930 2 930 2 930 2 930 2 930 2 930 2 930 2 930 2 930 3 950 3 950 3 950 3 950 3 950 3 950 3 950 3 950 3 950 3 950 4 970 4 970 4 970 4 970 4 970 4 970 4 970 4 970 4 970 4 970 5 990 5 990 5 990 5 990 5 990 5 990 5 990 5 990 5 990 5 990 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070} +} {0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 0 550 + 0 550 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 1 1010 + 1 1010 1 1010 1 1010 2 930 2 930 2 930 2 930 2 930 2 930 + 2 930 2 930 2 930 2 930 3 950 3 950 3 950 3 950 3 950 + 3 950 3 950 3 950 3 950 3 950 4 970 4 970 4 970 4 970 + 4 970 4 970 4 970 4 970 4 970 4 970 5 990 5 990 5 990 + 5 990 5 990 5 990 5 990 5 990 5 990 5 990 6 1010 6 1010 + 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 6 1010 + 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 7 1030 + 7 1030 7 1030 8 1050 8 1050 8 1050 8 1050 8 1050 8 1050 + 8 1050 8 1050 8 1050 8 1050 9 1070 9 1070 9 1070 9 1070 + 9 1070 9 1070 9 1070 9 1070 9 1070 9 1070} finish_test diff --git a/test/window8.tcl b/test/window8.tcl index df1fd78ab7..64fd98aea9 100644 --- a/test/window8.tcl +++ b/test/window8.tcl @@ -197,30 +197,55 @@ execsql_test 4.2.1 { ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING ) FROM t1 ORDER BY 1 NULLS FIRST; } - execsql_test 4.2.2 { + SELECT sum(b) OVER ( + ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} + +execsql_test 4.2.3 { SELECT sum(b) OVER ( ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING ) FROM t1 ORDER BY 1 NULLS FIRST; } +execsql_test 4.2.4 { + SELECT sum(b) OVER ( + ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} execsql_test 4.3.1 { SELECT sum(b) OVER ( ORDER BY a NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING ) FROM t1 ORDER BY 1 NULLS FIRST; } +execsql_test 4.3.2 { + SELECT sum(b) OVER ( + ORDER BY a NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} execsql_test 4.4.1 { SELECT sum(b) OVER ( ORDER BY a NULLS FIRST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) FROM t1 ORDER BY 1 NULLS FIRST; } - execsql_test 4.4.2 { + SELECT sum(b) OVER ( + ORDER BY a NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} + +execsql_test 4.4.3 { SELECT sum(b) OVER ( ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING ) FROM t1 ORDER BY 1 NULLS FIRST; } +execsql_test 4.4.4 { + SELECT sum(b) OVER ( + ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} ========== @@ -248,6 +273,17 @@ foreach {tn ex} { 6 { ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING } 7 { ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING } + + 8 { RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING } + 9 { ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING } + 10 { PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING } + 11 { ORDER BY a NULLS LAST GROUPS 6 PRECEDING } + 12 { ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING } + 13 { ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING } + 14 { ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING } } { execsql_test 5.$tn.$tn2.1 " SELECT max(c) OVER win, @@ -294,6 +330,7 @@ execsql_test 6.2 { } + finish_test diff --git a/test/window8.test b/test/window8.test index 829bd0b252..e149979cd4 100644 --- a/test/window8.test +++ b/test/window8.test @@ -3522,31 +3522,61 @@ do_execsql_test 4.1.2 { do_execsql_test 4.2.1 { SELECT sum(b) OVER ( ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 ; + ) FROM t1 ORDER BY 1 NULLS FIRST; } {{} {} 6 6 6} do_execsql_test 4.2.2 { + SELECT sum(b) OVER ( + ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} {6 6 6 {} {}} + +do_execsql_test 4.2.3 { SELECT sum(b) OVER ( ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 ; + ) FROM t1 ORDER BY 1 NULLS FIRST; } {{} {} 6 6 6} +do_execsql_test 4.2.4 { + SELECT sum(b) OVER ( + ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} {6 6 6 {} {}} + do_execsql_test 4.3.1 { SELECT sum(b) OVER ( - ORDER BY a RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING - ) FROM t1 ORDER BY 1 ; + ORDER BY a NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS FIRST; } {6 6 6 15 15} +do_execsql_test 4.3.2 { + SELECT sum(b) OVER ( + ORDER BY a NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} {9 9 15 15 15} + do_execsql_test 4.4.1 { SELECT sum(b) OVER ( - ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 ORDER BY 1 ; + ORDER BY a NULLS FIRST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS FIRST; } {3 6 9 9 12} do_execsql_test 4.4.2 { SELECT sum(b) OVER ( - ORDER BY a DESC ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING - ) FROM t1 ORDER BY 1 ; + ORDER BY a NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} {5 6 8 9 10} + +do_execsql_test 4.4.3 { + SELECT sum(b) OVER ( + ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS FIRST; +} {5 6 8 9 10} + +do_execsql_test 4.4.4 { + SELECT sum(b) OVER ( + ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; } {5 6 8 9 10} #========================================================================== @@ -3564,7 +3594,7 @@ do_execsql_test 5.1.1.1 { count(a) OVER win FROM t3 WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 @@ -3587,7 +3617,7 @@ do_execsql_test 5.1.1.2 { dense_rank() OVER win FROM t3 WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 @@ -3609,9 +3639,9 @@ do_execsql_test 5.1.2.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY a + WINDOW win AS ( ORDER BY a NULLS FIRST RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 16 899 113 16 899 113 16 899 113 16 899 113 16 899 113 16 899 113 16 979 102 44 979 102 44 @@ -3633,9 +3663,9 @@ do_execsql_test 5.1.2.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY a + WINDOW win AS ( ORDER BY a NULLS FIRST RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {2947 81 11 2947 81 11 2947 81 11 2947 81 11 2947 81 11 2947 81 11 2947 81 11 2947 81 11 2947 81 11 5287 74 10 5287 74 10 5287 74 10 5287 74 10 5287 74 10 5287 74 10 5287 74 10 8400 65 9 8400 65 9 @@ -3659,7 +3689,7 @@ do_execsql_test 5.1.3.1 { FROM t3 WINDOW win AS ( PARTITION BY coalesce(a, '') RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {777 113 5 777 113 5 777 113 5 777 113 5 777 113 5 805 250 7 805 250 7 805 250 7 805 250 7 805 250 7 805 250 7 805 250 7 822 158 6 822 158 6 822 158 6 822 158 6 822 158 6 822 158 6 @@ -3683,7 +3713,7 @@ do_execsql_test 5.1.3.2 { FROM t3 WINDOW win AS ( PARTITION BY coalesce(a, '') RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1366 1 1 1366 1 1 @@ -3703,8 +3733,8 @@ do_execsql_test 5.1.4.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 934 158 8 934 158 8 934 158 8 934 158 8 934 158 8 934 158 8 934 158 8 934 158 8 934 158 21 934 158 21 934 158 21 934 158 21 @@ -3726,8 +3756,8 @@ do_execsql_test 5.1.4.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {2050 1 1 2050 1 1 2050 1 1 2050 1 1 2050 1 1 2050 1 1 4359 7 2 4359 7 2 4359 7 2 4359 7 2 4359 7 2 4359 7 2 4359 7 2 4359 7 2 7840 15 3 7840 15 3 7840 15 3 7840 15 3 7840 15 3 7840 15 3 @@ -3750,8 +3780,8 @@ do_execsql_test 5.1.5.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {102 102 1 113 113 2 113 113 2 133 133 1 148 148 1 160 158 2 160 158 2 160 158 2 208 208 1 224 223 2 224 223 2 239 234 3 239 234 3 239 234 3 252 247 3 257 247 5 257 247 5 257 250 4 @@ -3773,8 +3803,8 @@ do_execsql_test 5.1.5.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 25 23 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 43 37 {} 43 37 {} 50 42 {} 60 51 {} 61 52 {} 64 55 {} 64 55 {} 67 57 {} 68 58 @@ -3795,8 +3825,8 @@ do_execsql_test 5.1.6.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {102 102 1 113 113 2 113 113 2 133 133 1 148 148 1 158 158 1 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1 @@ -3818,8 +3848,8 @@ do_execsql_test 5.1.6.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 11 9 {} 12 10 {} 13 11 {} 16 14 {} 17 15 {} 18 16 {} 22 20 {} 24 22 {} 25 23 {} 26 24 {} 31 27 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34 @@ -3840,9 +3870,9 @@ do_execsql_test 5.1.7.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c , b , a + WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 113 81 979 113 82 979 133 80 979 148 79 979 158 77 979 158 78 979 160 77 979 208 76 979 223 75 979 224 74 979 234 73 @@ -3864,9 +3894,335 @@ do_execsql_test 5.1.7.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c , b , a + WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87 + 6485 81 81 6485 82 82 6485 83 83 7324 80 80 8163 78 78 8163 79 79 + 8968 73 73 8968 74 74 8968 75 75 8968 76 76 8968 77 77 9745 69 69 + 9745 70 70 9745 71 71 9745 72 72 10504 65 65 10504 66 66 + 10504 67 67 10504 68 68 11215 64 64 11920 63 63 12603 62 62 + 13274 60 60 13274 61 61 13941 59 59 14608 55 55 14608 56 56 + 14608 57 57 14608 58 58 15241 54 54 15870 53 53 16499 52 52 + 17126 49 49 17126 50 50 17126 51 51 17733 44 44 17733 45 45 + 17733 46 46 17733 47 47 17733 48 48 18176 42 42 18176 43 43 + 18597 40 40 18597 41 41 18996 39 39 19395 37 37 19395 38 38 + 19788 36 36 20181 35 35 20536 34 34 20891 30 30 20891 31 31 + 20891 32 32 20891 33 33 21226 28 28 21226 29 29 21535 27 27 + 21830 26 26 22087 22 22 22087 23 23 22087 24 24 22087 25 25 + 22334 21 21 22573 17 17 22573 18 18 22573 19 19 22573 20 20 + 22796 11 11 22796 12 12 22796 13 13 22796 14 14 22796 15 15 + 22796 16 16 22929 10 10 23042 9 9 23155 1 1 23155 2 2 23155 3 3 + 23155 4 4 23155 5 5 23155 6 6 23155 7 7 23155 8 8} + +do_execsql_test 5.1.8.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83} + +do_execsql_test 5.1.8.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1} + +do_execsql_test 5.1.9.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 + 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 + 899 113 9 899 113 9 899 113 9 899 113 16 899 113 16 899 113 16 + 899 113 16 899 113 16 899 113 16 899 113 16 979 102 44 979 102 44 + 979 102 44 979 102 44 979 102 44 979 102 44 979 102 44 979 102 44 + 979 102 44 979 102 44 979 102 44 979 102 49 979 102 49 979 102 49 + 979 102 49 979 102 49 979 102 56 979 102 56 979 102 56 979 102 56 + 979 102 56 979 102 56 979 102 56 979 102 62 979 102 62 979 102 62 + 979 102 62 979 102 62 979 102 62 979 102 75 979 102 75 979 102 75 + 979 102 75 979 102 75 979 102 75 979 102 75 979 102 75 979 102 75 + 979 102 75 979 102 75 979 102 75 979 102 75 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 113 25 979 113 25 979 113 25 979 113 25 979 113 25 979 113 25 + 979 113 25 979 113 25 979 113 25 979 113 33 979 113 33 979 113 33 + 979 113 33 979 113 33 979 113 33 979 113 33 979 113 33} + +do_execsql_test 5.1.9.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {2050 84 11 2050 84 11 2050 84 11 2050 84 11 2050 84 11 2050 84 11 + 4997 75 10 4997 75 10 4997 75 10 4997 75 10 4997 75 10 4997 75 10 + 4997 75 10 4997 75 10 4997 75 10 7337 68 9 7337 68 9 7337 68 9 + 7337 68 9 7337 68 9 7337 68 9 7337 68 9 10450 59 8 10450 59 8 + 10450 59 8 10450 59 8 10450 59 8 10450 59 8 10450 59 8 10450 59 8 + 10450 59 8 11714 51 7 11714 51 7 11714 51 7 11714 51 7 11714 51 7 + 11714 51 7 11714 51 7 11714 51 7 12676 40 6 12676 40 6 12676 40 6 + 12676 40 6 12676 40 6 12676 40 6 12676 40 6 12676 40 6 12676 40 6 + 12676 40 6 12676 40 6 14195 35 5 14195 35 5 14195 35 5 14195 35 5 + 14195 35 5 15999 28 4 15999 28 4 15999 28 4 15999 28 4 15999 28 4 + 15999 28 4 15999 28 4 17365 22 3 17365 22 3 17365 22 3 17365 22 3 + 17365 22 3 17365 22 3 20846 9 2 20846 9 2 20846 9 2 20846 9 2 + 20846 9 2 20846 9 2 20846 9 2 20846 9 2 20846 9 2 20846 9 2 + 20846 9 2 20846 9 2 20846 9 2 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1} + +do_execsql_test 5.1.10.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {777 113 5 777 113 5 777 113 5 777 113 5 777 113 5 805 250 7 + 805 250 7 805 250 7 805 250 7 805 250 7 805 250 7 805 250 7 + 822 158 6 822 158 6 822 158 6 822 158 6 822 158 6 822 158 6 + 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13 + 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13 840 247 13 + 840 247 13 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 + 870 158 0 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 + 899 113 9 899 113 9 899 113 9 899 113 9 934 223 8 934 223 8 + 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 + 938 102 11 938 102 11 938 102 11 938 102 11 938 102 11 938 102 11 + 938 102 11 938 102 11 938 102 11 938 102 11 938 102 11 938 148 8 + 938 148 8 938 148 8 938 148 8 938 148 8 938 148 8 938 148 8 + 938 148 8 959 224 7 959 224 7 959 224 7 959 224 7 959 224 7 + 959 224 7 959 224 7 979 133 9 979 133 9 979 133 9 979 133 9 + 979 133 9 979 133 9 979 133 9 979 133 9 979 133 9} + +do_execsql_test 5.1.10.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 + 962 1 1 962 1 1 962 1 1 962 1 1 1264 1 1 1264 1 1 1264 1 1 + 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1366 1 1 1366 1 1 + 1366 1 1 1366 1 1 1366 1 1 1366 1 1 1519 1 1 1519 1 1 1519 1 1 + 1519 1 1 1519 1 1 1804 1 1 1804 1 1 1804 1 1 1804 1 1 1804 1 1 + 1804 1 1 1804 1 1 2050 1 1 2050 1 1 2050 1 1 2050 1 1 2050 1 1 + 2050 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 + 2309 1 1 2309 1 1 2340 1 1 2340 1 1 2340 1 1 2340 1 1 2340 1 1 + 2340 1 1 2340 1 1 2947 1 1 2947 1 1 2947 1 1 2947 1 1 2947 1 1 + 2947 1 1 2947 1 1 2947 1 1 2947 1 1 3113 1 1 3113 1 1 3113 1 1 + 3113 1 1 3113 1 1 3113 1 1 3113 1 1 3113 1 1 3113 1 1 3481 1 1 + 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1 + 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1} + +do_execsql_test 5.1.11.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {934 158 27 934 158 27 934 158 27 934 158 27 934 158 27 934 158 27 + 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 + 934 223 8 934 223 8 934 223 21 934 223 21 934 223 21 934 223 21 + 934 223 21 934 223 21 934 223 21 934 223 21 934 223 21 934 223 21 + 934 223 21 934 223 21 934 223 21 959 102 50 959 102 50 959 102 50 + 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 + 959 102 50 959 102 50 959 102 58 959 102 58 959 102 58 959 102 58 + 959 102 58 959 102 58 959 102 58 959 102 58 959 113 39 959 113 39 + 959 113 39 959 113 39 959 113 39 959 158 34 959 158 34 959 158 34 + 959 158 34 959 158 34 959 158 34 959 158 34 979 102 49 979 102 49 + 979 102 49 979 102 49 979 102 49 979 102 49 979 102 53 979 102 53 + 979 102 53 979 102 53 979 102 53 979 102 53 979 102 53 979 102 56 + 979 102 56 979 102 56 979 102 56 979 102 56 979 102 56 979 102 56 + 979 102 56 979 102 56 979 102 59 979 102 59 979 102 59 979 102 59 + 979 102 59 979 102 59 979 102 59 979 102 59 979 102 59} + +do_execsql_test 5.1.11.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 2309 1 1 + 2309 1 1 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 + 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 + 7156 22 3 7156 22 3 7156 22 3 7156 22 3 7156 22 3 7156 22 3 + 8960 28 4 8960 28 4 8960 28 4 8960 28 4 8960 28 4 8960 28 4 + 8960 28 4 10479 35 5 10479 35 5 10479 35 5 10479 35 5 10479 35 5 + 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6 + 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6 12368 68 9 + 12368 68 9 12368 68 9 12368 68 9 12368 68 9 12368 68 9 12368 68 9 + 12705 51 7 12705 51 7 12705 51 7 12705 51 7 12705 51 7 12705 51 7 + 12705 51 7 12705 51 7 13509 59 8 13509 59 8 13509 59 8 13509 59 8 + 13509 59 8 13509 59 8 13509 59 8 13509 59 8 13509 59 8 + 13949 75 10 13949 75 10 13949 75 10 13949 75 10 13949 75 10 + 13949 75 10 13949 75 10 13949 75 10 13949 75 10 14195 84 11 + 14195 84 11 14195 84 11 14195 84 11 14195 84 11 14195 84 11} + +do_execsql_test 5.1.12.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {102 102 1 113 113 2 113 113 2 133 133 1 148 148 1 160 158 2 + 160 158 2 160 158 2 208 208 1 224 223 2 224 223 2 239 234 3 + 239 234 3 239 234 3 252 247 3 257 247 5 257 247 5 257 250 4 + 257 252 3 295 295 1 309 309 1 336 330 3 336 330 3 336 330 3 + 346 346 1 355 354 2 355 354 2 355 354 2 399 393 4 399 393 4 + 399 393 4 399 393 4 399 393 4 412 412 1 421 421 1 430 430 1 + 443 443 1 480 480 2 480 480 2 574 572 2 574 572 2 607 607 1 + 618 618 2 618 618 2 634 627 4 634 627 4 634 627 4 634 627 4 + 634 629 3 652 652 1 667 660 2 671 667 3 671 667 3 671 667 3 + 671 667 3 683 683 1 711 705 2 716 705 3 716 711 2 730 726 2 + 730 726 2 762 759 2 768 759 4 768 762 3 768 762 3 777 777 1 + 792 786 3 794 786 4 794 786 4 794 790 3 805 805 1 822 822 1 + 845 839 5 845 839 5 845 839 5 845 839 5 845 839 5 870 870 2 + 870 870 2 870 870 2 899 899 1 911 911 1 934 929 2 938 929 4 + 938 934 3 938 934 3 963 959 2 963 959 2 979 979 1} + +do_execsql_test 5.1.12.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 25 23 {} 34 29 + {} 36 31 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 43 37 {} 43 37 + {} 50 42 {} 60 51 {} 61 52 {} 64 55 {} 64 55 {} 67 57 {} 68 58 + {} 69 59 {} 70 60 {} 72 62 {} 78 67 {} 78 67 {} 78 67 {} 85 72 + {} 85 72 133 4 3 223 10 8 223 11 9 226 2 2 226 2 2 239 12 10 + 239 13 11 239 14 12 247 15 13 257 18 16 257 19 17 295 20 18 + 309 21 19 335 22 20 335 23 21 335 24 22 421 35 30 443 37 32 + 504 16 14 504 17 15 607 42 36 683 56 47 710 26 24 710 27 25 + 710 27 25 711 59 50 759 62 53 759 63 54 777 66 56 805 71 61 + 899 81 68 911 82 69 929 83 70 929 84 71 979 89 75 1334 51 43 + 1416 57 48 1416 58 49 1584 29 26 1584 29 26 1584 31 27 1584 32 28 + 1584 32 28 1891 49 41 1922 87 73 1922 88 74 2005 52 44 2005 52 44 + 2005 54 45 2005 55 46 2518 45 38 2518 46 39 2518 46 39 2518 48 40 + 2523 73 63 2523 73 63 2523 75 64 2523 76 65 2523 77 66} + +do_execsql_test 5.1.13.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {102 102 1 113 113 2 113 113 2 133 133 1 148 148 1 158 158 1 + 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1 + 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1 + 257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1 + 346 346 1 354 354 1 355 355 1 355 355 1 393 393 2 393 393 2 + 398 398 1 399 399 1 399 399 1 412 412 1 421 421 1 430 430 1 + 443 443 1 480 480 2 480 480 2 572 572 1 574 574 1 607 607 1 + 618 618 2 618 618 2 627 627 1 629 629 1 629 629 1 633 633 1 + 634 634 1 652 652 1 660 660 1 667 667 1 667 667 1 670 670 1 + 671 671 1 683 683 1 705 705 1 711 711 1 716 716 1 726 726 1 + 730 730 1 759 759 1 762 762 1 768 768 2 768 768 2 777 777 1 + 786 786 1 790 790 1 792 792 1 794 794 1 805 805 1 822 822 1 + 839 839 2 839 839 2 840 840 1 844 844 1 845 845 1 870 870 2 + 870 870 2 870 870 2 899 899 1 911 911 1 929 929 1 934 934 1 + 938 938 2 938 938 2 959 959 1 963 963 1 979 979 1} + +do_execsql_test 5.1.13.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 11 9 {} 12 10 + {} 13 11 {} 16 14 {} 17 15 {} 18 16 {} 22 20 {} 24 22 {} 25 23 + {} 26 24 {} 31 27 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34 + {} 41 35 {} 43 37 {} 43 37 {} 49 41 {} 50 42 {} 51 43 {} 54 45 + {} 59 50 {} 60 51 {} 61 52 {} 63 54 {} 64 55 {} 64 55 {} 67 57 + {} 68 58 {} 69 59 {} 70 60 {} 72 62 {} 75 64 {} 76 65 {} 78 67 + {} 78 67 {} 78 67 {} 84 71 {} 85 72 {} 85 72 133 4 3 223 10 8 + 226 2 2 226 2 2 239 14 12 247 15 13 257 19 17 295 20 18 + 309 21 19 335 23 21 421 35 30 443 37 32 607 42 36 627 45 38 + 633 48 40 671 55 46 683 56 47 705 57 48 710 27 25 710 27 25 + 711 58 49 759 62 53 777 66 56 786 29 26 786 29 26 798 32 28 + 798 32 28 805 71 61 845 77 66 899 81 68 911 82 69 929 83 70 + 959 87 73 963 88 74 979 89 75 1258 46 39 1258 46 39 1334 52 44 + 1334 52 44 1678 73 63 1678 73 63} + +do_execsql_test 5.1.14.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 113 81 979 113 82 979 133 80 979 148 79 979 158 77 + 979 158 78 979 160 77 979 208 76 979 223 75 979 224 74 979 234 73 + 979 238 72 979 239 71 979 247 70 979 250 69 979 252 68 979 256 67 + 979 257 66 979 295 65 979 309 64 979 330 63 979 335 62 979 336 61 + 979 346 60 979 354 59 979 355 57 979 355 58 979 393 56 979 393 57 + 979 398 55 979 399 53 979 399 54 979 412 53 979 421 52 979 430 51 + 979 443 50 979 480 48 979 480 49 979 572 47 979 574 46 979 607 45 + 979 618 43 979 618 44 979 627 42 979 629 40 979 629 41 979 633 40 + 979 634 39 979 652 38 979 660 37 979 667 35 979 667 36 979 670 35 + 979 671 34 979 683 33 979 705 32 979 711 31 979 716 30 979 726 29 + 979 730 28 979 759 27 979 762 26 979 768 24 979 768 25 979 777 23 + 979 786 22 979 790 21 979 792 20 979 794 19 979 805 18 979 822 17 + 979 839 15 979 839 16 979 840 14 979 844 13 979 845 12 979 870 9 + 979 870 10 979 870 11 979 899 9 979 911 8 979 929 7} + +do_execsql_test 5.1.14.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE NO OTHERS ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87 6485 81 81 6485 82 82 6485 83 83 7324 80 80 8163 78 78 8163 79 79 8968 73 73 8968 74 74 8968 75 75 8968 76 76 8968 77 77 9745 69 69 @@ -3891,7 +4247,7 @@ do_execsql_test 5.2.1.1 { count(a) OVER win FROM t3 WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {963 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 @@ -3914,7 +4270,7 @@ do_execsql_test 5.2.1.2 { dense_rank() OVER win FROM t3 WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {22176 1 1 22192 1 1 22196 1 1 22226 1 1 22244 1 1 22256 1 1 22310 1 1 22316 1 1 22316 1 1 22350 1 1 22378 1 1 22396 1 1 22444 1 1 22450 1 1 22472 1 1 22484 1 1 22488 1 1 22488 1 1 @@ -3936,9 +4292,9 @@ do_execsql_test 5.2.2.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY a + WINDOW win AS ( ORDER BY a NULLS FIRST RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {839 113 8 899 113 8 899 113 8 899 113 8 899 113 8 899 113 8 899 113 8 899 113 8 899 113 15 899 113 15 899 113 15 899 113 15 899 113 15 899 113 15 899 113 15 899 234 8 963 113 24 979 102 43 @@ -3960,9 +4316,9 @@ do_execsql_test 5.2.2.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY a + WINDOW win AS ( ORDER BY a NULLS FIRST RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {2048 81 11 2108 81 11 2108 81 11 2690 81 11 2834 81 11 2947 81 11 2947 81 11 2947 81 11 2947 81 11 4482 74 10 4616 74 10 4844 74 10 4866 74 10 5287 74 10 5287 74 10 5287 74 10 7421 65 9 7437 65 9 @@ -3986,7 +4342,7 @@ do_execsql_test 5.2.3.1 { FROM t3 WINDOW win AS ( PARTITION BY coalesce(a, '') RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {667 158 0 671 250 6 759 158 5 768 113 4 777 113 4 777 113 4 777 113 4 777 252 4 792 247 12 805 250 6 805 250 6 805 250 6 805 250 6 805 250 6 805 398 6 822 158 5 822 158 5 822 158 5 @@ -4010,7 +4366,7 @@ do_execsql_test 5.2.3.2 { FROM t3 WINDOW win AS ( PARTITION BY coalesce(a, '') RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {295 1 1 335 1 1 607 1 1 667 1 1 742 1 1 759 1 1 845 1 1 890 1 1 929 1 1 959 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 1264 1 1 1264 1 1 @@ -4030,8 +4386,8 @@ do_execsql_test 5.2.4.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {667 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 355 0 911 158 7 934 158 7 934 158 7 934 158 7 934 158 7 934 158 7 934 158 7 934 158 7 934 158 20 934 158 20 934 158 20 934 158 20 @@ -4053,8 +4409,8 @@ do_execsql_test 5.2.4.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {1383 1 1 1421 1 1 1651 1 1 1695 1 1 2050 1 1 2050 1 1 3448 7 2 3732 7 2 4050 7 2 4120 7 2 4136 7 2 4359 7 2 4359 7 2 4359 7 2 7129 15 3 7135 15 3 7207 15 3 7441 15 3 7447 15 3 7447 15 3 @@ -4077,8 +4433,8 @@ do_execsql_test 5.2.5.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 113 113 1 @@ -4100,8 +4456,8 @@ do_execsql_test 5.2.5.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8 {} 14 12 {} 15 13 {} 19 17 {} 20 18 {} 21 19 {} 23 21 {} 25 23 {} 34 29 {} 35 30 {} 36 31 {} 37 32 {} 38 33 {} 38 33 {} 40 34 @@ -4122,8 +4478,8 @@ do_execsql_test 5.2.6.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 @@ -4144,8 +4500,8 @@ do_execsql_test 5.2.6.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8 {} 11 9 {} 12 10 {} 13 11 {} 14 12 {} 15 13 {} 16 14 {} 17 15 {} 18 16 {} 19 17 {} 20 18 {} 21 19 {} 22 20 {} 23 21 {} 24 22 @@ -4165,9 +4521,9 @@ do_execsql_test 5.2.7.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c , b , a + WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 83 979 113 80 979 113 81 979 113 82 979 133 79 979 148 78 979 158 76 979 158 77 979 160 76 979 208 75 979 223 74 979 224 73 @@ -4189,9 +4545,334 @@ do_execsql_test 5.2.7.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c , b , a + WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81 + 5640 84 84 5640 85 85 5640 86 86 7324 80 80 8123 77 77 8129 73 73 + 8129 74 74 8163 78 78 8163 79 79 8940 71 71 8968 75 75 8968 76 76 + 9727 66 66 9745 69 69 9745 70 70 9745 72 72 10504 65 65 + 10504 67 67 10504 68 68 11215 64 64 11844 62 62 11920 63 63 + 13274 60 60 13274 61 61 13897 58 58 13903 57 57 13925 56 56 + 13937 55 55 13941 59 59 15203 53 53 15241 54 54 15832 52 52 + 17100 48 48 17104 46 46 17104 47 47 17106 45 45 17126 49 49 + 17126 50 50 17126 51 51 17569 42 42 17733 44 44 18176 43 43 + 18597 40 40 18597 41 41 18952 37 37 18996 39 39 19395 38 38 + 19760 35 35 19788 36 36 20492 32 32 20492 33 33 20498 30 30 + 20536 34 34 20833 29 29 20871 28 28 20891 31 31 21180 27 27 + 21752 23 23 21830 26 26 22025 21 21 22087 22 22 22087 24 24 + 22087 25 25 22278 20 20 22316 19 19 22549 15 15 22557 14 14 + 22573 17 17 22573 18 18 22706 10 10 22796 11 11 22796 12 12 + 22796 13 13 22796 16 16 23022 4 4 23042 2 2 23042 3 3 23042 9 9 + 23155 1 1 23155 5 5 23155 6 6 23155 7 7 23155 8 8} + +do_execsql_test 5.2.8.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {963 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 83 979 102 83 + 979 102 83 979 102 83 979 102 83 979 102 83 979 113 82} + +do_execsql_test 5.2.8.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {22176 1 1 22192 1 1 22196 1 1 22226 1 1 22244 1 1 22256 1 1 + 22310 1 1 22316 1 1 22316 1 1 22350 1 1 22378 1 1 22396 1 1 + 22444 1 1 22450 1 1 22472 1 1 22484 1 1 22488 1 1 22488 1 1 + 22522 1 1 22526 1 1 22526 1 1 22528 1 1 22548 1 1 22712 1 1 + 22734 1 1 22756 1 1 22756 1 1 22762 1 1 22762 1 1 22800 1 1 + 22800 1 1 22820 1 1 22846 1 1 22860 1 1 22898 1 1 22908 1 1 + 22916 1 1 22932 1 1 23022 1 1 23042 1 1 23042 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1 + 23155 1 1 23155 1 1 23155 1 1 23155 1 1 23155 1 1} + +do_execsql_test 5.2.9.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {667 158 0 870 113 8 870 158 0 870 158 0 870 158 0 870 158 0 + 870 355 0 899 113 8 899 113 8 899 113 8 899 113 8 899 113 8 + 899 113 8 899 113 8 899 113 15 899 113 15 899 113 15 899 113 15 + 899 113 15 899 113 15 899 113 15 899 158 8 963 113 24 979 102 43 + 979 102 43 979 102 43 979 102 43 979 102 43 979 102 43 979 102 43 + 979 102 43 979 102 43 979 102 43 979 102 48 979 102 48 979 102 48 + 979 102 48 979 102 48 979 102 55 979 102 55 979 102 55 979 102 55 + 979 102 55 979 102 55 979 102 55 979 102 61 979 102 61 979 102 61 + 979 102 61 979 102 61 979 102 61 979 102 74 979 102 74 979 102 74 + 979 102 74 979 102 74 979 102 74 979 102 74 979 102 74 979 102 74 + 979 102 74 979 102 74 979 102 74 979 102 74 979 102 82 979 102 82 + 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 113 24 979 113 24 979 113 24 979 113 24 979 113 24 979 113 24 + 979 113 24 979 113 24 979 113 32 979 113 32 979 113 32 979 113 32 + 979 113 32 979 113 32 979 113 32 979 113 32 979 113 43} + +do_execsql_test 5.2.9.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {1383 84 11 1421 84 11 1651 84 11 1695 84 11 2050 84 11 2050 84 11 + 4098 75 10 4158 75 10 4158 75 10 4740 75 10 4884 75 10 4997 75 10 + 4997 75 10 4997 75 10 4997 75 10 6532 68 9 6666 68 9 6894 68 9 + 6916 68 9 7337 68 9 7337 68 9 7337 68 9 9471 59 8 9487 59 8 + 9767 59 8 10095 59 8 10317 59 8 10450 59 8 10450 59 8 10450 59 8 + 10450 59 8 10785 51 7 11379 51 7 11714 51 7 11714 51 7 11714 51 7 + 11714 51 7 11714 51 7 11714 51 7 12009 40 6 12381 40 6 12676 40 6 + 12676 40 6 12676 40 6 12676 40 6 12676 40 6 12676 40 6 12676 40 6 + 12676 40 6 12676 40 6 13418 35 5 13566 35 5 14082 35 5 14195 35 5 + 14195 35 5 15040 28 4 15154 28 4 15999 28 4 15999 28 4 15999 28 4 + 15999 28 4 15999 28 4 16606 22 3 16758 22 3 17365 22 3 17365 22 3 + 17365 22 3 17365 22 3 20135 9 2 20141 9 2 20213 9 2 20447 9 2 + 20453 9 2 20453 9 2 20599 9 2 20846 9 2 20846 9 2 20846 9 2 + 20846 9 2 20846 9 2 20846 9 2 22244 1 1 22528 1 1 22846 1 1 + 22916 1 1 22932 1 1 23155 1 1 23155 1 1 23155 1 1} + +do_execsql_test 5.2.10.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {667 158 0 671 250 6 759 158 5 768 113 4 777 113 4 777 113 4 + 777 113 4 777 252 4 792 247 12 805 250 6 805 250 6 805 250 6 + 805 250 6 805 250 6 805 398 6 822 158 5 822 158 5 822 158 5 + 822 158 5 822 346 5 839 113 8 840 247 12 840 247 12 840 247 12 + 840 247 12 840 247 12 840 247 12 840 247 12 840 247 12 840 247 12 + 840 247 12 840 247 12 840 393 12 845 224 6 870 102 10 870 158 0 + 870 158 0 870 158 0 870 158 0 870 355 0 899 113 8 899 113 8 + 899 113 8 899 113 8 899 113 8 899 113 8 899 113 8 899 234 8 + 911 223 7 929 148 7 934 223 7 934 223 7 934 223 7 934 223 7 + 934 223 7 934 223 7 934 239 7 938 102 10 938 102 10 938 102 10 + 938 102 10 938 102 10 938 102 10 938 102 10 938 102 10 938 102 10 + 938 148 7 938 148 7 938 148 7 938 148 7 938 148 7 938 148 7 + 938 160 7 938 208 10 959 224 6 959 224 6 959 224 6 959 224 6 + 959 224 6 959 238 6 963 133 8 979 133 8 979 133 8 979 133 8 + 979 133 8 979 133 8 979 133 8 979 133 8 979 330 8} + +do_execsql_test 5.2.10.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {295 1 1 335 1 1 607 1 1 667 1 1 742 1 1 759 1 1 845 1 1 + 890 1 1 929 1 1 959 1 1 962 1 1 962 1 1 962 1 1 962 1 1 + 962 1 1 962 1 1 962 1 1 962 1 1 962 1 1 1264 1 1 1264 1 1 + 1264 1 1 1264 1 1 1264 1 1 1264 1 1 1366 1 1 1366 1 1 1366 1 1 + 1366 1 1 1383 1 1 1398 1 1 1406 1 1 1421 1 1 1519 1 1 1519 1 1 + 1535 1 1 1651 1 1 1669 1 1 1682 1 1 1695 1 1 1804 1 1 1804 1 1 + 1804 1 1 1804 1 1 1804 1 1 1897 1 1 1919 1 1 2000 1 1 2048 1 1 + 2050 1 1 2050 1 1 2070 1 1 2086 1 1 2108 1 1 2108 1 1 2134 1 1 + 2150 1 1 2309 1 1 2309 1 1 2309 1 1 2340 1 1 2340 1 1 2340 1 1 + 2430 1 1 2690 1 1 2758 1 1 2770 1 1 2776 1 1 2834 1 1 2848 1 1 + 2947 1 1 2947 1 1 2947 1 1 2947 1 1 2980 1 1 3082 1 1 3088 1 1 + 3088 1 1 3113 1 1 3113 1 1 3113 1 1 3113 1 1 3234 1 1 3481 1 1 + 3481 1 1 3481 1 1 3481 1 1 3481 1 1 3481 1 1} + +do_execsql_test 5.2.11.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {911 223 7 934 158 26 934 158 26 934 158 26 934 158 26 934 158 26 + 934 158 33 934 223 7 934 223 7 934 223 7 934 223 7 934 223 7 + 934 223 7 934 223 20 934 223 20 934 223 20 934 223 20 934 223 20 + 934 223 20 934 223 20 934 223 20 934 223 20 934 223 20 934 223 20 + 934 223 20 934 223 20 934 223 26 934 239 7 959 102 49 959 102 49 + 959 102 49 959 102 49 959 102 49 959 102 49 959 102 49 959 102 49 + 959 102 49 959 102 49 959 102 57 959 102 57 959 102 57 959 102 57 + 959 102 57 959 102 57 959 102 57 959 102 57 959 113 38 959 113 38 + 959 113 38 959 113 38 959 113 49 959 158 33 959 158 33 959 158 33 + 959 158 33 959 158 33 959 158 33 959 158 38 963 102 58 979 102 49 + 979 102 49 979 102 49 979 102 49 979 102 49 979 102 49 979 102 52 + 979 102 52 979 102 52 979 102 52 979 102 52 979 102 52 979 102 52 + 979 102 55 979 102 55 979 102 55 979 102 55 979 102 55 979 102 55 + 979 102 55 979 102 55 979 102 55 979 102 58 979 102 58 979 102 58 + 979 102 58 979 102 58 979 102 58 979 102 58 979 102 58} + +do_execsql_test 5.2.11.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {1398 1 1 1682 1 1 2000 1 1 2070 1 1 2086 1 1 2309 1 1 2309 1 1 + 2309 1 1 5079 9 2 5085 9 2 5157 9 2 5391 9 2 5397 9 2 5397 9 2 + 5543 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 5790 9 2 + 6397 22 3 6549 22 3 7156 22 3 7156 22 3 7156 22 3 7156 22 3 + 8001 28 4 8115 28 4 8960 28 4 8960 28 4 8960 28 4 8960 28 4 + 8960 28 4 9702 35 5 9850 35 5 10366 35 5 10479 35 5 10479 35 5 + 10774 40 6 11146 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6 + 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11441 40 6 11563 68 9 + 11697 68 9 11776 51 7 11925 68 9 11947 68 9 12368 68 9 12368 68 9 + 12368 68 9 12370 51 7 12530 59 8 12546 59 8 12705 51 7 12705 51 7 + 12705 51 7 12705 51 7 12705 51 7 12705 51 7 12826 59 8 + 13050 75 10 13110 75 10 13110 75 10 13154 59 8 13376 59 8 + 13509 59 8 13509 59 8 13509 59 8 13509 59 8 13528 84 11 + 13566 84 11 13692 75 10 13796 84 11 13836 75 10 13840 84 11 + 13949 75 10 13949 75 10 13949 75 10 13949 75 10 14195 84 11 + 14195 84 11} + +do_execsql_test 5.2.12.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 113 113 1 + 113 113 1 158 158 1 160 158 1 160 158 2 223 223 1 224 224 1 + 238 234 2 239 234 2 239 238 2 252 250 2 256 252 2 257 247 4 + 257 247 4 257 250 3 335 330 2 336 330 2 336 335 2 355 354 1 + 355 354 2 355 355 1 399 393 3 399 393 3 399 393 3 399 393 3 + 399 393 4 480 480 1 480 480 1 572 572 1 574 574 1 618 618 1 + 618 618 1 633 629 2 634 627 3 634 627 3 634 627 4 634 629 3 + 667 667 1 670 667 2 671 667 2 671 667 2 671 667 3 711 711 1 + 711 711 1 716 705 2 726 726 1 730 730 1 762 762 1 768 759 3 + 768 762 2 768 762 2 792 790 2 792 790 2 794 786 3 794 786 3 + 844 839 4 845 839 4 845 839 4 845 839 4 845 839 4 870 870 1 + 870 870 1 870 870 2 934 934 1 938 929 3 938 934 2 938 934 2 + 959 959 1 963 963 1} + +do_execsql_test 5.2.12.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8 + {} 14 12 {} 15 13 {} 19 17 {} 20 18 {} 21 19 {} 23 21 {} 25 23 + {} 34 29 {} 35 30 {} 36 31 {} 37 32 {} 38 33 {} 38 33 {} 40 34 + {} 41 35 {} 42 36 {} 43 37 {} 43 37 {} 50 42 {} 56 47 {} 60 51 + {} 61 52 {} 62 53 {} 64 55 {} 64 55 {} 66 56 {} 67 57 {} 68 58 + {} 69 59 {} 70 60 {} 71 61 {} 72 62 {} 78 67 {} 78 67 {} 78 67 + {} 81 68 {} 82 69 {} 83 70 {} 85 72 {} 85 72 {} 89 75 113 2 2 + 113 2 2 223 11 9 239 12 10 239 13 11 257 18 16 335 22 20 + 335 24 22 355 27 25 355 27 25 504 16 14 504 17 15 705 58 49 + 710 26 24 711 57 48 711 59 50 759 63 54 929 84 71 959 88 74 + 963 87 73 1185 32 28 1185 32 28 1191 29 26 1191 29 26 1334 51 43 + 1334 55 46 1338 52 44 1338 52 44 1584 31 27 1678 77 66 1684 73 63 + 1684 73 63 1885 48 40 1889 46 39 1889 46 39 1891 45 38 1891 49 41 + 2005 54 45 2523 75 64 2523 76 65} + +do_execsql_test 5.2.13.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 113 113 1 + 113 113 1 158 158 0 158 158 1 355 355 0 355 355 1 393 393 1 + 393 393 1 399 399 0 399 399 1 480 480 1 480 480 1 618 618 1 + 618 618 1 629 629 0 629 629 1 667 667 0 667 667 1 768 768 1 + 768 768 1 839 839 1 839 839 1 870 870 1 870 870 1 870 870 2 + 938 938 1 938 938 1} + +do_execsql_test 5.2.13.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8 + {} 11 9 {} 12 10 {} 13 11 {} 14 12 {} 15 13 {} 16 14 {} 17 15 + {} 18 16 {} 19 17 {} 20 18 {} 21 19 {} 22 20 {} 23 21 {} 24 22 + {} 25 23 {} 26 24 {} 31 27 {} 34 29 {} 35 30 {} 36 31 {} 37 32 + {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 42 36 {} 43 37 {} 43 37 + {} 45 38 {} 48 40 {} 49 41 {} 50 42 {} 51 43 {} 54 45 {} 55 46 + {} 56 47 {} 57 48 {} 58 49 {} 59 50 {} 60 51 {} 61 52 {} 62 53 + {} 63 54 {} 64 55 {} 64 55 {} 66 56 {} 67 57 {} 68 58 {} 69 59 + {} 70 60 {} 71 61 {} 72 62 {} 75 64 {} 76 65 {} 77 66 {} 78 67 + {} 78 67 {} 78 67 {} 81 68 {} 82 69 {} 83 70 {} 84 71 {} 85 72 + {} 85 72 {} 87 73 {} 88 74 {} 89 75 113 2 2 113 2 2 355 27 25 + 355 27 25 393 29 26 393 29 26 399 32 28 399 32 28 629 46 39 + 629 46 39 667 52 44 667 52 44 839 73 63 839 73 63} + +do_execsql_test 5.2.14.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 83 979 113 80 979 113 81 979 113 82 979 133 79 979 148 78 + 979 158 76 979 158 77 979 160 76 979 208 75 979 223 74 979 224 73 + 979 234 72 979 238 71 979 239 70 979 247 69 979 250 68 979 252 67 + 979 256 66 979 257 65 979 295 64 979 309 63 979 330 63 979 335 61 + 979 336 60 979 346 59 979 354 58 979 355 56 979 355 58 979 393 55 + 979 393 56 979 398 54 979 399 52 979 399 53 979 412 52 979 421 51 + 979 430 50 979 443 49 979 480 47 979 480 48 979 572 46 979 574 46 + 979 607 44 979 618 42 979 618 43 979 627 41 979 629 40 979 629 40 + 979 633 39 979 634 38 979 652 37 979 660 36 979 667 34 979 667 35 + 979 670 34 979 671 33 979 683 32 979 705 31 979 711 30 979 716 29 + 979 726 28 979 730 27 979 759 26 979 762 25 979 768 23 979 768 24 + 979 777 22 979 786 21 979 790 20 979 792 19 979 794 18 979 805 17 + 979 822 16 979 839 15 979 839 15 979 840 13 979 844 12 979 845 11 + 979 870 8 979 870 9 979 870 10 979 899 8 979 911 7} + +do_execsql_test 5.2.14.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE CURRENT ROW ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81 5640 84 84 5640 85 85 5640 86 86 7324 80 80 8123 77 77 8129 73 73 8129 74 74 8163 78 78 8163 79 79 8940 71 71 8968 75 75 8968 76 76 @@ -4216,7 +4897,7 @@ do_execsql_test 5.3.1.1 { count(a) OVER win FROM t3 WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 @@ -4237,7 +4918,7 @@ do_execsql_test 5.3.1.2 { dense_rank() OVER win FROM t3 WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 @@ -4256,9 +4937,9 @@ do_execsql_test 5.3.2.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY a + WINDOW win AS ( ORDER BY a NULLS FIRST RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 9 899 113 16 899 113 16 899 113 16 @@ -4280,9 +4961,9 @@ do_execsql_test 5.3.2.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY a + WINDOW win AS ( ORDER BY a NULLS FIRST RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 81 11 {} 81 11 {} 81 11 {} 81 11 {} 81 11 {} 81 11 {} 81 11 {} 81 11 {} 81 11 2947 74 10 2947 74 10 2947 74 10 2947 74 10 2947 74 10 2947 74 10 2947 74 10 5287 65 9 5287 65 9 5287 65 9 @@ -4306,7 +4987,7 @@ do_execsql_test 5.3.3.1 { FROM t3 WINDOW win AS ( PARTITION BY coalesce(a, '') RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 @@ -4328,7 +5009,7 @@ do_execsql_test 5.3.3.2 { FROM t3 WINDOW win AS ( PARTITION BY coalesce(a, '') RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 @@ -4347,8 +5028,8 @@ do_execsql_test 5.3.4.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 934 158 8 934 158 8 934 158 8 934 158 8 934 158 8 @@ -4370,8 +5051,8 @@ do_execsql_test 5.3.4.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 2050 7 2 2050 7 2 2050 7 2 2050 7 2 2050 7 2 2050 7 2 2050 7 2 2050 7 2 4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3 @@ -4393,8 +5074,8 @@ do_execsql_test 5.3.5.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 @@ -4416,8 +5097,8 @@ do_execsql_test 5.3.5.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 2 2 {} 2 2 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8 {} 14 12 {} 15 13 {} 19 17 {} 20 18 {} 21 19 {} 23 21 {} 25 23 {} 27 25 {} 27 25 {} 34 29 {} 35 30 {} 36 31 @@ -4438,8 +5119,8 @@ do_execsql_test 5.3.6.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 @@ -4459,8 +5140,8 @@ do_execsql_test 5.3.6.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 2 2 {} 2 2 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 10 8 {} 11 9 {} 12 10 {} 13 11 {} 14 12 {} 15 13 {} 16 14 {} 17 15 {} 18 16 {} 19 17 {} 20 18 {} 21 19 {} 22 20 @@ -4480,9 +5161,9 @@ do_execsql_test 5.3.7.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c , b , a + WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 979 102 83 979 113 80 979 113 81 979 113 82 979 133 79 979 148 78 979 158 76 979 158 77 979 160 76 979 208 75 979 223 74 979 224 73 @@ -4504,9 +5185,324 @@ do_execsql_test 5.3.7.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c , b , a + WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81 + 5640 84 84 5640 85 85 5640 86 86 7324 80 80 8123 77 77 8129 73 73 + 8129 74 74 8163 78 78 8163 79 79 8940 71 71 8968 75 75 8968 76 76 + 9727 66 66 9745 69 69 9745 70 70 9745 72 72 10504 65 65 + 10504 67 67 10504 68 68 11215 64 64 11844 62 62 11920 63 63 + 13274 60 60 13274 61 61 13897 58 58 13903 57 57 13925 56 56 + 13937 55 55 13941 59 59 15203 53 53 15241 54 54 15832 52 52 + 17100 48 48 17104 46 46 17104 47 47 17106 45 45 17126 49 49 + 17126 50 50 17126 51 51 17569 42 42 17733 44 44 18176 43 43 + 18597 40 40 18597 41 41 18952 37 37 18996 39 39 19395 38 38 + 19760 35 35 19788 36 36 20492 32 32 20492 33 33 20498 30 30 + 20536 34 34 20833 29 29 20871 28 28 20891 31 31 21180 27 27 + 21752 23 23 21830 26 26 22025 21 21 22087 22 22 22087 24 24 + 22087 25 25 22278 20 20 22316 19 19 22549 15 15 22557 14 14 + 22573 17 17 22573 18 18 22706 10 10 22796 11 11 22796 12 12 + 22796 13 13 22796 16 16 23022 4 4 23042 2 2 23042 3 3 23042 9 9 + 23155 1 1 23155 5 5 23155 6 6 23155 7 7 23155 8 8} + +do_execsql_test 5.3.8.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0} + +do_execsql_test 5.3.8.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1} + +do_execsql_test 5.3.9.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 870 158 0 + 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 870 158 0 + 870 158 0 870 158 0 899 113 9 899 113 9 899 113 9 899 113 9 + 899 113 9 899 113 9 899 113 9 899 113 16 899 113 16 899 113 16 + 899 113 16 899 113 16 899 113 16 899 113 16 899 113 16 899 113 16 + 979 102 44 979 102 44 979 102 44 979 102 44 979 102 44 979 102 49 + 979 102 49 979 102 49 979 102 49 979 102 49 979 102 49 979 102 49 + 979 102 56 979 102 56 979 102 56 979 102 56 979 102 56 979 102 56 + 979 102 62 979 102 62 979 102 62 979 102 62 979 102 62 979 102 62 + 979 102 62 979 102 62 979 102 62 979 102 62 979 102 62 979 102 62 + 979 102 62 979 102 75 979 102 75 979 102 75 979 102 75 979 102 75 + 979 102 75 979 102 75 979 102 75 979 113 25 979 113 25 979 113 25 + 979 113 25 979 113 25 979 113 25 979 113 25 979 113 25 979 113 33 + 979 113 33 979 113 33 979 113 33 979 113 33 979 113 33 979 113 33 + 979 113 33 979 113 33 979 113 33 979 113 33} + +do_execsql_test 5.3.9.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 84 11 {} 84 11 {} 84 11 {} 84 11 {} 84 11 {} 84 11 + 2050 75 10 2050 75 10 2050 75 10 2050 75 10 2050 75 10 2050 75 10 + 2050 75 10 2050 75 10 2050 75 10 4997 68 9 4997 68 9 4997 68 9 + 4997 68 9 4997 68 9 4997 68 9 4997 68 9 7337 59 8 7337 59 8 + 7337 59 8 7337 59 8 7337 59 8 7337 59 8 7337 59 8 7337 59 8 + 7337 59 8 10450 51 7 10450 51 7 10450 51 7 10450 51 7 10450 51 7 + 10450 51 7 10450 51 7 10450 51 7 11714 40 6 11714 40 6 11714 40 6 + 11714 40 6 11714 40 6 11714 40 6 11714 40 6 11714 40 6 11714 40 6 + 11714 40 6 11714 40 6 12676 35 5 12676 35 5 12676 35 5 12676 35 5 + 12676 35 5 14195 28 4 14195 28 4 14195 28 4 14195 28 4 14195 28 4 + 14195 28 4 14195 28 4 15999 22 3 15999 22 3 15999 22 3 15999 22 3 + 15999 22 3 15999 22 3 17365 9 2 17365 9 2 17365 9 2 17365 9 2 + 17365 9 2 17365 9 2 17365 9 2 17365 9 2 17365 9 2 17365 9 2 + 17365 9 2 17365 9 2 17365 9 2 20846 1 1 20846 1 1 20846 1 1 + 20846 1 1 20846 1 1 20846 1 1 20846 1 1 20846 1 1} + +do_execsql_test 5.3.10.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0} + +do_execsql_test 5.3.10.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1} + +do_execsql_test 5.3.11.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 934 158 27 934 158 27 934 158 27 934 158 27 934 158 27 + 934 158 27 934 158 27 934 223 8 934 223 8 934 223 8 934 223 8 + 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 934 223 8 + 934 223 8 934 223 8 934 223 8 934 223 21 934 223 21 934 223 21 + 934 223 21 934 223 21 934 223 21 959 102 50 959 102 50 959 102 50 + 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 + 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 959 102 50 + 959 102 50 959 102 50 959 113 39 959 113 39 959 113 39 959 113 39 + 959 113 39 959 113 39 959 113 39 959 113 39 959 113 39 959 113 39 + 959 113 39 959 158 34 959 158 34 959 158 34 959 158 34 959 158 34 + 979 102 46 979 102 46 979 102 46 979 102 46 979 102 46 979 102 46 + 979 102 46 979 102 47 979 102 47 979 102 47 979 102 47 979 102 47 + 979 102 47 979 102 47 979 102 47 979 102 47 979 102 49 979 102 49 + 979 102 49 979 102 49 979 102 49 979 102 49} + +do_execsql_test 5.3.11.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 + 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 5790 22 3 + 5790 22 3 5790 22 3 5790 22 3 5790 22 3 5790 22 3 7156 28 4 + 7156 28 4 7156 28 4 7156 28 4 7156 28 4 7156 28 4 7156 28 4 + 8960 35 5 8960 35 5 8960 35 5 8960 35 5 8960 35 5 10028 68 9 + 10028 68 9 10028 68 9 10028 68 9 10028 68 9 10028 68 9 10028 68 9 + 10396 59 8 10396 59 8 10396 59 8 10396 59 8 10396 59 8 10396 59 8 + 10396 59 8 10396 59 8 10396 59 8 10479 40 6 10479 40 6 10479 40 6 + 10479 40 6 10479 40 6 10479 40 6 10479 40 6 10479 40 6 10479 40 6 + 10479 40 6 10479 40 6 11002 75 10 11002 75 10 11002 75 10 + 11002 75 10 11002 75 10 11002 75 10 11002 75 10 11002 75 10 + 11002 75 10 11441 51 7 11441 51 7 11441 51 7 11441 51 7 + 11441 51 7 11441 51 7 11441 51 7 11441 51 7 12145 84 11 + 12145 84 11 12145 84 11 12145 84 11 12145 84 11 12145 84 11} + +do_execsql_test 5.3.12.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 158 158 1 160 160 1 160 160 1 223 223 1 224 224 1 + 238 234 2 239 234 2 239 238 2 252 250 2 256 252 2 257 247 4 + 257 247 4 257 250 3 335 330 2 336 330 2 336 335 2 354 354 1 + 354 354 1 355 355 1 398 393 3 398 393 3 399 393 3 399 398 2 + 399 398 2 572 572 1 574 574 1 633 629 2 634 627 3 634 627 3 + 634 627 3 634 629 3 667 667 1 670 667 2 671 667 2 671 670 2 + 671 670 2 711 711 1 711 711 1 716 705 2 726 726 1 730 730 1 + 762 762 1 762 762 1 762 762 1 768 759 3 792 790 2 792 790 2 + 794 786 3 794 786 3 844 839 4 845 839 4 845 839 4 845 840 3 + 845 840 3 934 934 1 934 934 1 934 934 1 938 929 3 959 959 1 + 963 963 1} + +do_execsql_test 5.3.12.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 2 2 {} 2 2 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 + {} 9 7 {} 10 8 {} 14 12 {} 15 13 {} 19 17 {} 20 18 {} 21 19 + {} 23 21 {} 25 23 {} 27 25 {} 27 25 {} 34 29 {} 35 30 {} 36 31 + {} 37 32 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 42 36 {} 43 37 + {} 43 37 {} 50 42 {} 56 47 {} 60 51 {} 61 52 {} 62 53 {} 64 55 + {} 64 55 {} 66 56 {} 67 57 {} 68 58 {} 69 59 {} 70 60 {} 71 61 + {} 72 62 {} 78 67 {} 78 67 {} 78 67 {} 81 68 {} 82 69 {} 83 70 + {} 85 72 {} 85 72 {} 89 75 223 11 9 239 12 10 239 13 11 + 257 18 16 335 22 20 335 24 22 504 16 14 504 17 15 671 52 44 + 671 52 44 705 58 49 710 26 24 711 57 48 711 59 50 759 63 54 + 786 32 28 786 32 28 798 29 26 798 29 26 845 73 63 845 73 63 + 929 84 71 959 88 74 963 87 73 1260 46 39 1260 46 39 1334 51 43 + 1334 55 46 1584 31 27 1678 77 66 1885 48 40 1891 45 38 1891 49 41 + 2005 54 45 2523 75 64 2523 76 65} + +do_execsql_test 5.3.13.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0 + {} {} 0 {} {} 0 {} {} 0 {} {} 0 {} {} 0} + +do_execsql_test 5.3.13.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 2 2 {} 2 2 {} 4 3 {} 5 4 {} 6 5 {} 6 5 {} 8 6 + {} 9 7 {} 10 8 {} 11 9 {} 12 10 {} 13 11 {} 14 12 {} 15 13 + {} 16 14 {} 17 15 {} 18 16 {} 19 17 {} 20 18 {} 21 19 {} 22 20 + {} 23 21 {} 24 22 {} 25 23 {} 26 24 {} 27 25 {} 27 25 {} 29 26 + {} 29 26 {} 31 27 {} 32 28 {} 32 28 {} 34 29 {} 35 30 {} 36 31 + {} 37 32 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 42 36 {} 43 37 + {} 43 37 {} 45 38 {} 46 39 {} 46 39 {} 48 40 {} 49 41 {} 50 42 + {} 51 43 {} 52 44 {} 52 44 {} 54 45 {} 55 46 {} 56 47 {} 57 48 + {} 58 49 {} 59 50 {} 60 51 {} 61 52 {} 62 53 {} 63 54 {} 64 55 + {} 64 55 {} 66 56 {} 67 57 {} 68 58 {} 69 59 {} 70 60 {} 71 61 + {} 72 62 {} 73 63 {} 73 63 {} 75 64 {} 76 65 {} 77 66 {} 78 67 + {} 78 67 {} 78 67 {} 81 68 {} 82 69 {} 83 70 {} 84 71 {} 85 72 + {} 85 72 {} 87 73 {} 88 74 {} 89 75} + +do_execsql_test 5.3.14.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {963 929 6 979 102 82 979 102 82 979 102 82 979 102 82 979 102 82 + 979 102 83 979 113 80 979 113 81 979 113 82 979 133 79 979 148 78 + 979 158 76 979 158 77 979 160 76 979 208 75 979 223 74 979 224 73 + 979 234 72 979 238 71 979 239 70 979 247 69 979 250 68 979 252 67 + 979 256 66 979 257 65 979 295 64 979 309 63 979 330 63 979 335 61 + 979 336 60 979 346 59 979 354 58 979 355 56 979 355 58 979 393 55 + 979 393 56 979 398 54 979 399 52 979 399 53 979 412 52 979 421 51 + 979 430 50 979 443 49 979 480 47 979 480 48 979 572 46 979 574 46 + 979 607 44 979 618 42 979 618 43 979 627 41 979 629 40 979 629 40 + 979 633 39 979 634 38 979 652 37 979 660 36 979 667 34 979 667 35 + 979 670 34 979 671 33 979 683 32 979 705 31 979 711 30 979 716 29 + 979 726 28 979 730 27 979 759 26 979 762 25 979 768 23 979 768 24 + 979 777 22 979 786 21 979 790 20 979 792 19 979 794 18 979 805 17 + 979 822 16 979 839 15 979 839 15 979 840 13 979 844 12 979 845 11 + 979 870 8 979 870 9 979 870 10 979 899 8 979 911 7} + +do_execsql_test 5.3.14.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE GROUP ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {2851 89 89 3778 88 88 4681 87 87 5556 83 83 5574 82 82 5586 81 81 5640 84 84 5640 85 85 5640 86 86 7324 80 80 8123 77 77 8129 73 73 8129 74 74 8163 78 78 8163 79 79 8940 71 71 8968 75 75 8968 76 76 @@ -4531,7 +5527,7 @@ do_execsql_test 5.4.1.1 { count(a) OVER win FROM t3 WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1 @@ -4554,7 +5550,7 @@ do_execsql_test 5.4.1.2 { dense_rank() OVER win FROM t3 WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 @@ -4573,9 +5569,9 @@ do_execsql_test 5.4.2.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY a + WINDOW win AS ( ORDER BY a NULLS FIRST RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {113 113 1 234 234 1 257 257 1 336 336 1 354 354 1 768 768 1 839 839 1 839 839 1 899 113 10 899 113 10 899 113 10 899 113 10 899 113 10 899 113 10 899 113 10 899 113 17 899 113 17 899 113 17 @@ -4597,9 +5593,9 @@ do_execsql_test 5.4.2.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY a + WINDOW win AS ( ORDER BY a NULLS FIRST RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 81 11 {} 81 11 {} 81 11 {} 81 11 113 81 11 257 81 11 839 81 11 839 81 11 899 81 11 2947 74 10 2947 74 10 2947 74 10 3368 74 10 3390 74 10 3618 74 10 3752 74 10 5287 65 9 5287 65 9 @@ -4623,7 +5619,7 @@ do_execsql_test 5.4.3.1 { FROM t3 WINDOW win AS ( PARTITION BY coalesce(a, '') RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1 @@ -4647,7 +5643,7 @@ do_execsql_test 5.4.3.2 { FROM t3 WINDOW win AS ( PARTITION BY coalesce(a, '') RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 @@ -4666,8 +5662,8 @@ do_execsql_test 5.4.4.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {158 158 0 355 355 0 399 399 0 629 629 0 667 667 0 870 158 1 870 158 1 870 158 1 870 158 1 870 158 1 870 158 1 870 870 0 911 158 1 934 158 1 934 158 9 934 158 9 934 158 9 934 158 9 @@ -4689,8 +5685,8 @@ do_execsql_test 5.4.4.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY a GROUPS 6 PRECEDING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY a NULLS FIRST GROUPS 6 PRECEDING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 1 1 355 1 1 399 1 1 629 1 1 667 1 1 2050 7 2 2050 7 2 2050 7 2 2273 7 2 2289 7 2 2359 7 2 2677 7 2 2961 7 2 4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3 4359 15 3 @@ -4713,8 +5709,8 @@ do_execsql_test 5.4.5.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 160 158 1 160 158 2 160 158 2 208 208 1 224 223 2 224 223 2 239 234 3 239 234 3 239 234 3 252 247 3 257 247 5 257 247 5 257 250 4 @@ -4736,8 +5732,8 @@ do_execsql_test 5.4.5.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 25 23 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 43 37 {} 43 37 {} 50 42 {} 60 51 {} 61 52 {} 64 55 {} 64 55 {} 67 57 {} 68 58 @@ -4758,8 +5754,8 @@ do_execsql_test 5.4.6.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1 @@ -4781,8 +5777,8 @@ do_execsql_test 5.4.6.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + WINDOW win AS ( ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 11 9 {} 12 10 {} 13 11 {} 16 14 {} 17 15 {} 18 16 {} 22 20 {} 24 22 {} 25 23 {} 26 24 {} 31 27 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34 @@ -4803,9 +5799,9 @@ do_execsql_test 5.4.7.1 { min(c) OVER win, count(a) OVER win FROM t3 - WINDOW win AS ( ORDER BY c , b , a + WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 113 81 979 113 82 979 133 80 979 148 79 979 158 77 979 158 78 979 160 77 979 208 76 979 223 75 979 224 74 979 234 73 @@ -4827,9 +5823,331 @@ do_execsql_test 5.4.7.2 { rank() OVER win, dense_rank() OVER win FROM t3 - WINDOW win AS ( ORDER BY c , b , a + WINDOW win AS ( ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) - ORDER BY 1 , 2 , 3 + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87 + 6485 81 81 6485 82 82 6485 83 83 7324 80 80 8163 78 78 8163 79 79 + 8968 73 73 8968 74 74 8968 75 75 8968 76 76 8968 77 77 9745 69 69 + 9745 70 70 9745 71 71 9745 72 72 10504 65 65 10504 66 66 + 10504 67 67 10504 68 68 11215 64 64 11920 63 63 12603 62 62 + 13274 60 60 13274 61 61 13941 59 59 14608 55 55 14608 56 56 + 14608 57 57 14608 58 58 15241 54 54 15870 53 53 16499 52 52 + 17126 49 49 17126 50 50 17126 51 51 17733 44 44 17733 45 45 + 17733 46 46 17733 47 47 17733 48 48 18176 42 42 18176 43 43 + 18597 40 40 18597 41 41 18996 39 39 19395 37 37 19395 38 38 + 19788 36 36 20181 35 35 20536 34 34 20891 30 30 20891 31 31 + 20891 32 32 20891 33 33 21226 28 28 21226 29 29 21535 27 27 + 21830 26 26 22087 22 22 22087 23 23 22087 24 24 22087 25 25 + 22334 21 21 22573 17 17 22573 18 18 22573 19 19 22573 20 20 + 22796 11 11 22796 12 12 22796 13 13 22796 14 14 22796 15 15 + 22796 16 16 22929 10 10 23042 9 9 23155 1 1 23155 2 2 23155 3 3 + 23155 4 4 23155 5 5 23155 6 6 23155 7 7 23155 8 8} + +do_execsql_test 5.4.8.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0 + 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1 + 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1 + 257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1 + 346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1 + 398 398 1 399 399 0 399 399 1 412 412 1 421 421 1 430 430 1 + 443 443 1 480 480 1 480 480 1 572 572 1 574 574 1 607 607 1 + 618 618 1 618 618 1 627 627 1 629 629 0 629 629 1 633 633 1 + 634 634 1 652 652 1 660 660 1 667 667 0 667 667 1 670 670 1 + 671 671 1 683 683 1 705 705 1 711 711 1 716 716 1 726 726 1 + 730 730 1 759 759 1 762 762 1 768 768 1 768 768 1 777 777 1 + 786 786 1 790 790 1 792 792 1 794 794 1 805 805 1 822 822 1 + 839 839 1 839 839 1 840 840 1 844 844 1 845 845 1 870 870 0 + 870 870 1 870 870 1 899 899 1 911 911 1 929 929 1 934 934 1 + 938 938 1 938 938 1 959 959 1 963 963 1 979 979 1} + +do_execsql_test 5.4.8.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + 113 1 1 113 1 1 133 1 1 223 1 1 239 1 1 247 1 1 257 1 1 + 295 1 1 309 1 1 335 1 1 355 1 1 355 1 1 393 1 1 393 1 1 + 399 1 1 399 1 1 421 1 1 443 1 1 607 1 1 627 1 1 629 1 1 + 629 1 1 633 1 1 667 1 1 667 1 1 671 1 1 683 1 1 705 1 1 + 711 1 1 759 1 1 777 1 1 805 1 1 839 1 1 839 1 1 845 1 1 + 899 1 1 911 1 1 929 1 1 959 1 1 963 1 1 979 1 1} + +do_execsql_test 5.4.9.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {158 158 0 355 355 0 399 399 0 629 629 0 667 667 0 870 113 1 + 870 158 1 870 158 1 870 158 1 870 158 1 870 158 1 870 158 1 + 870 158 1 870 870 0 899 113 10 899 113 10 899 113 10 899 113 10 + 899 113 10 899 113 10 899 113 10 899 113 17 899 113 17 899 113 17 + 899 113 17 899 113 17 899 113 17 899 113 17 899 158 1 963 113 17 + 979 102 34 979 102 45 979 102 45 979 102 45 979 102 45 979 102 45 + 979 102 50 979 102 50 979 102 50 979 102 50 979 102 50 979 102 50 + 979 102 50 979 102 57 979 102 57 979 102 57 979 102 57 979 102 57 + 979 102 57 979 102 63 979 102 63 979 102 63 979 102 63 979 102 63 + 979 102 63 979 102 63 979 102 63 979 102 63 979 102 63 979 102 63 + 979 102 63 979 102 63 979 102 76 979 102 76 979 102 76 979 102 76 + 979 102 76 979 102 76 979 102 76 979 102 76 979 113 17 979 113 26 + 979 113 26 979 113 26 979 113 26 979 113 26 979 113 26 979 113 26 + 979 113 26 979 113 34 979 113 34 979 113 34 979 113 34 979 113 34 + 979 113 34 979 113 34 979 113 34 979 113 34 979 113 34} + +do_execsql_test 5.4.9.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 84 11 {} 84 11 355 84 11 399 84 11 629 84 11 667 84 11 + 2050 75 10 2050 75 10 2050 75 10 2050 75 10 2163 75 10 2307 75 10 + 2889 75 10 2889 75 10 2949 75 10 4997 68 9 4997 68 9 4997 68 9 + 5418 68 9 5440 68 9 5668 68 9 5802 68 9 7337 59 8 7337 59 8 + 7337 59 8 7337 59 8 7470 59 8 7692 59 8 8020 59 8 8300 59 8 + 8316 59 8 10450 51 7 10450 51 7 10450 51 7 10450 51 7 10450 51 7 + 10450 51 7 10785 51 7 11379 51 7 11714 40 6 11714 40 6 11714 40 6 + 11714 40 6 11714 40 6 11714 40 6 11714 40 6 11714 40 6 11714 40 6 + 12009 40 6 12381 40 6 12676 35 5 12676 35 5 12789 35 5 13305 35 5 + 13453 35 5 14195 28 4 14195 28 4 14195 28 4 14195 28 4 14195 28 4 + 15040 28 4 15154 28 4 15999 22 3 15999 22 3 15999 22 3 15999 22 3 + 16606 22 3 16758 22 3 17365 9 2 17365 9 2 17365 9 2 17365 9 2 + 17365 9 2 17365 9 2 17612 9 2 17758 9 2 17758 9 2 17764 9 2 + 17998 9 2 18070 9 2 18076 9 2 20846 1 1 20846 1 1 20846 1 1 + 21069 1 1 21085 1 1 21155 1 1 21473 1 1 21757 1 1} + +do_execsql_test 5.4.10.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0 + 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1 + 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1 + 257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1 + 346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1 + 398 398 1 399 399 0 399 399 1 412 412 1 421 421 1 430 430 1 + 443 443 1 480 480 1 480 480 1 572 572 1 574 574 1 607 607 1 + 618 618 1 618 618 1 627 627 1 629 629 0 629 629 1 633 633 1 + 634 634 1 652 652 1 660 660 1 667 667 0 667 667 1 670 670 1 + 671 671 1 683 683 1 705 705 1 711 711 1 716 716 1 726 726 1 + 730 730 1 759 759 1 762 762 1 768 768 1 768 768 1 777 777 1 + 786 786 1 790 790 1 792 792 1 794 794 1 805 805 1 822 822 1 + 839 839 1 839 839 1 840 840 1 844 844 1 845 845 1 870 870 0 + 870 870 1 870 870 1 899 899 1 911 911 1 929 929 1 934 934 1 + 938 938 1 938 938 1 959 959 1 963 963 1 979 979 1} + +do_execsql_test 5.4.10.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( PARTITION BY coalesce(a, '') + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 {} 1 1 + 113 1 1 113 1 1 133 1 1 223 1 1 239 1 1 247 1 1 257 1 1 + 295 1 1 309 1 1 335 1 1 355 1 1 355 1 1 393 1 1 393 1 1 + 399 1 1 399 1 1 421 1 1 443 1 1 607 1 1 627 1 1 629 1 1 + 629 1 1 633 1 1 667 1 1 667 1 1 671 1 1 683 1 1 705 1 1 + 711 1 1 759 1 1 777 1 1 805 1 1 839 1 1 839 1 1 845 1 1 + 899 1 1 911 1 1 929 1 1 959 1 1 963 1 1 979 1 1} + +do_execsql_test 5.4.11.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {223 223 1 239 239 1 309 309 1 572 572 1 627 627 1 870 870 1 + 911 911 1 934 158 22 934 158 28 934 158 28 934 158 28 934 158 28 + 934 158 28 934 158 28 934 223 9 934 223 9 934 223 9 934 223 9 + 934 223 9 934 223 9 934 223 9 934 223 9 934 223 9 934 223 9 + 934 223 9 934 223 9 934 223 9 934 223 22 934 223 22 934 223 22 + 934 223 22 934 223 22 934 934 1 959 102 40 959 102 51 959 102 51 + 959 102 51 959 102 51 959 102 51 959 102 51 959 102 51 959 102 51 + 959 102 51 959 102 51 959 102 51 959 102 51 959 102 51 959 102 51 + 959 102 51 959 113 35 959 113 40 959 113 40 959 113 40 959 113 40 + 959 113 40 959 113 40 959 113 40 959 113 40 959 113 40 959 113 40 + 959 158 28 959 158 35 959 158 35 959 158 35 959 158 35 963 102 51 + 979 102 47 979 102 47 979 102 47 979 102 47 979 102 47 979 102 47 + 979 102 47 979 102 48 979 102 48 979 102 48 979 102 48 979 102 48 + 979 102 48 979 102 48 979 102 48 979 102 48 979 102 49 979 102 49 + 979 102 49 979 102 49 979 102 49 979 102 49 979 102 51} + +do_execsql_test 5.4.11.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY a NULLS LAST GROUPS 6 PRECEDING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 1 1 {} 1 1 223 1 1 239 1 1 309 1 1 627 1 1 911 1 1 + 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2309 9 2 2556 9 2 + 2702 9 2 2702 9 2 2708 9 2 2942 9 2 3014 9 2 3020 9 2 5790 22 3 + 5790 22 3 5790 22 3 5790 22 3 6397 22 3 6549 22 3 7156 28 4 + 7156 28 4 7156 28 4 7156 28 4 7156 28 4 8001 28 4 8115 28 4 + 8960 35 5 8960 35 5 9073 35 5 9589 35 5 9737 35 5 10028 68 9 + 10028 68 9 10028 68 9 10396 59 8 10396 59 8 10396 59 8 10396 59 8 + 10449 68 9 10471 68 9 10479 40 6 10479 40 6 10479 40 6 10479 40 6 + 10479 40 6 10479 40 6 10479 40 6 10479 40 6 10479 40 6 10529 59 8 + 10699 68 9 10751 59 8 10774 40 6 10833 68 9 11002 75 10 + 11002 75 10 11002 75 10 11002 75 10 11079 59 8 11115 75 10 + 11146 40 6 11259 75 10 11359 59 8 11375 59 8 11441 51 7 + 11441 51 7 11441 51 7 11441 51 7 11441 51 7 11441 51 7 11776 51 7 + 11841 75 10 11841 75 10 11901 75 10 12145 84 11 12145 84 11 + 12370 51 7 12500 84 11 12544 84 11 12774 84 11 12812 84 11} + +do_execsql_test 5.4.12.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 160 158 1 + 160 158 2 160 158 2 208 208 1 224 223 2 224 223 2 239 234 3 + 239 234 3 239 234 3 252 247 3 257 247 5 257 247 5 257 250 4 + 257 252 3 295 295 1 309 309 1 336 330 3 336 330 3 336 330 3 + 346 346 1 355 354 1 355 354 2 355 354 2 399 393 3 399 393 3 + 399 393 3 399 393 4 399 393 4 412 412 1 421 421 1 430 430 1 + 443 443 1 480 480 1 480 480 1 574 572 2 574 572 2 607 607 1 + 618 618 1 618 618 1 634 627 3 634 627 4 634 627 4 634 627 4 + 634 629 3 652 652 1 667 660 2 671 667 2 671 667 3 671 667 3 + 671 667 3 683 683 1 711 705 2 716 705 3 716 711 2 730 726 2 + 730 726 2 762 759 2 768 759 4 768 762 2 768 762 2 777 777 1 + 792 786 3 794 786 4 794 786 4 794 790 3 805 805 1 822 822 1 + 845 839 4 845 839 4 845 839 5 845 839 5 845 839 5 870 870 0 + 870 870 1 870 870 1 899 899 1 911 911 1 934 929 2 938 929 4 + 938 934 2 938 934 2 963 959 2 963 959 2 979 979 1} + +do_execsql_test 5.4.12.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 25 23 {} 34 29 + {} 36 31 {} 38 33 {} 38 33 {} 40 34 {} 41 35 {} 43 37 {} 43 37 + {} 50 42 {} 60 51 {} 61 52 {} 64 55 {} 64 55 {} 67 57 {} 68 58 + {} 69 59 {} 70 60 {} 72 62 {} 78 67 {} 78 67 {} 78 67 {} 85 72 + {} 85 72 113 2 2 113 2 2 133 4 3 223 10 8 223 11 9 239 12 10 + 239 13 11 239 14 12 247 15 13 257 18 16 257 19 17 295 20 18 + 309 21 19 335 22 20 335 23 21 335 24 22 355 27 25 355 27 25 + 421 35 30 443 37 32 504 16 14 504 17 15 607 42 36 683 56 47 + 710 26 24 711 59 50 759 62 53 759 63 54 777 66 56 805 71 61 + 899 81 68 911 82 69 929 83 70 929 84 71 979 89 75 1185 32 28 + 1185 32 28 1191 29 26 1191 29 26 1334 51 43 1338 52 44 1338 52 44 + 1416 57 48 1416 58 49 1584 31 27 1684 73 63 1684 73 63 1889 46 39 + 1889 46 39 1891 49 41 1922 87 73 1922 88 74 2005 54 45 2005 55 46 + 2518 45 38 2518 48 40 2523 75 64 2523 76 65 2523 77 66} + +do_execsql_test 5.4.13.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {102 102 1 113 113 1 113 113 1 133 133 1 148 148 1 158 158 0 + 158 158 1 160 160 1 208 208 1 223 223 1 224 224 1 234 234 1 + 238 238 1 239 239 1 247 247 1 250 250 1 252 252 1 256 256 1 + 257 257 1 295 295 1 309 309 1 330 330 1 335 335 1 336 336 1 + 346 346 1 354 354 1 355 355 0 355 355 1 393 393 1 393 393 1 + 398 398 1 399 399 0 399 399 1 412 412 1 421 421 1 430 430 1 + 443 443 1 480 480 1 480 480 1 572 572 1 574 574 1 607 607 1 + 618 618 1 618 618 1 627 627 1 629 629 0 629 629 1 633 633 1 + 634 634 1 652 652 1 660 660 1 667 667 0 667 667 1 670 670 1 + 671 671 1 683 683 1 705 705 1 711 711 1 716 716 1 726 726 1 + 730 730 1 759 759 1 762 762 1 768 768 1 768 768 1 777 777 1 + 786 786 1 790 790 1 792 792 1 794 794 1 805 805 1 822 822 1 + 839 839 1 839 839 1 840 840 1 844 844 1 845 845 1 870 870 0 + 870 870 1 870 870 1 899 899 1 911 911 1 929 929 1 934 934 1 + 938 938 1 938 938 1 959 959 1 963 963 1 979 979 1} + +do_execsql_test 5.4.13.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {{} 1 1 {} 5 4 {} 6 5 {} 6 5 {} 8 6 {} 9 7 {} 11 9 {} 12 10 + {} 13 11 {} 16 14 {} 17 15 {} 18 16 {} 22 20 {} 24 22 {} 25 23 + {} 26 24 {} 31 27 {} 34 29 {} 36 31 {} 38 33 {} 38 33 {} 40 34 + {} 41 35 {} 43 37 {} 43 37 {} 49 41 {} 50 42 {} 51 43 {} 54 45 + {} 59 50 {} 60 51 {} 61 52 {} 63 54 {} 64 55 {} 64 55 {} 67 57 + {} 68 58 {} 69 59 {} 70 60 {} 72 62 {} 75 64 {} 76 65 {} 78 67 + {} 78 67 {} 78 67 {} 84 71 {} 85 72 {} 85 72 113 2 2 113 2 2 + 133 4 3 223 10 8 239 14 12 247 15 13 257 19 17 295 20 18 + 309 21 19 335 23 21 355 27 25 355 27 25 393 29 26 393 29 26 + 399 32 28 399 32 28 421 35 30 443 37 32 607 42 36 627 45 38 + 629 46 39 629 46 39 633 48 40 667 52 44 667 52 44 671 55 46 + 683 56 47 705 57 48 711 58 49 759 62 53 777 66 56 805 71 61 + 839 73 63 839 73 63 845 77 66 899 81 68 911 82 69 929 83 70 + 959 87 73 963 88 74 979 89 75} + +do_execsql_test 5.4.14.1 { + SELECT max(c) OVER win, + min(c) OVER win, + count(a) OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST +} {979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 979 102 83 + 979 102 83 979 113 81 979 113 82 979 133 80 979 148 79 979 158 77 + 979 158 78 979 160 77 979 208 76 979 223 75 979 224 74 979 234 73 + 979 238 72 979 239 71 979 247 70 979 250 69 979 252 68 979 256 67 + 979 257 66 979 295 65 979 309 64 979 330 63 979 335 62 979 336 61 + 979 346 60 979 354 59 979 355 57 979 355 58 979 393 56 979 393 57 + 979 398 55 979 399 53 979 399 54 979 412 53 979 421 52 979 430 51 + 979 443 50 979 480 48 979 480 49 979 572 47 979 574 46 979 607 45 + 979 618 43 979 618 44 979 627 42 979 629 40 979 629 41 979 633 40 + 979 634 39 979 652 38 979 660 37 979 667 35 979 667 36 979 670 35 + 979 671 34 979 683 33 979 705 32 979 711 31 979 716 30 979 726 29 + 979 730 28 979 759 27 979 762 26 979 768 24 979 768 25 979 777 23 + 979 786 22 979 790 21 979 792 20 979 794 19 979 805 18 979 822 17 + 979 839 15 979 839 16 979 840 14 979 844 13 979 845 12 979 870 9 + 979 870 10 979 870 11 979 899 9 979 911 8 979 929 7} + +do_execsql_test 5.4.14.2 { + SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win, + rank() OVER win, + dense_rank() OVER win + FROM t3 + WINDOW win AS ( ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST + ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING EXCLUDE TIES ) + ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST } {3830 89 89 4741 88 88 5640 84 84 5640 85 85 5640 86 86 5640 87 87 6485 81 81 6485 82 82 6485 83 83 7324 80 80 8163 78 78 8163 79 79 8968 73 73 8968 74 74 8968 75 75 8968 76 76 8968 77 77 9745 69 69 @@ -4860,14 +6178,14 @@ do_execsql_test 6.0 { do_execsql_test 6.1 { SELECT group_concat(a, '.') OVER ( - ORDER BY b RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING + ORDER BY b NULLS FIRST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING ) FROM t2 } {A.B A.B {}} do_execsql_test 6.2 { SELECT group_concat(a, '.') OVER ( - ORDER BY b DESC RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING + ORDER BY b DESC NULLS LAST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING ) FROM t2 } {{} A.B A.B} From 8c754a3613e22b0f19c8e0847615cca9f98a4ac4 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 19 Aug 2019 20:35:30 +0000 Subject: [PATCH 136/221] Omit the "_except" term from the name of the new interface. FossilOrigin-Name: e5ba47c2d8eb9f48a0e0d325e57d0092d536f85983819634c871ebd51829f1d1 --- manifest | 21 +++++++++------------ manifest.uuid | 2 +- src/shell.c.in | 6 ++++-- src/sqlite.h.in | 8 ++++++-- src/test1.c | 10 +++++----- src/vtab.c | 2 +- 6 files changed, 26 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 97b204c96f..bc476dd61d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sexperimental\ssqlite3_drop_modules_except()\sinterface. -D 2019-08-17T19:45:25.613 +C Omit\sthe\s"_except"\sterm\sfrom\sthe\sname\sof\sthe\snew\sinterface. +D 2019-08-19T20:35:30.961 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,8 +524,8 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c b2733d39a22f5023ab489b8535ca6854b51ff8667ca975815d004bb7388b0e41 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8 -F src/shell.c.in e0754f1d73c8e7d09548a29537e9e7d65fa0f4869c41722b7b89a64d9cdeff91 -F src/sqlite.h.in cbc4729565b6787c462fffac540b912acc24b32d22428f07d2cf3a937ba7a72e +F src/shell.c.in e0f0758b6ab506d8ab12502fd2b8c55546bb9e4bb772374344a5a1b73f5bc2b9 +F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 F src/sqliteInt.h b7d612d9c63abc8a8a7dcf7fbec5326b1770f40c81502c56f508e272154e7615 @@ -533,7 +533,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 50c93be3e1c03b4e6cf6756e5197afcfe7f5cd0497d83a7ac317cde09e19b290 -F src/test1.c 17f5334199c02e69292d826ba660f0fcb75f50f7686a76553afb55a2c74e87f7 +F src/test1.c af2f21f9aee617582129bdef3934734d88c0d53de0c71019453bb72185430389 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -604,7 +604,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vtab.c 8849cbd67596bebe58e2095fb95309aa3c5bf330d5501ec2b2511109de5a8f13 +F src/vtab.c 6b36944fdf05a33150787236e3506e878dca027a239e39eaf408f09c4821170c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1836,10 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5d6f4dfeea75c7dcd8c511545accb9eb4b405a02db034332249ba54794e313d2 -R 1452e34f48dd7f53a8de382ba3305e88 -T *branch * sqlite3_drop_modules_except -T *sym-sqlite3_drop_modules_except * -T -sym-trunk * +P 0851db4d337a87f8b2d3ce2ae9f9c928b9483591ca41a9e39cc01548059b1888 +R 0f164de667dc5b660a325950332b0cdd U drh -Z 3751a55606ec64d5cdbb771325aed7c0 +Z 965480cc8555a710613c03b1277cb66b diff --git a/manifest.uuid b/manifest.uuid index 9cc49bf88f..8140e9400c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0851db4d337a87f8b2d3ce2ae9f9c928b9483591ca41a9e39cc01548059b1888 \ No newline at end of file +e5ba47c2d8eb9f48a0e0d325e57d0092d536f85983819634c871ebd51829f1d1 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 9bfca22e53..0ee136389d 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9409,6 +9409,7 @@ static int do_meta_command(char *zLine, ShellState *p){ #ifdef SQLITE_DEBUG if( c=='u' && strncmp(azArg[0], "unmodule", n)==0 ){ int ii; + int lenOpt; char *zOpt; if( nArg<2 ){ raw_printf(stderr, "Usage: .unmodule [--allexcept] NAME ...\n"); @@ -9418,9 +9419,10 @@ static int do_meta_command(char *zLine, ShellState *p){ open_db(p, 0); zOpt = azArg[1]; if( zOpt[0]=='-' && zOpt[1]=='-' && zOpt[2]!=0 ) zOpt++; - if( strcmp(zOpt, "-allexcept")==0 ){ + lenOpt = (int)strlen(zOpt); + if( lenOpt>=3 && strncmp(zOpt, "-allexcept",lenOpt)==0 ){ assert( azArg[nArg]==0 ); - sqlite3_drop_modules_except(p->db, nArg>2 ? (const char**)(azArg+2) : 0); + sqlite3_drop_modules(p->db, nArg>2 ? (const char**)(azArg+2) : 0); }else{ for(ii=1; iidb, azArg[ii], 0, 0); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index ace4da70b1..521ddffdb4 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -6639,6 +6639,8 @@ struct sqlite3_index_info { ** ^If the third parameter (the pointer to the sqlite3_module object) is ** NULL then no new module is create and any existing modules with the ** same name are dropped. +** +** See also: [sqlite3_drop_modules()] */ int sqlite3_create_module( sqlite3 *db, /* SQLite connection to register module with */ @@ -6658,13 +6660,15 @@ int sqlite3_create_module_v2( ** CAPI3REF: Remove Unnecessary Virtual Table Implementations ** METHOD: sqlite3 ** -** ^The sqlite3_drop_modules_except(D,L) interface removes all virtual +** ^The sqlite3_drop_modules(D,L) interface removes all virtual ** table modules from database connection D except those named on list L. ** The L parameter must be either NULL or a pointer to an array of pointers ** to strings where the array is terminated by a single NULL pointer. ** ^If the L parameter is NULL, then all virtual table modules are removed. +** +** See also: [sqlite3_create_module()] */ -int sqlite3_drop_modules_except( +int sqlite3_drop_modules( sqlite3 *db, /* Remove modules from this connection */ const char **azKeep /* Except, do not remove the ones named here */ ); diff --git a/src/test1.c b/src/test1.c index 7243339056..e238d31e84 100644 --- a/src/test1.c +++ b/src/test1.c @@ -1111,13 +1111,13 @@ static int SQLITE_TCLAPI test_create_function( } /* -** Usage: sqlite3_drop_modules_except DB ?NAME ...? +** Usage: sqlite3_drop_modules DB ?NAME ...? ** -** Invoke the sqlite3_drop_modules_except(D,L) interface on database +** Invoke the sqlite3_drop_modules(D,L) interface on database ** connection DB, in order to drop all modules except those named in ** the argument. */ -static int SQLITE_TCLAPI test_drop_except( +static int SQLITE_TCLAPI test_drop_modules( void *NotUsed, Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ int argc, /* Number of arguments */ @@ -1132,7 +1132,7 @@ static int SQLITE_TCLAPI test_drop_except( return TCL_ERROR; } if( getDbPointer(interp, argv[1], &db) ) return TCL_ERROR; - sqlite3_drop_modules_except(db, argc>2 ? (const char**)(argv+2) : 0); + sqlite3_drop_modules(db, argc>2 ? (const char**)(argv+2) : 0); return TCL_OK; } @@ -7886,7 +7886,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_close_v2", (Tcl_CmdProc*)sqlite_test_close_v2 }, { "sqlite3_create_function", (Tcl_CmdProc*)test_create_function }, { "sqlite3_create_aggregate", (Tcl_CmdProc*)test_create_aggregate }, - { "sqlite3_drop_modules_except", (Tcl_CmdProc*)test_drop_except }, + { "sqlite3_drop_modules", (Tcl_CmdProc*)test_drop_modules }, { "sqlite_register_test_function", (Tcl_CmdProc*)test_register_func }, { "sqlite_abort", (Tcl_CmdProc*)sqlite_abort }, { "sqlite_bind", (Tcl_CmdProc*)test_bind }, diff --git a/src/vtab.c b/src/vtab.c index 760993120c..dd8a755be2 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -137,7 +137,7 @@ int sqlite3_create_module_v2( ** External API to drop all virtual-table modules, except those named ** on the azNames list. */ -int sqlite3_drop_modules_except(sqlite3 *db, const char** azNames){ +int sqlite3_drop_modules(sqlite3 *db, const char** azNames){ HashElem *pThis, *pNext; #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; From 3722b3abf1da4e9bde859df68e679e00c6829f41 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 20 Aug 2019 02:19:26 +0000 Subject: [PATCH 137/221] Fix a typo and a harmless compiler warning. FossilOrigin-Name: ec4c63e00c957f98d61ddc1b9d20406c7e1072d6ab0c12ac6939db6c63d90cb8 --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/test1.c | 1 - src/vtab.c | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index d592f7b0c3..1b402b9276 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_drop_modules()\sinterface. -D 2019-08-19T20:44:07.937 +C Fix\sa\stypo\sand\sa\sharmless\scompiler\swarning. +D 2019-08-20T02:19:26.962 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 50c93be3e1c03b4e6cf6756e5197afcfe7f5cd0497d83a7ac317cde09e19b290 -F src/test1.c af2f21f9aee617582129bdef3934734d88c0d53de0c71019453bb72185430389 +F src/test1.c 8ce455da8dcec886a0e1e608da0fee7de67c8195b14517a8824a2a40c2d11fbf F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -604,7 +604,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c 920285c3b7f5c64369e02da437dab71e9e91862df9c486541c14633739f91d75 F src/vdbesort.c 3531ae3a431ad6b98b67bd891fb42ec9d66867157188a2b1a9e58c55da6151b2 F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vtab.c 6b36944fdf05a33150787236e3506e878dca027a239e39eaf408f09c4821170c +F src/vtab.c 5a0b7193d586991b3db30e343d6b59959906bfe8658a6a0a85709b20ca50bb49 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1836,8 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4cb009b0f724f72eaea90e45488122f7c2a7d0caf31a8422da4060469507e921 e5ba47c2d8eb9f48a0e0d325e57d0092d536f85983819634c871ebd51829f1d1 -R 9f3cd232033726d002a567b7aed22f3d -T +closed e5ba47c2d8eb9f48a0e0d325e57d0092d536f85983819634c871ebd51829f1d1 -U drh -Z ea1a16d1273af50410789215c7a1a587 +P e2c6fed8f84929ed51a4e876bb09c85ac4b86a2e4cf0832a7da724bb9f4df5bf +R 8b1ae3c95bd6ffc47e9182b0d67348c9 +U mistachkin +Z 2a3c93f956b1ecd418b937639070a999 diff --git a/manifest.uuid b/manifest.uuid index 2aebc48857..1d741309c7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2c6fed8f84929ed51a4e876bb09c85ac4b86a2e4cf0832a7da724bb9f4df5bf \ No newline at end of file +ec4c63e00c957f98d61ddc1b9d20406c7e1072d6ab0c12ac6939db6c63d90cb8 \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index e238d31e84..c6c9e17afe 100644 --- a/src/test1.c +++ b/src/test1.c @@ -1123,7 +1123,6 @@ static int SQLITE_TCLAPI test_drop_modules( int argc, /* Number of arguments */ char **argv /* Text of each argument */ ){ - int rc; sqlite3 *db; if( argc!=2 ){ diff --git a/src/vtab.c b/src/vtab.c index dd8a755be2..085290914b 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -140,7 +140,7 @@ int sqlite3_create_module_v2( int sqlite3_drop_modules(sqlite3 *db, const char** azNames){ HashElem *pThis, *pNext; #ifdef SQLITE_ENABLE_API_ARMOR - if( !sqlite3SafetyCheckOk(db) || zName==0 ) return SQLITE_MISUSE_BKPT; + if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT; #endif for(pThis=sqliteHashFirst(&db->aModule); pThis; pThis=pNext){ Module *pMod = (Module*)sqliteHashData(pThis); From b6ce71bd265314f65ad95ecdb2735af54121a4dd Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 20 Aug 2019 11:43:44 +0000 Subject: [PATCH 138/221] Retain the affinity of an expression in a WHERE clause when it is transformed to a reference to an index column on the same expression. Fix for [f043b113]. FossilOrigin-Name: 511da0815673ca4a176aa61dc23a8231b2ab77e8363fc184a78b6e17dba64d49 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/wherecode.c | 1 + test/affinity2.test | 27 +++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1b402b9276..87f8421097 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sand\sa\sharmless\scompiler\swarning. -D 2019-08-20T02:19:26.962 +C Retain\sthe\saffinity\sof\san\sexpression\sin\sa\sWHERE\sclause\swhen\sit\sis\stransformed\sto\sa\sreference\sto\san\sindex\scolumn\son\sthe\ssame\sexpression.\sFix\sfor\s[f043b113]. +D 2019-08-20T11:43:44.838 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,11 +611,11 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 2fac51d2420f05ab6f644f1813d4f73f6214304836fd9b22345738d943faad9b F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb -F src/wherecode.c cf885ea2d439af9827c5cbab7d4c12be5c079439b7bd12e97151ccfe088c13c0 +F src/wherecode.c e1131fe94c8728cbecc707f6455afbda9418896497bdca2d49a04ce6c57999f6 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc F src/window.c 07e1c15081a735750218185c6b17053c87ecb764d06ab2c0a1ce568a2b4688e5 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 -F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd +F test/affinity2.test 34f2cf88e2a08d7a54a1fa2c9773ba81bf8b8216c0895e476118a1285540ee71 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e2c6fed8f84929ed51a4e876bb09c85ac4b86a2e4cf0832a7da724bb9f4df5bf -R 8b1ae3c95bd6ffc47e9182b0d67348c9 -U mistachkin -Z 2a3c93f956b1ecd418b937639070a999 +P ec4c63e00c957f98d61ddc1b9d20406c7e1072d6ab0c12ac6939db6c63d90cb8 +R 95e8d7b4c9783731533e987936fe1358 +U dan +Z 9e91c8360eb84da6700bb773b0dba23e diff --git a/manifest.uuid b/manifest.uuid index 1d741309c7..9ea5046c2d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ec4c63e00c957f98d61ddc1b9d20406c7e1072d6ab0c12ac6939db6c63d90cb8 \ No newline at end of file +511da0815673ca4a176aa61dc23a8231b2ab77e8363fc184a78b6e17dba64d49 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index c781b06c15..934e3e2e8f 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1117,6 +1117,7 @@ typedef struct IdxExprTrans { static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + pExpr->affExpr = sqlite3ExprAffinity(pExpr); pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; diff --git a/test/affinity2.test b/test/affinity2.test index 9838bd660a..033c90f448 100644 --- a/test/affinity2.test +++ b/test/affinity2.test @@ -14,6 +14,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix affinity2 do_execsql_test affinity2-100 { CREATE TABLE t1( @@ -58,4 +59,30 @@ do_execsql_test affinity2-300 { SELECT rowid, xt==+xi, xt==xi, xt==xb FROM t1 ORDER BY rowid; } {1 1 1 0 2 1 1 1 3 0 1 1} +#------------------------------------------------------------------------- +do_execsql_test 400 { + CREATE TABLE ttt(c0, c1); + CREATE INDEX ii ON ttt(CAST(c0 AS NUMERIC)); + INSERT INTO ttt VALUES('abc', '-1'); +} +do_execsql_test 410 { + SELECT * FROM ttt WHERE CAST(c0 AS NUMERIC) > c1 GROUP BY rowid; +} {abc -1} +do_execsql_test 420 { + SELECT * FROM ttt INDEXED BY ii WHERE CAST(c0 AS NUMERIC) > c1 GROUP BY rowid; +} {abc -1} + +do_execsql_test 430 { + CREATE TABLE t3(a, b, c INTEGER); + CREATE INDEX t3ac ON t3(a, c-1); + INSERT INTO t3 VALUES(1, 1, 1); + INSERT INTO t3 VALUES(2, 1, 0); + INSERT INTO t3 VALUES(3, 1, 1); + INSERT INTO t3 VALUES(4, 1, 0); + INSERT INTO t3 VALUES(5, 1, 1); +} +do_execsql_test 440 { + SELECT * FROM t3 WHERE c='0' ORDER BY a; +} {2 1 0 4 1 0} + finish_test From 95da9d5d46a1df00053191dfce9758dbda434e07 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 20 Aug 2019 13:49:12 +0000 Subject: [PATCH 139/221] Add the new sqlite3_drop_modules() interface to the loadable extension mechanism. FossilOrigin-Name: 658bd51623787be4ca87b066a051d119f39056286e223afef3691629cf1ab0e1 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/loadext.c | 4 +++- src/sqlite3ext.h | 4 ++++ 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 87f8421097..6cb80d1226 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Retain\sthe\saffinity\sof\san\sexpression\sin\sa\sWHERE\sclause\swhen\sit\sis\stransformed\sto\sa\sreference\sto\san\sindex\scolumn\son\sthe\ssame\sexpression.\sFix\sfor\s[f043b113]. -D 2019-08-20T11:43:44.838 +C Add\sthe\snew\ssqlite3_drop_modules()\sinterface\sto\sthe\sloadable\sextension\nmechanism. +D 2019-08-20T13:49:12.572 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c c2194dd2886337b870226fcb31c13e7df8c4b5e0ea85140e510a6f1daf1ad65b F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c +F src/loadext.c a045bb3425a9a633cc0f78e93d9beda6866f4c0f15bfdee735aba7c6b39f5cc4 F src/main.c 51c55eb579eac4180bfcc6242741084710911350d2cd0c3fdd0f9fde55442128 F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -527,7 +527,7 @@ F src/select.c 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8 F src/shell.c.in e0f0758b6ab506d8ab12502fd2b8c55546bb9e4bb772374344a5a1b73f5bc2b9 F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 +F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 F src/sqliteInt.h b7d612d9c63abc8a8a7dcf7fbec5326b1770f40c81502c56f508e272154e7615 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ec4c63e00c957f98d61ddc1b9d20406c7e1072d6ab0c12ac6939db6c63d90cb8 -R 95e8d7b4c9783731533e987936fe1358 -U dan -Z 9e91c8360eb84da6700bb773b0dba23e +P 511da0815673ca4a176aa61dc23a8231b2ab77e8363fc184a78b6e17dba64d49 +R b9c7a359cc9df9e55c5869fd605fd14d +U drh +Z 1abdc81b7e3d81dfcfc6c75af513ad72 diff --git a/manifest.uuid b/manifest.uuid index 9ea5046c2d..7456e32878 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -511da0815673ca4a176aa61dc23a8231b2ab77e8363fc184a78b6e17dba64d49 \ No newline at end of file +658bd51623787be4ca87b066a051d119f39056286e223afef3691629cf1ab0e1 \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index 9ca139c8dc..03997c0275 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -461,7 +461,9 @@ static const sqlite3_api_routines sqlite3Apis = { #endif /* Version 3.28.0 and later */ sqlite3_stmt_isexplain, - sqlite3_value_frombind + sqlite3_value_frombind, + /* Version 3.30.0 and later */ + sqlite3_drop_modules, }; /* diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index 088148b936..416ac94231 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -322,6 +322,8 @@ struct sqlite3_api_routines { /* Version 3.28.0 and later */ int (*stmt_isexplain)(sqlite3_stmt*); int (*value_frombind)(sqlite3_value*); + /* Version 3.30.0 and later */ + int (*drop_modules)(sqlite3*,const char**); }; /* @@ -614,6 +616,8 @@ typedef int (*sqlite3_loadext_entry)( /* Version 3.28.0 and later */ #define sqlite3_stmt_isexplain sqlite3_api->isexplain #define sqlite3_value_frombind sqlite3_api->frombind +/* Version 3.30.0 and later */ +#define sqlite3_drop_modules sqlite3_api->drop_modules #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) From 4780b9ad46ebf5b9a2628cd80ef2ec95a6566f56 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 20 Aug 2019 14:43:01 +0000 Subject: [PATCH 140/221] Fix a segfault that could occur following an OOM while processing a SELECT statement for which one or more of the expressions in the window frame declaration are themselves sub-selects that use window functions. FossilOrigin-Name: 75aec4fc886c04fe098828cc03bc72c197cbf40f0a1890fe5bbb98d4fd5c3c7e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 2 +- test/windowfault.test | 22 ++++++++++++++++++++++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6cb80d1226..f7957a23fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\snew\ssqlite3_drop_modules()\sinterface\sto\sthe\sloadable\sextension\nmechanism. -D 2019-08-20T13:49:12.572 +C Fix\sa\ssegfault\sthat\scould\soccur\sfollowing\san\sOOM\swhile\sprocessing\sa\sSELECT\sstatement\sfor\swhich\sone\sor\smore\sof\sthe\sexpressions\sin\sthe\swindow\sframe\sdeclaration\sare\sthemselves\ssub-selects\sthat\suse\swindow\sfunctions. +D 2019-08-20T14:43:01.572 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 66a844757e865624c51e3c23dedf7f650adf75f799947f202aacbb1c394c3cda +F src/expr.c abef10556e47c3fca04de6a80d802d428e008ed61b4c76dd8439c189f4cd778f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1715,7 +1715,7 @@ F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91 F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b -F test/windowfault.test 403693d7d951c5473f052f7ecddb61ed15ac9d212f238b8904ea270ba90f83e5 +F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 F test/with1.test d32792084dcb5f6c047d77bb8a032822ef9fe050ade07d0aeffa37753a05e3c9 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 511da0815673ca4a176aa61dc23a8231b2ab77e8363fc184a78b6e17dba64d49 -R b9c7a359cc9df9e55c5869fd605fd14d -U drh -Z 1abdc81b7e3d81dfcfc6c75af513ad72 +P 658bd51623787be4ca87b066a051d119f39056286e223afef3691629cf1ab0e1 +R de5c373fa0aa9adc1be1e5804cb9b91d +U dan +Z d06c51f62e0fa708481e21348393bcb2 diff --git a/manifest.uuid b/manifest.uuid index 7456e32878..e37939af6d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -658bd51623787be4ca87b066a051d119f39056286e223afef3691629cf1ab0e1 \ No newline at end of file +75aec4fc886c04fe098828cc03bc72c197cbf40f0a1890fe5bbb98d4fd5c3c7e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 41cc2724f6..c9deef0b6a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1511,7 +1511,7 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ #ifndef SQLITE_OMIT_WINDOWFUNC pNew->pWin = 0; pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); - if( p->pWin ) gatherSelectWindows(pNew); + if( p->pWin && db->mallocFailed==0 ) gatherSelectWindows(pNew); #endif pNew->selId = p->selId; *pp = pNew; diff --git a/test/windowfault.test b/test/windowfault.test index 41c4bb6ad0..e037c467b0 100644 --- a/test/windowfault.test +++ b/test/windowfault.test @@ -224,4 +224,26 @@ do_faultsim_test 9 -end 25 -faults tmpread -body { catch {db close} tvfs delete +reset_db +do_execsql_test 10.0 { + CREATE TABLE t1(a, b, c, d); + CREATE TABLE t2(a, b, c, d); +} + +do_faultsim_test 1 -faults oom* -prep { +} -body { + execsql { + SELECT row_number() OVER win + FROM t1 + WINDOW win AS ( + ORDER BY ( + SELECT percent_rank() OVER win2 FROM t2 + WINDOW win2 AS (ORDER BY a) + ) + ) + } +} -test { + faultsim_test_result {0 {}} +} + finish_test From 4fcb9caa60c3939cd562574f744a8514737ae7fb Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 20 Aug 2019 15:47:28 +0000 Subject: [PATCH 141/221] Do not pass ORDER BY clauses with non-standard NULL handling to virtual table implementations. FossilOrigin-Name: a9a82ee88d2d12209a674bd19167277aa91a6912e7a8bbf3714f90d559307fee --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 1 + test/nulls1.test | 29 +++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2dac1918cc..0c034215e3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\swith\swindow\sframes\sthat\suse\sORDER\sBY\s...\sNULLS\sLAST\setc. -D 2019-08-19T19:59:50.467 +C Do\snot\spass\sORDER\sBY\sclauses\swith\snon-standard\sNULL\shandling\sto\svirtual\stable\simplementations. +D 2019-08-20T15:47:28.909 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 52c433208eafdc7e1750ea4622cfffb5d14d906a0a9258e07bae4b6fee182fef +F src/where.c 391e856e4e73e3b68731ed6ee4fa0cb0e43a17c8565ddaad2b554e06db9ad239 F src/whereInt.h 807766a6a92893dbba8a887e5b13466d2257ce07a84cf1be0aae2c41aee3bf4f F src/wherecode.c 81c5d1eb909f8e1284df58367d25f748d126c475725665e7bb9b10a9bf702242 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc @@ -1182,7 +1182,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test d2f1da489fd24d7af54aed9d7e117e4c7d6bb3e67f3a87ef54377cc088563073 +F test/nulls1.test 085aae8cd3442159d993e6b5317b7503a71d82107ab1a87390a370d5891945f9 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bb9767a287097a615aeb4abdba689b10e1a1c36c016c8e55905b508075e62c86 -R 0d189432ffc682f45a241a646815eff1 +P 75d665a494dd7d6e77d5a80af386ee5accc0a53416d5493424dc0fef6c7b01a0 +R c52f59575d6f8f4774d29df09eb77ad3 U dan -Z 3a5c6bb3c2c9a1118645ddff85026963 +Z b71d521722a995099edda82dc88d1b7f diff --git a/manifest.uuid b/manifest.uuid index 7a21ed26bb..3553c8723d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -75d665a494dd7d6e77d5a80af386ee5accc0a53416d5493424dc0fef6c7b01a0 \ No newline at end of file +a9a82ee88d2d12209a674bd19167277aa91a6912e7a8bbf3714f90d559307fee \ No newline at end of file diff --git a/src/where.c b/src/where.c index 37eca3b7ea..a6349987a4 100644 --- a/src/where.c +++ b/src/where.c @@ -933,6 +933,7 @@ static sqlite3_index_info *allocateIndexInfo( for(i=0; ia[i].pExpr; if( pExpr->op!=TK_COLUMN || pExpr->iTable!=pSrc->iCursor ) break; + if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; } if( i==n){ nOrderBy = n; diff --git a/test/nulls1.test b/test/nulls1.test index e54d60856d..9faf82110b 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -118,4 +118,33 @@ do_execsql_test 3.2 { 400 300 } +#------------------------------------------------------------------------- +ifcapable vtab { + register_echo_module db + do_execsql_test 4.0 { + CREATE TABLE tx(a INTEGER PRIMARY KEY, b, c); + CREATE INDEX i1 ON tx(b); + INSERT INTO tx VALUES(1, 1, 1); + INSERT INTO tx VALUES(2, NULL, 2); + INSERT INTO tx VALUES(3, 3, 3); + INSERT INTO tx VALUES(4, NULL, 4); + INSERT INTO tx VALUES(5, 5, 5); + CREATE VIRTUAL TABLE te USING echo(tx); + } + + do_execsql_test 4.1 { + SELECT * FROM tx ORDER BY b NULLS FIRST; + } {2 {} 2 4 {} 4 1 1 1 3 3 3 5 5 5} + do_execsql_test 4.2 { + SELECT * FROM te ORDER BY b NULLS FIRST; + } {2 {} 2 4 {} 4 1 1 1 3 3 3 5 5 5} + + do_execsql_test 4.3 { + SELECT * FROM tx ORDER BY b NULLS LAST; + } {1 1 1 3 3 3 5 5 5 2 {} 2 4 {} 4} + do_execsql_test 4.4 { + SELECT * FROM te ORDER BY b NULLS LAST; + } {1 1 1 3 3 3 5 5 5 2 {} 2 4 {} 4} +} + finish_test From 2a0c16f27653982880ab76714b5aaae65db43315 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 20 Aug 2019 17:51:13 +0000 Subject: [PATCH 142/221] Add tests for sort-by-index cases that use IN() and non-default NULL handling. FossilOrigin-Name: 09d660ecde723fb30f3bb3684bbb7f95825d78da6a6f33ddf57846054cd563e0 --- manifest | 12 +++++------ manifest.uuid | 2 +- test/nulls1.test | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 0c034215e3..5e0da8bb80 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\spass\sORDER\sBY\sclauses\swith\snon-standard\sNULL\shandling\sto\svirtual\stable\simplementations. -D 2019-08-20T15:47:28.909 +C Add\stests\sfor\ssort-by-index\scases\sthat\suse\sIN()\sand\snon-default\sNULL\shandling. +D 2019-08-20T17:51:13.442 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1182,7 +1182,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 085aae8cd3442159d993e6b5317b7503a71d82107ab1a87390a370d5891945f9 +F test/nulls1.test abf8ab564357136d0a1c9909ab068d4fcb0a5e94e168bed6b6c6f548a6f56d07 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 75d665a494dd7d6e77d5a80af386ee5accc0a53416d5493424dc0fef6c7b01a0 -R c52f59575d6f8f4774d29df09eb77ad3 +P a9a82ee88d2d12209a674bd19167277aa91a6912e7a8bbf3714f90d559307fee +R 72239629606cb191b8fd5443e5ad57ff U dan -Z b71d521722a995099edda82dc88d1b7f +Z 5d1aadbb6bb817df7ca002049c5a7d6e diff --git a/manifest.uuid b/manifest.uuid index 3553c8723d..e1b28f0039 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9a82ee88d2d12209a674bd19167277aa91a6912e7a8bbf3714f90d559307fee \ No newline at end of file +09d660ecde723fb30f3bb3684bbb7f95825d78da6a6f33ddf57846054cd563e0 \ No newline at end of file diff --git a/test/nulls1.test b/test/nulls1.test index 9faf82110b..38fba79be0 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -119,6 +119,7 @@ do_execsql_test 3.2 { } #------------------------------------------------------------------------- +# ifcapable vtab { register_echo_module db do_execsql_test 4.0 { @@ -147,4 +148,59 @@ ifcapable vtab { } {1 1 1 3 3 3 5 5 5 2 {} 2 4 {} 4} } +#------------------------------------------------------------------------- +# +do_execsql_test 5.0 { + CREATE TABLE t4(a, b, c); + INSERT INTO t4 VALUES(1, 1, 11); + INSERT INTO t4 VALUES(1, 2, 12); + INSERT INTO t4 VALUES(1, NULL, 1); + + INSERT INTO t4 VALUES(2, NULL, 1); + INSERT INTO t4 VALUES(2, 2, 12); + INSERT INTO t4 VALUES(2, 1, 11); + + INSERT INTO t4 VALUES(3, NULL, 1); + INSERT INTO t4 VALUES(3, 2, 12); + INSERT INTO t4 VALUES(3, NULL, 3); +} + +do_execsql_test 5.1 { + SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a, b NULLS LAST +} { + 1 1 11 1 2 12 1 {} 1 + 2 1 11 2 2 12 2 {} 1 + 3 2 12 3 {} 1 3 {} 3 +} +do_execsql_test 5.2 { + CREATE INDEX t4ab ON t4(a, b); + SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a, b NULLS LAST +} { + 1 1 11 1 2 12 1 {} 1 + 2 1 11 2 2 12 2 {} 1 + 3 2 12 3 {} 1 3 {} 3 +} +do_eqp_test 5.3 { + SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a, b NULLS LAST +} { + QUERY PLAN + `--SEARCH TABLE t4 USING INDEX t4ab (a=?) +} + +do_execsql_test 5.4 { + SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a DESC, b DESC NULLS FIRST +} { + 3 {} 3 3 {} 1 3 2 12 + 2 {} 1 2 2 12 2 1 11 + 1 {} 1 1 2 12 1 1 11 +} +do_eqp_test 5.5 { + SELECT * FROM t4 WHERE a IN (1, 2, 3) ORDER BY a DESC, b DESC NULLS FIRST +} { + QUERY PLAN + `--SEARCH TABLE t4 USING INDEX t4ab (a=?) +} + finish_test + + From 35fb866ea334beedadb258eaacb68b627a6b2554 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 20 Aug 2019 19:11:29 +0000 Subject: [PATCH 143/221] Fix a problem with fts5 "ORDER BY rank" queries when the fts5 table name requires quoting. FossilOrigin-Name: 00e9a8f2730eb7239bf7fd107c97c409e4f9fbd968510766373440a9079898eb --- ext/fts5/fts5_main.c | 2 +- ext/fts5/test/fts5corrupt3.test | 69 ++++++++++++++++----------------- ext/fts5/test/fts5rank.test | 18 +++++++++ manifest | 16 ++++---- manifest.uuid | 2 +- 5 files changed, 62 insertions(+), 45 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index d44e95942c..4bb3a9965f 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -932,7 +932,7 @@ static int fts5CursorFirstSorted( ** ** If SQLite a built-in statement cache, this wouldn't be a problem. */ rc = fts5PrepareStatement(&pSorter->pStmt, pConfig, - "SELECT rowid, rank FROM %Q.%Q ORDER BY %s(%s%s%s) %s", + "SELECT rowid, rank FROM %Q.%Q ORDER BY %s(\"%w\"%s%s) %s", pConfig->zDb, pConfig->zName, zRank, pConfig->zName, (zRankArgs ? ", " : ""), (zRankArgs ? zRankArgs : ""), diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 0497c95bcf..2391d97eea 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -767,7 +767,7 @@ SELECT * FROM t1 WHERE t1 MATCH 'abandon'; do_catchsql_test 13.1 { SELECT * FROM t1 WHERE t1 MATCH 'abandon'; -} {1 {vtable constructor failed: t1}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -958,7 +958,7 @@ do_test 15.0 { do_catchsql_test 15.1 { INSERT INTO t1(t1) VALUES('integrity-check'); -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #--------------------------------------------------------------------------- # @@ -3903,19 +3903,19 @@ do_test 33.0 { | end crash-fed6e90021ba5d.db }]} {} -do_execsql_test 33.1 { +do_catchsql_test 33.1 { CREATE VIRTUAL TABLE t2 USING fts5vocab('t1','row'); CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col'); CREATE VIRTUAL TABLE t4 USING fts5vocab('t1','instance'); -} +} {/*malformed database schema*/} do_catchsql_test 33.2 { SELECT * FROM t2; -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} do_catchsql_test 33.3 { SELECT * FROM t2, t3, t4 WHERE t2.term=t3.term AND t3.term=t4.term; -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -4637,17 +4637,17 @@ do_test 37.0 { do_catchsql_test 37.1 { SELECT * FROM t3; -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db -do_execsql_test 37.0 { +do_execsql_test 37a.0 { CREATE VIRTUAL TABLE t1 USING fts5(b, c); INSERT INTO t1 VALUES('a', 'b'); SELECT quote(block) FROM t1_data WHERE rowid=10; } {X'000000000101010001010101'} -do_execsql_test 37.1 { +do_execsql_test 37a.1 { UPDATE t1_data SET block = X'FFFFFFFF0101010001010101' WHERE rowid = 10; SELECT rowid FROM t1('a'); } {1} @@ -4894,7 +4894,7 @@ do_test 38.0 { do_catchsql_test 38.1 { UPDATE t1 SET b=quote(zeroblob(200)) WHERE t1 MATCH 'thread*'; -} {0 {}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -5326,16 +5326,16 @@ do_test 40.0 { | end crash2.txt.db }]} {} -do_execsql_test 40.1 { +do_catchsql_test 40.1 { BEGIN; INSERT INTO t1(b) VALUES(X'819192e578de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bf'); INSERT INTO t1(b) VALUES(X'c8ae0d0e7c3175946e62ba2b449511d4eb504079984a20f77969f62206c9f3d7ea25358ab705e6978627290b6d48db9032f815a06a79a4f4b809841a0942eed12954ed166f666111812a508abc3bec87958846edaec0a6fe14564bc0a4b78f1c35ebcacca6bae29cc37ae9b59d8a2d7593af1e47dda0ece2268a98d20febafad037964f139851f9a57f48b3706b01721769071991412044cd6006f1d72eb6eb4aa5ad77e378176db8c15575fbeee47165e38a7c6c5a557ac2dfe11813976eaf6741cf593a9e457053a3c34cddfbe605a6e25419f993de8374fafcd3636509d8416a51dc7bcc14cfca322ae343078f47e23522431c17d0da0c033'); INSERT INTO t1(b) VALUES(X'dc29a94e873a45a4243fce9b912aaefbadf1d0423e0345793874b356eeb500b92fb05284c1601fe9bad3143f72162f10242cec27c44ebf764c8fc9fb0824e32c4161472a4f914f579e0e8274f08ca1a02e59b9d8eec1f31061f9ccb9ed97a6f06534e991f7992c761489e6a7724f6e9c2b581e77487ded3a986d53c4419bbd3e9747cee300e670dd7294874c77e2ed48da68eaa6c3ec954a09ac410493d98e34d6686e54fbbe80696705f10e040c66093efb40746b33600685c94c664c7942835a9e954866121d5dcfb2cb12e92521ea3df175ee17072502dad9b9c1565f801b2179799011eb7418bfa00323e3157589e648ff7378be233c79b7'); -} +} {/*malformed database schema*/} do_catchsql_test 40.2 { INSERT INTO t1(a,b) VALUES(1,11),(2,22),(3, true ),(4,44); -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -5789,7 +5789,7 @@ do_test 43.0 { do_catchsql_test 43.1 { INSERT INTO t1(t1) VALUES('optimize'); -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -6047,7 +6047,7 @@ do_catchsql_test 45.2 { INSERT INTO t1(t1, rank) VALUES('merge', 5); INSERT INTO t1(t1, rank) VALUES('merge', 5); INSERT INTO t1(t1, rank) VALUES('merge', 5); -} {0 {}} +} {/*malformed database schema*/} #-------------------------------------------------------------------------- reset_db @@ -6265,7 +6265,7 @@ do_test 46.0 { do_catchsql_test 46.1 { SELECT snippet(t1,'[','', '--',-1,10) FROM t1('*'); -} {0 {{}}} +} {/*malformed database schema*/} #-------------------------------------------------------------------------- reset_db @@ -6418,7 +6418,7 @@ do_test 47.0 { do_catchsql_test 47.1 { INSERT INTO t1(t1) VALUES('integrity-check'); -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} do_catchsql_test 47.2 { SELECT count(*) FROM ( @@ -6426,7 +6426,7 @@ do_catchsql_test 47.2 { highlight(t1, 2, '[', ']') FROM t1('g h') WHERE rank MATCH 'bm25(1.0, 1.0)' ORDER BY rank ) -} {0 3} +} {/*malformed database schema*/} #-------------------------------------------------------------------------- reset_db @@ -7130,7 +7130,7 @@ do_test 52.0 { do_catchsql_test 52.1 { SELECT fts5_decode(id, block) FROM t1_data; -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -7346,7 +7346,7 @@ do_test 53.0 { do_catchsql_test 53.1 { WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x<>1 FROM c WHERE x<10) INSERT INTO t1(a) SELECT randomblob(3000) FROM c; -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -7562,7 +7562,7 @@ do_test 54.0 { do_catchsql_test 54.1 { SELECT rowid==-1 FROM t1('t*'); -} {0 {0 0 0}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -7777,10 +7777,10 @@ do_test 55.0 { | end crash-b366b5ac0d3887.db }]} {} -do_execsql_test 55.1 { +do_catchsql_test 55.1 { SAVEPOINT one; DELETE FROM t1 WHERE a MATCH 'ts'; -} +} {/*malformed database schema*/} do_execsql_test 55.2 { ROLLBACK TO one; @@ -8013,7 +8013,7 @@ do_test 56.1 { set res "1 {database disk image is malformed}" } set res -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -8131,7 +8131,7 @@ do_test 57.0 { do_catchsql_test 57.1 { INSERT INTO t1(t1) VALUES('optimize') -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- reset_db @@ -8339,9 +8339,9 @@ do_test 58.0 { | end crash-5a5acd0ab42d31.db }]} {} -do_execsql_test 58.1 { +do_catchsql_test 58.1 { SELECT * FROM t1('t*'); -} {{} {} {} {} {} {}} +} {/*malformed database schema*/} #------------------------------------------------------------------------- do_test 59.0 { @@ -8948,13 +8948,13 @@ do_test 61.0 { | end crash-e5fa281edabddf.db }]} {} -do_execsql_test 61.1 { +do_catchsql_test 61.1 { CREATE VIRTUAL TABLE t3 USING fts5vocab('t1'(),'col' ); -} +} {/*malformed database schema*/} do_catchsql_test 61.2 { SELECT * FROM t3 ORDER BY rowid; -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} breakpoint #------------------------------------------------------------------------- @@ -9159,7 +9159,7 @@ do_test 62.0 { do_catchsql_test 62.1 { WITH c(x) AS (VALUES(false) UNION ALL SELECT x+1 FROM c WHERE x<72) INSERT INTO t1(a) SELECT randomblob(2829) FROM c; -} {0 {}} +} {/*malformed database schema*/} #--------------------------------------------------------------------------- do_test 63.0 { @@ -9357,16 +9357,15 @@ do_test 63.0 { do_catchsql_test 63.1 { SELECT * FROM t1 WHERE b MATCH 'thead*thead*theSt*'; -} {1 {database disk image is malformed}} +} {/*malformed database schema*/} do_catchsql_test 63.2 { INSERT INTO t1(t1) VALUES('optimize'); -} {0 {}} +} {/*malformed database schema*/} -breakpoint do_catchsql_test 63.3 { SELECT * FROM t1 WHERE b MATCH 'thead*thead*theSt*'; -} {0 {}} +} {/*malformed database schema*/} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/ext/fts5/test/fts5rank.test b/ext/fts5/test/fts5rank.test index e8f5473c4b..22534e8e03 100644 --- a/ext/fts5/test/fts5rank.test +++ b/ext/fts5/test/fts5rank.test @@ -162,4 +162,22 @@ do_execsql_test 5.1 { SELECT rowid FROM ttt('word') WHERE rowid BETWEEN 30 AND 40 ORDER BY rank; } {30 31 32 33 34 35 36 37 38 39 40} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 6.0 { + CREATE VIRTUAL TABLE "My.Table" USING fts5(Text); + + INSERT INTO "My.Table" VALUES ('hello this is a test'); + INSERT INTO "My.Table" VALUES ('of trying to order by'); + INSERT INTO "My.Table" VALUES ('rank on an fts5 table'); + INSERT INTO "My.Table" VALUES ('that have periods in'); + INSERT INTO "My.Table" VALUES ('the table names.'); + INSERT INTO "My.Table" VALUES ('table table table'); +} +do_execsql_test 6.1 { + SELECT * FROM "My.Table" WHERE Text MATCH 'table' ORDER BY rank; +} { + {table table table} {the table names.} {rank on an fts5 table} +} + finish_test diff --git a/manifest b/manifest index f7957a23fb..cfd08c86b4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\ssegfault\sthat\scould\soccur\sfollowing\san\sOOM\swhile\sprocessing\sa\sSELECT\sstatement\sfor\swhich\sone\sor\smore\sof\sthe\sexpressions\sin\sthe\swindow\sframe\sdeclaration\sare\sthemselves\ssub-selects\sthat\suse\swindow\sfunctions. -D 2019-08-20T14:43:01.572 +C Fix\sa\sproblem\swith\sfts5\s"ORDER\sBY\srank"\squeries\swhen\sthe\sfts5\stable\sname\srequires\squoting. +D 2019-08-20T19:11:29.544 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -117,7 +117,7 @@ F ext/fts5/fts5_config.c d7523cba5e66da077233c023aecbc3e6a37978ff75a18131c5ab5b1 F ext/fts5/fts5_expr.c 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c cd363c2fa3e626c04a9b7c705ff50222b4cab052704938f6a24881602ed3ed0d -F ext/fts5/fts5_main.c 346a1ec08caa66f1187f1e0bf12e39e4d24682323b839e8a76ef653b8db8a91d +F ext/fts5/fts5_main.c b2c42f1cef9673ecdd498b22c38483a4380bcf1701d1e61b021a2945f18e42e1 F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -157,7 +157,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 9517cc527a8e8a33949652d5c7b5e251f8c3d5ae3f23f01d4320e30f29a0336b F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 1f36c04fdd717f7d44a0addcdad0f5e54a5a403eab8a25426b069757830682ee +F ext/fts5/test/fts5corrupt3.test 99318789d84c678ed6388e61109b9f7b92c64419e87e4881093c01e219c5d397 F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -199,7 +199,7 @@ F ext/fts5/test/fts5porter.test 8d08010c28527db66bc3feebd2b8767504aaeb9b101a9863 F ext/fts5/test/fts5porter2.test 0d251a673f02fa13ca7f011654873b3add20745f7402f108600a23e52d8c7457 F ext/fts5/test/fts5prefix.test a0fa67b06650f2deaa7bf27745899d94e0fb547ad9ecbd08bfad98c04912c056 F ext/fts5/test/fts5query.test ac363b17a442620bb0780e93c24f16a5f963dfe2f23dc85647b869efcfada728 -F ext/fts5/test/fts5rank.test ca5000241924ecc2882db33c60f4f3a62b1ee6b16b5a9c8c6ddd9b6b2138489c +F ext/fts5/test/fts5rank.test c9fd4a1e36b4fa92d572ec13d846469b97da249d1c2f7fd3ee7e017ce46f2416 F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7 F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415 F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 658bd51623787be4ca87b066a051d119f39056286e223afef3691629cf1ab0e1 -R de5c373fa0aa9adc1be1e5804cb9b91d +P 75aec4fc886c04fe098828cc03bc72c197cbf40f0a1890fe5bbb98d4fd5c3c7e +R 1c1c766fc2c729d2e5f3a524114c00f7 U dan -Z d06c51f62e0fa708481e21348393bcb2 +Z 8a025a4c149038423df368f1009cf0d8 diff --git a/manifest.uuid b/manifest.uuid index e37939af6d..508e9fd646 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -75aec4fc886c04fe098828cc03bc72c197cbf40f0a1890fe5bbb98d4fd5c3c7e \ No newline at end of file +00e9a8f2730eb7239bf7fd107c97c409e4f9fbd968510766373440a9079898eb \ No newline at end of file From 546738f855d8c7e01c1d04b287040938ffeed81c Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 20 Aug 2019 20:09:51 +0000 Subject: [PATCH 144/221] Further tests for the special null-handling on this branch. FossilOrigin-Name: 0dbbb51f4d39cafb01d625d65c12dcb232a9c1da7ed5a9397bf55cfea1b980d2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/nulls1.test | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 5e0da8bb80..42a0a50ee3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sfor\ssort-by-index\scases\sthat\suse\sIN()\sand\snon-default\sNULL\shandling. -D 2019-08-20T17:51:13.442 +C Further\stests\sfor\sthe\sspecial\snull-handling\son\sthis\sbranch. +D 2019-08-20T20:09:51.176 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1182,7 +1182,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test abf8ab564357136d0a1c9909ab068d4fcb0a5e94e168bed6b6c6f548a6f56d07 +F test/nulls1.test 5b978fbae9c73b497608c16f2636a2f71de6e2c914e4c78955cf022e39b7a0d5 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a9a82ee88d2d12209a674bd19167277aa91a6912e7a8bbf3714f90d559307fee -R 72239629606cb191b8fd5443e5ad57ff +P 09d660ecde723fb30f3bb3684bbb7f95825d78da6a6f33ddf57846054cd563e0 +R fb0a3ff22d0818546ad42a3f60c048f9 U dan -Z 5d1aadbb6bb817df7ca002049c5a7d6e +Z 9ee5e455d6aba2bd43615893c1e9314b diff --git a/manifest.uuid b/manifest.uuid index e1b28f0039..ecfaa97382 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -09d660ecde723fb30f3bb3684bbb7f95825d78da6a6f33ddf57846054cd563e0 \ No newline at end of file +0dbbb51f4d39cafb01d625d65c12dcb232a9c1da7ed5a9397bf55cfea1b980d2 \ No newline at end of file diff --git a/test/nulls1.test b/test/nulls1.test index 38fba79be0..75d398782d 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -201,6 +201,42 @@ do_eqp_test 5.5 { `--SEARCH TABLE t4 USING INDEX t4ab (a=?) } +#------------------------------------------------------------------------- +# +do_execsql_test 6.0 { + CREATE TABLE t5(a, b, c); + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<200 + ) + INSERT INTO t5 SELECT i%2, CASE WHEN (i%10)==0 THEN NULL ELSE i END, i FROM s; +} + +set res1 [db eval { SELECT a,b FROM t5 WHERE a=1 ORDER BY b NULLS LAST, c }] +set res2 [db eval { + SELECT a,b FROM t5 WHERE a=1 ORDER BY b DESC NULLS FIRST, c DESC +}] + +do_execsql_test 6.1.1 { + CREATE INDEX t5ab ON t5(a, b, c); + SELECT a,b FROM t5 WHERE a=1 ORDER BY b NULLS LAST, c; +} $res1 +do_eqp_test 6.1.2 { + SELECT a,b FROM t5 WHERE a=1 ORDER BY b NULLS LAST, c; +} { + QUERY PLAN + `--SEARCH TABLE t5 USING COVERING INDEX t5ab (a=?) +} +do_execsql_test 6.2.1 { + SELECT a,b FROM t5 WHERE a=1 ORDER BY b DESC NULLS FIRST, c DESC +} $res2 +do_eqp_test 6.2.2 { + SELECT a,b FROM t5 WHERE a=1 ORDER BY b DESC NULLS FIRST, c DESC +} { + QUERY PLAN + `--SEARCH TABLE t5 USING COVERING INDEX t5ab (a=?) +} + + finish_test From 6fcb9f3ad96ea42eb46ff33b5fbd182f51d968b2 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 21 Aug 2019 11:31:48 +0000 Subject: [PATCH 145/221] Fix a broken assert() in the fts3 snippet code that was failing for queries containging more than 64 phrases. FossilOrigin-Name: 4c01e0170e113ad052b6c3980beb4be9f1dc03fb3cf34132b90e8b82b23f654e --- ext/fts3/fts3_snippet.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3snippet.test | 24 ++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index d5ebda6a05..6db3fd7d96 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -433,10 +433,10 @@ static void fts3SnippetDetails( while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){ int j; - u64 mPhrase = (u64)1 << i; + u64 mPhrase = (u64)1 << (i%64); u64 mPos = (u64)1 << (iCsr - iStart); assert( iCsr>=iStart && (iCsr - iStart)<=64 ); - assert( i>=0 && i<=64 ); + assert( i>=0 ); if( (mCover|mCovered)&mPhrase ){ iScore++; }else{ diff --git a/manifest b/manifest index cfd08c86b4..a7c9848843 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sfts5\s"ORDER\sBY\srank"\squeries\swhen\sthe\sfts5\stable\sname\srequires\squoting. -D 2019-08-20T19:11:29.544 +C Fix\sa\sbroken\sassert()\sin\sthe\sfts3\ssnippet\scode\sthat\swas\sfailing\sfor\squeries\scontainging\smore\sthan\s64\sphrases. +D 2019-08-21T11:31:48.364 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -90,7 +90,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 2f3a78b990f1c8658225618c8a0fa06ab60046688d6fb627a548e8ada9011150 +F ext/fts3/fts3_snippet.c 7963dd25ec81013c31f3c61697d0a1f3d06be21af3565774645c08d3dedf1fa7 F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 F ext/fts3/fts3_test.c 73b16e229e517c1b1f0fb8e1046182a4e5dbc8dbe6eea8a5d4353fcce7dbbf39 F ext/fts3/fts3_tokenize_vtab.c 1de9a61acfa2a0445ed989310c31839c57f6b6086dd9d5c97177ae734a17fd8b @@ -965,7 +965,7 @@ F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba16 F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test dace744104d1a44dc12dc9dd10b8d7542342df503d96942b7c4a55034e761789 +F test/fts3snippet.test 430bb5ace2b31ccd99de4d71775d956da832c114c4b3e39589748f114458647c F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 75aec4fc886c04fe098828cc03bc72c197cbf40f0a1890fe5bbb98d4fd5c3c7e -R 1c1c766fc2c729d2e5f3a524114c00f7 +P 00e9a8f2730eb7239bf7fd107c97c409e4f9fbd968510766373440a9079898eb +R 255eac821d14dded7de17c80283ba7c2 U dan -Z 8a025a4c149038423df368f1009cf0d8 +Z f165fea3d8f5943a2e39a213216b0a66 diff --git a/manifest.uuid b/manifest.uuid index 508e9fd646..bc8cee914d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -00e9a8f2730eb7239bf7fd107c97c409e4f9fbd968510766373440a9079898eb \ No newline at end of file +4c01e0170e113ad052b6c3980beb4be9f1dc03fb3cf34132b90e8b82b23f654e \ No newline at end of file diff --git a/test/fts3snippet.test b/test/fts3snippet.test index ebcdb8cffd..976c8c8492 100644 --- a/test/fts3snippet.test +++ b/test/fts3snippet.test @@ -561,7 +561,31 @@ do_test 4.3 { }] } {64} +#------------------------------------------------------------------------- +# Request a snippet from a query with more than 64 phrases. +# +do_execsql_test 5.0 { + CREATE VIRTUAL TABLE t5 USING fts3(x); + INSERT INTO t5 VALUES('a1 a2 a3'); + INSERT INTO t5 VALUES('a4 a5 a6'); + INSERT INTO t5 VALUES('a70 a71 a72'); +} +do_execsql_test 5.1 { + SELECT snippet(t5, '[', ']') FROM t5 WHERE t5 MATCH + 'a1 OR a2 OR a3 OR a4 OR a5 OR a6 OR a7 OR a8 OR a9 OR a10 OR ' || + 'a11 OR a12 OR a13 OR a14 OR a15 OR a16 OR a17 OR a18 OR a19 OR a10 OR ' || + 'a21 OR a22 OR a23 OR a24 OR a25 OR a26 OR a27 OR a28 OR a29 OR a20 OR ' || + 'a31 OR a32 OR a33 OR a34 OR a35 OR a36 OR a37 OR a38 OR a39 OR a30 OR ' || + 'a41 OR a42 OR a43 OR a44 OR a45 OR a46 OR a47 OR a48 OR a49 OR a40 OR ' || + 'a51 OR a52 OR a53 OR a54 OR a55 OR a56 OR a57 OR a58 OR a59 OR a50 OR ' || + 'a61 OR a62 OR a63 OR a64 OR a65 OR a66 OR a67 OR a68 OR a69 OR a60 OR ' || + 'a71 OR a72 OR a73 OR a74 OR a75 OR a76 OR a77 OR a78 OR a79 OR a70' +} { + {[a1] [a2] [a3]} + {[a4] [a5] [a6]} + {[a70] [a71] [a72]} +} set sqlite_fts3_enable_parentheses 0 finish_test From f7c92e82d27b88b1fa56ff72796ed42e89f614c9 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 21 Aug 2019 14:54:50 +0000 Subject: [PATCH 146/221] Avoid assuming that "column IS ?", where column is declared UNIQUE, matches only a single row (as "?" might be NULL). Fix for [b8689402]. FossilOrigin-Name: d02490a2f0cae047087130b4ad8f55f265845c2ffb3bde3b7d507edb54acea6d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 12 +++++++++--- test/distinct2.test | 26 ++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index a7c9848843..b14d09aa2a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbroken\sassert()\sin\sthe\sfts3\ssnippet\scode\sthat\swas\sfailing\sfor\squeries\scontainging\smore\sthan\s64\sphrases. -D 2019-08-21T11:31:48.364 +C Avoid\sassuming\sthat\s"column\sIS\s?",\swhere\scolumn\sis\sdeclared\sUNIQUE,\smatches\sonly\sa\ssingle\srow\s(as\s"?"\smight\sbe\sNULL).\sFix\sfor\s[b8689402]. +D 2019-08-21T14:54:50.917 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 2fac51d2420f05ab6f644f1813d4f73f6214304836fd9b22345738d943faad9b +F src/where.c 16c649c1dbc5676ad9b1c6a9b3559b4c4ab8e916d5da59cabb461682444a9ca8 F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c e1131fe94c8728cbecc707f6455afbda9418896497bdca2d49a04ce6c57999f6 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc @@ -811,7 +811,7 @@ F test/descidx2.test 9f1a0c83fd57f8667c82310ca21b30a350888b5d F test/descidx3.test 09ddbe3f5295f482d2f8b687cf6db8bad7acd9a2 F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e F test/distinct.test a1783b960ad8c15a77cd9f207be072898db1026c -F test/distinct2.test 1a01038083535fa9431f4a22587ae58d52d0a794910c36bd2bec07ba1e0e7367 +F test/distinct2.test b854b442111bf362328981f55d39d0df13140383b112057f6e046e311f14e5c3 F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 00e9a8f2730eb7239bf7fd107c97c409e4f9fbd968510766373440a9079898eb -R 255eac821d14dded7de17c80283ba7c2 +P 4c01e0170e113ad052b6c3980beb4be9f1dc03fb3cf34132b90e8b82b23f654e +R ba43ef9ffea471302d6253c6ac41d4d7 U dan -Z f165fea3d8f5943a2e39a213216b0a66 +Z 050be14a9fe83dd49b34a7e227f313e7 diff --git a/manifest.uuid b/manifest.uuid index bc8cee914d..2b4538aa49 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4c01e0170e113ad052b6c3980beb4be9f1dc03fb3cf34132b90e8b82b23f654e \ No newline at end of file +d02490a2f0cae047087130b4ad8f55f265845c2ffb3bde3b7d507edb54acea6d \ No newline at end of file diff --git a/src/where.c b/src/where.c index a37a810a2b..ae8899e302 100644 --- a/src/where.c +++ b/src/where.c @@ -3765,15 +3765,21 @@ static i8 wherePathSatisfiesOrderBy( u16 eOp = pLoop->aLTerm[j]->eOperator; /* Skip over == and IS and ISNULL terms. (Also skip IN terms when - ** doing WHERE_ORDERBY_LIMIT processing). + ** doing WHERE_ORDERBY_LIMIT processing). Except, IS and ISNULL + ** terms imply that the index is not UNIQUE NOT NULL in which case + ** the loop need to be marked as not order-distinct because it can + ** have repeated NULL rows. ** ** If the current term is a column of an ((?,?) IN (SELECT...)) ** expression for which the SELECT returns more than one column, ** check that it is the only column used by this loop. Otherwise, ** if it is one of two or more, none of the columns can be - ** considered to match an ORDER BY term. */ + ** considered to match an ORDER BY term. + */ if( (eOp & eqOpMask)!=0 ){ - if( eOp & WO_ISNULL ){ + if( eOp & (WO_ISNULL|WO_IS) ){ + testcase( eOp & WO_ISNULL ); + testcase( eOp & WO_IS ); testcase( isOrderDistinct ); isOrderDistinct = 0; } diff --git a/test/distinct2.test b/test/distinct2.test index 634dfd72e3..c42a1c971a 100644 --- a/test/distinct2.test +++ b/test/distinct2.test @@ -274,6 +274,32 @@ do_execsql_test 2040 { two 1 1 } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 3000 { + CREATE TABLE t0 (c0, c1 NOT NULL DEFAULT 1, c2, PRIMARY KEY (c0, c1)); + INSERT INTO t0(c2) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); + INSERT INTO t0(c2) VALUES('a'); +} +do_execsql_test 3010 { + SELECT DISTINCT * FROM t0 WHERE NULL IS t0.c0; +} { + {} 1 {} + {} 1 a +} + +do_execsql_test 3020 { + ANALYZE; +} + +do_execsql_test 3030 { + SELECT DISTINCT * FROM t0 WHERE NULL IS c0; +} { + {} 1 {} + {} 1 a +} finish_test + From 37874d7dccf49e8de10341cf61184db407425eb4 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 21 Aug 2019 17:46:34 +0000 Subject: [PATCH 147/221] Disable broken test case in expert1.test. FossilOrigin-Name: 73e30c2e92ccab274ff7cee48511c461de148786bb9d338921c1ecb193822282 --- ext/expert/expert1.test | 2 ++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/ext/expert/expert1.test b/ext/expert/expert1.test index 912c074c60..a0a18f6374 100644 --- a/ext/expert/expert1.test +++ b/ext/expert/expert1.test @@ -134,6 +134,7 @@ do_setup_rec_test $tn.5 { SEARCH TABLE t1 USING COVERING INDEX t1_idx_000123a7 (a=?) } +if 0 { do_setup_rec_test $tn.6 { CREATE TABLE t1(a, b, c); } { @@ -142,6 +143,7 @@ do_setup_rec_test $tn.6 { CREATE INDEX t1_idx_00000061 ON t1(a); SEARCH TABLE t1 USING COVERING INDEX t1_idx_00000061 } +} do_setup_rec_test $tn.7 { CREATE TABLE t1(a, b, c); diff --git a/manifest b/manifest index 6c483fdc14..b49de46348 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthis\sbranch\swith\slatest\strunk\schanges. -D 2019-08-21T15:41:50.875 +C Disable\sbroken\stest\scase\sin\sexpert1.test. +D 2019-08-21T17:46:34.434 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -47,7 +47,7 @@ F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74 F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 -F ext/expert/expert1.test 358e416877a5693fb99d5514f5d88452b5239dc2196b74e0e926718502faef6d +F ext/expert/expert1.test e2afc53a27610e8251e44c7f961806607a5490ff204b3db342740d558e052662 F ext/expert/sqlite3expert.c 3da865f2286433588260f41e796422c611bceaca3a0bbf9139a619cf7d062c19 F ext/expert/sqlite3expert.h af6354f8ee5c9e025024e63fec3bd640a802afcc3099a44d804752cf0791d811 F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0dbbb51f4d39cafb01d625d65c12dcb232a9c1da7ed5a9397bf55cfea1b980d2 d02490a2f0cae047087130b4ad8f55f265845c2ffb3bde3b7d507edb54acea6d -R 0832eeba23985db1371cd9381db27e16 +P 6153bcf41a9aa0497f8210311c99ac23846223068f2b6a3a1c2d9dec7673c7e1 +R 705b56b5be1b7e1fefeda4caba19be14 U dan -Z 6d83f96c910eba2164bcf7c8dafeccf3 +Z c64ec774c7130f6a813c233a9a841076 diff --git a/manifest.uuid b/manifest.uuid index 4890872255..f2e61edbdf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6153bcf41a9aa0497f8210311c99ac23846223068f2b6a3a1c2d9dec7673c7e1 \ No newline at end of file +73e30c2e92ccab274ff7cee48511c461de148786bb9d338921c1ecb193822282 \ No newline at end of file From f236b21f4b3dba4c104fcda5eb582297be89efe9 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 21 Aug 2019 19:58:11 +0000 Subject: [PATCH 148/221] Add missing VdbeCoverage() macros to new code. FossilOrigin-Name: b1cbcdc6eb42cca0c42a05e0d6ba4c6c7f09adff0c59ecfc5b434a94dec07a41 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 5 +---- src/window.c | 10 ++++++++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index b49de46348..d90e4f1fad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sbroken\stest\scase\sin\sexpert1.test. -D 2019-08-21T17:46:34.434 +C Add\smissing\sVdbeCoverage()\smacros\sto\snew\scode. +D 2019-08-21T19:58:11.253 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,11 +609,11 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c efdaf72cbae66b77fa0e5acd2036b162a9ba45e1109b64ccc72d2c69328feb35 +F src/where.c b49039ad3e7947f6a21735839ba126fc11a21861eeb2483aa5bddae03eea50a8 F src/whereInt.h 807766a6a92893dbba8a887e5b13466d2257ce07a84cf1be0aae2c41aee3bf4f F src/wherecode.c b8f285f93d53274d36d279f3aeaef67cdd28c2d899e06c5d813fb8a4ba6be1b9 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc -F src/window.c 94dccce0568dbcc65658d762e5b11c390fd5509d40e73205cb7f0c22f0051532 +F src/window.c 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test 34f2cf88e2a08d7a54a1fa2c9773ba81bf8b8216c0895e476118a1285540ee71 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6153bcf41a9aa0497f8210311c99ac23846223068f2b6a3a1c2d9dec7673c7e1 -R 705b56b5be1b7e1fefeda4caba19be14 +P 73e30c2e92ccab274ff7cee48511c461de148786bb9d338921c1ecb193822282 +R edcea46a2acf7bb6888ff4c7d19a220b U dan -Z c64ec774c7130f6a813c233a9a841076 +Z 27ad915f85c1608e423344937ae2bcdc diff --git a/manifest.uuid b/manifest.uuid index f2e61edbdf..7acb4c891f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -73e30c2e92ccab274ff7cee48511c461de148786bb9d338921c1ecb193822282 \ No newline at end of file +b1cbcdc6eb42cca0c42a05e0d6ba4c6c7f09adff0c59ecfc5b434a94dec07a41 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 72bdc60eb1..c5733e16af 100644 --- a/src/where.c +++ b/src/where.c @@ -5218,12 +5218,9 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ if( pLevel->regBignull ){ sqlite3VdbeResolveLabel(v, pLevel->addrBignull); addr = sqlite3VdbeAddOp1(v, OP_If, pLevel->regBignull); + VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->regBignull); sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->p2-1); - sqlite3VdbeChangeP5(v, pLevel->p5); - VdbeCoverage(v); - VdbeCoverageIf(v, pLevel->op==OP_Next); - VdbeCoverageIf(v, pLevel->op==OP_Prev); sqlite3VdbeJumpHere(v, addr); } #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT diff --git a/src/window.c b/src/window.c index 80dfd612c4..d3603e7a1e 100644 --- a/src/window.c +++ b/src/window.c @@ -1907,8 +1907,14 @@ static void windowCodeRangeTest( addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); switch( op ){ case OP_Ge: sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); break; - case OP_Gt: sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); break; - case OP_Le: sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); break; + case OP_Gt: + sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); + VdbeCoverage(v); + break; + case OP_Le: + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); + VdbeCoverage(v); + break; default: assert( op==OP_Lt ); /* no-op */ } sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); From 3e364802321c67602b2522ac4cde1fdeb2ac5d18 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 22 Aug 2019 00:53:16 +0000 Subject: [PATCH 149/221] Fix the OP_SeekGE, OP_SeekGT, OP_SeekLE, and OP_SeekLT opcodes so that they preserve the datatype of the value in the register used as the key. Ticket [d9f584e936c7a8d0] FossilOrigin-Name: 81b9f0f55042777b37de78069f7089041a9ee21dd0a0c86b879053fb46e140b4 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 14 +++++++++----- test/where.test | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index b14d09aa2a..de21ce3956 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sassuming\sthat\s"column\sIS\s?",\swhere\scolumn\sis\sdeclared\sUNIQUE,\smatches\sonly\sa\ssingle\srow\s(as\s"?"\smight\sbe\sNULL).\sFix\sfor\s[b8689402]. -D 2019-08-21T14:54:50.917 +C Fix\sthe\sOP_SeekGE,\sOP_SeekGT,\sOP_SeekLE,\sand\sOP_SeekLT\sopcodes\sso\sthat\sthey\npreserve\sthe\sdatatype\sof\sthe\svalue\sin\sthe\sregister\sused\sas\sthe\skey.\nTicket\s[d9f584e936c7a8d0] +D 2019-08-22T00:53:16.723 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -595,7 +595,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 1041610254502572bcc79ce6f61d9364fb93c154a4935fbaeaa7fd2e158e5205 +F src/vdbe.c 7cd09c6cc4d0e0053ced392ea4d04762e7ffd1470ff1b90ba3ebd2869c849ae8 F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e @@ -1670,7 +1670,7 @@ F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2a F test/walvfs.test f1accd66c876e3a0f6b4bef5b18d13411062d0ff0a0016e32bb41570474e99fc F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec F test/wapptest.tcl 3090239c59379d41e1a0644feb6683082fdb86edfab0c668973f8003f22c0e5d x -F test/where.test d640c16d33ae671c7583fd575d1a64fd55194dcc4393b877b3028db9ddba5a3b +F test/where.test 19c709c9f0f6ed12c23f909f6592aa55fba34269d5a2898537aa27a22b9ce650 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4c01e0170e113ad052b6c3980beb4be9f1dc03fb3cf34132b90e8b82b23f654e -R ba43ef9ffea471302d6253c6ac41d4d7 -U dan -Z 050be14a9fe83dd49b34a7e227f313e7 +P d02490a2f0cae047087130b4ad8f55f265845c2ffb3bde3b7d507edb54acea6d +R 9a1f89de468f638cf6272be3b894c4f7 +U drh +Z 8cbd654fcd7e359876e90cf539c4f92a diff --git a/manifest.uuid b/manifest.uuid index 2b4538aa49..5dc70a956e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d02490a2f0cae047087130b4ad8f55f265845c2ffb3bde3b7d507edb54acea6d \ No newline at end of file +81b9f0f55042777b37de78069f7089041a9ee21dd0a0c86b879053fb46e140b4 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 0bba39a667..c50e2a0b50 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4127,6 +4127,7 @@ case OP_SeekGT: { /* jump, in3, group */ pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; if( pC->isTable ){ + u16 flags3, newType; /* The BTREE_SEEK_EQ flag is only set on index cursors */ assert( sqlite3BtreeCursorHasHint(pC->uc.pCursor, BTREE_SEEK_EQ)==0 || CORRUPT_DB ); @@ -4135,16 +4136,19 @@ case OP_SeekGT: { /* jump, in3, group */ ** blob, or NULL. But it needs to be an integer before we can do ** the seek, so convert it. */ pIn3 = &aMem[pOp->p3]; - if( (pIn3->flags & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Str))==MEM_Str ){ + flags3 = pIn3->flags; + if( (flags3 & (MEM_Int|MEM_Real|MEM_IntReal|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn3, 0); } - iKey = sqlite3VdbeIntValue(pIn3); + iKey = sqlite3VdbeIntValue(pIn3); /* Get the integer key value */ + newType = pIn3->flags; /* Record the type after applying numeric affinity */ + pIn3->flags = flags3; /* But convert the type back to its original */ /* If the P3 value could not be converted into an integer without ** loss of information, then special processing is required... */ - if( (pIn3->flags & (MEM_Int|MEM_IntReal))==0 ){ - if( (pIn3->flags & MEM_Real)==0 ){ - if( (pIn3->flags & MEM_Null) || oc>=OP_SeekGE ){ + if( (newType & (MEM_Int|MEM_IntReal))==0 ){ + if( (newType & MEM_Real)==0 ){ + if( (newType & MEM_Null) || oc>=OP_SeekGE ){ VdbeBranchTaken(1,2); goto jump_to_p2; }else{ diff --git a/test/where.test b/test/where.test index 5997498839..26bf3a0402 100644 --- a/test/where.test +++ b/test/where.test @@ -1538,4 +1538,37 @@ do_catchsql_test where-25.5 { ON CONFLICT(c) DO UPDATE SET b=NULL } {1 {corrupt database}} +# 2019-08-21 Ticket https://www.sqlite.org/src/info/d9f584e936c7a8d0 +# +db close +sqlite3 db :memory: +do_execsql_test where-26.1 { + CREATE TABLE t0(c0 INTEGER PRIMARY KEY, c1 TEXT); + INSERT INTO t0(c0, c1) VALUES (1, 'a'); + CREATE TABLE t1(c0 INT PRIMARY KEY, c1 TEXT); + INSERT INTO t1(c0, c1) VALUES (1, 'a'); + SELECT * FROM t0 WHERE '-1' BETWEEN 0 AND t0.c0; +} {1 a} +do_execsql_test where-26.2 { + SELECT * FROM t1 WHERE '-1' BETWEEN 0 AND t1.c0; +} {1 a} +do_execsql_test where-26.3 { + SELECT * FROM t0 WHERE '-1'>=0 AND '-1'<=t0.c0; +} {1 a} +do_execsql_test where-26.4 { + SELECT * FROM t1 WHERE '-1'>=0 AND '-1'<=t1.c0; +} {1 a} +do_execsql_test where-26.5 { + SELECT '-1' BETWEEN 0 AND t0.c0 FROM t0; +} {1} +do_execsql_test where-26.6 { + SELECT '-1' BETWEEN 0 AND t1.c0 FROM t1; +} {1} +do_execsql_test where-26.7 { + SELECT '-1'>=0 AND '-1'<=t0.c0 FROM t0; +} {1} +do_execsql_test where-26.8 { + SELECT '-1'>=0 AND '-1'<=t1.c0 FROM t1; +} {1} + finish_test From af8664020a8f01e275e9237082d570fd25978eef Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 22 Aug 2019 11:11:28 +0000 Subject: [PATCH 150/221] Fix a false-positive in sqlite3ExprNeedsNoAffinityChange(). Ticket [ac184eb571d5e6e0] FossilOrigin-Name: e62eddbb048cbc2c15cb8eeb5b7a907e7cb08c21a27ebba96a069f62dbcb0f30 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 10 +++++++--- test/affinity2.test | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index de21ce3956..6c5bb1afc4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_SeekGE,\sOP_SeekGT,\sOP_SeekLE,\sand\sOP_SeekLT\sopcodes\sso\sthat\sthey\npreserve\sthe\sdatatype\sof\sthe\svalue\sin\sthe\sregister\sused\sas\sthe\skey.\nTicket\s[d9f584e936c7a8d0] -D 2019-08-22T00:53:16.723 +C Fix\sa\sfalse-positive\sin\ssqlite3ExprNeedsNoAffinityChange().\nTicket\s[ac184eb571d5e6e0] +D 2019-08-22T11:11:28.880 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c abef10556e47c3fca04de6a80d802d428e008ed61b4c76dd8439c189f4cd778f +F src/expr.c 1888c5647ec7630703ce0574f6e6b351062b7e0f990667f3c069cc7e602566b1 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -615,7 +615,7 @@ F src/wherecode.c e1131fe94c8728cbecc707f6455afbda9418896497bdca2d49a04ce6c57999 F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc F src/window.c 07e1c15081a735750218185c6b17053c87ecb764d06ab2c0a1ce568a2b4688e5 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 -F test/affinity2.test 34f2cf88e2a08d7a54a1fa2c9773ba81bf8b8216c0895e476118a1285540ee71 +F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d02490a2f0cae047087130b4ad8f55f265845c2ffb3bde3b7d507edb54acea6d -R 9a1f89de468f638cf6272be3b894c4f7 +P 81b9f0f55042777b37de78069f7089041a9ee21dd0a0c86b879053fb46e140b4 +R a8ad8ca6cf470341d16a9de34fb069f4 U drh -Z 8cbd654fcd7e359876e90cf539c4f92a +Z 2534526d731ee28f45a8990ce9a4aa42 diff --git a/manifest.uuid b/manifest.uuid index 5dc70a956e..42c3c2ad9a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -81b9f0f55042777b37de78069f7089041a9ee21dd0a0c86b879053fb46e140b4 \ No newline at end of file +e62eddbb048cbc2c15cb8eeb5b7a907e7cb08c21a27ebba96a069f62dbcb0f30 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c9deef0b6a..3c6e939756 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2159,8 +2159,12 @@ int sqlite3ExprCanBeNull(const Expr *p){ */ int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ u8 op; + int unaryMinus = 0; if( aff==SQLITE_AFF_BLOB ) return 1; - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + if( p->op==TK_UMINUS ) unaryMinus = 1; + p = p->pLeft; + } op = p->op; if( op==TK_REGISTER ) op = p->op2; switch( op ){ @@ -2171,10 +2175,10 @@ int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; } case TK_STRING: { - return aff==SQLITE_AFF_TEXT; + return !unaryMinus && aff==SQLITE_AFF_TEXT; } case TK_BLOB: { - return 1; + return !unaryMinus; } case TK_COLUMN: { assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ diff --git a/test/affinity2.test b/test/affinity2.test index 033c90f448..40e442376e 100644 --- a/test/affinity2.test +++ b/test/affinity2.test @@ -85,4 +85,36 @@ do_execsql_test 440 { SELECT * FROM t3 WHERE c='0' ORDER BY a; } {2 1 0 4 1 0} +# 2019-08-22 ticket https://sqlite.org/src/info/d99f1ffe836c591ac57f +# False positive in sqlite3ExprNeedsNoAffinityChange() +# +do_execsql_test 500 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 TEXT UNIQUE, c1); + INSERT INTO t0(c0) VALUES (-1); + SELECT quote(- x'ce'), quote(t0.c0), quote(- x'ce' >= t0.c0) FROM t0; +} {0 '-1' 1} +do_execsql_test 501 { + SELECT * FROM t0 WHERE - x'ce' >= t0.c0; +} {-1 {}} +do_execsql_test 502 { + SELECT quote(+-+x'ce'), quote(t0.c0), quote(+-+x'ce' >= t0.c0) FROM t0; +} {0 '-1' 1} +do_execsql_test 503 { + SELECT * FROM t0 WHERE +-+x'ce' >= t0.c0; +} {-1 {}} +do_execsql_test 504 { + SELECT quote(- 'ce'), quote(t0.c0), quote(- 'ce' >= t0.c0) FROM t0; +} {0 '-1' 1} +do_execsql_test 505 { + SELECT * FROM t0 WHERE - 'ce' >= t0.c0; +} {-1 {}} +do_execsql_test 506 { + SELECT quote(+-+'ce'), quote(t0.c0), quote(+-+'ce' >= t0.c0) FROM t0; +} {0 '-1' 1} +do_execsql_test 507 { + SELECT * FROM t0 WHERE +-+'ce' >= t0.c0; +} {-1 {}} + + finish_test From 0d950af311f8db2c34efa5da0256477794b9c3dd Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 22 Aug 2019 16:38:42 +0000 Subject: [PATCH 151/221] Fix the likely(), unlikely(), and likelihood() functions so that they have no affinity, just like any other function. Ticket [7e07a3dbf5a8cd26] FossilOrigin-Name: 44578865fa7baf9760e355691ca9ce753295aaba7a4ee0bba29d4f85d9335bab --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/expr.c | 26 +++++++++++++++++++------- src/resolve.c | 6 +++--- src/select.c | 2 +- src/sqliteInt.h | 1 + src/where.c | 13 +++++++------ src/whereexpr.c | 4 ++-- test/whereG.test | 42 ++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 88 insertions(+), 32 deletions(-) diff --git a/manifest b/manifest index 6c5bb1afc4..fe11de97f2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfalse-positive\sin\ssqlite3ExprNeedsNoAffinityChange().\nTicket\s[ac184eb571d5e6e0] -D 2019-08-22T11:11:28.880 +C Fix\sthe\slikely(),\sunlikely(),\sand\slikelihood()\sfunctions\sso\sthat\sthey\shave\nno\saffinity,\sjust\slike\sany\sother\sfunction.\nTicket\s[7e07a3dbf5a8cd26] +D 2019-08-22T16:38:42.563 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 1888c5647ec7630703ce0574f6e6b351062b7e0f990667f3c069cc7e602566b1 +F src/expr.c a1a811e1e5c623a7aa7176fa781ce72944a92b06233b15a39151a743d6eaab97 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -521,14 +521,14 @@ F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 132484635a30f873ee7eccd47f93ed1932503863b93b28423b42332d81adffaf F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c b2733d39a22f5023ab489b8535ca6854b51ff8667ca975815d004bb7388b0e41 +F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8 +F src/select.c d42f1f1435c5b85a3bd48fdb196bb499c00797691bbed0d0c2b153c8b13ab742 F src/shell.c.in e0f0758b6ab506d8ab12502fd2b8c55546bb9e4bb772374344a5a1b73f5bc2b9 F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h b7d612d9c63abc8a8a7dcf7fbec5326b1770f40c81502c56f508e272154e7615 +F src/sqliteInt.h 52594e495e35649c22f650b5249e515ac8eb108d97be304d14a0e89539ed1c59 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -609,10 +609,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 16c649c1dbc5676ad9b1c6a9b3559b4c4ab8e916d5da59cabb461682444a9ca8 +F src/where.c c35ad5b77fc135a09d6b16a63076748b5c32936016b5031294508a4d6a2ddbb1 F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c e1131fe94c8728cbecc707f6455afbda9418896497bdca2d49a04ce6c57999f6 -F src/whereexpr.c 5cce1fd11876086890a27c05e0cb75ca97ba64ba6984f72154039f1cfd2e69cc +F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 07e1c15081a735750218185c6b17053c87ecb764d06ab2c0a1ce568a2b4688e5 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 @@ -1685,7 +1685,7 @@ F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 F test/whereD.test 711d4df58d6d4fb9b3f5ce040b818564198be002 F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89 -F test/whereG.test 0158783235a6dd82fc0e37652b8522b186b9510594ac0a4bff0c4101b4396a52 +F test/whereG.test 4cda56de49f0c7d9a4f2590a3ddc5f79a7f2a03d2229d0f5bb5d3981ce57f293 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 81b9f0f55042777b37de78069f7089041a9ee21dd0a0c86b879053fb46e140b4 -R a8ad8ca6cf470341d16a9de34fb069f4 +P e62eddbb048cbc2c15cb8eeb5b7a907e7cb08c21a27ebba96a069f62dbcb0f30 +R 1215bd20457039d9af85e446a05c94b4 U drh -Z 2534526d731ee28f45a8990ce9a4aa42 +Z a684ecbf66c59873a68e428c9a74f890 diff --git a/manifest.uuid b/manifest.uuid index 42c3c2ad9a..a744097ebf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e62eddbb048cbc2c15cb8eeb5b7a907e7cb08c21a27ebba96a069f62dbcb0f30 \ No newline at end of file +44578865fa7baf9760e355691ca9ce753295aaba7a4ee0bba29d4f85d9335bab \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 3c6e939756..496abd32ce 100644 --- a/src/expr.c +++ b/src/expr.c @@ -106,10 +106,22 @@ Expr *sqlite3ExprAddCollateString(Parse *pParse, Expr *pExpr, const char *zC){ } /* -** Skip over any TK_COLLATE operators and any unlikely() -** or likelihood() function at the root of an expression. +** Skip over any TK_COLLATE operators. */ Expr *sqlite3ExprSkipCollate(Expr *pExpr){ + while( pExpr && ExprHasProperty(pExpr, EP_Skip) ){ + assert( pExpr->op==TK_COLLATE ); + pExpr = pExpr->pLeft; + } + return pExpr; +} + +/* +** Skip over any TK_COLLATE operators and/or any unlikely() +** or likelihood() or likely() functions at the root of an +** expression. +*/ +Expr *sqlite3ExprSkipCollateAndLikely(Expr *pExpr){ while( pExpr && ExprHasProperty(pExpr, EP_Skip|EP_Unlikely) ){ if( ExprHasProperty(pExpr, EP_Unlikely) ){ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); @@ -3382,7 +3394,7 @@ void sqlite3ExprCodeMove(Parse *pParse, int iFrom, int iTo, int nReg){ ** the correct value for the expression. */ static void exprToRegister(Expr *pExpr, int iReg){ - Expr *p = sqlite3ExprSkipCollate(pExpr); + Expr *p = sqlite3ExprSkipCollateAndLikely(pExpr); p->op2 = p->op; p->op = TK_REGISTER; p->iTable = iReg; @@ -4190,7 +4202,7 @@ int sqlite3ExprCodeAtInit( */ int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){ int r2; - pExpr = sqlite3ExprSkipCollate(pExpr); + pExpr = sqlite3ExprSkipCollateAndLikely(pExpr); if( ConstFactorOk(pParse) && pExpr->op!=TK_REGISTER && sqlite3ExprIsConstantNotJoin(pExpr) @@ -4933,8 +4945,8 @@ int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ */ int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ return sqlite3ExprCompare(0, - sqlite3ExprSkipCollate(pA), - sqlite3ExprSkipCollate(pB), + sqlite3ExprSkipCollateAndLikely(pA), + sqlite3ExprSkipCollateAndLikely(pB), iTab); } @@ -5142,7 +5154,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ */ int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ Walker w; - p = sqlite3ExprSkipCollate(p); + p = sqlite3ExprSkipCollateAndLikely(p); while( p ){ if( p->op==TK_NOTNULL ){ p = p->pLeft; diff --git a/src/resolve.c b/src/resolve.c index ab22664095..b61af805b2 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -973,7 +973,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } case TK_IS: case TK_ISNOT: { - Expr *pRight = sqlite3ExprSkipCollate(pExpr->pRight); + Expr *pRight = sqlite3ExprSkipCollateAndLikely(pExpr->pRight); assert( !ExprHasProperty(pExpr, EP_Reduced) ); /* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE", ** and "x IS NOT FALSE". */ @@ -1184,7 +1184,7 @@ static int resolveCompoundOrderBy( int iCol = -1; Expr *pE, *pDup; if( pItem->done ) continue; - pE = sqlite3ExprSkipCollate(pItem->pExpr); + pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); if( sqlite3ExprIsInteger(pE, &iCol) ){ if( iCol<=0 || iCol>pEList->nExpr ){ resolveOutOfRangeError(pParse, "ORDER", i+1, pEList->nExpr); @@ -1363,7 +1363,7 @@ static int resolveOrderGroupBy( pParse = pNC->pParse; for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ Expr *pE = pItem->pExpr; - Expr *pE2 = sqlite3ExprSkipCollate(pE); + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pE); if( zType[0]!='G' ){ iCol = resolveAsName(pParse, pSelect->pEList, pE2); if( iCol>0 ){ diff --git a/src/select.c b/src/select.c index bd8fee87ed..9cfcddf8da 100644 --- a/src/select.c +++ b/src/select.c @@ -1960,7 +1960,7 @@ int sqlite3ColumnsFromExprList( if( (zName = pEList->a[i].zName)!=0 ){ /* If the column contains an "AS " phrase, use as the name */ }else{ - Expr *pColExpr = sqlite3ExprSkipCollate(pEList->a[i].pExpr); + Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr); while( pColExpr->op==TK_DOT ){ pColExpr = pColExpr->pRight; assert( pColExpr!=0 ); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 552a435c95..f60b6f7aec 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4274,6 +4274,7 @@ int sqlite3ExprCollSeqMatch(Parse*,Expr*,Expr*); Expr *sqlite3ExprAddCollateToken(Parse *pParse, Expr*, const Token*, int); Expr *sqlite3ExprAddCollateString(Parse*,Expr*,const char*); Expr *sqlite3ExprSkipCollate(Expr*); +Expr *sqlite3ExprSkipCollateAndLikely(Expr*); int sqlite3CheckCollSeq(Parse *, CollSeq *); int sqlite3WritableSchema(sqlite3*); int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*); diff --git a/src/where.c b/src/where.c index ae8899e302..6e9d9cb9a2 100644 --- a/src/where.c +++ b/src/where.c @@ -253,7 +253,8 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ ){ if( (pTerm->eOperator & WO_EQUIV)!=0 && pScan->nEquivaiCur) - && (pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight))->op==TK_COLUMN + && (pX = sqlite3ExprSkipCollateAndLikely(pTerm->pExpr->pRight))->op + ==TK_COLUMN ){ int j; for(j=0; jnEquiv; j++){ @@ -449,7 +450,7 @@ static int findIndexCol( const char *zColl = pIdx->azColl[iCol]; for(i=0; inExpr; i++){ - Expr *p = sqlite3ExprSkipCollate(pList->a[i].pExpr); + Expr *p = sqlite3ExprSkipCollateAndLikely(pList->a[i].pExpr); if( p->op==TK_COLUMN && p->iColumn==pIdx->aiColumn[iCol] && p->iTable==iBase @@ -513,7 +514,7 @@ static int isDistinctRedundant( ** current SELECT is a correlated sub-query. */ for(i=0; inExpr; i++){ - Expr *p = sqlite3ExprSkipCollate(pDistinct->a[i].pExpr); + Expr *p = sqlite3ExprSkipCollateAndLikely(pDistinct->a[i].pExpr); if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1; } @@ -2769,7 +2770,7 @@ static int indexMightHelpWithOrderBy( if( pIndex->bUnordered ) return 0; if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0; for(ii=0; iinExpr; ii++){ - Expr *pExpr = sqlite3ExprSkipCollate(pOB->a[ii].pExpr); + Expr *pExpr = sqlite3ExprSkipCollateAndLikely(pOB->a[ii].pExpr); if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ if( pExpr->iColumn<0 ) return 1; for(jj=0; jjnKeyCol; jj++){ @@ -3709,7 +3710,7 @@ static i8 wherePathSatisfiesOrderBy( */ for(i=0; ia[i].pExpr); + pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr); if( pOBExpr->op!=TK_COLUMN ) continue; if( pOBExpr->iTable!=iCur ) continue; pTerm = sqlite3WhereFindTerm(&pWInfo->sWC, iCur, pOBExpr->iColumn, @@ -3829,7 +3830,7 @@ static i8 wherePathSatisfiesOrderBy( isMatch = 0; for(i=0; bOnce && ia[i].pExpr); + pOBExpr = sqlite3ExprSkipCollateAndLikely(pOrderBy->a[i].pExpr); testcase( wctrlFlags & WHERE_GROUPBY ); testcase( wctrlFlags & WHERE_DISTINCTBY ); if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0; diff --git a/src/whereexpr.c b/src/whereexpr.c index 252d924b85..d878bdb9ec 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -84,7 +84,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ }else{ pTerm->truthProb = 1; } - pTerm->pExpr = sqlite3ExprSkipCollate(p); + pTerm->pExpr = sqlite3ExprSkipCollateAndLikely(p); pTerm->wtFlags = wtFlags; pTerm->pWC = pWC; pTerm->iParent = -1; @@ -1451,7 +1451,7 @@ static void exprAnalyze( ** all terms of the WHERE clause. */ void sqlite3WhereSplit(WhereClause *pWC, Expr *pExpr, u8 op){ - Expr *pE2 = sqlite3ExprSkipCollate(pExpr); + Expr *pE2 = sqlite3ExprSkipCollateAndLikely(pExpr); pWC->op = op; if( pE2==0 ) return; if( pE2->op!=op ){ diff --git a/test/whereG.test b/test/whereG.test index d2e6a4ee96..595de116aa 100644 --- a/test/whereG.test +++ b/test/whereG.test @@ -266,5 +266,47 @@ do_execsql_test 7.3 { SELECT coalesce(a,a), x FROM t1, t2 ORDER BY 1, 2; } {1 3 1 4 9 3 9 4} +# 2019-08-22 +# Ticket https://www.sqlite.org/src/info/7e07a3dbf5a8cd26 +# +do_execsql_test 8.1 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0 (c0); + INSERT INTO t0(c0) VALUES ('a'); + SELECT LIKELY(t0.rowid) <= '0' FROM t0; +} {1} +do_execsql_test 8.2 { + SELECT * FROM t0 WHERE LIKELY(t0.rowid) <= '0'; +} {a} +do_execsql_test 8.3 { + SELECT (t0.rowid) <= '0' FROM t0; +} {0} +do_execsql_test 8.4 { + SELECT * FROM t0 WHERE (t0.rowid) <= '0'; +} {} +do_execsql_test 8.5 { + SELECT unlikely(t0.rowid) <= '0', likelihood(t0.rowid,0.5) <= '0' FROM t0; +} {1 1} +do_execsql_test 8.6 { + SELECT * FROM t0 WHERE unlikely(t0.rowid) <= '0'; +} {a} +do_execsql_test 8.7 { + SELECT * FROM t0 WHERE likelihood(t0.rowid, 0.5) <= '0'; +} {a} +do_execsql_test 8.8 { + SELECT unlikely(t0.rowid <= '0'), + likely(t0.rowid <= '0'), + likelihood(t0.rowid <= '0',0.5) + FROM t0; +} {0 0 0} +do_execsql_test 8.9 { + SELECT * FROM t0 WHERE unlikely(t0.rowid <= '0'); +} {} +do_execsql_test 8.10 { + SELECT * FROM t0 WHERE likelihood(t0.rowid <= '0', 0.5); +} {} + + + finish_test From 505ae9def80b7b45e37a454064f1cf23df26bdf1 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 22 Aug 2019 21:13:56 +0000 Subject: [PATCH 152/221] Add additional VDBE coverage marcros. FossilOrigin-Name: d3531f5be7d3769689e2cd8bdc9bab5608759de027d44cc123996f32a4a89583 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 23 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 5b97a10ac7..d781ff2ecd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sfixes\sfrom\strunk.\s\sAlso\sfix\sa\sreference\sto\sthe\sKeyInfo.aSortOrder\sfield,\nwhich\sshould\snow\sbe\sKeyInfo.aSortFlags -D 2019-08-22T19:35:24.209 +C Add\sadditional\sVDBE\scoverage\smarcros. +D 2019-08-22T21:13:56.537 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c e954bdbd248e755ddbe0ff54b743a7b99eeb2d852d034b2176004a905c4128bc F src/whereInt.h 807766a6a92893dbba8a887e5b13466d2257ce07a84cf1be0aae2c41aee3bf4f -F src/wherecode.c b8f285f93d53274d36d279f3aeaef67cdd28c2d899e06c5d813fb8a4ba6be1b9 +F src/wherecode.c f8005a06f78bd396216b444280a78688198e9b3aaed582c8e7fc608d111b1d93 F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b1cbcdc6eb42cca0c42a05e0d6ba4c6c7f09adff0c59ecfc5b434a94dec07a41 44578865fa7baf9760e355691ca9ce753295aaba7a4ee0bba29d4f85d9335bab -R 2d835772a9b0c8de420768a9d0cab391 +P 63e625c8eb06720eef30573aa562e38c90d228a9cf493f8bb59f09e50f0e3168 +R 3b31af6d2e0a85acf1bc0e1de0094280 U drh -Z db9bead32e306ab3e60ddcd2bc746cd1 +Z 763e56944768007815dc6fe6b985fbdb diff --git a/manifest.uuid b/manifest.uuid index 7877eb59c1..34fc4dc3ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -63e625c8eb06720eef30573aa562e38c90d228a9cf493f8bb59f09e50f0e3168 \ No newline at end of file +d3531f5be7d3769689e2cd8bdc9bab5608759de027d44cc123996f32a4a89583 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index c662c1ce56..55ac394b65 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1710,9 +1710,23 @@ Bitmask sqlite3WhereCodeOneLoopStart( start_constraints = (nConstraint>1); op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint-1); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); }else{ op = aStartOp[(start_constraints<<2) + ((!startEq)<<1) + bRev]; sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); } } } @@ -1762,6 +1776,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( nConstraint ){ if( regBignull ){ sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+3); + VdbeCoverage(v); } op = aEndOp[bRev*2 + endEq]; sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); @@ -1772,12 +1787,20 @@ Bitmask sqlite3WhereCodeOneLoopStart( } if( regBignull ){ sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); if( bStopAtNull ){ op = aEndOp[bRev*2 + 0]; + assert( op==OP_IdxGE || op==OP_IdxLE ); sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); }else{ op = aEndOp[bRev*2 + endEq]; sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint+1); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); } } From 74e1b861ad749a00966583c29f0e2d8dfb510c82 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 23 Aug 2019 13:08:49 +0000 Subject: [PATCH 153/221] Extra VDBE comments in the NULLS LAST logic provide landmarks to help understand the EXPLAIN output. FossilOrigin-Name: 649b08ead50f10a9ec0357a5e1ed020195d9f93be61ef703ea036a8e53f07a34 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 2 ++ src/whereInt.h | 2 +- src/wherecode.c | 5 ++++- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index d781ff2ecd..9403c98df3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sadditional\sVDBE\scoverage\smarcros. -D 2019-08-22T21:13:56.537 +C Extra\sVDBE\scomments\sin\sthe\sNULLS\sLAST\slogic\sprovide\slandmarks\sto\shelp\nunderstand\sthe\sEXPLAIN\soutput. +D 2019-08-23T13:08:49.776 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,9 +609,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c e954bdbd248e755ddbe0ff54b743a7b99eeb2d852d034b2176004a905c4128bc -F src/whereInt.h 807766a6a92893dbba8a887e5b13466d2257ce07a84cf1be0aae2c41aee3bf4f -F src/wherecode.c f8005a06f78bd396216b444280a78688198e9b3aaed582c8e7fc608d111b1d93 +F src/where.c cba20474827dfb3e6bfe7835635e0f018a67d4b8faef4c90d4f28b81b81a8915 +F src/whereInt.h cce97c33db637c027bd6f3601a5ff845bd65c833b6465e3b091d48f6a7f51268 +F src/wherecode.c 1700806bb5bb507ff3614d0836893f35a5a5c438087ee6f373f2ecdf32156d71 F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 63e625c8eb06720eef30573aa562e38c90d228a9cf493f8bb59f09e50f0e3168 -R 3b31af6d2e0a85acf1bc0e1de0094280 +P d3531f5be7d3769689e2cd8bdc9bab5608759de027d44cc123996f32a4a89583 +R ab23b496c06c535da116ba045bb5e66a U drh -Z 763e56944768007815dc6fe6b985fbdb +Z 115e4fb3e71b36cfad63bc3458a08668 diff --git a/manifest.uuid b/manifest.uuid index 34fc4dc3ee..729790d69c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d3531f5be7d3769689e2cd8bdc9bab5608759de027d44cc123996f32a4a89583 \ No newline at end of file +649b08ead50f10a9ec0357a5e1ed020195d9f93be61ef703ea036a8e53f07a34 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 37daab6791..00aa5f3660 100644 --- a/src/where.c +++ b/src/where.c @@ -5219,9 +5219,11 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ if( pLevel->regBignull ){ sqlite3VdbeResolveLabel(v, pLevel->addrBignull); addr = sqlite3VdbeAddOp1(v, OP_If, pLevel->regBignull); + VdbeComment((v, "If NULL-scan done")); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->regBignull); sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->p2-1); + VdbeComment((v, "Do the NULL-scan")); sqlite3VdbeJumpHere(v, addr); } #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT diff --git a/src/whereInt.h b/src/whereInt.h index f402a18f8c..d1fc3515a5 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -71,7 +71,7 @@ struct WhereLevel { int addrCont; /* Jump here to continue with the next loop cycle */ int addrFirst; /* First instruction of interior of the loop */ int addrBody; /* Beginning of the body of this loop */ - int regBignull; /* big-null flag register */ + int regBignull; /* big-null flag reg. True if NULLs not yet scanned */ int addrBignull; /* Jump here for next part of big-null scan */ #ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ diff --git a/src/wherecode.c b/src/wherecode.c index 55ac394b65..12ed0d7af0 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1550,7 +1550,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( u8 bSeekPastNull = 0; /* True to seek past initial nulls */ u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ int omitTable; /* True if we use the index only */ - int regBignull = 0; + int regBignull = 0; /* big-null flag register */ pIdx = pLoop->u.btree.pIndex; iIdxCur = pLevel->iIdxCur; @@ -1691,6 +1691,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( } if( regBignull ){ sqlite3VdbeAddOp2(v, OP_Integer, 0, regBignull); + VdbeComment((v, "NULL-scan flag")); } op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; @@ -1776,6 +1777,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( nConstraint ){ if( regBignull ){ sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+3); + VdbeComment((v, "If in NULL-scan")); VdbeCoverage(v); } op = aEndOp[bRev*2 + endEq]; @@ -1787,6 +1789,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( } if( regBignull ){ sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+2); + VdbeComment((v, "If not in NULL-scan")); VdbeCoverage(v); if( bStopAtNull ){ op = aEndOp[bRev*2 + 0]; From ec3dda5b11f527c69f1007fa60ba2765e0a5628b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 23 Aug 2019 13:32:03 +0000 Subject: [PATCH 154/221] Invert the meaning of the regBignull flag so that it is 1 when doing the normal scan and 1 when scanning nulls. This enables the re-do jump at the bottom of the loop to be coded with a single OP_IfNotZero opcode, rather than a sequence of OP_If, OP_Integer, OP_Goto. FossilOrigin-Name: bf875e1a259a4167694e06349458452dc36c1d38aa6843518d9ae46ce74e5559 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 8 +------- src/whereInt.h | 2 +- src/wherecode.c | 12 ++++++------ 5 files changed, 17 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 9403c98df3..6962dd393e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Extra\sVDBE\scomments\sin\sthe\sNULLS\sLAST\slogic\sprovide\slandmarks\sto\shelp\nunderstand\sthe\sEXPLAIN\soutput. -D 2019-08-23T13:08:49.776 +C Invert\sthe\smeaning\sof\sthe\sregBignull\sflag\sso\sthat\sit\sis\s1\swhen\sdoing\sthe\nnormal\sscan\sand\s1\swhen\sscanning\snulls.\s\sThis\senables\sthe\sre-do\sjump\sat\sthe\nbottom\sof\sthe\sloop\sto\sbe\scoded\swith\sa\ssingle\sOP_IfNotZero\sopcode,\srather\nthan\sa\ssequence\sof\sOP_If,\sOP_Integer,\sOP_Goto. +D 2019-08-23T13:32:03.306 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,9 +609,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c cba20474827dfb3e6bfe7835635e0f018a67d4b8faef4c90d4f28b81b81a8915 -F src/whereInt.h cce97c33db637c027bd6f3601a5ff845bd65c833b6465e3b091d48f6a7f51268 -F src/wherecode.c 1700806bb5bb507ff3614d0836893f35a5a5c438087ee6f373f2ecdf32156d71 +F src/where.c 10e21ac338582a4f87b2d09f09dd812c9bda0a0c4c456f54daeeee355afae733 +F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 +F src/wherecode.c c02ff23ea48b8980d003817bd412e3ce7ce4982159a090566a24cb6101688a9d F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d3531f5be7d3769689e2cd8bdc9bab5608759de027d44cc123996f32a4a89583 -R ab23b496c06c535da116ba045bb5e66a +P 649b08ead50f10a9ec0357a5e1ed020195d9f93be61ef703ea036a8e53f07a34 +R c7fec8ea82d2ec3c4ef608bd58d88fd0 U drh -Z 115e4fb3e71b36cfad63bc3458a08668 +Z 0dcd16d55adeefa06ece8236ed711d36 diff --git a/manifest.uuid b/manifest.uuid index 729790d69c..72e2aaa811 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -649b08ead50f10a9ec0357a5e1ed020195d9f93be61ef703ea036a8e53f07a34 \ No newline at end of file +bf875e1a259a4167694e06349458452dc36c1d38aa6843518d9ae46ce74e5559 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 00aa5f3660..1dbeb0e065 100644 --- a/src/where.c +++ b/src/where.c @@ -5218,13 +5218,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ VdbeCoverageIf(v, pLevel->op==OP_VNext); if( pLevel->regBignull ){ sqlite3VdbeResolveLabel(v, pLevel->addrBignull); - addr = sqlite3VdbeAddOp1(v, OP_If, pLevel->regBignull); - VdbeComment((v, "If NULL-scan done")); - VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->regBignull); - sqlite3VdbeAddOp2(v, OP_Goto, 0, pLevel->p2-1); - VdbeComment((v, "Do the NULL-scan")); - sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp2(v, OP_IfNotZero, pLevel->regBignull, pLevel->p2-1); } #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); diff --git a/src/whereInt.h b/src/whereInt.h index d1fc3515a5..e63ca46d53 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -71,7 +71,7 @@ struct WhereLevel { int addrCont; /* Jump here to continue with the next loop cycle */ int addrFirst; /* First instruction of interior of the loop */ int addrBody; /* Beginning of the body of this loop */ - int regBignull; /* big-null flag reg. True if NULLs not yet scanned */ + int regBignull; /* big-null flag reg. True if a NULL-scan is needed */ int addrBignull; /* Jump here for next part of big-null scan */ #ifndef SQLITE_LIKE_DOESNT_MATCH_BLOBS u32 iLikeRepCntr; /* LIKE range processing counter register (times 2) */ diff --git a/src/wherecode.c b/src/wherecode.c index 12ed0d7af0..2aff70554f 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1690,8 +1690,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp1(v, OP_SeekHit, iIdxCur); } if( regBignull ){ - sqlite3VdbeAddOp2(v, OP_Integer, 0, regBignull); - VdbeComment((v, "NULL-scan flag")); + sqlite3VdbeAddOp2(v, OP_Integer, 1, regBignull); + VdbeComment((v, "NULL-scan needed flag")); } op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; @@ -1776,8 +1776,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( /* Check if the index cursor is past the end of the range. */ if( nConstraint ){ if( regBignull ){ - sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+3); - VdbeComment((v, "If in NULL-scan")); + sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+3); + VdbeComment((v, "If NULL-scan active")); VdbeCoverage(v); } op = aEndOp[bRev*2 + endEq]; @@ -1788,8 +1788,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); } if( regBignull ){ - sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+2); - VdbeComment((v, "If not in NULL-scan")); + sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+2); + VdbeComment((v, "If NULL-scan pending")); VdbeCoverage(v); if( bStopAtNull ){ op = aEndOp[bRev*2 + 0]; From 0086e078656bbdfebffdbea67f3f0131aa677b08 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 23 Aug 2019 16:12:20 +0000 Subject: [PATCH 155/221] Simplification of the WHERE loop code generator for NULLS LAST saves a few CPU cycles and about a hundred bytes of code space. FossilOrigin-Name: e3ed2f496f51234a8f81d90d47ba603b06dbed38b8bd8f1934294379cde74d3a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 38 ++++++++++++++------------------------ 3 files changed, 21 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 6962dd393e..46a935e609 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Invert\sthe\smeaning\sof\sthe\sregBignull\sflag\sso\sthat\sit\sis\s1\swhen\sdoing\sthe\nnormal\sscan\sand\s1\swhen\sscanning\snulls.\s\sThis\senables\sthe\sre-do\sjump\sat\sthe\nbottom\sof\sthe\sloop\sto\sbe\scoded\swith\sa\ssingle\sOP_IfNotZero\sopcode,\srather\nthan\sa\ssequence\sof\sOP_If,\sOP_Integer,\sOP_Goto. -D 2019-08-23T13:32:03.306 +C Simplification\sof\sthe\sWHERE\sloop\scode\sgenerator\sfor\sNULLS\sLAST\ssaves\sa\nfew\sCPU\scycles\sand\sabout\sa\shundred\sbytes\sof\scode\sspace. +D 2019-08-23T16:12:20.533 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 10e21ac338582a4f87b2d09f09dd812c9bda0a0c4c456f54daeeee355afae733 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c c02ff23ea48b8980d003817bd412e3ce7ce4982159a090566a24cb6101688a9d +F src/wherecode.c f8ba85888b8a6843bce84e7e21f61d6c043c21c888871ad84fb911f45671e95d F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 649b08ead50f10a9ec0357a5e1ed020195d9f93be61ef703ea036a8e53f07a34 -R c7fec8ea82d2ec3c4ef608bd58d88fd0 +P bf875e1a259a4167694e06349458452dc36c1d38aa6843518d9ae46ce74e5559 +R f34508d6bf0c4c450df67caf81b0a3ce U drh -Z 0dcd16d55adeefa06ece8236ed711d36 +Z 77866c600215002b5dd6dd0eeafd861f diff --git a/manifest.uuid b/manifest.uuid index 72e2aaa811..c464a63a97 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bf875e1a259a4167694e06349458452dc36c1d38aa6843518d9ae46ce74e5559 \ No newline at end of file +e3ed2f496f51234a8f81d90d47ba603b06dbed38b8bd8f1934294379cde74d3a \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 2aff70554f..c1304c8af1 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1671,10 +1671,10 @@ Bitmask sqlite3WhereCodeOneLoopStart( } bSeekPastNull = 0; }else if( bSeekPastNull ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); - nConstraint++; startEq = 0; + sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); start_constraints = 1; + nConstraint++; }else if( regBignull ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regBase+nEq); start_constraints = 1; @@ -1705,30 +1705,20 @@ Bitmask sqlite3WhereCodeOneLoopStart( VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); + assert( bSeekPastNull==0 || bStopAtNull==0 ); if( regBignull ){ + assert( bSeekPastNull==1 || bStopAtNull==1 ); + assert( bStopAtNull==startEq ); sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); - if( bStopAtNull ){ - start_constraints = (nConstraint>1); - op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint-1); - VdbeCoverage(v); - VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); - VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); - VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); - VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); - VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); - VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); - }else{ - op = aStartOp[(start_constraints<<2) + ((!startEq)<<1) + bRev]; - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - VdbeCoverage(v); - VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); - VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); - VdbeCoverageIf(v, op==OP_SeekGT); testcase( op==OP_SeekGT ); - VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); - VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); - VdbeCoverageIf(v, op==OP_SeekLT); testcase( op==OP_SeekLT ); - } + op = aStartOp[(nConstraint>1)*4 + 2 + bRev]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint-startEq); + VdbeCoverage(v); + VdbeCoverageIf(v, op==OP_Rewind); testcase( op==OP_Rewind ); + VdbeCoverageIf(v, op==OP_Last); testcase( op==OP_Last ); + VdbeCoverageIf(v, op==OP_SeekGE); testcase( op==OP_SeekGE ); + VdbeCoverageIf(v, op==OP_SeekLE); testcase( op==OP_SeekLE ); + assert( op==OP_Rewind || op==OP_Last || op==OP_SeekGE || op==OP_SeekLE); } } From 5f6a4ea2e2b5a12bc425615a8a01af920c1bc65d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 23 Aug 2019 17:00:22 +0000 Subject: [PATCH 156/221] Additional simplifications of the WHERE loop code generator logic for NULLS LAST. FossilOrigin-Name: 1383680d927d7d703933be7653c0019199845e7f7e82bcc76d9ca3808093e9d8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 28 ++++++++++++++-------------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 46a935e609..3fb90c2684 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplification\sof\sthe\sWHERE\sloop\scode\sgenerator\sfor\sNULLS\sLAST\ssaves\sa\nfew\sCPU\scycles\sand\sabout\sa\shundred\sbytes\sof\scode\sspace. -D 2019-08-23T16:12:20.533 +C Additional\ssimplifications\sof\sthe\sWHERE\sloop\scode\sgenerator\slogic\sfor\nNULLS\sLAST. +D 2019-08-23T17:00:22.277 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 10e21ac338582a4f87b2d09f09dd812c9bda0a0c4c456f54daeeee355afae733 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c f8ba85888b8a6843bce84e7e21f61d6c043c21c888871ad84fb911f45671e95d +F src/wherecode.c 3bed0f377aacff188575bccc2f01d45ed5df353b52e8b2c39a22ff88ae3cfc25 F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bf875e1a259a4167694e06349458452dc36c1d38aa6843518d9ae46ce74e5559 -R f34508d6bf0c4c450df67caf81b0a3ce +P e3ed2f496f51234a8f81d90d47ba603b06dbed38b8bd8f1934294379cde74d3a +R 1ab18b69b8d15ca4e03875cc0023fa2f U drh -Z 77866c600215002b5dd6dd0eeafd861f +Z e7fe19284bcd51997b007393da65f48c diff --git a/manifest.uuid b/manifest.uuid index c464a63a97..80c0a7a60e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3ed2f496f51234a8f81d90d47ba603b06dbed38b8bd8f1934294379cde74d3a \ No newline at end of file +1383680d927d7d703933be7653c0019199845e7f7e82bcc76d9ca3808093e9d8 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index c1304c8af1..9868428c5b 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1708,6 +1708,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( assert( bSeekPastNull==0 || bStopAtNull==0 ); if( regBignull ){ assert( bSeekPastNull==1 || bStopAtNull==1 ); + assert( bSeekPastNull==!bStopAtNull ); assert( bStopAtNull==startEq ); sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); op = aStartOp[(nConstraint>1)*4 + 2 + bRev]; @@ -1766,6 +1767,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( /* Check if the index cursor is past the end of the range. */ if( nConstraint ){ if( regBignull ){ + /* Except, skip the end-of-range check while doing the NULL-scan */ sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+3); VdbeComment((v, "If NULL-scan active")); VdbeCoverage(v); @@ -1778,23 +1780,21 @@ Bitmask sqlite3WhereCodeOneLoopStart( testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); } if( regBignull ){ + /* During a NULL-scan, check to see if we have reached the end of + ** the NULLs */ + assert( bSeekPastNull==!bStopAtNull ); + assert( bSeekPastNull+bStopAtNull==1 ); + assert( nConstraint+bSeekPastNull>0 ); sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+2); VdbeComment((v, "If NULL-scan pending")); VdbeCoverage(v); - if( bStopAtNull ){ - op = aEndOp[bRev*2 + 0]; - assert( op==OP_IdxGE || op==OP_IdxLE ); - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint); - testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); - testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); - }else{ - op = aEndOp[bRev*2 + endEq]; - sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, nConstraint+1); - testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); - testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); - testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); - testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); - } + op = aEndOp[bRev*2 + bSeekPastNull]; + sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, + nConstraint+bSeekPastNull); + testcase( op==OP_IdxGT ); VdbeCoverageIf(v, op==OP_IdxGT ); + testcase( op==OP_IdxGE ); VdbeCoverageIf(v, op==OP_IdxGE ); + testcase( op==OP_IdxLT ); VdbeCoverageIf(v, op==OP_IdxLT ); + testcase( op==OP_IdxLE ); VdbeCoverageIf(v, op==OP_IdxLE ); } if( pLoop->wsFlags & WHERE_IN_EARLYOUT ){ From a31d3554c5daaff3c9e8d411879c6185b75073a0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 23 Aug 2019 17:09:02 +0000 Subject: [PATCH 157/221] Revise the VDBE comments for NULL-scan so that they also work make sense when reading a NULLS FIRST plan. FossilOrigin-Name: bfe793780fa6fc7a1e7d0ee60606dda272985de9573887dca118e9510fc609f2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 3fb90c2684..7052b4ef66 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Additional\ssimplifications\sof\sthe\sWHERE\sloop\scode\sgenerator\slogic\sfor\nNULLS\sLAST. -D 2019-08-23T17:00:22.277 +C Revise\sthe\sVDBE\scomments\sfor\sNULL-scan\sso\sthat\sthey\salso\swork\smake\nsense\swhen\sreading\sa\sNULLS\sFIRST\splan. +D 2019-08-23T17:09:02.374 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -611,7 +611,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 10e21ac338582a4f87b2d09f09dd812c9bda0a0c4c456f54daeeee355afae733 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 3bed0f377aacff188575bccc2f01d45ed5df353b52e8b2c39a22ff88ae3cfc25 +F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e3ed2f496f51234a8f81d90d47ba603b06dbed38b8bd8f1934294379cde74d3a -R 1ab18b69b8d15ca4e03875cc0023fa2f +P 1383680d927d7d703933be7653c0019199845e7f7e82bcc76d9ca3808093e9d8 +R 26440ec11262a796737d9ceae9976115 U drh -Z e7fe19284bcd51997b007393da65f48c +Z 426e1e92ed37562d2a1263893c3aee0b diff --git a/manifest.uuid b/manifest.uuid index 80c0a7a60e..a5e43de7bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1383680d927d7d703933be7653c0019199845e7f7e82bcc76d9ca3808093e9d8 \ No newline at end of file +bfe793780fa6fc7a1e7d0ee60606dda272985de9573887dca118e9510fc609f2 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 9868428c5b..2fbcba17e9 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1691,7 +1691,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( } if( regBignull ){ sqlite3VdbeAddOp2(v, OP_Integer, 1, regBignull); - VdbeComment((v, "NULL-scan needed flag")); + VdbeComment((v, "NULL-scan pass ctr")); } op = aStartOp[(start_constraints<<2) + (startEq<<1) + bRev]; @@ -1769,7 +1769,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( regBignull ){ /* Except, skip the end-of-range check while doing the NULL-scan */ sqlite3VdbeAddOp2(v, OP_IfNot, regBignull, sqlite3VdbeCurrentAddr(v)+3); - VdbeComment((v, "If NULL-scan active")); + VdbeComment((v, "If NULL-scan 2nd pass")); VdbeCoverage(v); } op = aEndOp[bRev*2 + endEq]; @@ -1786,7 +1786,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( assert( bSeekPastNull+bStopAtNull==1 ); assert( nConstraint+bSeekPastNull>0 ); sqlite3VdbeAddOp2(v, OP_If, regBignull, sqlite3VdbeCurrentAddr(v)+2); - VdbeComment((v, "If NULL-scan pending")); + VdbeComment((v, "If NULL-scan 1st pass")); VdbeCoverage(v); op = aEndOp[bRev*2 + bSeekPastNull]; sqlite3VdbeAddOp4Int(v, op, iIdxCur, addrNxt, regBase, From ee6c5e5ae7193241a55dd83c8f434a5d7c5abf11 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 23 Aug 2019 20:33:01 +0000 Subject: [PATCH 158/221] Move some things in parse.y so that TK_COLUMN and TK_AGG_COLUMN are assigned the same values as they are on trunk for a very small speedup. FossilOrigin-Name: d26fdfa3bc5f8d9c4a6000462080b0dd508e5cae9a83e0d126be48195224da8c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/parse.y | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 7052b4ef66..7dcd24ab83 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Revise\sthe\sVDBE\scomments\sfor\sNULL-scan\sso\sthat\sthey\salso\swork\smake\nsense\swhen\sreading\sa\sNULLS\sFIRST\splan. -D 2019-08-23T17:09:02.374 +C Move\ssome\sthings\sin\sparse.y\sso\sthat\sTK_COLUMN\sand\sTK_AGG_COLUMN\sare\sassigned\sthe\ssame\svalues\sas\sthey\sare\son\strunk\sfor\sa\svery\ssmall\sspeedup. +D 2019-08-23T20:33:01.837 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -512,7 +512,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 61e979ce7f860df902b21b16ed40504ddd58fe4546fb15908a51538b3062e8e0 +F src/parse.y d127bf3f79f9f5baccfdfa00c7898df3eafa027ac58c35fd673bf81b008b2374 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1383680d927d7d703933be7653c0019199845e7f7e82bcc76d9ca3808093e9d8 -R 26440ec11262a796737d9ceae9976115 -U drh -Z 426e1e92ed37562d2a1263893c3aee0b +P bfe793780fa6fc7a1e7d0ee60606dda272985de9573887dca118e9510fc609f2 +R 65f7f5b095c6143834951d2d50e30b05 +U dan +Z 741541dbd05afd6dd401231ece81d5cb diff --git a/manifest.uuid b/manifest.uuid index a5e43de7bd..130c1ae433 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bfe793780fa6fc7a1e7d0ee60606dda272985de9573887dca118e9510fc609f2 \ No newline at end of file +d26fdfa3bc5f8d9c4a6000462080b0dd508e5cae9a83e0d126be48195224da8c \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index a919c41175..92be672a31 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1773,12 +1773,12 @@ filter_clause(A) ::= FILTER LP WHERE expr(X) RP. { A = X; } ** are synthesized and do not actually appear in the grammar: */ %token - TRUEFALSE /* True or false keyword */ - ISNOT /* Combination of IS and NOT */ - FUNCTION /* A function invocation */ COLUMN /* Reference to a table column */ AGG_FUNCTION /* An aggregate function */ AGG_COLUMN /* An aggregated column */ + TRUEFALSE /* True or false keyword */ + ISNOT /* Combination of IS and NOT */ + FUNCTION /* A function invocation */ UMINUS /* Unary minus */ UPLUS /* Unary plus */ TRUTH /* IS TRUE or IS FALSE or IS NOT TRUE or IS NOT FALSE */ From ee37f8b0a38521c892afc7ddb2810b70ba9c0283 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 23 Aug 2019 23:05:32 +0000 Subject: [PATCH 159/221] Fix the built-in edit() SQL function in the CLI so that it works with zero-length blobs. FossilOrigin-Name: e32490128684cfeeb8213baecc78a7942b8fb63d00e375edd965bf236faeed18 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index fe11de97f2..7938652485 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\slikely(),\sunlikely(),\sand\slikelihood()\sfunctions\sso\sthat\sthey\shave\nno\saffinity,\sjust\slike\sany\sother\sfunction.\nTicket\s[7e07a3dbf5a8cd26] -D 2019-08-22T16:38:42.563 +C Fix\sthe\sbuilt-in\sedit()\sSQL\sfunction\sin\sthe\sCLI\sso\sthat\sit\sworks\swith\nzero-length\sblobs. +D 2019-08-23T23:05:32.503 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c d42f1f1435c5b85a3bd48fdb196bb499c00797691bbed0d0c2b153c8b13ab742 -F src/shell.c.in e0f0758b6ab506d8ab12502fd2b8c55546bb9e4bb772374344a5a1b73f5bc2b9 +F src/shell.c.in 9a0706cd539fb6f00948a6a41a84c51a893179f5338c94ea37177d5f239c7741 F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e62eddbb048cbc2c15cb8eeb5b7a907e7cb08c21a27ebba96a069f62dbcb0f30 -R 1215bd20457039d9af85e446a05c94b4 +P 44578865fa7baf9760e355691ca9ce753295aaba7a4ee0bba29d4f85d9335bab +R d576abe88102041dd107794a8906549d U drh -Z a684ecbf66c59873a68e428c9a74f890 +Z e6a2c406773297981564bcc226b2bf48 diff --git a/manifest.uuid b/manifest.uuid index a744097ebf..c235cac52f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -44578865fa7baf9760e355691ca9ce753295aaba7a4ee0bba29d4f85d9335bab \ No newline at end of file +e32490128684cfeeb8213baecc78a7942b8fb63d00e375edd965bf236faeed18 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 0ee136389d..99a816fada 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1289,7 +1289,7 @@ static void editFunc( fseek(f, 0, SEEK_END); sz = ftell(f); rewind(f); - p = sqlite3_malloc64( sz+(bBin==0) ); + p = sqlite3_malloc64( sz+1 ); if( p==0 ){ sqlite3_result_error_nomem(context); goto edit_func_end; From 298680d15a694b4c4b5fb7f7bd5d06cb3f08016e Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 24 Aug 2019 17:11:29 +0000 Subject: [PATCH 160/221] Fix a potential buffer overrun in fts5 caused by corrupt database records. FossilOrigin-Name: 156d612800a7282fe0ebb20feb31d3fd577f4ab60fab8c00940c87143997aefb --- ext/fts5/fts5_index.c | 5 +- ext/fts5/test/fts5corrupt3.test | 125 ++++++++++++++++++++++++++++++++ manifest | 16 ++-- manifest.uuid | 2 +- 4 files changed, 138 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 000ce98033..3fa97c2fea 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4997,9 +4997,12 @@ static void fts5MergePrefixLists( Fts5PoslistWriter writer; memset(&writer, 0, sizeof(writer)); + /* See the earlier comment in this function for an explanation of why + ** corrupt input position lists might cause the output to consume + ** at most 20 bytes of unexpected space. */ fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); fts5BufferZero(&tmp); - sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist); + sqlite3Fts5BufferSize(&p->rc, &tmp, i1.nPoslist + i2.nPoslist + 10 + 10); if( p->rc ) break; sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 2391d97eea..306ae9fe03 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -9367,6 +9367,131 @@ do_catchsql_test 63.3 { SELECT * FROM t1 WHERE b MATCH 'thead*thead*theSt*'; } {/*malformed database schema*/} +#--------------------------------------------------------------------------- +do_test 64.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-4470f0b94422f7.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0d e2 00 0f c4 0f 6a ...............j +| 112: 0e fc 0e 9d 0e 3d 0d e2 00 00 00 00 00 01 00 00 .....=.......... +| 3552: 00 00 59 06 06 17 21 21 01 7f 74 61 62 6c 65 74 ..Y...!!..tablet +| 3568: 74 74 5f 63 6f 6e 66 69 67 74 74 74 5f 63 6f 6e tt_configttt_con +| 3584: 66 69 67 06 43 52 45 41 54 45 20 54 41 42 4c 45 fig.CREATE TABLE +| 3600: 20 27 74 74 74 5f 63 6f 6e 66 69 67 27 28 6b 20 'ttt_config'(k +| 3616: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 PRIMARY KEY, v) +| 3632: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5e 05 07 WITHOUT ROWID^.. +| 3648: 17 23 23 01 81 03 74 61 62 6c 65 74 74 74 5f 64 .##...tablettt_d +| 3664: 6f 63 73 69 7a 65 74 74 74 5f 64 6f 63 73 69 7a ocsizettt_docsiz +| 3680: 65 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 e.CREATE TABLE ' +| 3696: 74 74 74 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 ttt_docsize'(id +| 3712: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3728: 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 29 5d 04 07 KEY, sz BLOB)].. +| 3744: 17 23 23 01 81 01 74 61 62 6c 65 74 74 74 5f 63 .##...tablettt_c +| 3760: 6f 6e 74 65 6e 74 74 74 74 5f 63 6f 6e 74 65 6e ontentttt_conten +| 3776: 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3792: 74 74 74 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 ttt_content'(id +| 3808: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3824: 4b 45 59 2c 20 63 30 2c 20 63 31 29 6c 03 07 17 KEY, c0, c1)l... +| 3840: 1b 1b 01 81 2f 74 61 62 6c 65 74 74 74 5f 69 64 ..../tablettt_id +| 3856: 78 74 74 74 5f 69 64 78 03 43 52 45 41 54 45 20 xttt_idx.CREATE +| 3872: 54 41 42 4c 45 20 27 74 74 74 5f 69 64 78 27 28 TABLE 'ttt_idx'( +| 3888: 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e segid, term, pgn +| 3904: 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 o, PRIMARY KEY(s +| 3920: 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 54 egid, term)) WIT +| 3936: 48 4f 55 54 20 52 4f 57 49 44 58 02 07 17 1d 1d HOUT ROWIDX..... +| 3952: 01 81 03 74 61 62 6c 65 74 74 74 5f 64 61 74 61 ...tablettt_data +| 3968: 74 74 74 5f 64 61 74 61 02 43 52 45 41 54 45 20 ttt_data.CREATE +| 3984: 54 41 42 4c 45 20 27 74 74 74 5f 64 61 74 61 27 TABLE 'ttt_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 13 13 08 5f 74 61 62 6c LOB):......_tabl +| 4048: 65 74 74 74 74 74 74 43 52 45 41 54 45 20 56 49 ettttttCREATE VI +| 4064: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 74 74 20 RTUAL TABLE ttt +| 4080: 55 53 49 4e 47 20 66 74 73 35 28 61 2c 20 62 29 USING fts5(a, b) +| page 2 offset 4096 +| 0: 0d 0f 44 00 05 0e 81 00 0f 1a 0e 81 0f af 0f 58 ..D............X +| 16: 0e 98 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3712: 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 03 01 .....0.......... +| 3728: 01 01 02 01 01 03 01 01 81 24 8c 80 80 80 80 01 .........$...... +| 3744: 04 00 82 4c 00 00 00 9b 02 30 65 03 1a 02 05 05 ...L.....0e..... +| 3760: 07 05 01 01 04 03 03 08 03 03 01 2e 02 05 05 07 ................ +| 3776: 05 07 05 07 05 01 01 04 03 03 08 03 03 08 03 03 ................ +| 3792: 07 f3 03 02 01 65 03 1e 03 05 05 04 05 05 01 00 .....e.......... +| 3808: 03 06 04 04 06 04 03 01 36 03 05 05 04 06 05 04 ........6....... +| 3824: 06 05 04 05 05 01 01 03 06 04 04 06 04 04 06 04 ................ +| 3840: 04 06 04 03 03 01 65 03 14 04 05 06 f5 05 01 01 ......e......... +| 3856: 02 08 09 01 20 04 05 07 05 07 05 07 05 05 01 00 .... ........... +| 3872: 02 08 0a 0a 0a 04 01 65 03 02 0a 01 06 0a 0a 0a .......e........ +| 3888: 05 01 65 03 06 01 01 0a 01 0a 01 01 0a 0a 0a 04 ..e............. +| 3904: 2b 31 21 0b 0f ef 00 14 2a 00 00 00 00 01 02 02 +1!.....*....... +| 3920: 00 02 01 01 01 02 01 01 50 88 80 80 80 80 01 04 ........P....... +| 3936: 00 81 24 00 00 00 47 02 30 65 02 1a 02 05 05 07 ..$...G.0e...... +| 3952: 05 01 01 04 03 03 08 03 03 02 01 65 02 1e 03 05 ...........e.... +| 3968: 05 04 05 05 01 01 03 06 04 04 06 04 03 03 01 65 ...............e +| 3984: 02 14 04 05 07 05 05 01 01 02 08 0a 04 01 65 02 ..............e. +| 4000: 02 0a 05 01 65 02 06 01 01 0a 04 12 14 0f 06 31 ....e..........1 +| 4016: 84 80 80 80 80 01 03 00 68 00 00 00 2b 02 30 65 ........h...+.0e +| 4032: 01 10 02 05 05 01 01 04 03 03 02 01 65 01 12 03 ............e... +| 4048: 05 05 01 01 03 06 04 03 03 01 65 01 0e 04 05 05 ..........e..... +| 4064: 01 01 02 08 04 0d 0e 06 01 03 00 12 04 4c 4c 00 .............LL. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f 00 00 00 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 04 0e 1a 00 0f c7 0f 5b 0e ef 0e 1a ...........[.... +| 3600: 00 00 00 00 00 00 00 00 00 00 81 52 04 06 00 81 ...........R.... +| 3616: 5d 81 55 65 20 65 65 20 65 65 65 20 65 20 65 65 ].Ue ee eee e ee +| 3632: 20 65 65 65 20 65 20 65 65 20 65 65 65 66 20 65 eee e ee eeef e +| 3648: 65 20 65 65 65 20 65 20 65 65 20 65 65 65 20 65 e eee e ee eee e +| 3664: 20 65 65 20 65 65 65 65 20 65 65 20 65 65 65 20 ee eeee ee eee +| 3680: 65 20 65 65 20 65 65 65 20 65 20 65 65 20 65 65 e ee eee e ee ee +| 3696: 65 65 20 65 65 20 65 65 65 20 65 20 65 65 20 65 ee ee eee e ee e +| 3712: 65 65 20 65 20 65 65 20 65 65 65 65 65 65 20 65 ee e ee eeeeee e +| 3728: 65 20 65 20 65 20 65 20 65 65 20 65 65 65 20 65 e e e e ee eee e +| 3744: 65 20 65 65 65 65 65 20 65 65 20 65 20 65 1f 65 e eeeee ee e e.e +| 3760: 20 65 65 20 65 65 65 20 65 65 20 65 65 65 65 65 ee eee ee eeeee +| 3776: 20 65 65 20 65 20 65 20 65 20 65 65 20 65 65 65 ee e e e ee eee +| 3792: 20 65 65 20 65 65 65 65 65 20 65 65 20 65 20 65 ee eeeee ee e e +| 3808: 20 65 20 65 65 20 65 65 65 20 65 65 20 65 65 6a e ee eee ee eej +| 3824: 03 03 ff 75 71 65 20 65 65 1f 65 65 65 20 65 20 ...uqe ee.eee e +| 3840: 65 65 20 65 65 65 20 65 20 65 65 20 65 65 65 65 ee eee e ee eeee +| 3856: 20 65 65 20 65 65 65 20 65 20 65 65 20 65 65 65 ee eee e ee eee +| 3872: 20 65 20 65 65 20 65 65 65 65 65 65 20 65 65 20 e ee eeeeee ee +| 3888: 65 20 65 20 65 20 65 65 20 65 65 65 20 65 65 20 e e e ee eee ee +| 3904: 65 65 65 65 65 20 65 65 20 65 20 65 20 65 20 65 eeeee ee e e e e +| 3920: 65 20 65 65 65 20 65 65 20 65 65 6a 02 04 00 75 e eee ee eej...u +| 3936: 40 65 20 65 65 20 65 65 65 20 65 20 65 65 20 65 @e ee eee e ee e +| 3952: 65 65 20 65 20 65 65 20 65 65 65 65 20 65 65 20 ee e ee eeee ee +| 3968: 65 65 65 20 65 20 65 65 20 65 65 65 20 65 20 65 eee e ee eee e e +| 3984: 65 20 65 65 65 65 65 65 20 65 65 20 65 20 65 20 e eeeeee ee e e +| 4000: 65 20 65 65 20 65 65 65 20 65 65 20 65 65 65 65 e ee eee ee eeee +| 4016: 65 20 65 65 20 65 20 65 20 65 20 65 65 20 65 65 e ee e e e ee ee +| 4032: 65 20 65 65 20 65 65 37 01 04 00 41 3f 65 20 65 e ee ee7...A?e e +| 4048: 65 20 65 65 65 20 65 20 65 65 20 65 65 65 20 65 e eee e ee eee e +| 4064: 20 65 65 20 65 65 65 65 65 65 20 65 65 20 65 20 ee eeeeee ee e +| 4080: 65 20 65 20 65 65 20 65 65 65 20 65 65 20 65 65 e e ee eee ee ee +| page 5 offset 16384 +| 0: 0d 00 00 00 04 0f e4 00 0f f9 0f f2 0f eb 0f e4 ................ +| 4064: 00 00 00 00 05 04 03 00 10 21 21 05 03 03 00 10 .........!!..... +| 4080: 11 11 05 02 03 00 10 11 11 05 01 03 00 10 09 09 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-4470f0b94422f7.db +}]} {} + +do_catchsql_test 64.1 { + SELECT * FROM ttt('e*'); +} {1 {database disk image is malformed}} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 7938652485..8fbc28972e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbuilt-in\sedit()\sSQL\sfunction\sin\sthe\sCLI\sso\sthat\sit\sworks\swith\nzero-length\sblobs. -D 2019-08-23T23:05:32.503 +C Fix\sa\spotential\sbuffer\soverrun\sin\sfts5\scaused\sby\scorrupt\sdatabase\srecords. +D 2019-08-24T17:11:29.099 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c d7523cba5e66da077233c023aecbc3e6a37978ff75a18131c5ab5b1229d5bac7 F ext/fts5/fts5_expr.c 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c cd363c2fa3e626c04a9b7c705ff50222b4cab052704938f6a24881602ed3ed0d +F ext/fts5/fts5_index.c ada7661078752941e1d83bd42fe5aedef3350a1ccb9076c98153090ccd1d2f0d F ext/fts5/fts5_main.c b2c42f1cef9673ecdd498b22c38483a4380bcf1701d1e61b021a2945f18e42e1 F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -157,7 +157,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 9517cc527a8e8a33949652d5c7b5e251f8c3d5ae3f23f01d4320e30f29a0336b F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 99318789d84c678ed6388e61109b9f7b92c64419e87e4881093c01e219c5d397 +F ext/fts5/test/fts5corrupt3.test 1e0a557a2c33d26a516d8ae57685a77001e9887a7457abcea6be1c4ac77332e8 F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 44578865fa7baf9760e355691ca9ce753295aaba7a4ee0bba29d4f85d9335bab -R d576abe88102041dd107794a8906549d -U drh -Z e6a2c406773297981564bcc226b2bf48 +P e32490128684cfeeb8213baecc78a7942b8fb63d00e375edd965bf236faeed18 +R 61cea08062816b86beb5c1f5910b0854 +U dan +Z 0284ef6b0b4932b74129e7c6ac32b7ce diff --git a/manifest.uuid b/manifest.uuid index c235cac52f..5f960bb4c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e32490128684cfeeb8213baecc78a7942b8fb63d00e375edd965bf236faeed18 \ No newline at end of file +156d612800a7282fe0ebb20feb31d3fd577f4ab60fab8c00940c87143997aefb \ No newline at end of file From 666a42ffb3ad492e049ad3e1020299218f66a53b Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 24 Aug 2019 21:02:47 +0000 Subject: [PATCH 161/221] Minor performance improvement for balance_nonroot(). FossilOrigin-Name: d7434cae3edc321e2f1f8d340a0e656b1613b736f8400fb271a0e80f59401b9e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8fbc28972e..9c844a6a2b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sbuffer\soverrun\sin\sfts5\scaused\sby\scorrupt\sdatabase\srecords. -D 2019-08-24T17:11:29.099 +C Minor\sperformance\simprovement\sfor\sbalance_nonroot(). +D 2019-08-24T21:02:47.092 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -464,7 +464,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 5cf994516c1b74928b9d15971573a8bc8595e1afec129184099976da603402de +F src/btree.c fdc4389b271bca30138db27dc2dfb9f52c2a7baaa44845aaf31a3c54663d837f F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f F src/build.c 7fb6ad35d162517d6bfa196f4fb2a1d7c3a362531e84c59f3a0479e0de511556 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e32490128684cfeeb8213baecc78a7942b8fb63d00e375edd965bf236faeed18 -R 61cea08062816b86beb5c1f5910b0854 +P 156d612800a7282fe0ebb20feb31d3fd577f4ab60fab8c00940c87143997aefb +R 4b6697f6c6d10128787e7bec7d1f64d6 U dan -Z 0284ef6b0b4932b74129e7c6ac32b7ce +Z 7ec145bc88468367dffb3891d93405d5 diff --git a/manifest.uuid b/manifest.uuid index 5f960bb4c8..31e578823c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -156d612800a7282fe0ebb20feb31d3fd577f4ab60fab8c00940c87143997aefb \ No newline at end of file +d7434cae3edc321e2f1f8d340a0e656b1613b736f8400fb271a0e80f59401b9e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 6e6a9b2797..7ff91e667b 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6992,7 +6992,8 @@ static int pageInsertArray( while( 1 /*Exit by break*/ ){ int sz, rc; u8 *pSlot; - sz = cachedCellSize(pCArray, i); + assert( pCArray->szCell[i]!=0 ); + sz = pCArray->szCell[i]; if( (aData[1]==0 && aData[2]==0) || (pSlot = pageFindSlot(pPg,sz,&rc))==0 ){ if( (pData - pBegin) Date: Mon, 26 Aug 2019 12:50:01 +0000 Subject: [PATCH 162/221] Enforce 80-character line discipline in the CLI. Minor improvements to the CLI built-in help. FossilOrigin-Name: 9690013a00d73a8047b25149ded50d20c74b5c62c0725eec50ed8477688e58a0 --- manifest | 14 +++--- manifest.uuid | 2 +- src/shell.c.in | 116 +++++++++++++++++++++++++------------------------ 3 files changed, 68 insertions(+), 64 deletions(-) diff --git a/manifest b/manifest index 9c844a6a2b..d84171b55a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sperformance\simprovement\sfor\sbalance_nonroot(). -D 2019-08-24T21:02:47.092 +C Enforce\s80-character\sline\sdiscipline\sin\sthe\sCLI.\s\sMinor\simprovements\sto\sthe\nCLI\sbuilt-in\shelp. +D 2019-08-26T12:50:01.892 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c d42f1f1435c5b85a3bd48fdb196bb499c00797691bbed0d0c2b153c8b13ab742 -F src/shell.c.in 9a0706cd539fb6f00948a6a41a84c51a893179f5338c94ea37177d5f239c7741 +F src/shell.c.in 596e4160b6418900edc0aff4dbb8e172d8ab6c5e80e846ed8ef027ecc8612be0 F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 156d612800a7282fe0ebb20feb31d3fd577f4ab60fab8c00940c87143997aefb -R 4b6697f6c6d10128787e7bec7d1f64d6 -U dan -Z 7ec145bc88468367dffb3891d93405d5 +P d7434cae3edc321e2f1f8d340a0e656b1613b736f8400fb271a0e80f59401b9e +R 04935d3cf93769475d1663473c5f261d +U drh +Z 842f41c6fd92cfd4b2a81346bcdf6611 diff --git a/manifest.uuid b/manifest.uuid index 31e578823c..91686bde2b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7434cae3edc321e2f1f8d340a0e656b1613b736f8400fb271a0e80f59401b9e \ No newline at end of file +9690013a00d73a8047b25149ded50d20c74b5c62c0725eec50ed8477688e58a0 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 99a816fada..7144151d5d 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1766,7 +1766,8 @@ static void eqp_render_level(ShellState *p, int iEqpId){ for(pRow = eqp_next_row(p, iEqpId, 0); pRow; pRow = pNext){ pNext = eqp_next_row(p, iEqpId, pRow); z = pRow->zText; - utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, pNext ? "|--" : "`--", z); + utf8_printf(p->out, "%s%s%s\n", p->sGraph.zPrefix, + pNext ? "|--" : "`--", z); if( n<(int)sizeof(p->sGraph.zPrefix)-7 ){ memcpy(&p->sGraph.zPrefix[n], pNext ? "| " : " ", 4); eqp_render_level(p, pRow->iEqpId); @@ -1957,7 +1958,7 @@ static int shell_callback( while( j>0 && IsSpace(z[j-1]) ){ j--; } z[j] = 0; if( strlen30(z)>=79 ){ - for(i=j=0; (c = z[i])!=0; i++){ /* Copy changes from z[i] back to z[j] */ + for(i=j=0; (c = z[i])!=0; i++){ /* Copy from z[i] back to z[j] */ if( c==cEnd ){ cEnd = 0; }else if( c=='"' || c=='\'' || c=='`' ){ @@ -2536,7 +2537,7 @@ static int display_stats( raw_printf(pArg->out, "Autoindex Inserts: %d\n", iCur); iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_VM_STEP, bReset); raw_printf(pArg->out, "Virtual Machine Steps: %d\n", iCur); - iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE, bReset); + iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_REPREPARE,bReset); raw_printf(pArg->out, "Reprepare operations: %d\n", iCur); iCur = sqlite3_stmt_status(pArg->pStmt, SQLITE_STMTSTATUS_RUN, bReset); raw_printf(pArg->out, "Number of times run: %d\n", iCur); @@ -3459,20 +3460,20 @@ static const char *(azHelp[]) = { ".archive ... Manage SQL archives", " Each command must have exactly one of the following options:", " -c, --create Create a new archive", - " -u, --update Add files or update files with changed mtime", - " -i, --insert Like -u but always add even if mtime unchanged", + " -u, --update Add or update files with changed mtime", + " -i, --insert Like -u but always add even if unchanged", " -t, --list List contents of archive", " -x, --extract Extract files from archive", " Optional arguments:", " -v, --verbose Print each filename as it is processed", - " -f FILE, --file FILE Operate on archive FILE (default is current db)", - " -a FILE, --append FILE Operate on FILE opened using the apndvfs VFS", - " -C DIR, --directory DIR Change to directory DIR to read/extract files", + " -f FILE, --file FILE Use archive FILE (default is current db)", + " -a FILE, --append FILE Open FILE using the apndvfs VFS", + " -C DIR, --directory DIR Read/extract files from directory DIR", " -n, --dryrun Show the SQL that would have occurred", " Examples:", - " .ar -cf archive.sar foo bar # Create archive.sar from files foo and bar", - " .ar -tf archive.sar # List members of archive.sar", - " .ar -xvf archive.sar # Verbosely extract files from archive.sar", + " .ar -cf ARCHIVE foo bar # Create ARCHIVE from files foo and bar", + " .ar -tf ARCHIVE # List members of ARCHIVE", + " .ar -xvf ARCHIVE # Verbosely extract files from ARCHIVE", " See also:", " http://sqlite.org/cli.html#sqlar_archive_support", #endif @@ -3481,7 +3482,7 @@ static const char *(azHelp[]) = { #endif ".backup ?DB? FILE Backup DB (default \"main\") to FILE", " --append Use the appendvfs", - " --async Write to FILE without a journal and without fsync()", + " --async Write to FILE without journal and fsync()", ".bail on|off Stop after hitting an error. Default OFF", ".binary on|off Turn binary output on or off. Default OFF", ".cd DIRECTORY Change the working directory to DIRECTORY", @@ -3501,15 +3502,15 @@ static const char *(azHelp[]) = { " Other Modes:", #ifdef SQLITE_DEBUG " test Show raw EXPLAIN QUERY PLAN output", - " trace Like \"full\" but also enable \"PRAGMA vdbe_trace\"", + " trace Like \"full\" but enable \"PRAGMA vdbe_trace\"", #endif " trigger Like \"full\" but also show trigger bytecode", - ".excel Display the output of next command in a spreadsheet", + ".excel Display the output of next command in spreadsheet", ".exit ?CODE? Exit this program with return-code CODE", - ".expert EXPERIMENTAL. Suggest indexes for specified queries", + ".expert EXPERIMENTAL. Suggest indexes for queries", /* Because explain mode comes on automatically now, the ".explain" mode -** is removed from the help screen. It is still supported for legacy, however */ -/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off or to automatic",*/ +** is removed from the help screen. It is still supported for legacy, however */ +/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off",*/ ".filectrl CMD ... Run various sqlite3_file_control() operations", " Run \".filectrl\" with no arguments for details", ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", @@ -3556,7 +3557,7 @@ static const char *(azHelp[]) = { " --append Use appendvfs to append database to the end of FILE", #ifdef SQLITE_ENABLE_DESERIALIZE " --deserialize Load into memory useing sqlite3_deserialize()", - " --hexdb Load the output of \"dbtotxt\" as an in-memory database", + " --hexdb Load the output of \"dbtotxt\" as an in-memory db", " --maxsize N Maximum size for --hexdb or --deserialized database", #endif " --new Initialize FILE to an empty database", @@ -3569,7 +3570,7 @@ static const char *(azHelp[]) = { " init Initialize the TEMP table that holds bindings", " list List the current parameter bindings", " set PARAMETER VALUE Given SQL parameter PARAMETER a value of VALUE", - " PARAMETER should start with '$', ':', '@', or '?'", + " PARAMETER should start with one of: $ : @ ?", " unset PARAMETER Remove PARAMETER from the binding table", ".print STRING... Print literal STRING", #ifndef SQLITE_OMIT_PROGRESS_CALLBACK @@ -3584,6 +3585,9 @@ static const char *(azHelp[]) = { ".read FILE Read input from FILE", #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) ".recover Recover as much data as possible from corrupt db.", + " --freelist-corrupt Assume the freelist is corrupt", + " --recovery-db NAME Store recovery metadata in database file NAME", + " --lost-and-found TABLE Alternative name for the lost-and-found table", #endif ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", ".save FILE Write in-memory database into FILE", @@ -3615,7 +3619,7 @@ static const char *(azHelp[]) = { " Options:", " --schema Also hash the sqlite_master table", " --sha3-224 Use the sha3-224 algorithm", - " --sha3-256 Use the sha3-256 algorithm. This is the default.", + " --sha3-256 Use the sha3-256 algorithm (default)", " --sha3-384 Use the sha3-384 algorithm", " --sha3-512 Use the sha3-512 algorithm", " Any other argument is a LIKE pattern for tables to hash", @@ -5523,7 +5527,7 @@ void shellReset( #endif /* !defined SQLITE_OMIT_VIRTUALTABLE */ #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) -/********************************************************************************* +/****************************************************************************** ** The ".archive" or ".ar" command. */ /* @@ -5721,7 +5725,8 @@ static int arParseCommand( i = n; }else{ if( iArg>=(nArg-1) ){ - return arErrorMsg(pAr, "option requires an argument: %c",z[i]); + return arErrorMsg(pAr, "option requires an argument: %c", + z[i]); } zArg = azArg[++iArg]; } @@ -6109,10 +6114,10 @@ end_ar_transaction: ** Implementation of ".ar" dot command. */ static int arDotCommand( - ShellState *pState, /* Current shell tool state */ - int fromCmdLine, /* True if -A command-line option, not .ar cmd */ - char **azArg, /* Array of arguments passed to dot command */ - int nArg /* Number of entries in azArg[] */ + ShellState *pState, /* Current shell tool state */ + int fromCmdLine, /* True if -A command-line option, not .ar cmd */ + char **azArg, /* Array of arguments passed to dot command */ + int nArg /* Number of entries in azArg[] */ ){ ArCommand cmd; int rc; @@ -6212,7 +6217,7 @@ end_ar_command: return rc; } /* End of the ".archive" or ".ar" command logic -**********************************************************************************/ +*******************************************************************************/ #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB) */ #if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) @@ -6604,11 +6609,8 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ zLostAndFound = azArg[i]; } else{ - raw_printf(stderr, "unexpected option: %s\n", azArg[i]); - raw_printf(stderr, "options are:\n"); - raw_printf(stderr, " --freelist-corrupt\n"); - raw_printf(stderr, " --recovery-db DATABASE\n"); - raw_printf(stderr, " --lost-and-found TABLE-NAME\n"); + utf8_printf(stderr, "unexpected option: %s\n", azArg[i]); + showHelp(pState->out, azArg[0]); return 1; } } @@ -8467,7 +8469,8 @@ static int do_meta_command(char *zLine, ShellState *p){ if( zName ){ appendText(&sSelect, " UNION ALL SELECT shell_module_schema(name)," - " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", 0); + " 'table', name, name, name, 9e+99, 'main' FROM pragma_module_list", + 0); } #endif appendText(&sSelect, ") WHERE ", 0); @@ -8566,7 +8569,8 @@ static int do_meta_command(char *zLine, ShellState *p){ if( pSession->p==0 ) goto session_not_open; out = fopen(azCmd[1], "wb"); if( out==0 ){ - utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", azCmd[1]); + utf8_printf(stderr, "ERROR: cannot open \"%s\" for writing\n", + azCmd[1]); }else{ int szChng; void *pChng; @@ -8887,8 +8891,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { utf8_printf(stderr, "Unknown option \"%s\" on \"%s\"\n", azArg[i], azArg[0]); - raw_printf(stderr, "Should be one of: --schema" - " --sha3-224 --sha3-256 --sha3-384 --sha3-512\n"); + showHelp(p->out, azArg[0]); rc = 1; goto meta_command_exit; } @@ -9166,26 +9169,26 @@ static int do_meta_command(char *zLine, ShellState *p){ int ctrlCode; /* Integer code for that option */ const char *zUsage; /* Usage notes */ } aCtrl[] = { - { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" }, - { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" }, - /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/ - /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/ - { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" }, - { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, - /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" }, */ - { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, - { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN" }, - { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, - { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, - { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, + { "always", SQLITE_TESTCTRL_ALWAYS, "BOOLEAN" }, + { "assert", SQLITE_TESTCTRL_ASSERT, "BOOLEAN" }, + /*{ "benign_malloc_hooks",SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, "" },*/ + /*{ "bitvec_test", SQLITE_TESTCTRL_BITVEC_TEST, "" },*/ + { "byteorder", SQLITE_TESTCTRL_BYTEORDER, "" }, + { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, + /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/ + { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, + { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN" }, + { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, + { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, + { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, #ifdef YYCOVERAGE - { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" }, + { "parser_coverage", SQLITE_TESTCTRL_PARSER_COVERAGE, "" }, #endif - { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " }, - { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, - { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, - { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" }, - { "reserve", SQLITE_TESTCTRL_RESERVE, "BYTES-OF-RESERVE" }, + { "pending_byte", SQLITE_TESTCTRL_PENDING_BYTE, "OFFSET " }, + { "prng_restore", SQLITE_TESTCTRL_PRNG_RESTORE, "" }, + { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, + { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" }, + { "reserve", SQLITE_TESTCTRL_RESERVE, "BYTES-OF-RESERVE"}, }; int testctrl = -1; int iCtrl = -1; @@ -9328,7 +9331,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } } if( isOk==0 && iCtrl>=0 ){ - utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd, aCtrl[iCtrl].zUsage); + utf8_printf(p->out, "Usage: .testctrl %s %s\n", zCmd,aCtrl[iCtrl].zUsage); rc = 1; }else if( isOk==1 ){ raw_printf(p->out, "%d\n", rc2); @@ -9445,7 +9448,8 @@ static int do_meta_command(char *zLine, ShellState *p){ rc = 1; goto meta_command_exit; } - rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], strlen30(azArg[3])); + rc = sqlite3_user_authenticate(p->db, azArg[2], azArg[3], + strlen30(azArg[3])); if( rc ){ utf8_printf(stderr, "Authentication failed for user %s\n", azArg[2]); rc = 1; From d86fe44ab5a442a065935cb8b11a138b238dcf4b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 26 Aug 2019 13:45:49 +0000 Subject: [PATCH 163/221] Fix typo in a comment. No code changes. FossilOrigin-Name: d0cc06d8a30444125e5655f6587a6355471c3447c08a2e5f7a046a4ed5cc5f09 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d84171b55a..88f11e92f8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enforce\s80-character\sline\sdiscipline\sin\sthe\sCLI.\s\sMinor\simprovements\sto\sthe\nCLI\sbuilt-in\shelp. -D 2019-08-26T12:50:01.892 +C Fix\stypo\sin\sa\scomment.\s\sNo\scode\schanges. +D 2019-08-26T13:45:49.721 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c a1a811e1e5c623a7aa7176fa781ce72944a92b06233b15a39151a743d6eaab97 +F src/expr.c 9962ab98d340c9d6815ce381e374ce928f7a7a2a04ca7779b10ffe93db563da0 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d7434cae3edc321e2f1f8d340a0e656b1613b736f8400fb271a0e80f59401b9e -R 04935d3cf93769475d1663473c5f261d +P 9690013a00d73a8047b25149ded50d20c74b5c62c0725eec50ed8477688e58a0 +R 2f001fd65969a9ca56fabaf8851a89b5 U drh -Z 842f41c6fd92cfd4b2a81346bcdf6611 +Z b2e7fed545219961a9764335cb571eba diff --git a/manifest.uuid b/manifest.uuid index 91686bde2b..38abd08e3c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9690013a00d73a8047b25149ded50d20c74b5c62c0725eec50ed8477688e58a0 \ No newline at end of file +d0cc06d8a30444125e5655f6587a6355471c3447c08a2e5f7a046a4ed5cc5f09 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 496abd32ce..6cb2e0c348 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2859,7 +2859,7 @@ void sqlite3CodeRhsOfIN( ** ** The pExpr parameter is the SELECT or EXISTS operator to be coded. ** -** The register that holds the result. For a multi-column SELECT, +** Return the register that holds the result. For a multi-column SELECT, ** the result is stored in a contiguous array of registers and the ** return value is the register of the left-most result column. ** Return 0 if an error occurs. From 554a9dc78ab23f3831dd689fe33fb87f2d60626d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 26 Aug 2019 14:18:28 +0000 Subject: [PATCH 164/221] Improved detection of number of column mismatch for vector assignment in UPDATE statements. Ticket [78acc9d40f0786e8] FossilOrigin-Name: bd4bda73df3794eef424eb13e08fc7cc54347d1ac69febaeec41f6b6cb4a42bc --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 8 ++++++-- src/sqliteInt.h | 1 + test/rowvalue7.test | 10 ++++++++++ 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 88f11e92f8..ec1710be3d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stypo\sin\sa\scomment.\s\sNo\scode\schanges. -D 2019-08-26T13:45:49.721 +C Improved\sdetection\sof\snumber\sof\scolumn\smismatch\sfor\svector\sassignment\nin\sUPDATE\sstatements.\s\sTicket\s[78acc9d40f0786e8] +D 2019-08-26T14:18:28.243 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 9962ab98d340c9d6815ce381e374ce928f7a7a2a04ca7779b10ffe93db563da0 +F src/expr.c 701e304da3f0ddf491ff6927eeafdd196b491e48c5290117dcb95e19dd3413ea F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -528,7 +528,7 @@ F src/shell.c.in 596e4160b6418900edc0aff4dbb8e172d8ab6c5e80e846ed8ef027ecc8612be F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 52594e495e35649c22f650b5249e515ac8eb108d97be304d14a0e89539ed1c59 +F src/sqliteInt.h 9a3e2cf34d375ea74ecb9a1a60651f8b22b2bca007742a393cc87f4a3a2db0c3 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1260,7 +1260,7 @@ F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 -F test/rowvalue7.test 5d06ff19d9e6969e574a2e662a531dd0c67801a8 +F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf6f2dba F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9690013a00d73a8047b25149ded50d20c74b5c62c0725eec50ed8477688e58a0 -R 2f001fd65969a9ca56fabaf8851a89b5 +P d0cc06d8a30444125e5655f6587a6355471c3447c08a2e5f7a046a4ed5cc5f09 +R c94e7f0fd8fde374ff7a64e52e862147 U drh -Z b2e7fed545219961a9764335cb571eba +Z 704a1e95609dba9715f49ae5f6d53285 diff --git a/manifest.uuid b/manifest.uuid index 38abd08e3c..5072ee8c39 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d0cc06d8a30444125e5655f6587a6355471c3447c08a2e5f7a046a4ed5cc5f09 \ No newline at end of file +bd4bda73df3794eef424eb13e08fc7cc54347d1ac69febaeec41f6b6cb4a42bc \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6cb2e0c348..aac706644c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1632,6 +1632,10 @@ ExprList *sqlite3ExprListAppendVector( for(i=0; inId; i++){ Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); + assert( pSubExpr!=0 || db->mallocFailed ); + assert( pSubExpr==0 || pSubExpr->iTable==0 ); + if( pSubExpr==0 ) continue; + pSubExpr->iTable = pColumns->nId; pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); if( pList ){ assert( pList->nExpr==iFirst+i+1 ); @@ -3906,8 +3910,8 @@ expr_code_doover: pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); } assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); - if( pExpr->iTable - && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) + if( pExpr->iTable!=0 + && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pExpr->iTable, n); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f60b6f7aec..9492da17a1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2470,6 +2470,7 @@ struct Expr { ** TK_REGISTER: register number ** TK_TRIGGER: 1 -> new, 0 -> old ** EP_Unlikely: 134217728 times likelihood + ** TK_SELECT_COLUMN: Number of columns on the LHS ** TK_SELECT: 1st register of result vector */ ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. ** TK_VARIABLE: variable number (always >= 1). diff --git a/test/rowvalue7.test b/test/rowvalue7.test index f6764f301e..03591afaf4 100644 --- a/test/rowvalue7.test +++ b/test/rowvalue7.test @@ -55,4 +55,14 @@ do_catchsql_test 2.2 { UPDATE t1 SET (b,c,d) = (SELECT x,y FROM t2 WHERE w=a); } {1 {3 columns assigned 2 values}} +# 2019-08-26 +# ticket https://www.sqlite.org/src/info/78acc9d40f0786e8 +# +do_catchsql_test 3.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,2); + UPDATE t1 SET (a,a,a,b)=(SELECT 99,100); +} {1 {4 columns assigned 2 values}} + finish_test From d790c9a1613334e2fc6b92211911e032ecbf36cf Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 26 Aug 2019 14:57:58 +0000 Subject: [PATCH 165/221] Tweak the shell tool ".recover" command so that it can recover rows that consist of a rowid and no fields. FossilOrigin-Name: 279ac7fdec0b1409cd400b7b093f89089d93c49f596f378c6a3032434a85bf83 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index ec1710be3d..3ab941f551 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\snumber\sof\scolumn\smismatch\sfor\svector\sassignment\nin\sUPDATE\sstatements.\s\sTicket\s[78acc9d40f0786e8] -D 2019-08-26T14:18:28.243 +C Tweak\sthe\sshell\stool\s".recover"\scommand\sso\sthat\sit\scan\srecover\srows\sthat\sconsist\sof\sa\srowid\sand\sno\sfields. +D 2019-08-26T14:57:58.620 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c d42f1f1435c5b85a3bd48fdb196bb499c00797691bbed0d0c2b153c8b13ab742 -F src/shell.c.in 596e4160b6418900edc0aff4dbb8e172d8ab6c5e80e846ed8ef027ecc8612be0 +F src/shell.c.in e5fb91505f29ae9458cabf1a63bbd1faf6b4b34eabca33d0f75a06aacecca21b F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d0cc06d8a30444125e5655f6587a6355471c3447c08a2e5f7a046a4ed5cc5f09 -R c94e7f0fd8fde374ff7a64e52e862147 -U drh -Z 704a1e95609dba9715f49ae5f6d53285 +P bd4bda73df3794eef424eb13e08fc7cc54347d1ac69febaeec41f6b6cb4a42bc +R f61d543a07f97630767d799321746763 +U dan +Z 653ee8815bcf440360f1ea49c2de4aca diff --git a/manifest.uuid b/manifest.uuid index 5072ee8c39..bcc4398929 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd4bda73df3794eef424eb13e08fc7cc54347d1ac69febaeec41f6b6cb4a42bc \ No newline at end of file +279ac7fdec0b1409cd400b7b093f89089d93c49f596f378c6a3032434a85bf83 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 7144151d5d..9ae39a1d64 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -6712,7 +6712,7 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ " )" " SELECT pgno FROM p WHERE (parent IS NULL OR pgno = orig)" ") " - "FROM pages WHERE maxlen > 0 AND i NOT IN freelist;" + "FROM pages WHERE maxlen IS NOT NULL AND i NOT IN freelist;" "UPDATE recovery.map AS o SET intkey = (" " SELECT substr(data, 1, 1)==X'0D' FROM sqlite_dbpage WHERE pgno=o.pgno" ");" From 6397a78b2ba93729678ef0ea68d0765e046a360e Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 27 Aug 2019 10:05:45 +0000 Subject: [PATCH 166/221] If a TEMP TRIGGER references an auxiliary schema, and that auxiliary schema is detached, move the trigger to reference the TEMP schema before completing the detach, so that the trigger does not hold a dangling schema pointer. FossilOrigin-Name: 069c2f4c61f06211a8981abc412afcc1536ece13380b13a70aa99123f8f527cd --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/attach.c | 13 +++++++++++++ src/trigger.c | 14 +++++++------- test/trigger1.test | 14 ++++++++++++++ 5 files changed, 44 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 3ab941f551..19417652ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Tweak\sthe\sshell\stool\s".recover"\scommand\sso\sthat\sit\scan\srecover\srows\sthat\sconsist\sof\sa\srowid\sand\sno\sfields. -D 2019-08-26T14:57:58.620 +C If\sa\sTEMP\sTRIGGER\sreferences\san\sauxiliary\sschema,\sand\sthat\sauxiliary\sschema\nis\sdetached,\smove\sthe\strigger\sto\sreference\sthe\sTEMP\sschema\sbefore\scompleting\nthe\sdetach,\sso\sthat\sthe\strigger\sdoes\snot\shold\sa\sdangling\sschema\spointer. +D 2019-08-27T10:05:45.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -459,7 +459,7 @@ F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 5c3031e45e80f79d7d54c2d32dd3c44926544d4f6a478858bfe4ee3191570190 F src/analyze.c a3f4ea45cdb4e9df78d4ea7beb87ec8a7a46f494173b641cd28512a40a97bff2 -F src/attach.c a6f108eb7922fad920e8aba0cda56fb56d89d136d519be5177cd3bd3559f2566 +F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 @@ -589,7 +589,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c fc8c6c0a8a26afb3a97e3f844d65403dd27cf1450baf4415034fa4ccf00c4d7e -F src/trigger.c 2305271878e95addc1c01361e5e8e342e87cba5efefdd7d3032687e5d67e05d1 +F src/trigger.c f964d85935d0b9675b4aa2f74999cabee3ac1ac705f71b38a8b7e8ccd4ad474b F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 @@ -1560,7 +1560,7 @@ F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 F test/transitive1.test 293300f46916569f08875cdb2fe2134be2c27677 -F test/trigger1.test 17e4b43e656c4b354df2357634a6ba887990f510c43629f4feca30e3338d2a61 +F test/trigger1.test 6be279c9d48b25320eab68c30fd5268ab787955679f4c584128f71800247fb50 F test/trigger2.test 5cd7d69a7ba1143ee045e4ae2963ff32ae4c87a6 F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bd4bda73df3794eef424eb13e08fc7cc54347d1ac69febaeec41f6b6cb4a42bc -R f61d543a07f97630767d799321746763 -U dan -Z 653ee8815bcf440360f1ea49c2de4aca +P 279ac7fdec0b1409cd400b7b093f89089d93c49f596f378c6a3032434a85bf83 +R 0805c7b844001f17510379fb60166cba +U drh +Z 87dfaef8c8e67d4b9cd50025b5165f6d diff --git a/manifest.uuid b/manifest.uuid index bcc4398929..cef7eaf8a2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -279ac7fdec0b1409cd400b7b093f89089d93c49f596f378c6a3032434a85bf83 \ No newline at end of file +069c2f4c61f06211a8981abc412afcc1536ece13380b13a70aa99123f8f527cd \ No newline at end of file diff --git a/src/attach.c b/src/attach.c index 61f169ed76..1dcb407edd 100644 --- a/src/attach.c +++ b/src/attach.c @@ -299,6 +299,7 @@ static void detachFunc( sqlite3 *db = sqlite3_context_db_handle(context); int i; Db *pDb = 0; + HashElem *pEntry; char zErr[128]; UNUSED_PARAMETER(NotUsed); @@ -323,6 +324,18 @@ static void detachFunc( goto detach_error; } + /* If any TEMP triggers reference the schema being detached, move those + ** triggers to reference the TEMP schema itself. */ + assert( db->aDb[1].pSchema ); + pEntry = sqliteHashFirst(&db->aDb[1].pSchema->trigHash); + while( pEntry ){ + Trigger *pTrig = (Trigger*)sqliteHashData(pEntry); + if( pTrig->pTabSchema==pDb->pSchema ){ + pTrig->pTabSchema = pTrig->pSchema; + } + pEntry = sqliteHashNext(pEntry); + } + sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; pDb->pSchema = 0; diff --git a/src/trigger.c b/src/trigger.c index 989df9678a..16cc57b40c 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -618,10 +618,9 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ iDb = sqlite3SchemaToIndex(pParse->db, pTrigger->pSchema); assert( iDb>=0 && iDbnDb ); pTable = tableOfTrigger(pTrigger); - assert( pTable ); - assert( pTable->pSchema==pTrigger->pSchema || iDb==1 ); + assert( (pTable && pTable->pSchema==pTrigger->pSchema) || iDb==1 ); #ifndef SQLITE_OMIT_AUTHORIZATION - { + if( pTable ){ int code = SQLITE_DROP_TRIGGER; const char *zDb = db->aDb[iDb].zDbSName; const char *zTab = SCHEMA_TABLE(iDb); @@ -635,7 +634,6 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ /* Generate code to destroy the database record of the trigger. */ - assert( pTable!=0 ); if( (v = sqlite3GetVdbe(pParse))!=0 ){ sqlite3NestedParse(pParse, "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", @@ -659,9 +657,11 @@ void sqlite3UnlinkAndDeleteTrigger(sqlite3 *db, int iDb, const char *zName){ if( ALWAYS(pTrigger) ){ if( pTrigger->pSchema==pTrigger->pTabSchema ){ Table *pTab = tableOfTrigger(pTrigger); - Trigger **pp; - for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext)); - *pp = (*pp)->pNext; + if( pTab ){ + Trigger **pp; + for(pp=&pTab->pTrigger; *pp!=pTrigger; pp=&((*pp)->pNext)); + *pp = (*pp)->pNext; + } } sqlite3DeleteTrigger(db, pTrigger); db->mDbFlags |= DBFLAG_SchemaChange; diff --git a/test/trigger1.test b/test/trigger1.test index 8946cd85c9..ddb40e3adb 100644 --- a/test/trigger1.test +++ b/test/trigger1.test @@ -768,4 +768,18 @@ do_execsql_test trigger1-19.1 { SELECT * FROM t19; } {1 2 2} +# 2019-08-26 Chromium sqlite3_fts3_lpm_fuzzer find. +# +db close +sqlite3 db :memory: +do_execsql_test trigger1-20.1 { + CREATE TABLE t20_1(x); + ATTACH ':memory:' AS aux; + CREATE TABLE aux.t20_2(y); + CREATE TABLE aux.t20_3(z); + CREATE TEMP TRIGGER r20_3 AFTER INSERT ON t20_2 BEGIN UPDATE t20_3 SET z=z+1; END; + DETACH aux; + DROP TRIGGER r20_3; +} {} + finish_test From 790b37a2403eb479fcb9e33e0d7622b78524c579 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 27 Aug 2019 17:01:07 +0000 Subject: [PATCH 167/221] Omit the "x IN (y)" to "x==y" optimization of check-in [e68b427afbc82e20] (and ticket [e39d032577df6942]) as it causes difficult affinity problems as demonstrated by ticket [dbaf8a6820be1ece] and the original assertion fault is no longer a factor due to countless other changes of the previous 5 years. FossilOrigin-Name: 7f5168a76a400fc2e1e40c6950470b1bfb38a0be54fc5518c17c29fdae7d8f1f --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/expr.c | 2 -- src/parse.y | 27 --------------------------- src/select.c | 3 --- src/sqliteInt.h | 2 +- src/vdbe.c | 7 ++++--- src/where.c | 2 -- test/in4.test | 13 ++++++++----- 9 files changed, 26 insertions(+), 56 deletions(-) diff --git a/manifest b/manifest index 19417652ab..88f2172882 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sa\sTEMP\sTRIGGER\sreferences\san\sauxiliary\sschema,\sand\sthat\sauxiliary\sschema\nis\sdetached,\smove\sthe\strigger\sto\sreference\sthe\sTEMP\sschema\sbefore\scompleting\nthe\sdetach,\sso\sthat\sthe\strigger\sdoes\snot\shold\sa\sdangling\sschema\spointer. -D 2019-08-27T10:05:45.169 +C Omit\sthe\s"x\sIN\s(y)"\sto\s"x==y"\soptimization\sof\scheck-in\s[e68b427afbc82e20]\n(and\sticket\s[e39d032577df6942])\sas\sit\scauses\sdifficult\saffinity\sproblems\nas\sdemonstrated\sby\sticket\s[dbaf8a6820be1ece]\sand\sthe\soriginal\sassertion\sfault\nis\sno\slonger\sa\sfactor\sdue\sto\scountless\sother\schanges\sof\sthe\sprevious\s5\syears. +D 2019-08-27T17:01:07.813 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 701e304da3f0ddf491ff6927eeafdd196b491e48c5290117dcb95e19dd3413ea +F src/expr.c 18b6d8b5fea8151fae6d67fb12f2fff1f3abe8d5fe70365ecb3671a0aaf51c27 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -512,7 +512,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 6d03a24bc0dcd15b93c480ea8a87f7ccd25313fe826485726d9ef13b82f2378d +F src/parse.y 152a72755398be8f36e097bbab9fd3eeebc638b31ed1ec134e49284f9d7f013a F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -523,12 +523,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c d42f1f1435c5b85a3bd48fdb196bb499c00797691bbed0d0c2b153c8b13ab742 +F src/select.c c1dfbd699a6dce14c2e6f30370a57753294d6b725cc75551b26146e0c1d25076 F src/shell.c.in e5fb91505f29ae9458cabf1a63bbd1faf6b4b34eabca33d0f75a06aacecca21b F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 9a3e2cf34d375ea74ecb9a1a60651f8b22b2bca007742a393cc87f4a3a2db0c3 +F src/sqliteInt.h ce52cf59718f4affee3057381f5cf7acefe42d2ab6b43c6da93f4b1f6a3c704b F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -595,7 +595,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 7cd09c6cc4d0e0053ced392ea4d04762e7ffd1470ff1b90ba3ebd2869c849ae8 +F src/vdbe.c cdd90f4c4773a08504c66815faa505570257619a0bafcc9b486a24844be51357 F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c c35ad5b77fc135a09d6b16a63076748b5c32936016b5031294508a4d6a2ddbb1 +F src/where.c 6cc2708ab9a386c0aef3fa50ed0f5bdfed22848e492960a4504eb25bdb79c8d1 F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c e1131fe94c8728cbecc707f6455afbda9418896497bdca2d49a04ce6c57999f6 F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f @@ -1028,7 +1028,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 F test/in.test 63e642e97bc22c8fd970752fb4f0b3992a957003ea87524fe69e5a700500c500 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 +F test/in4.test 0f77b0ff371549e6a119d0356be10bdba72258162e9701e83527a560482f5e98 F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test 62d943a02f722948f4410ee0b53c3cb39acd7c41afb083df8d7004238fe90a20 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 279ac7fdec0b1409cd400b7b093f89089d93c49f596f378c6a3032434a85bf83 -R 0805c7b844001f17510379fb60166cba +P 069c2f4c61f06211a8981abc412afcc1536ece13380b13a70aa99123f8f527cd +R 1d1745df08bf23742595db0b843b9c5f U drh -Z 87dfaef8c8e67d4b9cd50025b5165f6d +Z ead76a2ee397baa2df21935f693c9dfe diff --git a/manifest.uuid b/manifest.uuid index cef7eaf8a2..40a6660d4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -069c2f4c61f06211a8981abc412afcc1536ece13380b13a70aa99123f8f527cd \ No newline at end of file +7f5168a76a400fc2e1e40c6950470b1bfb38a0be54fc5518c17c29fdae7d8f1f \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index aac706644c..fbb5ffafaf 100644 --- a/src/expr.c +++ b/src/expr.c @@ -44,7 +44,6 @@ char sqlite3TableColumnAffinity(Table *pTab, int iCol){ */ char sqlite3ExprAffinity(Expr *pExpr){ int op; - if( pExpr->flags & EP_Generic ) return 0; while( ExprHasProperty(pExpr, EP_Skip) ){ assert( pExpr->op==TK_COLLATE ); pExpr = pExpr->pLeft; @@ -156,7 +155,6 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ Expr *p = pExpr; while( p ){ int op = p->op; - if( p->flags & EP_Generic ) break; if( op==TK_REGISTER ) op = p->op2; if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) && p->y.pTab!=0 diff --git a/src/parse.y b/src/parse.y index 648e79d9e3..e84a9a18e6 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1176,33 +1176,6 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { */ sqlite3ExprUnmapAndDelete(pParse, A); A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); - }else if( Y->nExpr==1 ){ - /* Expressions of the form: - ** - ** expr1 IN (?1) - ** expr1 NOT IN (?2) - ** - ** with exactly one value on the RHS can be simplified to something - ** like this: - ** - ** expr1 == ?1 - ** expr1 <> ?2 - ** - ** But, the RHS of the == or <> is marked with the EP_Generic flag - ** so that it may not contribute to the computation of comparison - ** affinity or the collating sequence to use for comparison. Otherwise, - ** the semantics would be subtly different from IN or NOT IN. - */ - Expr *pRHS = Y->a[0].pExpr; - Y->a[0].pExpr = 0; - sqlite3ExprListDelete(pParse->db, Y); - /* pRHS cannot be NULL because a malloc error would have been detected - ** before now and control would have never reached this point */ - if( ALWAYS(pRHS) ){ - pRHS->flags &= ~EP_Collate; - pRHS->flags |= EP_Generic; - } - A = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, A, pRHS); }else{ A = sqlite3PExpr(pParse, TK_IN, A, 0); if( A ){ diff --git a/src/select.c b/src/select.c index 9cfcddf8da..af87e4d2be 100644 --- a/src/select.c +++ b/src/select.c @@ -3476,9 +3476,6 @@ static Expr *substExpr( pNew->iRightJoinTable = pExpr->iRightJoinTable; ExprSetProperty(pNew, EP_FromJoin); } - if( pNew && ExprHasProperty(pExpr,EP_Generic) ){ - ExprSetProperty(pNew, EP_Generic); - } sqlite3ExprDelete(db, pExpr); pExpr = pNew; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 9492da17a1..70b2f0ba77 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2508,7 +2508,7 @@ struct Expr { #define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ #define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ #define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ -#define EP_Generic 0x000200 /* Ignore COLLATE or affinity on this tree */ + /* 0x000200 Available for reuse */ #define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ #define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ #define EP_Skip 0x001000 /* Operator does not contribute to affinity */ diff --git a/src/vdbe.c b/src/vdbe.c index c50e2a0b50..8c5c684af7 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5444,11 +5444,12 @@ case OP_Next: /* jump */ ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */ assert( pOp->opcode!=OP_Next || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE - || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found - || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid); + || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found + || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid + || pC->seekOp==OP_IfNoHope); assert( pOp->opcode!=OP_Prev || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE - || pC->seekOp==OP_Last + || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope || pC->seekOp==OP_NullRow); rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3); diff --git a/src/where.c b/src/where.c index 6e9d9cb9a2..e566e9e689 100644 --- a/src/where.c +++ b/src/where.c @@ -2517,8 +2517,6 @@ static int whereLoopAddBtreeIndex( }else if( ALWAYS(pExpr->x.pList && pExpr->x.pList->nExpr) ){ /* "x IN (value, value, ...)" */ nIn = sqlite3LogEst(pExpr->x.pList->nExpr); - assert( nIn>0 ); /* RHS always has 2 or more terms... The parser - ** changes "x IN (?)" into "x=?". */ } if( pProbe->hasStat1 ){ LogEst M, logK, safetyMargin; diff --git a/test/in4.test b/test/in4.test index a89961f82b..787b9ea36c 100644 --- a/test/in4.test +++ b/test/in4.test @@ -226,10 +226,13 @@ do_execsql_test in4-3.42 { do_execsql_test in4-3.43 { SELECT * FROM t3 WHERE x IN (10); } {10 10 10} -do_execsql_test in4-3.44 { - EXPLAIN - SELECT * FROM t3 WHERE x IN (10); -} {~/OpenEphemeral/} + +# This test would verify that the "X IN (Y)" -> "X==Y" optimization +# was working. But we have now taken that optimization out. +#do_execsql_test in4-3.44 { +# EXPLAIN +# SELECT * FROM t3 WHERE x IN (10); +#} {~/OpenEphemeral/} do_execsql_test in4-3.45 { SELECT * FROM t3 WHERE x NOT IN (10,11,99999); } {1 1 1} @@ -326,7 +329,7 @@ do_execsql_test in4-6.1 { do_execsql_test in4-6.1-eqp { EXPLAIN QUERY PLAN SELECT * FROM t6a, t6b WHERE a=3 AND b IN (c); -} {~/SCAN/} +} {~/SCAN TABLE t6a/} do_execsql_test in4-6.2 { SELECT * FROM t6a, t6b WHERE a=3 AND c IN (b); } {3 4 4 44} From 7ec796d00228854511e3e19772a477e19c99aaac Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 27 Aug 2019 17:28:05 +0000 Subject: [PATCH 168/221] Add ALWAYS() to an always true conditional that results from the previous check-in. Add a test case for ticket [dbaf8a6820be1ece] to supplement those already checked into TH3. FossilOrigin-Name: aff209804722ac902c7abfde80ad2677e0f51beb2c7f28f65d51105d984a1640 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 2 +- test/in.test | 10 ++++++++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 88f2172882..448d1500ae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\s"x\sIN\s(y)"\sto\s"x==y"\soptimization\sof\scheck-in\s[e68b427afbc82e20]\n(and\sticket\s[e39d032577df6942])\sas\sit\scauses\sdifficult\saffinity\sproblems\nas\sdemonstrated\sby\sticket\s[dbaf8a6820be1ece]\sand\sthe\soriginal\sassertion\sfault\nis\sno\slonger\sa\sfactor\sdue\sto\scountless\sother\schanges\sof\sthe\sprevious\s5\syears. -D 2019-08-27T17:01:07.813 +C Add\sALWAYS()\sto\san\salways\strue\sconditional\sthat\sresults\sfrom\sthe\nprevious\scheck-in.\s\sAdd\sa\stest\scase\sfor\sticket\s[dbaf8a6820be1ece]\sto\nsupplement\sthose\salready\schecked\sinto\sTH3. +D 2019-08-27T17:28:05.799 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 6cc2708ab9a386c0aef3fa50ed0f5bdfed22848e492960a4504eb25bdb79c8d1 +F src/where.c b33215cc1c69518b3c99a95cd8340eabd8e65213529e578659701401bfbcaa24 F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c e1131fe94c8728cbecc707f6455afbda9418896497bdca2d49a04ce6c57999f6 F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f @@ -1025,7 +1025,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 41aa8847745a879b897a7febea0f8f9efc8e67fe8bf680589b6e07c7b0a1569a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 63e642e97bc22c8fd970752fb4f0b3992a957003ea87524fe69e5a700500c500 +F test/in.test 1f82966f8c3f380c0a2d5a04e4111a333c3f46d96f40fb540e022c70ace85c11 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test 0f77b0ff371549e6a119d0356be10bdba72258162e9701e83527a560482f5e98 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 069c2f4c61f06211a8981abc412afcc1536ece13380b13a70aa99123f8f527cd -R 1d1745df08bf23742595db0b843b9c5f +P 7f5168a76a400fc2e1e40c6950470b1bfb38a0be54fc5518c17c29fdae7d8f1f +R e976ee574a610781e94b063fc639c3bb U drh -Z ead76a2ee397baa2df21935f693c9dfe +Z 4e7308a6b92cf40c1732223a6962408d diff --git a/manifest.uuid b/manifest.uuid index 40a6660d4e..27ec395e67 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7f5168a76a400fc2e1e40c6950470b1bfb38a0be54fc5518c17c29fdae7d8f1f \ No newline at end of file +aff209804722ac902c7abfde80ad2677e0f51beb2c7f28f65d51105d984a1640 \ No newline at end of file diff --git a/src/where.c b/src/where.c index e566e9e689..1eafcc87d8 100644 --- a/src/where.c +++ b/src/where.c @@ -802,7 +802,7 @@ static void constructAutomaticIndex( idxCols |= cMask; pIdx->aiColumn[n] = pTerm->u.leftColumn; pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); - pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; + pIdx->azColl[n] = ALWAYS(pColl) ? pColl->zName : sqlite3StrBINARY; n++; } } diff --git a/test/in.test b/test/in.test index c247f2e070..f96dfcc11e 100644 --- a/test/in.test +++ b/test/in.test @@ -750,4 +750,14 @@ do_execsql_test in-17.4 { SELECT 1 IN (CAST('1' AS text) COLLATE nocase); } 0 +# 2019-08-27 ticket https://sqlite.org/src/info/dbaf8a6820be1ece +# +do_execsql_test in-18.1 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 INT UNIQUE); + INSERT INTO t0(c0) VALUES (1); + SELECT * FROM t0 WHERE '1' IN (t0.c0); +} {} + + finish_test From e893759cac17443c63fd0bc0bfce198985da7aa5 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 27 Aug 2019 17:59:01 +0000 Subject: [PATCH 169/221] The ALWAYS() added by the previous check-in was incorrect. Take it back out. FossilOrigin-Name: 336235db2b1167cdb2feb64b47eb6368c97c43ee9641b7bfccc5775a41dd0d0e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 448d1500ae..3ecba933a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sALWAYS()\sto\san\salways\strue\sconditional\sthat\sresults\sfrom\sthe\nprevious\scheck-in.\s\sAdd\sa\stest\scase\sfor\sticket\s[dbaf8a6820be1ece]\sto\nsupplement\sthose\salready\schecked\sinto\sTH3. -D 2019-08-27T17:28:05.799 +C The\sALWAYS()\sadded\sby\sthe\sprevious\scheck-in\swas\sincorrect.\s\sTake\sit\sback\sout. +D 2019-08-27T17:59:01.529 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c b33215cc1c69518b3c99a95cd8340eabd8e65213529e578659701401bfbcaa24 +F src/where.c 6cc2708ab9a386c0aef3fa50ed0f5bdfed22848e492960a4504eb25bdb79c8d1 F src/whereInt.h 2082fc2bd1eb66cb236a1a3c4b250e33d2bad9e43a0486a2cf9e4e211c58f3eb F src/wherecode.c e1131fe94c8728cbecc707f6455afbda9418896497bdca2d49a04ce6c57999f6 F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7f5168a76a400fc2e1e40c6950470b1bfb38a0be54fc5518c17c29fdae7d8f1f -R e976ee574a610781e94b063fc639c3bb +P aff209804722ac902c7abfde80ad2677e0f51beb2c7f28f65d51105d984a1640 +R ab1237ad66e99f2406a94be2d43ffa7b U drh -Z 4e7308a6b92cf40c1732223a6962408d +Z 919069f1dca2ee3915ff3c6a1bd5e156 diff --git a/manifest.uuid b/manifest.uuid index 27ec395e67..60f2eca16a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aff209804722ac902c7abfde80ad2677e0f51beb2c7f28f65d51105d984a1640 \ No newline at end of file +336235db2b1167cdb2feb64b47eb6368c97c43ee9641b7bfccc5775a41dd0d0e \ No newline at end of file diff --git a/src/where.c b/src/where.c index 1eafcc87d8..e566e9e689 100644 --- a/src/where.c +++ b/src/where.c @@ -802,7 +802,7 @@ static void constructAutomaticIndex( idxCols |= cMask; pIdx->aiColumn[n] = pTerm->u.leftColumn; pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); - pIdx->azColl[n] = ALWAYS(pColl) ? pColl->zName : sqlite3StrBINARY; + pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; n++; } } From 2e51716b1520fc6e681e9578d681e2e60ae6590f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 28 Aug 2019 02:09:47 +0000 Subject: [PATCH 170/221] Increase the size of the yy_lookahead table so that it is never necessary to down bounds checking on the index. FossilOrigin-Name: bafd872398e58766e996963372c7acc03a1e20a6d39a3867ca45d3ea0ed2ac1d --- manifest | 20 +++++++++++--------- manifest.uuid | 2 +- tool/lemon.c | 19 ++++++++++++++++++- tool/lempar.c | 6 ++++-- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index e3c0e4ca6c..2e8403bc0f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssupport\sfor\s"ORDER\sBY\s...\sNULLS\sFIRST"\sand\s"ORDER\sBY\s...\sNULLS\sLAST".\sUse\sthis\sto\sfix\sticket\s[f8a7060e]. -D 2019-08-27T19:59:21.714 +C Increase\sthe\ssize\sof\sthe\syy_lookahead\stable\sso\sthat\sit\sis\snever\snecessary\sto\ndown\sbounds\schecking\son\sthe\sindex. +D 2019-08-28T02:09:47.441 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1756,8 +1756,8 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c cc43148d2793ab93668e74a6a6319bb71c2e65c1ffcd6deeaa59e12be9362a43 -F tool/lempar.c 4b868d0a5eb9a67cd1b546274227c0d449dad073c663b331b686fa2253e1c86f +F tool/lemon.c 3b40d248784ada53b1210fb389ebfc149f3043eebcfbe477646430137071798b +F tool/lempar.c be669a41410f127485e7d52b0c50f5b449c745aa23e06940b9d1a9c9eda58633 F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1837,8 +1837,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 336235db2b1167cdb2feb64b47eb6368c97c43ee9641b7bfccc5775a41dd0d0e ad816d01d4bd3908ff2c574d79d1a29b6d732df308f2f1b1cdf7c0bc7c1bd7cf -R 5139358becb963924affc3638fcd0d5e -T +closed ad816d01d4bd3908ff2c574d79d1a29b6d732df308f2f1b1cdf7c0bc7c1bd7cf -U dan -Z 534b1b1d3945585b80108a8c2d91a394 +P 94085fb3e756bc984237b74b6e29c68462ad860870c64dcb5124feaeec387660 +R 622629c7f73f36222c78d3454b5494fa +T *branch * lemon-optimization +T *sym-lemon-optimization * +T -sym-trunk * +U drh +Z 2510adf038772aa7dc037a8992922686 diff --git a/manifest.uuid b/manifest.uuid index 12718058d1..24efefb261 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -94085fb3e756bc984237b74b6e29c68462ad860870c64dcb5124feaeec387660 \ No newline at end of file +bafd872398e58766e996963372c7acc03a1e20a6d39a3867ca45d3ea0ed2ac1d \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index 4416f67bb2..3daa6d38cf 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -4153,6 +4153,7 @@ void ReportTable( struct rule *rp; struct acttab *pActtab; int i, j, n, sz; + int nLookAhead; int szActionType; /* sizeof(YYACTIONTYPE) */ int szCodeType; /* sizeof(YYCODETYPE) */ const char *name; @@ -4403,13 +4404,29 @@ void ReportTable( if( la<0 ) la = lemp->nsymbol; if( j==0 ) fprintf(out," /* %5d */ ", i); fprintf(out, " %4d,", la); - if( j==9 || i==n-1 ){ + if( j==9 ){ fprintf(out, "\n"); lineno++; j = 0; }else{ j++; } } + /* Add extra entries to the end of the yy_lookahead[] table so that + ** yy_shift_ofst[]+iToken will always be a valid index into the array, + ** even for the largest possible value of yy_shift_ofst[] and iToken. */ + nLookAhead = lemp->nterminal + lemp->nactiontab; + while( interminal); + if( j==9 ){ + fprintf(out, "\n"); lineno++; + j = 0; + }else{ + j++; + } + i++; + } + if( j>0 ) fprintf(out, "\n"); lineno++; fprintf(out, "};\n"); lineno++; /* Output the yy_shift_ofst[] table */ diff --git a/tool/lempar.c b/tool/lempar.c index 1c088080d4..baf6a217df 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -521,11 +521,13 @@ static YYACTIONTYPE yy_find_shift_action( do{ i = yy_shift_ofst[stateno]; assert( i>=0 ); - /* assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); */ + assert( i<=YY_ACTTAB_COUNT ); + assert( i+YYNTOKEN<=(int)YY_NLOOKAHEAD ); assert( iLookAhead!=YYNOCODE ); assert( iLookAhead < YYNTOKEN ); i += iLookAhead; - if( i>=YY_NLOOKAHEAD || yy_lookahead[i]!=iLookAhead ){ + assert( i<(int)YY_NLOOKAHEAD ); + if( yy_lookahead[i]!=iLookAhead ){ #ifdef YYFALLBACK YYCODETYPE iFallback; /* Fallback token */ if( iLookAhead Date: Wed, 28 Aug 2019 11:31:11 +0000 Subject: [PATCH 171/221] Further improvements to parser speed by enlarging lookup tables to eliminate the need to do range checking on the index prior to lookup. FossilOrigin-Name: 47d3e091ae49eb7947af5abef9b5b96b16b86d349e51fe0677795649be6db473 --- manifest | 17 +++++++---------- manifest.uuid | 2 +- tool/lemon.c | 4 +++- tool/lempar.c | 17 +++++------------ 4 files changed, 16 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 2e8403bc0f..167921e6c3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Increase\sthe\ssize\sof\sthe\syy_lookahead\stable\sso\sthat\sit\sis\snever\snecessary\sto\ndown\sbounds\schecking\son\sthe\sindex. -D 2019-08-28T02:09:47.441 +C Further\simprovements\sto\sparser\sspeed\sby\senlarging\slookup\stables\sto\seliminate\nthe\sneed\sto\sdo\srange\schecking\son\sthe\sindex\sprior\sto\slookup. +D 2019-08-28T11:31:11.959 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1756,8 +1756,8 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c 3b40d248784ada53b1210fb389ebfc149f3043eebcfbe477646430137071798b -F tool/lempar.c be669a41410f127485e7d52b0c50f5b449c745aa23e06940b9d1a9c9eda58633 +F tool/lemon.c c9848ef9694689d244a5097238ca1f83df85cc52c80ad149a4cf49595a0ee9c2 +F tool/lempar.c 5d1b20f2e9d7d6e3e1f5e1c11dba455c798bf0097634f5aef7c68a1ae7bc7d86 F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1837,10 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 94085fb3e756bc984237b74b6e29c68462ad860870c64dcb5124feaeec387660 -R 622629c7f73f36222c78d3454b5494fa -T *branch * lemon-optimization -T *sym-lemon-optimization * -T -sym-trunk * +P bafd872398e58766e996963372c7acc03a1e20a6d39a3867ca45d3ea0ed2ac1d +R 958bf9b2f74079dc6a59cf74943d64b1 U drh -Z 2510adf038772aa7dc037a8992922686 +Z 3fa2b314bcffff2187af5dcc971ba8ee diff --git a/manifest.uuid b/manifest.uuid index 24efefb261..2c14daf263 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bafd872398e58766e996963372c7acc03a1e20a6d39a3867ca45d3ea0ed2ac1d \ No newline at end of file +47d3e091ae49eb7947af5abef9b5b96b16b86d349e51fe0677795649be6db473 \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index 3daa6d38cf..893e1d18b9 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -4506,7 +4506,9 @@ void ReportTable( */ if( lemp->has_fallback ){ int mx = lemp->nterminal - 1; - while( mx>0 && lemp->symbols[mx]->fallback==0 ){ mx--; } + /* 2019-08-28: Generate fallback entries for every token to avoid + ** having to do a range check on the index */ + /* while( mx>0 && lemp->symbols[mx]->fallback==0 ){ mx--; } */ lemp->tablesize += (mx+1)*szCodeType; for(i=0; i<=mx; i++){ struct symbol *p = lemp->symbols[i]; diff --git a/tool/lempar.c b/tool/lempar.c index baf6a217df..9d5b19f465 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -530,8 +530,9 @@ static YYACTIONTYPE yy_find_shift_action( if( yy_lookahead[i]!=iLookAhead ){ #ifdef YYFALLBACK YYCODETYPE iFallback; /* Fallback token */ - if( iLookAhead %s\n", @@ -546,16 +547,8 @@ static YYACTIONTYPE yy_find_shift_action( #ifdef YYWILDCARD { int j = i - iLookAhead + YYWILDCARD; - if( -#if YY_SHIFT_MIN+YYWILDCARD<0 - j>=0 && -#endif -#if YY_SHIFT_MAX+YYWILDCARD>=YY_ACTTAB_COUNT - j0 - ){ + assert( j<(int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])) ); + if( yy_lookahead[j]==YYWILDCARD && iLookAhead>0 ){ #ifndef NDEBUG if( yyTraceFILE ){ fprintf(yyTraceFILE, "%sWILDCARD %s => %s\n", From 6ee3fa87fd7ca53713cffb9ff662a61f797b760d Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 28 Aug 2019 11:49:45 +0000 Subject: [PATCH 172/221] Fix an unreachable branch in sqlite3ParserFallback() FossilOrigin-Name: e059178b47109caee2c2211b2db6e594c014af636677118a64e10edf01ac017d --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/lempar.c | 5 ++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 167921e6c3..23b6a28b23 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\simprovements\sto\sparser\sspeed\sby\senlarging\slookup\stables\sto\seliminate\nthe\sneed\sto\sdo\srange\schecking\son\sthe\sindex\sprior\sto\slookup. -D 2019-08-28T11:31:11.959 +C Fix\san\sunreachable\sbranch\sin\ssqlite3ParserFallback() +D 2019-08-28T11:49:45.616 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1757,7 +1757,7 @@ F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c c9848ef9694689d244a5097238ca1f83df85cc52c80ad149a4cf49595a0ee9c2 -F tool/lempar.c 5d1b20f2e9d7d6e3e1f5e1c11dba455c798bf0097634f5aef7c68a1ae7bc7d86 +F tool/lempar.c eb2841e2a7fd484cf44b1f526b06e7ab0f216d2f41818bf9485e8f38e3d1db19 F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bafd872398e58766e996963372c7acc03a1e20a6d39a3867ca45d3ea0ed2ac1d -R 958bf9b2f74079dc6a59cf74943d64b1 +P 47d3e091ae49eb7947af5abef9b5b96b16b86d349e51fe0677795649be6db473 +R eed84f5af5dd0a6ce743afeb00c4b4e4 U drh -Z 3fa2b314bcffff2187af5dcc971ba8ee +Z 0c74ffec3ce3109c0e0f66d709525f70 diff --git a/manifest.uuid b/manifest.uuid index 2c14daf263..1d045fd59e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -47d3e091ae49eb7947af5abef9b5b96b16b86d349e51fe0677795649be6db473 \ No newline at end of file +e059178b47109caee2c2211b2db6e594c014af636677118a64e10edf01ac017d \ No newline at end of file diff --git a/tool/lempar.c b/tool/lempar.c index 9d5b19f465..f75ad51c39 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -1064,9 +1064,8 @@ void Parse( */ int ParseFallback(int iToken){ #ifdef YYFALLBACK - if( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ){ - return yyFallback[iToken]; - } + assert( iToken<(int)(sizeof(yyFallback)/sizeof(yyFallback[0])) ); + return yyFallback[iToken]; #else (void)iToken; #endif From 50b3ea2daf855d61d3a56562d3e2bfc843e06823 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 29 Aug 2019 14:25:44 +0000 Subject: [PATCH 173/221] Fix a potential buffer overrun in fts5 caused by corrupted database records. FossilOrigin-Name: c465d0eb478e42045e08efe8b6fa64d4bd4d747cdf743beae4608562b014169e --- ext/fts5/fts5_index.c | 6 + ext/fts5/test/fts5corrupt3.test | 211 +++++++++++++++++++++++++++++++- manifest | 17 ++- manifest.uuid | 2 +- 4 files changed, 222 insertions(+), 14 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 3fa97c2fea..c0f7ac551a 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5050,6 +5050,12 @@ static void fts5MergePrefixLists( } /* WRITEPOSLISTSIZE */ + assert_nc( tmp.n<=i1.nPoslist+i2.nPoslist ); + assert( tmp.n<=i1.nPoslist+i2.nPoslist+10+10 ); + if( tmp.n>i1.nPoslist+i2.nPoslist ){ + if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT; + break; + } fts5BufferSafeAppendVarint(&out, tmp.n * 2); fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); fts5DoclistIterNext(&i1); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 306ae9fe03..a7da137b11 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -6908,7 +6908,7 @@ do_catchsql_test 50.1 { #------------------------------------------------------------------------- reset_db -do_execsql_test 51.1 { +do_execsql_test 51.0 { BEGIN TRANSACTION; PRAGMA writable_schema=ON; CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); @@ -6976,7 +6976,7 @@ COMMIT; do_catchsql_test 51.1 { SELECT max(rowid)==0 FROM t1('e*'); -} {0 0} +} {1 {database disk image is malformed}} #-------------------------------------------------------------------------- reset_db @@ -8544,7 +8544,7 @@ do_test 59.0 { do_catchsql_test 59.1 { SELECT (matchinfo(591,t1)) FROM t1 WHERE t1 MATCH 'e*eŸ' -} {0 {}} +} {1 {database disk image is malformed}} #------------------------------------------------------------------------- do_test 60.0 { @@ -8750,7 +8750,7 @@ do_test 60.0 { do_catchsql_test 60.2 { SELECT (matchinfo(t1,591)) FROM t1 WHERE t1 MATCH 'e*eŸ' -} {0 {}} +} {1 {database disk image is malformed}} #------------------------------------------------------------------------- do_test 61.0 { @@ -9491,6 +9491,209 @@ do_catchsql_test 64.1 { SELECT * FROM ttt('e*'); } {1 {database disk image is malformed}} +#--------------------------------------------------------------------------- +do_test 65.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-3aef66940ace0c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 00 00 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c d6 63 32 29 69 04 07 17 19 c0, c1,.c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 93 ff 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 31 31 36 30 ...........21160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 33 f1 609...........3. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 03 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 3d ......0000000..= +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 01 f2 03 06 4e 02 02 03 06 01 ..........N..... +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 13 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 07 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 01 f1 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 76 b4 65 6e 73 69 6f 6e 1f 02 ......v.ension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 25 0d 02 03 01 02 03 01 ........%....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 0f f2 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 00 03 6d 61 78 1c 02 0c 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 13 06 00 f2 02 03 ocase........... +| 3680: 06 01 12 02 13 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 8e 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 11 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 01 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 01 f1 06 01 01 02 ad 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 01 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0e fc 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 00 00 00 00 00 00 00 00 ....$........... +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 8f DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 43 41 46 45 3d ..%..THREADCAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4b 4f 41 44 21 45 58 54 45 4e 53 49 4f IT KOAD!EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 59 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMYT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 56 a9 4d 1f 1e 05 00 33 0f 19 IONXRTV.M....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 57 42 49 4e 31 52 59 1f 1d 05 00 33 0f 000WBIN1RY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 32 0000XNOCASE....2 +| 3328: 0f 17 4e 41 58 20 4d 45 4d 4f 52 59 2d 35 30 30 ..NAX MEMORY-500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 59 4e 4f 43 41 53 45 17 LE RTREEYNOCASE. +| 3408: 19 66 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 .f.%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 10 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 40 42 4c 45 20 4a 53 4f 4e 31 58 42 ..EN@BLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 32 58 4e 4f 43 41 53 45 17 LE JSON2XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4d 41 42 4c 45 20 4a 53 4f ...%..EMABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4f 81 42 4c NARY....)..EO.BL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 51 53 45 E GEOPOLYXNOCQSE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 1a 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 48 4e 4f 43 41 53 45 16 1d 05 E FTS5HNOCASE... +| 3728: 00 23 0f a4 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 55 53 34 58 42 49 4e 41 52 59 17 0b LE FUS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 57 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e WNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 05 52 54 52 49 4d 1e ABLE FTS4.RTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 8a 4e 41 52 .....DEBUGXB.NAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3f 87 ...C..COMPILER?. +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 45 0d 60 59 4c 45 52 3d 67 63 63 2d 35 2e 34 2d E.`YLER=gcc-5.4- +| 4080: 30 20 32 30 31 36 30 36 30 39 00 00 00 00 00 00 0 20160609...... +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 01 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 02 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 00 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-3aef66940ace0c.db +}]} {} + +do_catchsql_test 65.1 { + SELECT ( MATCH (t1,591)) FROM t1 WHERE t1 MATCH 'e*eŸ' +} {1 {database disk image is malformed}} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index af8d219242..1294681dce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sLemon\sso\sthat\sit\senlarges\ssome\sof\sits\stables\sslightly\sin\sorder\sto\navoid\shaving\sto\sindex\srange\schecks\son\stable\slookups\sfor\sa\sperformance\nincrease. -D 2019-08-29T00:27:12.377 +C Fix\sa\spotential\sbuffer\soverrun\sin\sfts5\scaused\sby\scorrupted\sdatabase\srecords. +D 2019-08-29T14:25:44.718 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c d7523cba5e66da077233c023aecbc3e6a37978ff75a18131c5ab5b1229d5bac7 F ext/fts5/fts5_expr.c 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c ada7661078752941e1d83bd42fe5aedef3350a1ccb9076c98153090ccd1d2f0d +F ext/fts5/fts5_index.c b062bdb836e195656aac8d6684e943585cff4bf7d7c593c80cb67c3b6cfef7ee F ext/fts5/fts5_main.c b2c42f1cef9673ecdd498b22c38483a4380bcf1701d1e61b021a2945f18e42e1 F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -157,7 +157,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 9517cc527a8e8a33949652d5c7b5e251f8c3d5ae3f23f01d4320e30f29a0336b F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 1e0a557a2c33d26a516d8ae57685a77001e9887a7457abcea6be1c4ac77332e8 +F ext/fts5/test/fts5corrupt3.test f326d70e08acffcbd8a551edd72b5723db7d3a902d288d958014c81a111cae21 F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -1837,8 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 94085fb3e756bc984237b74b6e29c68462ad860870c64dcb5124feaeec387660 e059178b47109caee2c2211b2db6e594c014af636677118a64e10edf01ac017d -R eed84f5af5dd0a6ce743afeb00c4b4e4 -T +closed e059178b47109caee2c2211b2db6e594c014af636677118a64e10edf01ac017d -U drh -Z adf3ddab2b496435d84f7dc30e6d3ae7 +P 4be6a23a188bd1fea445283d6dcc2f5c3470c28852dc4895d63117ad0c773fcf +R 12af26efe518d88efce12e7278408573 +U dan +Z dfc696063c3b6a7085f401f76e6517be diff --git a/manifest.uuid b/manifest.uuid index cd30b15e13..06e243d03c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4be6a23a188bd1fea445283d6dcc2f5c3470c28852dc4895d63117ad0c773fcf \ No newline at end of file +c465d0eb478e42045e08efe8b6fa64d4bd4d747cdf743beae4608562b014169e \ No newline at end of file From 1cd382e3500588126a91692377254bb807276d83 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 29 Aug 2019 15:06:35 +0000 Subject: [PATCH 174/221] Avoid assuming that for "~ (? OR TRUE)" to be true, "?" must not be NULL, just as we do for "NOT (? OR TRUE)". Fix for ticket [c0390363]. FossilOrigin-Name: 84ae41fd2f50cb7c0c3f6522d0f94817e1bbf96eae5316279e3e32cee4e46e91 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- test/indexexpr2.test | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1294681dce..ac91ec3f1e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sbuffer\soverrun\sin\sfts5\scaused\sby\scorrupted\sdatabase\srecords. -D 2019-08-29T14:25:44.718 +C Avoid\sassuming\sthat\sfor\s"~\s(?\sOR\sTRUE)"\sto\sbe\strue,\s"?"\smust\snot\sbe\sNULL,\sjust\sas\swe\sdo\sfor\s"NOT\s(?\sOR\sTRUE)".\sFix\sfor\sticket\s[c0390363]. +D 2019-08-29T15:06:35.023 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 0f3aaaac5c1bd6a34fece3308ad572ef846c1601c58957902dc2a36f75373364 +F src/expr.c 33c1d88c98968fb6407d73da056af50dbc6045fcbf2641e99edb8974f0e19adc F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1053,7 +1053,7 @@ F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 0f293369ed6f56764cfc3db05685d45469d9e685ba87e3698527049ba359ae24 -F test/indexexpr2.test d319e7d1b1043403f39a20c892d512e02b5549c6004806b977030f2430c60208 +F test/indexexpr2.test efffd39a278d8d9e8c5e9f82ef23178970951df9d725e4aea6d304bf81be6678 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 72004f6a900a25bd3f1ce9a72e73d02749644666a8ce6d6d2dba061137e5aa63 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4be6a23a188bd1fea445283d6dcc2f5c3470c28852dc4895d63117ad0c773fcf -R 12af26efe518d88efce12e7278408573 +P c465d0eb478e42045e08efe8b6fa64d4bd4d747cdf743beae4608562b014169e +R b17ceb5c6a3471208662929e8aee416b U dan -Z dfc696063c3b6a7085f401f76e6517be +Z 68262acbccebad319b476c344a9d0307 diff --git a/manifest.uuid b/manifest.uuid index 06e243d03c..1d7a1cb2a2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c465d0eb478e42045e08efe8b6fa64d4bd4d747cdf743beae4608562b014169e \ No newline at end of file +84ae41fd2f50cb7c0c3f6522d0f94817e1bbf96eae5316279e3e32cee4e46e91 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 365f60665f..d83e18eb26 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5027,7 +5027,6 @@ static int exprImpliesNotNull( } case TK_SPAN: case TK_COLLATE: - case TK_BITNOT: case TK_UPLUS: case TK_UMINUS: { return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); @@ -5037,6 +5036,7 @@ static int exprImpliesNotNull( if( p->op2!=TK_IS ) return 0; return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); } + case TK_BITNOT: case TK_NOT: { return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); } diff --git a/test/indexexpr2.test b/test/indexexpr2.test index a3a685fb3d..589a0589ab 100644 --- a/test/indexexpr2.test +++ b/test/indexexpr2.test @@ -295,6 +295,23 @@ do_execsql_test 7.3 { REINDEX; } {} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 8.0 { + CREATE TABLE t0(c0); + CREATE INDEX i0 ON t0(c0) WHERE c0 NOT NULL; + INSERT INTO t0(c0) VALUES (NULL); +} + +breakpoint +do_execsql_test 8.1 { + SELECT * FROM t0 WHERE ~('' BETWEEN t0.c0 AND TRUE); +} {{}} + +do_execsql_test 8.2 { + SELECT ~('' BETWEEN t0.c0 AND TRUE) FROM t0; +} {-1} + finish_test From b6a9121bb383f37c78b8d8d99e6f1d8dd3b6b4e3 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 29 Aug 2019 15:50:16 +0000 Subject: [PATCH 175/221] Fix another case where SQLite assumes that if "~(? AND FALSE)" is true, "?" must be non-null. FossilOrigin-Name: 616f5663b3dbd0929128c0990fc6d8bba1513c7ae196b87c450ac0b3b3203ecd --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 1 + test/join.test | 7 ++++++- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index ac91ec3f1e..7ed3408640 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sassuming\sthat\sfor\s"~\s(?\sOR\sTRUE)"\sto\sbe\strue,\s"?"\smust\snot\sbe\sNULL,\sjust\sas\swe\sdo\sfor\s"NOT\s(?\sOR\sTRUE)".\sFix\sfor\sticket\s[c0390363]. -D 2019-08-29T15:06:35.023 +C Fix\sanother\scase\swhere\sSQLite\sassumes\sthat\sif\s"~(?\sAND\sFALSE)"\sis\strue,\s"?"\smust\sbe\snon-null. +D 2019-08-29T15:50:16.698 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 33c1d88c98968fb6407d73da056af50dbc6045fcbf2641e99edb8974f0e19adc +F src/expr.c c54fcc18ff7a9206524c44a3ebfaffcf71bae1fda063bdf254cfe2d4820ee71e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1077,7 +1077,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test f505c78a793b0c807d534c1cacf71c7bf96aa734f78d091721f2a6859077b7e8 +F test/join.test 6ce8296a08e78632c322cde0add78a7ce05466c3d9ec7d5130b38b5b489e7c27 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c465d0eb478e42045e08efe8b6fa64d4bd4d747cdf743beae4608562b014169e -R b17ceb5c6a3471208662929e8aee416b +P 84ae41fd2f50cb7c0c3f6522d0f94817e1bbf96eae5316279e3e32cee4e46e91 +R c76b8e8761ede59ea3d32402ab062564 U dan -Z 68262acbccebad319b476c344a9d0307 +Z abbce93de6b15f66332b49534306a771 diff --git a/manifest.uuid b/manifest.uuid index 1d7a1cb2a2..84eab99b18 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -84ae41fd2f50cb7c0c3f6522d0f94817e1bbf96eae5316279e3e32cee4e46e91 \ No newline at end of file +616f5663b3dbd0929128c0990fc6d8bba1513c7ae196b87c450ac0b3b3203ecd \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index d83e18eb26..80bc002d7f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5103,6 +5103,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ switch( pExpr->op ){ case TK_ISNOT: case TK_NOT: + case TK_BITNOT: case TK_ISNULL: case TK_NOTNULL: case TK_IS: diff --git a/test/join.test b/test/join.test index 25c31705c8..f53a90c84a 100644 --- a/test/join.test +++ b/test/join.test @@ -812,11 +812,16 @@ do_execsql_test join-15.105 { FROM t1 LEFT JOIN t2 WHERE a IN (1,3,x,y); } {1 2 {} {} x 3 4 {} {} x} -do_execsql_test join-15.106 { +do_execsql_test join-15.106a { SELECT *, 'x' FROM t1 LEFT JOIN t2 WHERE NOT ( 'x'='y' AND t2.y=1 ); } {1 2 {} {} x 3 4 {} {} x} +do_execsql_test join-15.106b { + SELECT *, 'x' + FROM t1 LEFT JOIN t2 + WHERE ~ ( 'x'='y' AND t2.y=1 ); +} {1 2 {} {} x 3 4 {} {} x} do_execsql_test join-15.107 { SELECT *, 'x' FROM t1 LEFT JOIN t2 From f76ccb7d5486a2664127dec004dd52835f600a81 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 29 Aug 2019 16:17:59 +0000 Subject: [PATCH 176/221] Remove an unreachable branch in the NULLS LAST logic of RANGE window functions. FossilOrigin-Name: 47cd634c98b502d40a493455ba6d73cbd0dae74944f9cf06fcbcd025f4b49d6e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/window.c | 12 +++++------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 7ed3408640..516f0b90a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\scase\swhere\sSQLite\sassumes\sthat\sif\s"~(?\sAND\sFALSE)"\sis\strue,\s"?"\smust\sbe\snon-null. -D 2019-08-29T15:50:16.698 +C Remove\san\sunreachable\sbranch\sin\sthe\sNULLS\sLAST\slogic\sof\sRANGE\swindow\nfunctions. +D 2019-08-29T16:17:59.802 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/where.c 6f8bd0b4ade152571e960504a3042a31fd80e8adcef834db0717af3fbac4acb5 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f -F src/window.c 3ea716bb0dd5ffc8cdbaa48baffc525958b51bc61b2afd73a56baccfcd7ceb2f +F src/window.c 7d74882b41db7f44300489b3513f94f3f95684725e6d8e4e8cede44f015bb4b0 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 84ae41fd2f50cb7c0c3f6522d0f94817e1bbf96eae5316279e3e32cee4e46e91 -R c76b8e8761ede59ea3d32402ab062564 -U dan -Z abbce93de6b15f66332b49534306a771 +P 616f5663b3dbd0929128c0990fc6d8bba1513c7ae196b87c450ac0b3b3203ecd +R 9f9103695325eba7c86630a81c46d881 +U drh +Z 7097a40260a07e3670128a93ad17b767 diff --git a/manifest.uuid b/manifest.uuid index 84eab99b18..d6076d12ea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -616f5663b3dbd0929128c0990fc6d8bba1513c7ae196b87c450ac0b3b3203ecd \ No newline at end of file +47cd634c98b502d40a493455ba6d73cbd0dae74944f9cf06fcbcd025f4b49d6e \ No newline at end of file diff --git a/src/window.c b/src/window.c index d3603e7a1e..ac8d1080fb 100644 --- a/src/window.c +++ b/src/window.c @@ -1864,7 +1864,7 @@ static void windowIfNewPeer( */ static void windowCodeRangeTest( WindowCodeArg *p, - int op, /* OP_Ge or OP_Gt */ + int op, /* OP_Ge, OP_Gt, or OP_Le */ int csr1, int regVal, int csr2, @@ -1908,14 +1908,12 @@ static void windowCodeRangeTest( switch( op ){ case OP_Ge: sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); break; case OP_Gt: - sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); - VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); VdbeCoverage(v); break; - case OP_Le: - sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); - VdbeCoverage(v); + default: + assert( op==OP_Le ); + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); break; - default: assert( op==OP_Lt ); /* no-op */ } sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); sqlite3VdbeJumpHere(v, addr); From db586e48432ac81c81d454af4f5e879743dd9f7b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 29 Aug 2019 16:48:10 +0000 Subject: [PATCH 177/221] Add a missing VdbeCoverage() macro. FossilOrigin-Name: 33da6092d3d04b6eb6ab396b8c4f668e3529e26bf11e26f5fcb9b61fe3470197 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 516f0b90a6..a38e9488a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunreachable\sbranch\sin\sthe\sNULLS\sLAST\slogic\sof\sRANGE\swindow\nfunctions. -D 2019-08-29T16:17:59.802 +C Add\sa\smissing\sVdbeCoverage()\smacro. +D 2019-08-29T16:48:10.044 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 6f8bd0b4ade152571e960504a3042a31fd80e8adcef834db0717af3fbac4acb5 +F src/where.c 0a573a77eff9ab22edfbac0519b2147fce414f52af838497b5eb376f1fe60ef5 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 616f5663b3dbd0929128c0990fc6d8bba1513c7ae196b87c450ac0b3b3203ecd -R 9f9103695325eba7c86630a81c46d881 +P 47cd634c98b502d40a493455ba6d73cbd0dae74944f9cf06fcbcd025f4b49d6e +R 82040bfc52a0536ad402b4608c120103 U drh -Z 7097a40260a07e3670128a93ad17b767 +Z 90dda46f03caf5162d829380d2711d0e diff --git a/manifest.uuid b/manifest.uuid index d6076d12ea..4597b323cb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -47cd634c98b502d40a493455ba6d73cbd0dae74944f9cf06fcbcd025f4b49d6e \ No newline at end of file +33da6092d3d04b6eb6ab396b8c4f668e3529e26bf11e26f5fcb9b61fe3470197 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 3d1d8418f1..d250990db2 100644 --- a/src/where.c +++ b/src/where.c @@ -5217,6 +5217,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ if( pLevel->regBignull ){ sqlite3VdbeResolveLabel(v, pLevel->addrBignull); sqlite3VdbeAddOp2(v, OP_IfNotZero, pLevel->regBignull, pLevel->p2-1); + VdbeCoverage(v); } #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); From 9d23ea74d44f458f39b51ae39a9b0d617947a90d Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 29 Aug 2019 19:34:29 +0000 Subject: [PATCH 178/221] Fix other problems similar to ticket [c0390363]. FossilOrigin-Name: 96ff2ba9c4bb71d5f7c6f359986a76a5364b7ac3e1a612441543a9eabecf31df --- manifest | 16 +++++------ manifest.uuid | 2 +- src/expr.c | 27 +++++++++++++----- test/indexexpr2.test | 67 +++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 92 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index a38e9488a1..68a3beac9d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smissing\sVdbeCoverage()\smacro. -D 2019-08-29T16:48:10.044 +C Fix\sother\sproblems\ssimilar\sto\sticket\s[c0390363]. +D 2019-08-29T19:34:29.959 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c c54fcc18ff7a9206524c44a3ebfaffcf71bae1fda063bdf254cfe2d4820ee71e +F src/expr.c 13cbe4b8af90685aa1359e6866c8b86177049f9c273a3c9bc47dda473f843977 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1053,7 +1053,7 @@ F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 0f293369ed6f56764cfc3db05685d45469d9e685ba87e3698527049ba359ae24 -F test/indexexpr2.test efffd39a278d8d9e8c5e9f82ef23178970951df9d725e4aea6d304bf81be6678 +F test/indexexpr2.test b580f378423bca443ffab47ada677203cfcf8a60f48a8aa20065f27c8f7739b5 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 72004f6a900a25bd3f1ce9a72e73d02749644666a8ce6d6d2dba061137e5aa63 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 47cd634c98b502d40a493455ba6d73cbd0dae74944f9cf06fcbcd025f4b49d6e -R 82040bfc52a0536ad402b4608c120103 -U drh -Z 90dda46f03caf5162d829380d2711d0e +P 33da6092d3d04b6eb6ab396b8c4f668e3529e26bf11e26f5fcb9b61fe3470197 +R fddd1b4f06a264ef0d3ea52604d276ee +U dan +Z 0c2c6f276dc80545da616e6fc4335cce diff --git a/manifest.uuid b/manifest.uuid index 4597b323cb..4548ec71ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -33da6092d3d04b6eb6ab396b8c4f668e3529e26bf11e26f5fcb9b61fe3470197 \ No newline at end of file +96ff2ba9c4bb71d5f7c6f359986a76a5364b7ac3e1a612441543a9eabecf31df \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 80bc002d7f..fbed5f9921 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5014,14 +5014,16 @@ static int exprImpliesNotNull( case TK_GE: case TK_PLUS: case TK_MINUS: + case TK_BITOR: + case TK_LSHIFT: + case TK_RSHIFT: + case TK_CONCAT: + seenNot = 1; + /* Fall thru */ case TK_STAR: case TK_REM: case TK_BITAND: - case TK_BITOR: - case TK_SLASH: - case TK_LSHIFT: - case TK_RSHIFT: - case TK_CONCAT: { + case TK_SLASH: { if( exprImpliesNotNull(pParse, p->pRight, pNN, iTab, seenNot) ) return 1; /* Fall thru into the next case */ } @@ -5102,8 +5104,6 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune; switch( pExpr->op ){ case TK_ISNOT: - case TK_NOT: - case TK_BITNOT: case TK_ISNULL: case TK_NOTNULL: case TK_IS: @@ -5128,6 +5128,18 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ } return WRC_Prune; + case TK_AND: + if( sqlite3ExprImpliesNonNullRow(pExpr->pLeft, pWalker->u.iCur) + && sqlite3ExprImpliesNonNullRow(pExpr->pRight, pWalker->u.iCur) + ){ + pWalker->eCode = 1; + } + return WRC_Prune; + + case TK_BETWEEN: + sqlite3WalkExpr(pWalker, pExpr->pLeft); + return WRC_Prune; + /* Virtual tables are allowed to use constraints like x=NULL. So ** a term of the form x=y does not prove that y is not null if x ** is the column of a virtual table */ @@ -5148,6 +5160,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ ){ return WRC_Prune; } + default: return WRC_Continue; } diff --git a/test/indexexpr2.test b/test/indexexpr2.test index 589a0589ab..5d387c7523 100644 --- a/test/indexexpr2.test +++ b/test/indexexpr2.test @@ -303,15 +303,74 @@ do_execsql_test 8.0 { INSERT INTO t0(c0) VALUES (NULL); } -breakpoint -do_execsql_test 8.1 { +do_execsql_test 8.1.1 { SELECT * FROM t0 WHERE ~('' BETWEEN t0.c0 AND TRUE); } {{}} - -do_execsql_test 8.2 { +do_execsql_test 8.1.2 { SELECT ~('' BETWEEN t0.c0 AND TRUE) FROM t0; } {-1} +foreach {tn expr} { + 1 " 0 == (34 BETWEEN c0 AND 33)" + 2 " 1 != (34 BETWEEN c0 AND 33)" + 3 "-1 < (34 BETWEEN c0 AND 33)" + 4 "-1 <= (34 BETWEEN c0 AND 33)" + 5 " 1 > (34 BETWEEN c0 AND 33)" + 6 " 1 >= (34 BETWEEN c0 AND 33)" + 7 " 1 - (34 BETWEEN c0 AND 33)" + 8 "-1 + (34 BETWEEN c0 AND 33)" + 9 " 1 | (34 BETWEEN c0 AND 33)" + 10 " 1 << (34 BETWEEN c0 AND 33)" + 11 " 1 >> (34 BETWEEN c0 AND 33)" + 12 " 1 || (34 BETWEEN c0 AND 33)" +} { + do_execsql_test 8.3.$tn.1 "SELECT * FROM t0 WHERE $expr ORDER BY c0" { {} } + do_execsql_test 8.3.$tn.2 "SELECT ($expr) IS TRUE FROM t0" { 1 } +} +do_execsql_test 8.4 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2), (3, 4); + CREATE TABLE t2(x, y); +} + +foreach {tn expr} { + 1 " 0 == (a=0 AND y=1)" + 2 " 1 != (a=0 AND y=1)" + 3 "-1 < (a=0 AND y=1)" + 4 "-1 <= (a=0 AND y=1)" + 5 " 1 > (a=0 AND y=1)" + 6 " 1 >= (a=0 AND y=1)" + 7 " 1 - (a=0 AND y=1)" + 8 "-1 + (a=0 AND y=1)" + 9 " 1 | (a=0 AND y=1)" + 10 "1 << (a=0 AND y=1)" + 11 "1 >> (a=0 AND y=1)" + 12 "1 || (a=0 AND y=1)" + + 13 " 0 == (10 BETWEEN y AND b)" + 14 " 1 != (10 BETWEEN y AND b)" + 15 "-1 < (10 BETWEEN y AND b)" + 16 "-1 <= (10 BETWEEN y AND b)" + 17 " 1 > (10 BETWEEN y AND b)" + 18 " 1 >= (10 BETWEEN y AND b)" + 19 " 1 - (10 BETWEEN y AND b)" + 20 "-1 + (10 BETWEEN y AND b)" + 21 " 1 | (10 BETWEEN y AND b)" + 22 " 1 << (10 BETWEEN y AND b)" + 23 " 1 >> (10 BETWEEN y AND b)" + 24 " 1 || (10 BETWEEN y AND b)" + + 25 " 1 || (10 BETWEEN y AND b)" +} { + do_execsql_test 8.5.$tn.1 " + SELECT * FROM t1 LEFT JOIN t2 WHERE $expr + " {1 2 {} {} 3 4 {} {}} + + do_execsql_test 8.5.$tn.2 " + SELECT ($expr) IS TRUE FROM t1 LEFT JOIN t2 + " {1 1} +} finish_test + From bd717a4d2e5797027b8203a6f68af24be78e4f93 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 29 Aug 2019 21:16:46 +0000 Subject: [PATCH 179/221] Improve vdbe branch coverage of NULLS LAST code. FossilOrigin-Name: e8e9f77d52974f6ba0a536d05837b280a996745deb3a2169bb29379f10e49df4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 2 +- test/nulls1.test | 11 +++++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 68a3beac9d..2d9f39f93c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sother\sproblems\ssimilar\sto\sticket\s[c0390363]. -D 2019-08-29T19:34:29.959 +C Improve\svdbe\sbranch\scoverage\sof\sNULLS\sLAST\scode. +D 2019-08-29T21:16:46.523 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 0a573a77eff9ab22edfbac0519b2147fce414f52af838497b5eb376f1fe60ef5 +F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f @@ -1182,7 +1182,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 5b978fbae9c73b497608c16f2636a2f71de6e2c914e4c78955cf022e39b7a0d5 +F test/nulls1.test 725fb4d99db2ddcce59ca6bf847cd92db8f1af861785918892f84ac3bcd4223d F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 33da6092d3d04b6eb6ab396b8c4f668e3529e26bf11e26f5fcb9b61fe3470197 -R fddd1b4f06a264ef0d3ea52604d276ee +P 96ff2ba9c4bb71d5f7c6f359986a76a5364b7ac3e1a612441543a9eabecf31df +R 586f9989c33ac2fc3f97f5c8be86f8ca U dan -Z 0c2c6f276dc80545da616e6fc4335cce +Z 3e69d63d2ff40a29da3ca94aaeb78df7 diff --git a/manifest.uuid b/manifest.uuid index 4548ec71ce..5e6d961dc6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -96ff2ba9c4bb71d5f7c6f359986a76a5364b7ac3e1a612441543a9eabecf31df \ No newline at end of file +e8e9f77d52974f6ba0a536d05837b280a996745deb3a2169bb29379f10e49df4 \ No newline at end of file diff --git a/src/where.c b/src/where.c index d250990db2..b51d4485c4 100644 --- a/src/where.c +++ b/src/where.c @@ -5216,7 +5216,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ VdbeCoverageIf(v, pLevel->op==OP_VNext); if( pLevel->regBignull ){ sqlite3VdbeResolveLabel(v, pLevel->addrBignull); - sqlite3VdbeAddOp2(v, OP_IfNotZero, pLevel->regBignull, pLevel->p2-1); + sqlite3VdbeAddOp2(v, OP_DecrJumpZero, pLevel->regBignull, pLevel->p2-1); VdbeCoverage(v); } #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT diff --git a/test/nulls1.test b/test/nulls1.test index 75d398782d..98fc6ab37d 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -236,6 +236,17 @@ do_eqp_test 6.2.2 { `--SEARCH TABLE t5 USING COVERING INDEX t5ab (a=?) } +#------------------------------------------------------------------------- +do_execsql_test 7.0 { + CREATE TABLE t71(a, b, c); + CREATE INDEX t71abc ON t71(a, b, c); + + SELECT * FROM t71 WHERE a=1 AND b=2 ORDER BY c NULLS LAST; + SELECT * FROM t71 WHERE a=1 AND b=2 ORDER BY c DESC NULLS FIRST; + + SELECT * FROM t71 ORDER BY a NULLS LAST; + SELECT * FROM t71 ORDER BY a DESC NULLS FIRST; +} finish_test From f4d9c9822df99cbf29b49a3af6f183aa4992fb36 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 29 Aug 2019 23:24:18 +0000 Subject: [PATCH 180/221] Remove a faulty testcase() macro. FossilOrigin-Name: 80124ae55246b79023d23d3f55487ac3c0b40e8ff301c5daf4dd0631de8ddb29 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 1 - 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2d9f39f93c..e1e281ccd7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\svdbe\sbranch\scoverage\sof\sNULLS\sLAST\scode. -D 2019-08-29T21:16:46.523 +C Remove\sa\sfaulty\stestcase()\smacro. +D 2019-08-29T23:24:18.476 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 13cbe4b8af90685aa1359e6866c8b86177049f9c273a3c9bc47dda473f843977 +F src/expr.c 6b62b44b9210cc4abfb6ca0d58b613824a0dc39e907b10361641bb95e8eec8a3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 96ff2ba9c4bb71d5f7c6f359986a76a5364b7ac3e1a612441543a9eabecf31df -R 586f9989c33ac2fc3f97f5c8be86f8ca -U dan -Z 3e69d63d2ff40a29da3ca94aaeb78df7 +P e8e9f77d52974f6ba0a536d05837b280a996745deb3a2169bb29379f10e49df4 +R 8060576dea17cd03f198b51c19488720 +U drh +Z 568c53db6ad05332ec202be9ff627c3b diff --git a/manifest.uuid b/manifest.uuid index 5e6d961dc6..a94e571162 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e8e9f77d52974f6ba0a536d05837b280a996745deb3a2169bb29379f10e49df4 \ No newline at end of file +80124ae55246b79023d23d3f55487ac3c0b40e8ff301c5daf4dd0631de8ddb29 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index fbed5f9921..b6b204a063 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5112,7 +5112,6 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ case TK_IN: case TK_FUNCTION: testcase( pExpr->op==TK_ISNOT ); - testcase( pExpr->op==TK_NOT ); testcase( pExpr->op==TK_ISNULL ); testcase( pExpr->op==TK_NOTNULL ); testcase( pExpr->op==TK_IS ); From 38cefc83c81842f4d4c1c92958e688c3bac14b79 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 13:07:06 +0000 Subject: [PATCH 181/221] The expression "(x IS FALSE) IS FALSE" does not imply that X is not NULL. Ticket [a6408d42b9f44462] FossilOrigin-Name: 45ff2b1f2693bb0231a864a511bb82cf2a5945ab3d806a5bbaf1517ecb287883 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- test/index6.test | 11 +++++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e1e281ccd7..c05dfbf9f0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sfaulty\stestcase()\smacro. -D 2019-08-29T23:24:18.476 +C The\sexpression\s"(x\sIS\sFALSE)\sIS\sFALSE"\sdoes\snot\simply\sthat\sX\sis\snot\sNULL.\nTicket\s[a6408d42b9f44462] +D 2019-08-30T13:07:06.147 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 6b62b44b9210cc4abfb6ca0d58b613824a0dc39e907b10361641bb95e8eec8a3 +F src/expr.c 5f9d677be65dd8f636eedb598e3c68c9a72bc39fa753d952df2adea96ade17be F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1047,7 +1047,7 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test 7883c35749e3f38282572194ffdbe7d025b1e2938c1e67da2d408ff3c27d9a46 +F test/index6.test 4286a391c34586bc4d6cc0f68c6505c7b0f5b9afe8cb98fe415eefffb2384cb4 F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e8e9f77d52974f6ba0a536d05837b280a996745deb3a2169bb29379f10e49df4 -R 8060576dea17cd03f198b51c19488720 +P 80124ae55246b79023d23d3f55487ac3c0b40e8ff301c5daf4dd0631de8ddb29 +R cd2bfff061492eccfe83623c7f6b6353 U drh -Z 568c53db6ad05332ec202be9ff627c3b +Z 295dda45dc991784101709d0169e56ad diff --git a/manifest.uuid b/manifest.uuid index a94e571162..d23972f86e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -80124ae55246b79023d23d3f55487ac3c0b40e8ff301c5daf4dd0631de8ddb29 \ No newline at end of file +45ff2b1f2693bb0231a864a511bb82cf2a5945ab3d806a5bbaf1517ecb287883 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b6b204a063..46aea5f3d0 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5036,7 +5036,7 @@ static int exprImpliesNotNull( case TK_TRUTH: { if( seenNot ) return 0; if( p->op2!=TK_IS ) return 0; - return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); } case TK_BITNOT: case TK_NOT: { diff --git a/test/index6.test b/test/index6.test index 5faf0f02ac..09b8e1cf92 100644 --- a/test/index6.test +++ b/test/index6.test @@ -437,4 +437,15 @@ do_execsql_test index6-14.2 { SELECT * FROM t0 WHERE CASE c0 WHEN 0 THEN 0 ELSE 1 END; } {{} row} +# 2019-08-30 +# Ticket https://www.sqlite.org/src/info/a6408d42b9f44462 +# +do_execsql_test index6-15.1 { + DROP TABLE t0; + CREATE TABLE t0(c0); + INSERT INTO t0(c0) VALUES (NULL); + CREATE INDEX i0 ON t0(1) WHERE c0 NOT NULL; + SELECT 1 FROM t0 WHERE (t0.c0 IS FALSE) IS FALSE; +} {1} + finish_test From 7a231b49738d82582d9f4c31da18da90928d6f10 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 15:11:08 +0000 Subject: [PATCH 182/221] The expression "(X IS FALSE) BETWEEN FALSE AND TRUE" does not implie that X is not NULL. Ticket [fba33c8b1df6a915] FossilOrigin-Name: 057fb8b1809b8b9c8fff0fd0804153b9644f0545c23c6ddc4758bda3381094b9 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 11 +++++++---- test/index6.test | 10 ++++++++++ 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index c05dfbf9f0..e12f380013 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sexpression\s"(x\sIS\sFALSE)\sIS\sFALSE"\sdoes\snot\simply\sthat\sX\sis\snot\sNULL.\nTicket\s[a6408d42b9f44462] -D 2019-08-30T13:07:06.147 +C The\sexpression\s"(X\sIS\sFALSE)\sBETWEEN\sFALSE\sAND\sTRUE"\sdoes\snot\simplie\sthat\nX\sis\snot\sNULL.\s\sTicket\s[fba33c8b1df6a915] +D 2019-08-30T15:11:08.913 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 5f9d677be65dd8f636eedb598e3c68c9a72bc39fa753d952df2adea96ade17be +F src/expr.c e1d261e3d2ddd29d49d645bf2b919f37b842fa5fc41a936b2dcc3e5a309d58c0 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1047,7 +1047,7 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test 4286a391c34586bc4d6cc0f68c6505c7b0f5b9afe8cb98fe415eefffb2384cb4 +F test/index6.test 5b016266f0e823b2a27724da25c18fe38feb474006f9604d9d5f996bfef75b68 F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 80124ae55246b79023d23d3f55487ac3c0b40e8ff301c5daf4dd0631de8ddb29 -R cd2bfff061492eccfe83623c7f6b6353 +P 45ff2b1f2693bb0231a864a511bb82cf2a5945ab3d806a5bbaf1517ecb287883 +R 9c64b300fe2525056b87d63bc987465b U drh -Z 295dda45dc991784101709d0169e56ad +Z 75ee72b9565e384807e78e8394c68f11 diff --git a/manifest.uuid b/manifest.uuid index d23972f86e..0f4dbf8996 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45ff2b1f2693bb0231a864a511bb82cf2a5945ab3d806a5bbaf1517ecb287883 \ No newline at end of file +057fb8b1809b8b9c8fff0fd0804153b9644f0545c23c6ddc4758bda3381094b9 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 46aea5f3d0..27929767c9 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4974,13 +4974,16 @@ int sqlite3ExprCompareSkip(Expr *pA, Expr *pB, int iTab){ /* ** Return non-zero if Expr p can only be true if pNN is not NULL. +** +** Or if seenNot is true, return non-zero if Expr p can only be +** non-NULL if pNN is not NULL */ static int exprImpliesNotNull( Parse *pParse, /* Parsing context */ Expr *p, /* The expression to be checked */ Expr *pNN, /* The expression that is NOT NULL */ int iTab, /* Table being evaluated */ - int seenNot /* True if p is an operand of NOT */ + int seenNot /* Return true only if p can be any non-NULL value */ ){ assert( p ); assert( pNN ); @@ -4999,12 +5002,12 @@ static int exprImpliesNotNull( assert( pList!=0 ); assert( pList->nExpr==2 ); if( seenNot ) return 0; - if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, seenNot) - || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, seenNot) + if( exprImpliesNotNull(pParse, pList->a[0].pExpr, pNN, iTab, 1) + || exprImpliesNotNull(pParse, pList->a[1].pExpr, pNN, iTab, 1) ){ return 1; } - return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); } case TK_EQ: case TK_NE: diff --git a/test/index6.test b/test/index6.test index 09b8e1cf92..d32e909e10 100644 --- a/test/index6.test +++ b/test/index6.test @@ -439,6 +439,7 @@ do_execsql_test index6-14.2 { # 2019-08-30 # Ticket https://www.sqlite.org/src/info/a6408d42b9f44462 +# Ticket https://www.sqlite.org/src/info/fba33c8b1df6a915 # do_execsql_test index6-15.1 { DROP TABLE t0; @@ -447,5 +448,14 @@ do_execsql_test index6-15.1 { CREATE INDEX i0 ON t0(1) WHERE c0 NOT NULL; SELECT 1 FROM t0 WHERE (t0.c0 IS FALSE) IS FALSE; } {1} +do_execsql_test index6-15.2 { + SELECT 1 FROM t0 WHERE (t0.c0 IS FALSE) BETWEEN FALSE AND TRUE; +} {1} +do_execsql_test index6-15.3 { + SELECT 1 FROM t0 WHERE TRUE BETWEEN (t0.c0 IS FALSE) AND TRUE; +} {1} +do_execsql_test index6-15.4 { + SELECT 1 FROM t0 WHERE FALSE BETWEEN FALSE AND (t0.c0 IS FALSE); +} {1} finish_test From ae144a1c9fc092e8756f66cd8d60b80dbbd1e010 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 16:00:58 +0000 Subject: [PATCH 183/221] The expression "(X IS FALSE) IN (FALSE)" does not imply that X is NOT NULL. Ticket [f8f472cbc77ba9c9] FossilOrigin-Name: dd66134817ecbda01c59a05ad0d6ac44bee700ab10cd2119c869dd69af293fe2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- test/index6.test | 5 +++++ 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e12f380013..f9cae012c2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sexpression\s"(X\sIS\sFALSE)\sBETWEEN\sFALSE\sAND\sTRUE"\sdoes\snot\simplie\sthat\nX\sis\snot\sNULL.\s\sTicket\s[fba33c8b1df6a915] -D 2019-08-30T15:11:08.913 +C The\sexpression\s"(X\sIS\sFALSE)\sIN\s(FALSE)"\sdoes\snot\simply\sthat\sX\sis\sNOT\sNULL.\nTicket\s[f8f472cbc77ba9c9] +D 2019-08-30T16:00:58.750 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c e1d261e3d2ddd29d49d645bf2b919f37b842fa5fc41a936b2dcc3e5a309d58c0 +F src/expr.c e1b74116375bb88c1b4b90b635d417dcd0643ac46bacf5a3caefef60c8e5e115 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1047,7 +1047,7 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test 5b016266f0e823b2a27724da25c18fe38feb474006f9604d9d5f996bfef75b68 +F test/index6.test bae04b456a1845d8d48af751ac5b9bba5571551b96ef39d2b5b1db48cadd0fac F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 45ff2b1f2693bb0231a864a511bb82cf2a5945ab3d806a5bbaf1517ecb287883 -R 9c64b300fe2525056b87d63bc987465b +P 057fb8b1809b8b9c8fff0fd0804153b9644f0545c23c6ddc4758bda3381094b9 +R dbd65dd02f8837e1f86624f44fe9aa97 U drh -Z 75ee72b9565e384807e78e8394c68f11 +Z 96ee8b9606bd233ac998576dd644ea25 diff --git a/manifest.uuid b/manifest.uuid index 0f4dbf8996..98bf5de4ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -057fb8b1809b8b9c8fff0fd0804153b9644f0545c23c6ddc4758bda3381094b9 \ No newline at end of file +dd66134817ecbda01c59a05ad0d6ac44bee700ab10cd2119c869dd69af293fe2 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 27929767c9..e87ff70507 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4995,7 +4995,7 @@ static int exprImpliesNotNull( if( seenNot && ExprHasProperty(p, EP_xIsSelect) ) return 0; assert( ExprHasProperty(p,EP_xIsSelect) || (p->x.pList!=0 && p->x.pList->nExpr>0) ); - return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, seenNot); + return exprImpliesNotNull(pParse, p->pLeft, pNN, iTab, 1); } case TK_BETWEEN: { ExprList *pList = p->x.pList; diff --git a/test/index6.test b/test/index6.test index d32e909e10..d5bc77c0db 100644 --- a/test/index6.test +++ b/test/index6.test @@ -440,6 +440,7 @@ do_execsql_test index6-14.2 { # 2019-08-30 # Ticket https://www.sqlite.org/src/info/a6408d42b9f44462 # Ticket https://www.sqlite.org/src/info/fba33c8b1df6a915 +# https://sqlite.org/src/info/bac716244fddac1fe841 # do_execsql_test index6-15.1 { DROP TABLE t0; @@ -457,5 +458,9 @@ do_execsql_test index6-15.3 { do_execsql_test index6-15.4 { SELECT 1 FROM t0 WHERE FALSE BETWEEN FALSE AND (t0.c0 IS FALSE); } {1} +do_execsql_test index6-15.5 { + SELECT 1 FROM t0 WHERE (c0 IS FALSE) IN (FALSE); +} {1} + finish_test From 8b47f5208247277ee6eaf532e547d4995f56114b Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 30 Aug 2019 16:14:58 +0000 Subject: [PATCH 184/221] Fix a bug in RANGE window functions that use "ORDER BY DESC NULLS FIRST" as the window-frame ORDER BY clause. FossilOrigin-Name: 39b4cad4a51bb5116d62ffb16ac36d96a9280321b049eb2d008605392f52a459 --- manifest | 18 ++++---- manifest.uuid | 2 +- src/window.c | 106 +++++++++++++++++++++++++++++++++++----------- test/window8.tcl | 13 ++++++ test/window8.test | 15 +++++++ 5 files changed, 119 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index f9cae012c2..69eb8d41dd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sexpression\s"(X\sIS\sFALSE)\sIN\s(FALSE)"\sdoes\snot\simply\sthat\sX\sis\sNOT\sNULL.\nTicket\s[f8f472cbc77ba9c9] -D 2019-08-30T16:00:58.750 +C Fix\sa\sbug\sin\sRANGE\swindow\sfunctions\sthat\suse\s"ORDER\sBY\s\sDESC\sNULLS\sFIRST"\sas\sthe\swindow-frame\sORDER\sBY\sclause. +D 2019-08-30T16:14:58.448 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f -F src/window.c 7d74882b41db7f44300489b3513f94f3f95684725e6d8e4e8cede44f015bb4b0 +F src/window.c 701bea99097fd9f2c49e0af54446c986853e639fa297248ea62fac5e3f3b8dba F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1711,8 +1711,8 @@ F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652 F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd -F test/window8.tcl 5884cc884f9605bf88c0d18a534894bf9342f72687bf1bc43ed0cab4c8af7973 -F test/window8.test 48590f3737d17eec503d77769c13ead15d12e8819820b1dc68afe8a3c5bc3250 +F test/window8.tcl 3b63931d608b6f00a9d26368207a7ffc9370c96e3e137ae2aff35284ade69d13 +F test/window8.test 4531204bfb5d833efbd8a5a1527c9871e62f8ae479386f42a7b55bdb5be39df3 F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b @@ -1837,7 +1837,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 057fb8b1809b8b9c8fff0fd0804153b9644f0545c23c6ddc4758bda3381094b9 -R dbd65dd02f8837e1f86624f44fe9aa97 -U drh -Z 96ee8b9606bd233ac998576dd644ea25 +P dd66134817ecbda01c59a05ad0d6ac44bee700ab10cd2119c869dd69af293fe2 +R f9d7b459685c1da5bc61b772c0f2da65 +U dan +Z 05bbd4877d54c35c485e8a33829586c4 diff --git a/manifest.uuid b/manifest.uuid index 98bf5de4ce..7d6528b578 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dd66134817ecbda01c59a05ad0d6ac44bee700ab10cd2119c869dd69af293fe2 \ No newline at end of file +39b4cad4a51bb5116d62ffb16ac36d96a9280321b049eb2d008605392f52a459 \ No newline at end of file diff --git a/src/window.c b/src/window.c index ac8d1080fb..4537559953 100644 --- a/src/window.c +++ b/src/window.c @@ -1854,31 +1854,42 @@ static void windowIfNewPeer( /* ** This function is called as part of generating VM programs for RANGE ** offset PRECEDING/FOLLOWING frame boundaries. Assuming "ASC" order for -** the ORDER BY term in the window, it generates code equivalent to: +** the ORDER BY term in the window, and that argument op is OP_Ge, it generates +** code equivalent to: ** ** if( csr1.peerVal + regVal >= csr2.peerVal ) goto lbl; ** -** A special type of arithmetic is used such that if csr.peerVal is not -** a numeric type (real or integer), then the result of the addition is -** a copy of csr1.peerVal. +** The value of parameter op may also be OP_Gt or OP_Le. In these cases the +** operator in the above pseudo-code is replaced with ">" or "<=", respectively. +** +** If the sort-order for the ORDER BY term in the window is DESC, then the +** comparison is reversed. Instead of adding regVal to csr1.peerVal, it is +** subtracted. And the comparison operator is inverted to - ">=" becomes "<=", +** ">" becomes "<", and so on. So, with DESC sort order, if the argument op +** is OP_Ge, the generated code is equivalent to: +** +** if( csr1.peerVal - regVal <= csr2.peerVal ) goto lbl; +** +** A special type of arithmetic is used such that if csr1.peerVal is not +** a numeric type (real or integer), then the result of the addition addition +** or subtraction is a a copy of csr1.peerVal. */ static void windowCodeRangeTest( WindowCodeArg *p, int op, /* OP_Ge, OP_Gt, or OP_Le */ - int csr1, - int regVal, - int csr2, - int lbl + int csr1, /* Cursor number for cursor 1 */ + int regVal, /* Register containing non-negative number */ + int csr2, /* Cursor number for cursor 2 */ + int lbl /* Jump destination if the condition is true */ ){ Parse *pParse = p->pParse; Vdbe *v = sqlite3GetVdbe(pParse); - int reg1 = sqlite3GetTempReg(pParse); - int reg2 = sqlite3GetTempReg(pParse); - int arith = OP_Add; - int addrGe; - ExprList *pOrderBy = p->pMWin->pOrderBy; - - int regString = ++pParse->nMem; + ExprList *pOrderBy = p->pMWin->pOrderBy; /* ORDER BY clause for this window */ + int reg1 = sqlite3GetTempReg(pParse); /* Register for csr1.peerVal+regVal */ + int reg2 = sqlite3GetTempReg(pParse); /* Regiser for csr2.peerVal */ + int regString = ++pParse->nMem; /* Register for constant value '' */ + int arith = OP_Add; /* OP_Add or OP_Subtract */ + int addrGe; /* Jump destination */ assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); assert( pOrderBy && pOrderBy->nExpr==1 ); @@ -1891,47 +1902,92 @@ static void windowCodeRangeTest( arith = OP_Subtract; } + /* Read the peer-value from each cursor into a register */ windowReadPeerValues(p, csr1, reg1); windowReadPeerValues(p, csr2, reg2); - /* Check if the peer value for csr1 value is a text or blob by comparing - ** it to the smallest possible string - ''. If it is, jump over the - ** OP_Add or OP_Subtract operation and proceed directly to the comparison. */ + VdbeModuleComment((v, "CodeRangeTest: if( R%d %s R%d %s R%d ) goto lbl", + reg1, (arith==OP_Add ? "+" : "-"), regVal, + ((op==OP_Ge) ? ">=" : (op==OP_Le) ? "<=" : (op==OP_Gt) ? ">" : "<"), reg2 + )); + + /* Register reg1 currently contains csr1.peerVal (the peer-value from csr1). + ** This block adds (or subtracts for DESC) the numeric value in regVal + ** from it. Or, if reg1 is not numeric (it is a NULL, a text value or a blob), + ** then leave reg1 as it is. In pseudo-code, this is implemented as: + ** + ** if( reg1>='' ) goto addrGe; + ** reg1 = reg1 +/- regVal + ** addrGe: + ** + ** Since all strings and blobs are greater-than-or-equal-to an empty string, + ** the add/subtract is skipped for these, as required. If reg1 is a NULL, + ** then the arithmetic is performed, but since adding or subtracting from + ** NULL is always NULL anyway, this case is handled as required too. */ sqlite3VdbeAddOp4(v, OP_String8, 0, regString, 0, "", P4_STATIC); addrGe = sqlite3VdbeAddOp3(v, OP_Ge, regString, 0, reg1); VdbeCoverage(v); sqlite3VdbeAddOp3(v, arith, regVal, reg1, reg1); sqlite3VdbeJumpHere(v, addrGe); + + /* If the BIGNULL flag is set for the ORDER BY, then it is required to + ** consider NULL values to be larger than all other values, instead of + ** the usual smaller. The VDBE opcodes OP_Ge and so on do not handle this + ** (and adding that capability causes a performance regression), so + ** instead if the BIGNULL flag is set then cases where either reg1 or + ** reg2 are NULL are handled separately in the following block. The code + ** generated is equivalent to: + ** + ** if( reg1 IS NULL ){ + ** if( op==OP_Gt ) goto lbl; + ** if( op==OP_Ge && reg2 IS NOT NULL ) goto lbl; + ** if( op==OP_Le && reg2 IS NULL ) goto lbl; + ** }else if( reg2 IS NULL ){ + ** if( op==OP_Le ) goto lbl; + ** } + ** + ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is + ** not taken, control jumps over the comparison operator coded below this + ** block. */ if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ - int addr; - addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); + /* This block runs if reg1 contains a NULL. */ + int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); switch( op ){ - case OP_Ge: sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); break; + case OP_Ge: + sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); + break; case OP_Gt: sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); VdbeCoverage(v); break; - default: - assert( op==OP_Le ); + default: assert( op==OP_Le ); sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); break; } - sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+2); + sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+3); + + /* This block runs if reg1 is not NULL, but reg2 is. */ sqlite3VdbeJumpHere(v, addr); sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); if( op==OP_Gt || op==OP_Ge ){ sqlite3VdbeChangeP2(v, -1, sqlite3VdbeCurrentAddr(v)+1); } } + + /* Compare registers reg2 and reg1, taking the jump if required. Note that + ** control skips over this test if the BIGNULL flag is set and either + ** reg1 or reg2 contain a NULL value. */ sqlite3VdbeAddOp3(v, op, reg2, lbl, reg1); VdbeCoverage(v); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); + assert( op==OP_Ge || op==OP_Gt || op==OP_Lt || op==OP_Le ); testcase(op==OP_Ge); VdbeCoverageIf(v, op==OP_Ge); testcase(op==OP_Lt); VdbeCoverageIf(v, op==OP_Lt); testcase(op==OP_Le); VdbeCoverageIf(v, op==OP_Le); testcase(op==OP_Gt); VdbeCoverageIf(v, op==OP_Gt); - sqlite3ReleaseTempReg(pParse, reg1); sqlite3ReleaseTempReg(pParse, reg2); + + VdbeModuleComment((v, "CodeRangeTest: end")); } /* diff --git a/test/window8.tcl b/test/window8.tcl index 64fd98aea9..d881fd8e4b 100644 --- a/test/window8.tcl +++ b/test/window8.tcl @@ -247,6 +247,18 @@ execsql_test 4.4.4 { ) FROM t1 ORDER BY 1 NULLS LAST; } +execsql_test 4.5.1 { + SELECT sum(b) OVER ( + ORDER BY a ASC NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} +execsql_test 4.5.2 { + SELECT sum(b) OVER ( + ORDER BY a DESC NULLS FIRST RANGE + BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} + ========== execsql_test 5.0 { @@ -329,6 +341,7 @@ execsql_test 6.2 { FROM t2 } +========== finish_test diff --git a/test/window8.test b/test/window8.test index e149979cd4..53d3e30027 100644 --- a/test/window8.test +++ b/test/window8.test @@ -3579,6 +3579,19 @@ do_execsql_test 4.4.4 { ) FROM t1 ORDER BY 1 NULLS LAST; } {5 6 8 9 10} +do_execsql_test 4.5.1 { + SELECT sum(b) OVER ( + ORDER BY a ASC NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} {9 9 15 15 15} + +do_execsql_test 4.5.2 { + SELECT sum(b) OVER ( + ORDER BY a DESC NULLS FIRST RANGE + BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING + ) FROM t1 ORDER BY 1 NULLS LAST; +} {6 6 6 15 15} + #========================================================================== do_execsql_test 5.0 { @@ -6190,4 +6203,6 @@ do_execsql_test 6.2 { FROM t2 } {{} A.B A.B} +#========================================================================== + finish_test From ac6627327c01a1f9655e7ac33cb3adab45abc761 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 16:46:12 +0000 Subject: [PATCH 185/221] New test cases for window functions with RANGE BETWEEN and DESC NULLS FIRST. FossilOrigin-Name: f7002f86c780e279c9f8a6268f317586519c059c9de2115ff6f1cad272570c29 --- manifest | 13 ++- manifest.uuid | 2 +- test/windowA.test | 292 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 300 insertions(+), 7 deletions(-) create mode 100644 test/windowA.test diff --git a/manifest b/manifest index 69eb8d41dd..c858e4eba1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sin\sRANGE\swindow\sfunctions\sthat\suse\s"ORDER\sBY\s\sDESC\sNULLS\sFIRST"\sas\sthe\swindow-frame\sORDER\sBY\sclause. -D 2019-08-30T16:14:58.448 +C New\stest\scases\sfor\swindow\sfunctions\swith\sRANGE\sBETWEEN\sand\sDESC\sNULLS\sFIRST. +D 2019-08-30T16:46:12.848 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1714,6 +1714,7 @@ F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af4 F test/window8.tcl 3b63931d608b6f00a9d26368207a7ffc9370c96e3e137ae2aff35284ade69d13 F test/window8.test 4531204bfb5d833efbd8a5a1527c9871e62f8ae479386f42a7b55bdb5be39df3 F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 +F test/windowA.test 5cd7c8dc3b2fcdfc6ea122c81a35726106880ae75afd097f62061839aff13b71 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 @@ -1837,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dd66134817ecbda01c59a05ad0d6ac44bee700ab10cd2119c869dd69af293fe2 -R f9d7b459685c1da5bc61b772c0f2da65 -U dan -Z 05bbd4877d54c35c485e8a33829586c4 +P 39b4cad4a51bb5116d62ffb16ac36d96a9280321b049eb2d008605392f52a459 +R 5b7566c6e8c614d220a50ba45c732f15 +U drh +Z 7f59914616f53a7b55c42685c9ae4ee5 diff --git a/manifest.uuid b/manifest.uuid index 7d6528b578..00e9822a33 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -39b4cad4a51bb5116d62ffb16ac36d96a9280321b049eb2d008605392f52a459 \ No newline at end of file +f7002f86c780e279c9f8a6268f317586519c059c9de2115ff6f1cad272570c29 \ No newline at end of file diff --git a/test/windowA.test b/test/windowA.test new file mode 100644 index 0000000000..20c904eee2 --- /dev/null +++ b/test/windowA.test @@ -0,0 +1,292 @@ +# 2019-08-30 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# Test cases for RANGE BETWEEN and especially with NULLS LAST +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix windowA + +ifcapable !windowfunc { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), d FLOAT); + INSERT INTO t1 VALUES + (1, 'A', 5.4), + (2, 'B', 5.55), + (3, 'C', 8.0), + (4, 'D', 10.25), + (5, 'E', 10.26), + (6, 'N', NULL), + (7, 'N', NULL); +} {} + +do_execsql_test 1.1 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS LAST + RANGE BETWEEN 2.50 PRECEDING AND 2.25 FOLLOWING) + ORDER BY +d DESC NULLS LAST, +a; +} [list \ + 5 E 10.26 ED \ + 4 D 10.25 EDC \ + 3 C 8.0 EDC \ + 2 B 5.55 CBA \ + 1 A 5.4 BA \ + 6 N NULL NN \ + 7 N NULL NN \ +] + +do_execsql_test 1.2 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN 2.50 PRECEDING AND 2.25 FOLLOWING) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NN \ + 7 N NULL NN \ + 5 E 10.26 ED \ + 4 D 10.25 EDC \ + 3 C 8.0 EDC \ + 2 B 5.55 CBA \ + 1 A 5.4 BA \ +] + +do_execsql_test 1.3 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS LAST + RANGE BETWEEN 2.50 PRECEDING AND UNBOUNDED FOLLOWING) + ORDER BY +d DESC NULLS LAST, +a; +} [list \ + 5 E 10.26 EDCBANN \ + 4 D 10.25 EDCBANN \ + 3 C 8.0 EDCBANN \ + 2 B 5.55 CBANN \ + 1 A 5.4 BANN \ + 6 N NULL NN \ + 7 N NULL NN \ +] + +do_execsql_test 1.4 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN 2.50 PRECEDING AND UNBOUNDED FOLLOWING) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NNEDCBA \ + 7 N NULL NNEDCBA \ + 5 E 10.26 EDCBA \ + 4 D 10.25 EDCBA \ + 3 C 8.0 EDCBA \ + 2 B 5.55 CBA \ + 1 A 5.4 BA \ +] + +do_execsql_test 1.5 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS LAST + RANGE BETWEEN 2.50 PRECEDING AND CURRENT ROW) + ORDER BY +d DESC NULLS LAST, +a; +} [list \ + 5 E 10.26 E \ + 4 D 10.25 ED \ + 3 C 8.0 EDC \ + 2 B 5.55 CB \ + 1 A 5.4 BA \ + 6 N NULL NN \ + 7 N NULL NN \ +] + +do_execsql_test 1.6 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN 2.50 PRECEDING AND CURRENT ROW) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NN \ + 7 N NULL NN \ + 5 E 10.26 E \ + 4 D 10.25 ED \ + 3 C 8.0 EDC \ + 2 B 5.55 CB \ + 1 A 5.4 BA \ +] + +do_execsql_test 2.1 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS LAST + RANGE BETWEEN UNBOUNDED PRECEDING AND 2.25 FOLLOWING) + ORDER BY +d DESC NULLS LAST, +a; +} [list \ + 5 E 10.26 ED \ + 4 D 10.25 EDC \ + 3 C 8.0 EDC \ + 2 B 5.55 EDCBA \ + 1 A 5.4 EDCBA \ + 6 N NULL EDCBANN \ + 7 N NULL EDCBANN \ +] + +do_execsql_test 2.2 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN UNBOUNDED PRECEDING AND 2.25 FOLLOWING) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NN \ + 7 N NULL NN \ + 5 E 10.26 NNED \ + 4 D 10.25 NNEDC \ + 3 C 8.0 NNEDC \ + 2 B 5.55 NNEDCBA \ + 1 A 5.4 NNEDCBA \ +] + +do_execsql_test 2.3 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS LAST + RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) + ORDER BY +d DESC NULLS LAST, +a; +} [list \ + 5 E 10.26 EDCBANN \ + 4 D 10.25 EDCBANN \ + 3 C 8.0 EDCBANN \ + 2 B 5.55 EDCBANN \ + 1 A 5.4 EDCBANN \ + 6 N NULL EDCBANN \ + 7 N NULL EDCBANN \ +] + +do_execsql_test 2.4 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NNEDCBA \ + 7 N NULL NNEDCBA \ + 5 E 10.26 NNEDCBA \ + 4 D 10.25 NNEDCBA \ + 3 C 8.0 NNEDCBA \ + 2 B 5.55 NNEDCBA \ + 1 A 5.4 NNEDCBA \ +] + +do_execsql_test 2.5 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS LAST + RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) + ORDER BY +d DESC NULLS LAST, +a; +} [list \ + 5 E 10.26 E \ + 4 D 10.25 ED \ + 3 C 8.0 EDC \ + 2 B 5.55 EDCB \ + 1 A 5.4 EDCBA \ + 6 N NULL EDCBANN \ + 7 N NULL EDCBANN \ +] + +do_execsql_test 2.6 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NN \ + 7 N NULL NN \ + 5 E 10.26 NNE \ + 4 D 10.25 NNED \ + 3 C 8.0 NNEDC \ + 2 B 5.55 NNEDCB \ + 1 A 5.4 NNEDCBA \ +] + + +do_execsql_test 3.1 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS LAST + RANGE BETWEEN CURRENT ROW AND 2.25 FOLLOWING) + ORDER BY +d DESC NULLS LAST, +a; +} [list \ + 5 E 10.26 ED \ + 4 D 10.25 DC \ + 3 C 8.0 C \ + 2 B 5.55 BA \ + 1 A 5.4 A \ + 6 N NULL NN \ + 7 N NULL NN \ +] + +do_execsql_test 3.2 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN CURRENT ROW AND 2.25 FOLLOWING) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NN \ + 7 N NULL NN \ + 5 E 10.26 ED \ + 4 D 10.25 DC \ + 3 C 8.0 C \ + 2 B 5.55 BA \ + 1 A 5.4 A \ +] + +do_execsql_test 3.3 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS LAST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + ORDER BY +d DESC NULLS LAST, +a; +} [list \ + 5 E 10.26 EDCBANN \ + 4 D 10.25 DCBANN \ + 3 C 8.0 CBANN \ + 2 B 5.55 BANN \ + 1 A 5.4 ANN \ + 6 N NULL NN \ + 7 N NULL NN \ +] + +do_execsql_test 3.4 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NNEDCBA \ + 7 N NULL NNEDCBA \ + 5 E 10.26 EDCBA \ + 4 D 10.25 DCBA \ + 3 C 8.0 CBA \ + 2 B 5.55 BA \ + 1 A 5.4 A \ +] + +finish_test From 1cac1766df5515b4984e001a9aabccbd506f3dda Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 30 Aug 2019 17:28:55 +0000 Subject: [PATCH 186/221] Add further comments to window.c. FossilOrigin-Name: 900464567b2a5ce0c278a3297e4be1968f609258608aa0fbe2fc67709aa22a4b --- manifest | 14 ++++---- manifest.uuid | 2 +- src/window.c | 95 +++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 85 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index c858e4eba1..e990056a98 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sfor\swindow\sfunctions\swith\sRANGE\sBETWEEN\sand\sDESC\sNULLS\sFIRST. -D 2019-08-30T16:46:12.848 +C Add\sfurther\scomments\sto\swindow.c. +D 2019-08-30T17:28:55.760 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f -F src/window.c 701bea99097fd9f2c49e0af54446c986853e639fa297248ea62fac5e3f3b8dba +F src/window.c ff37ca403ad3c47bb1e60b0e88c546aa5194524dc20d7f75e866187a093ae5d7 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 39b4cad4a51bb5116d62ffb16ac36d96a9280321b049eb2d008605392f52a459 -R 5b7566c6e8c614d220a50ba45c732f15 -U drh -Z 7f59914616f53a7b55c42685c9ae4ee5 +P f7002f86c780e279c9f8a6268f317586519c059c9de2115ff6f1cad272570c29 +R 717428315655334cbf16abae9c8648f7 +U dan +Z e01e05b9266977bc594b107aacdc1011 diff --git a/manifest.uuid b/manifest.uuid index 00e9822a33..e5c97e32cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f7002f86c780e279c9f8a6268f317586519c059c9de2115ff6f1cad272570c29 \ No newline at end of file +900464567b2a5ce0c278a3297e4be1968f609258608aa0fbe2fc67709aa22a4b \ No newline at end of file diff --git a/src/window.c b/src/window.c index 4537559953..fbb60b9c40 100644 --- a/src/window.c +++ b/src/window.c @@ -1499,19 +1499,78 @@ static void windowAggStep( typedef struct WindowCodeArg WindowCodeArg; typedef struct WindowCsrAndReg WindowCsrAndReg; + +/* +** See comments above struct WindowCodeArg. +*/ struct WindowCsrAndReg { - int csr; - int reg; + int csr; /* Cursor number */ + int reg; /* First in array of peer values */ }; +/* +** A single instance of this structure is allocated on the stack by +** sqlite3WindowCodeStep() and a pointer to it passed to the various helper +** routines. This is to reduce the number of arguments required by each +** helper function. +** +** regArg: +** Each window function requires an accumulator register (just as an +** ordinary aggregate function does). This variable is set to the first +** in an array of accumulator registers - one for each window function +** in the WindowCodeArg.pMWin list. +** +** eDelete: +** The window functions implementation sometimes caches the input rows +** that it processes in a temporary table. If it is not zero, this +** variable indicates when rows may be removed from the temp table (in +** order to reduce memory requirements - it would always be safe just +** to leave them there). Possible values for eDelete are: +** +** WINDOW_RETURN_ROW: +** An input row can be discarded after it is returned to the caller. +** +** WINDOW_AGGINVERSE: +** An input row can be discarded after the window functions xInverse() +** callbacks have been invoked in it. +** +** WINDOW_AGGSTEP: +** An input row can be discarded after the window functions xStep() +** callbacks have been invoked in it. +** +** start,current,end +** Consider a window-frame similar to the following: +** +** (ORDER BY a, b GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING) +** +** The windows functions implmentation caches the input rows in a temp +** table, sorted by "a, b" (it actually populates the cache lazily, and +** aggressively removes rows once they are no longer required, but that's +** a mere detail). It keeps three cursors open on the temp table. One +** (current) that points to the next row to return to the query engine +** once its window function values have been calculated. Another (end) +** points to the next row to call the xStep() method of each window function +** on (so that it is 2 groups ahead of current). And a third (start) that +** points to the next row to call the xInverse() method of each window +** function on. +** +** Each cursor (start, current and end) consists of a VDBE cursor +** (WindowCsrAndReg.csr) and an array of registers (starting at +** WindowCodeArg.reg) that always contains a copy of the peer values +** read from the corresponding cursor. +** +** Depending on the window-frame in question, all three cursors may not +** be required. In this case both WindowCodeArg.csr and reg are set to +** 0. +*/ struct WindowCodeArg { - Parse *pParse; - Window *pMWin; - Vdbe *pVdbe; - int regGosub; - int addrGosub; - int regArg; - int eDelete; + Parse *pParse; /* Parse context */ + Window *pMWin; /* First in list of functions being processed */ + Vdbe *pVdbe; /* VDBE object */ + int addrGosub; /* OP_Gosub to this address to return one row */ + int regGosub; /* Register used with OP_Gosub(addrGosub) */ + int regArg; /* First in array of accumulator registers */ + int eDelete; /* See above */ WindowCsrAndReg start; WindowCsrAndReg current; @@ -1876,18 +1935,18 @@ static void windowIfNewPeer( */ static void windowCodeRangeTest( WindowCodeArg *p, - int op, /* OP_Ge, OP_Gt, or OP_Le */ - int csr1, /* Cursor number for cursor 1 */ - int regVal, /* Register containing non-negative number */ - int csr2, /* Cursor number for cursor 2 */ - int lbl /* Jump destination if the condition is true */ + int op, /* OP_Ge, OP_Gt, or OP_Le */ + int csr1, /* Cursor number for cursor 1 */ + int regVal, /* Register containing non-negative number */ + int csr2, /* Cursor number for cursor 2 */ + int lbl /* Jump destination if condition is true */ ){ Parse *pParse = p->pParse; Vdbe *v = sqlite3GetVdbe(pParse); - ExprList *pOrderBy = p->pMWin->pOrderBy; /* ORDER BY clause for this window */ - int reg1 = sqlite3GetTempReg(pParse); /* Register for csr1.peerVal+regVal */ - int reg2 = sqlite3GetTempReg(pParse); /* Regiser for csr2.peerVal */ - int regString = ++pParse->nMem; /* Register for constant value '' */ + ExprList *pOrderBy = p->pMWin->pOrderBy; /* ORDER BY clause for window */ + int reg1 = sqlite3GetTempReg(pParse); /* Reg. for csr1.peerVal+regVal */ + int reg2 = sqlite3GetTempReg(pParse); /* Reg. for csr2.peerVal */ + int regString = ++pParse->nMem; /* Reg. for constant value '' */ int arith = OP_Add; /* OP_Add or OP_Subtract */ int addrGe; /* Jump destination */ From db3a32ed1cfb3b90cc5baa9df54e48afa9b18ee6 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 18:02:49 +0000 Subject: [PATCH 187/221] Back out the change at [47cd634c98b502d4] which was incorrect. Add a test case so that we don't accidently back out that change again. FossilOrigin-Name: 596ac2a4eab28b74f4050fb4eb71883f2a1421fdbccf302413e4653391bb52c9 --- manifest | 17 +++++++++-------- manifest.uuid | 2 +- src/window.c | 9 ++++++--- test/windowA.test | 17 +++++++++++++++++ 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index e990056a98..9688a40bb9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sfurther\scomments\sto\swindow.c. -D 2019-08-30T17:28:55.760 +C Back\sout\sthe\schange\sat\s[47cd634c98b502d4]\swhich\swas\sincorrect.\s\sAdd\sa\stest\ncase\sso\sthat\swe\sdon't\saccidently\sback\sout\sthat\schange\sagain. +D 2019-08-30T18:02:49.143 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f -F src/window.c ff37ca403ad3c47bb1e60b0e88c546aa5194524dc20d7f75e866187a093ae5d7 +F src/window.c 9f55b65411e1d37fa51b78afdeed16b73c73f1d97a052ee58c91c724a1b615d8 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1714,7 +1714,7 @@ F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af4 F test/window8.tcl 3b63931d608b6f00a9d26368207a7ffc9370c96e3e137ae2aff35284ade69d13 F test/window8.test 4531204bfb5d833efbd8a5a1527c9871e62f8ae479386f42a7b55bdb5be39df3 F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 -F test/windowA.test 5cd7c8dc3b2fcdfc6ea122c81a35726106880ae75afd097f62061839aff13b71 +F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 @@ -1838,7 +1838,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f7002f86c780e279c9f8a6268f317586519c059c9de2115ff6f1cad272570c29 -R 717428315655334cbf16abae9c8648f7 -U dan -Z e01e05b9266977bc594b107aacdc1011 +P 900464567b2a5ce0c278a3297e4be1968f609258608aa0fbe2fc67709aa22a4b +Q -47cd634c98b502d40a493455ba6d73cbd0dae74944f9cf06fcbcd025f4b49d6e +R 29d0b25ea3e14a5d62e6dc7f8a60e5a3 +U drh +Z 198db2b82ee9fb9cef5cc67ca7c92ad8 diff --git a/manifest.uuid b/manifest.uuid index e5c97e32cd..aa386daac4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -900464567b2a5ce0c278a3297e4be1968f609258608aa0fbe2fc67709aa22a4b \ No newline at end of file +596ac2a4eab28b74f4050fb4eb71883f2a1421fdbccf302413e4653391bb52c9 \ No newline at end of file diff --git a/src/window.c b/src/window.c index fbb60b9c40..ad709bb036 100644 --- a/src/window.c +++ b/src/window.c @@ -2016,11 +2016,14 @@ static void windowCodeRangeTest( sqlite3VdbeAddOp2(v, OP_Goto, 0, lbl); break; case OP_Gt: - sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_NotNull, reg2, lbl); + VdbeCoverage(v); break; - default: assert( op==OP_Le ); - sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); VdbeCoverage(v); + case OP_Le: + sqlite3VdbeAddOp2(v, OP_IsNull, reg2, lbl); + VdbeCoverage(v); break; + default: assert( op==OP_Lt ); /* no-op */ break; } sqlite3VdbeAddOp2(v, OP_Goto, 0, sqlite3VdbeCurrentAddr(v)+3); diff --git a/test/windowA.test b/test/windowA.test index 20c904eee2..e94ae57e43 100644 --- a/test/windowA.test +++ b/test/windowA.test @@ -289,4 +289,21 @@ do_execsql_test 3.4 { 1 A 5.4 A \ ] +do_execsql_test 4.0 { + SELECT a, b, quote(d), group_concat(b,'') OVER w1 FROM t1 + WINDOW w1 AS + (ORDER BY d DESC NULLS FIRST + RANGE BETWEEN 2.50 PRECEDING AND 0.5 PRECEDING) + ORDER BY +d DESC NULLS FIRST, +a; +} [list \ + 6 N NULL NN \ + 7 N NULL NN \ + 5 E 10.26 {} \ + 4 D 10.25 {} \ + 3 C 8.0 ED \ + 2 B 5.55 C \ + 1 A 5.4 {} \ +] + + finish_test From 9889ede28dd20ca1a2093a125cb38160eeb2c01a Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 30 Aug 2019 19:45:03 +0000 Subject: [PATCH 188/221] Add test case to window8.test. Also fix an error in a comment in window.c. FossilOrigin-Name: 2925bfa5971c8557ecaa6ac18df0825ebbbd1622017509e83451d90640146fa8 --- manifest | 19 +++++++++---------- manifest.uuid | 2 +- src/window.c | 4 ++-- test/window8.tcl | 16 ++++++++++++++++ test/window8.test | 17 +++++++++++++++++ 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 9688a40bb9..5830119222 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Back\sout\sthe\schange\sat\s[47cd634c98b502d4]\swhich\swas\sincorrect.\s\sAdd\sa\stest\ncase\sso\sthat\swe\sdon't\saccidently\sback\sout\sthat\schange\sagain. -D 2019-08-30T18:02:49.143 +C Add\stest\scase\sto\swindow8.test.\sAlso\sfix\san\serror\sin\sa\scomment\sin\swindow.c. +D 2019-08-30T19:45:03.375 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f -F src/window.c 9f55b65411e1d37fa51b78afdeed16b73c73f1d97a052ee58c91c724a1b615d8 +F src/window.c 96b0c033d33408f16ac8b177eac6362ee53a23d9b6d7a51a04289ab2f956bb77 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1711,8 +1711,8 @@ F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652 F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd -F test/window8.tcl 3b63931d608b6f00a9d26368207a7ffc9370c96e3e137ae2aff35284ade69d13 -F test/window8.test 4531204bfb5d833efbd8a5a1527c9871e62f8ae479386f42a7b55bdb5be39df3 +F test/window8.tcl 112bdc96dd310cfef93119fc5e4e9108c322080676fdb006ccc98d67d41c8acb +F test/window8.test 85ad3bd55615482c7a93f5286f0b0968f86ad0d62df5bca2f0ea50699e5aef31 F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 @@ -1838,8 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 900464567b2a5ce0c278a3297e4be1968f609258608aa0fbe2fc67709aa22a4b -Q -47cd634c98b502d40a493455ba6d73cbd0dae74944f9cf06fcbcd025f4b49d6e -R 29d0b25ea3e14a5d62e6dc7f8a60e5a3 -U drh -Z 198db2b82ee9fb9cef5cc67ca7c92ad8 +P 596ac2a4eab28b74f4050fb4eb71883f2a1421fdbccf302413e4653391bb52c9 +R 94fb5a9c76dec8423f58b92f29509529 +U dan +Z c980e1f35bfd2a5c73fbb1e591fe4935 diff --git a/manifest.uuid b/manifest.uuid index aa386daac4..a68d49dff1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -596ac2a4eab28b74f4050fb4eb71883f2a1421fdbccf302413e4653391bb52c9 \ No newline at end of file +2925bfa5971c8557ecaa6ac18df0825ebbbd1622017509e83451d90640146fa8 \ No newline at end of file diff --git a/src/window.c b/src/window.c index ad709bb036..7cb86e58be 100644 --- a/src/window.c +++ b/src/window.c @@ -1998,8 +1998,8 @@ static void windowCodeRangeTest( ** generated is equivalent to: ** ** if( reg1 IS NULL ){ - ** if( op==OP_Gt ) goto lbl; - ** if( op==OP_Ge && reg2 IS NOT NULL ) goto lbl; + ** if( op==OP_Ge ) goto lbl; + ** if( op==OP_Gt && reg2 IS NOT NULL ) goto lbl; ** if( op==OP_Le && reg2 IS NULL ) goto lbl; ** }else if( reg2 IS NULL ){ ** if( op==OP_Le ) goto lbl; diff --git a/test/window8.tcl b/test/window8.tcl index d881fd8e4b..aa934a8267 100644 --- a/test/window8.tcl +++ b/test/window8.tcl @@ -343,6 +343,22 @@ execsql_test 6.2 { ========== +execsql_test 7.0 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER, b INTEGER); + + INSERT INTO t2 VALUES(1, 65); + INSERT INTO t2 VALUES(2, NULL); + INSERT INTO t2 VALUES(3, NULL); + INSERT INTO t2 VALUES(4, NULL); +} + +execsql_test 7.1 { + SELECT sum(a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING + ); +} finish_test diff --git a/test/window8.test b/test/window8.test index 53d3e30027..0c7656b9a1 100644 --- a/test/window8.test +++ b/test/window8.test @@ -6205,4 +6205,21 @@ do_execsql_test 6.2 { #========================================================================== +do_execsql_test 7.0 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER, b INTEGER); + + INSERT INTO t2 VALUES(1, 65); + INSERT INTO t2 VALUES(2, NULL); + INSERT INTO t2 VALUES(3, NULL); + INSERT INTO t2 VALUES(4, NULL); +} {} + +do_execsql_test 7.1 { + SELECT sum(a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING + ); +} {9 9 9 9} + finish_test From efb5f9a173e45a1cfb4e03f5680a6307f6e3f17c Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 21:52:13 +0000 Subject: [PATCH 189/221] Improvements to VDBE tracing. No changes to code in normal deliverables. FossilOrigin-Name: 54553bf16fabd72d1967acef317beb518e086707ccd45890b7c7256b8da08b75 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 8 +++++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 5830119222..fd489fe4af 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scase\sto\swindow8.test.\sAlso\sfix\san\serror\sin\sa\scomment\sin\swindow.c. -D 2019-08-30T19:45:03.375 +C Improvements\sto\sVDBE\stracing.\s\sNo\schanges\sto\scode\sin\snormal\sdeliverables. +D 2019-08-30T21:52:13.928 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -595,7 +595,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c fca0f3762bc5cb7698a0bf754886503e703f66bf28013479c2177345053cab17 +F src/vdbe.c 351129b483cfbf4776fdb989dc92b460c8e9d4aa24a3ad553a2e18e4489fdca2 F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 596ac2a4eab28b74f4050fb4eb71883f2a1421fdbccf302413e4653391bb52c9 -R 94fb5a9c76dec8423f58b92f29509529 -U dan -Z c980e1f35bfd2a5c73fbb1e591fe4935 +P 2925bfa5971c8557ecaa6ac18df0825ebbbd1622017509e83451d90640146fa8 +R e59b4dfec90afc7f1bc13be5998e1a64 +U drh +Z d085179c5e728bf4a41ae90b0a515b06 diff --git a/manifest.uuid b/manifest.uuid index a68d49dff1..0792ed6856 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2925bfa5971c8557ecaa6ac18df0825ebbbd1622017509e83451d90640146fa8 \ No newline at end of file +54553bf16fabd72d1967acef317beb518e086707ccd45890b7c7256b8da08b75 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 25b0cb3dd0..f931da3805 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -485,11 +485,12 @@ void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){ *(zCsr++) = c; sqlite3_snprintf(100, zCsr, "%d[", pMem->n); zCsr += sqlite3Strlen30(zCsr); - for(i=0; i<16 && in; i++){ + for(i=0; i<25 && in; i++){ sqlite3_snprintf(100, zCsr, "%02X", ((int)pMem->z[i] & 0xFF)); zCsr += sqlite3Strlen30(zCsr); } - for(i=0; i<16 && in; i++){ + *zCsr++ = '|'; + for(i=0; i<25 && in; i++){ char z = pMem->z[i]; if( z<32 || z>126 ) *zCsr++ = '.'; else *zCsr++ = z; @@ -519,7 +520,7 @@ void sqlite3VdbeMemPrettyPrint(Mem *pMem, char *zBuf){ sqlite3_snprintf(100, &zBuf[k], "%d", pMem->n); k += sqlite3Strlen30(&zBuf[k]); zBuf[k++] = '['; - for(j=0; j<15 && jn; j++){ + for(j=0; j<25 && jn; j++){ u8 c = pMem->z[j]; if( c>=0x20 && c<0x7f ){ zBuf[k++] = c; @@ -1832,6 +1833,7 @@ case OP_RealAffinity: { /* in1 */ testcase( pIn1->flags & MEM_Int ); testcase( pIn1->flags & MEM_IntReal ); sqlite3VdbeMemRealify(pIn1); + REGISTER_TRACE(pOp->p1, pIn1); } break; } From a7ce167e5b89e45d203014fc6ad0dbbfa3d44346 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 23:15:00 +0000 Subject: [PATCH 190/221] Make sure OP_RealAffinity has been applied to all columns of type REAL in the excluded.* pseudo-table of an UPSERT. Ticket [5a3dba8104421320] FossilOrigin-Name: 67381dadede98a55d8d9e085d021e6fa6473071978967b6302e03b28cf2245e1 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/upsert.c | 8 +++++++- test/upsert1.test | 10 ++++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index fd489fe4af..25379034a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sVDBE\stracing.\s\sNo\schanges\sto\scode\sin\snormal\sdeliverables. -D 2019-08-30T21:52:13.928 +C Make\ssure\sOP_RealAffinity\shas\sbeen\sapplied\sto\sall\scolumns\sof\stype\sREAL\nin\sthe\sexcluded.*\spseudo-table\sof\san\sUPSERT.\nTicket\s[5a3dba8104421320] +D 2019-08-30T23:15:00.679 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -591,7 +591,7 @@ F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1 F src/treeview.c fc8c6c0a8a26afb3a97e3f844d65403dd27cf1450baf4415034fa4ccf00c4d7e F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 -F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 +F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf @@ -1593,7 +1593,7 @@ F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 F test/update.test 1148de8d913e9817717990603aadeca07aab9ddbb10a30f167cbfd8d3a3ccb60 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 -F test/upsert1.test 994bde41800bb77dbe32fcd2e1f6c4b49cc9f2c6cd345731c774dff02b51c110 +F test/upsert1.test 9b115320149e6d72db64511a373c522746c2a2156efdbdb52add33504f66c989 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c F test/upsert4.test 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2925bfa5971c8557ecaa6ac18df0825ebbbd1622017509e83451d90640146fa8 -R e59b4dfec90afc7f1bc13be5998e1a64 +P 54553bf16fabd72d1967acef317beb518e086707ccd45890b7c7256b8da08b75 +R cef0df55cd7685f2b9e620402ed17caf U drh -Z d085179c5e728bf4a41ae90b0a515b06 +Z 1f2b76474aa0bfdfd3021ea753e61c50 diff --git a/manifest.uuid b/manifest.uuid index 0792ed6856..164a8fc461 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -54553bf16fabd72d1967acef317beb518e086707ccd45890b7c7256b8da08b75 \ No newline at end of file +67381dadede98a55d8d9e085d021e6fa6473071978967b6302e03b28cf2245e1 \ No newline at end of file diff --git a/src/upsert.c b/src/upsert.c index 850ae863b9..7beb9ffaec 100644 --- a/src/upsert.c +++ b/src/upsert.c @@ -205,6 +205,7 @@ void sqlite3UpsertDoUpdate( sqlite3 *db = pParse->db; SrcList *pSrc; /* FROM clause for the UPDATE */ int iDataCur; + int i; assert( v!=0 ); assert( pUpsert!=0 ); @@ -221,7 +222,6 @@ void sqlite3UpsertDoUpdate( Index *pPk = sqlite3PrimaryKeyIndex(pTab); int nPk = pPk->nKeyCol; int iPk = pParse->nMem+1; - int i; pParse->nMem += nPk; for(i=0; ipUpsertSrc, 0); + /* excluded.* columns of type REAL need to be converted to a hard real */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp1(v, OP_RealAffinity, pUpsert->regData+i); + } + } sqlite3Update(pParse, pSrc, pUpsert->pUpsertSet, pUpsert->pUpsertWhere, OE_Abort, 0, 0, pUpsert); pUpsert->pUpsertSet = 0; /* Will have been deleted by sqlite3Update() */ diff --git a/test/upsert1.test b/test/upsert1.test index 0d13cd8543..006af438dc 100644 --- a/test/upsert1.test +++ b/test/upsert1.test @@ -210,5 +210,15 @@ do_execsql_test upsert1-780 { SELECT * FROM t1; } {1 2 33 4 5} +# 2019-08-30 ticket https://sqlite.org/src/info/5a3dba8104421320 +do_execsql_test upsert1-800 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 REAL UNIQUE, c1); + CREATE UNIQUE INDEX test800i0 ON t0(0 || c1); + INSERT INTO t0(c0, c1) VALUES (1, 2), (2, 1); + INSERT INTO t0(c0) VALUES (1) ON CONFLICT(c0) DO UPDATE SET c1=excluded.c0; + PRAGMA integrity_check; + REINDEX; +} {ok} finish_test From 7314495ff82c0ed4ac6f2776121282e3a8fe566a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 23:56:34 +0000 Subject: [PATCH 191/221] When the affinity of a table column is INT or REAL, make the affinity of corresponding index columns NUMERIC. This increases the precision of index lookups for large numbers so that it matches the precision of ordinary comparison operators. Ticket [40812aea1fde9594] FossilOrigin-Name: e0d909c740b774d8a46731696e33342be83206cc4a95d07f42fdb3d8cc2d7a8e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/insert.c | 1 + src/wherecode.c | 1 + test/affinity2.test | 11 +++++++++++ 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 25379034a1..3d36562265 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sOP_RealAffinity\shas\sbeen\sapplied\sto\sall\scolumns\sof\stype\sREAL\nin\sthe\sexcluded.*\spseudo-table\sof\san\sUPSERT.\nTicket\s[5a3dba8104421320] -D 2019-08-30T23:15:00.679 +C When\sthe\saffinity\sof\sa\stable\scolumn\sis\sINT\sor\sREAL,\smake\sthe\saffinity\sof\ncorresponding\sindex\scolumns\sNUMERIC.\s\sThis\sincreases\sthe\sprecision\sof\nindex\slookups\sfor\slarge\snumbers\sso\sthat\sit\smatches\sthe\sprecision\sof\nordinary\scomparison\soperators.\s\sTicket\s[40812aea1fde9594] +D 2019-08-30T23:56:34.003 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -484,7 +484,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 81eec6acf4fbf0942bbab6804fe50df3e109acba40b8bbfb00fec9a14d0715a6 +F src/insert.c 40557ebd69f4115e7a273f9304a8ab637a47ce44f3c6923396928f023967b5e8 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c a045bb3425a9a633cc0f78e93d9beda6866f4c0f15bfdee735aba7c6b39f5cc4 F src/main.c 51c55eb579eac4180bfcc6242741084710911350d2cd0c3fdd0f9fde55442128 @@ -611,11 +611,11 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b +F src/wherecode.c b27b95cbd901c50ff4b26835eb249f57845193615861742bd1056e6d2e40b40c F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 96b0c033d33408f16ac8b177eac6362ee53a23d9b6d7a51a04289ab2f956bb77 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 -F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 +F test/affinity2.test da465d3d490ab24ef64f7715b5953343a4967762b9350b29eb1462879ff3fb9e F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 54553bf16fabd72d1967acef317beb518e086707ccd45890b7c7256b8da08b75 -R cef0df55cd7685f2b9e620402ed17caf +P 67381dadede98a55d8d9e085d021e6fa6473071978967b6302e03b28cf2245e1 +R 81c5159f885099a08c3a032048c494b3 U drh -Z 1f2b76474aa0bfdfd3021ea753e61c50 +Z df65619bddc85917641870cd10c4e180 diff --git a/manifest.uuid b/manifest.uuid index 164a8fc461..9793ee6e7a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -67381dadede98a55d8d9e085d021e6fa6473071978967b6302e03b28cf2245e1 \ No newline at end of file +e0d909c740b774d8a46731696e33342be83206cc4a95d07f42fdb3d8cc2d7a8e \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 04d3d580f5..d9078b89db 100644 --- a/src/insert.c +++ b/src/insert.c @@ -99,6 +99,7 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); } if( affSQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; pIdx->zColAff[n] = aff; } pIdx->zColAff[n] = 0; diff --git a/src/wherecode.c b/src/wherecode.c index 2fbcba17e9..22ed905f4e 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -755,6 +755,7 @@ static int codeAllEqualityTerms( if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ zAff[j] = SQLITE_AFF_BLOB; } + if( zAff[j]==SQLITE_AFF_REAL ) zAff[j] = SQLITE_AFF_NUMERIC; } } } diff --git a/test/affinity2.test b/test/affinity2.test index 40e442376e..acdf91c062 100644 --- a/test/affinity2.test +++ b/test/affinity2.test @@ -116,5 +116,16 @@ do_execsql_test 507 { SELECT * FROM t0 WHERE +-+'ce' >= t0.c0; } {-1 {}} +# 2019-08-30 ticket https://www.sqlite.org/src/info/40812aea1fde9594 +# +do_execsql_test 600 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 REAL UNIQUE); + INSERT INTO t0(c0) VALUES (3175546974276630385); + SELECT 3175546974276630385 < c0 FROM t0; +} {1} +do_execsql_test 601 { + SELECT 1 FROM t0 WHERE 3175546974276630385 < c0; +} {1} finish_test From 6a19865ff2f39ed313462da7e0e204b6ff3eb8b0 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 31 Aug 2019 01:33:19 +0000 Subject: [PATCH 192/221] Remove some affinity tests that became unreachable due to the prior change. FossilOrigin-Name: e2db1123faac26c0e0b6a1ebef1685ea7633bfcafd1ff743ba5380700f7745af --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 7 +++---- src/wherecode.c | 1 - 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 3d36562265..6bede4ab76 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sthe\saffinity\sof\sa\stable\scolumn\sis\sINT\sor\sREAL,\smake\sthe\saffinity\sof\ncorresponding\sindex\scolumns\sNUMERIC.\s\sThis\sincreases\sthe\sprecision\sof\nindex\slookups\sfor\slarge\snumbers\sso\sthat\sit\smatches\sthe\sprecision\sof\nordinary\scomparison\soperators.\s\sTicket\s[40812aea1fde9594] -D 2019-08-30T23:56:34.003 +C Remove\ssome\saffinity\stests\sthat\sbecame\sunreachable\sdue\sto\sthe\sprior\schange. +D 2019-08-31T01:33:19.183 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c e1b74116375bb88c1b4b90b635d417dcd0643ac46bacf5a3caefef60c8e5e115 +F src/expr.c 60cf8c778c3291220487bea46667339160f15bbddaef57c1a703c56d5fc76c52 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -611,7 +611,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c b27b95cbd901c50ff4b26835eb249f57845193615861742bd1056e6d2e40b40c +F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 96b0c033d33408f16ac8b177eac6362ee53a23d9b6d7a51a04289ab2f956bb77 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 67381dadede98a55d8d9e085d021e6fa6473071978967b6302e03b28cf2245e1 -R 81c5159f885099a08c3a032048c494b3 +P e0d909c740b774d8a46731696e33342be83206cc4a95d07f42fdb3d8cc2d7a8e +R fb7480045131ad29a415b8e551946237 U drh -Z df65619bddc85917641870cd10c4e180 +Z 73deec9d190744adeeaa8d20a010bc12 diff --git a/manifest.uuid b/manifest.uuid index 9793ee6e7a..9ee4cd5bb4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e0d909c740b774d8a46731696e33342be83206cc4a95d07f42fdb3d8cc2d7a8e \ No newline at end of file +e2db1123faac26c0e0b6a1ebef1685ea7633bfcafd1ff743ba5380700f7745af \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e87ff70507..0332dc3e53 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2203,10 +2203,10 @@ int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ if( op==TK_REGISTER ) op = p->op2; switch( op ){ case TK_INTEGER: { - return aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC; + return aff>=SQLITE_AFF_NUMERIC; } case TK_FLOAT: { - return aff==SQLITE_AFF_REAL || aff==SQLITE_AFF_NUMERIC; + return aff>=SQLITE_AFF_NUMERIC; } case TK_STRING: { return !unaryMinus && aff==SQLITE_AFF_TEXT; @@ -2216,8 +2216,7 @@ int sqlite3ExprNeedsNoAffinityChange(const Expr *p, char aff){ } case TK_COLUMN: { assert( p->iTable>=0 ); /* p cannot be part of a CHECK constraint */ - return p->iColumn<0 - && (aff==SQLITE_AFF_INTEGER || aff==SQLITE_AFF_NUMERIC); + return aff>=SQLITE_AFF_NUMERIC && p->iColumn<0; } default: { return 0; diff --git a/src/wherecode.c b/src/wherecode.c index 22ed905f4e..2fbcba17e9 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -755,7 +755,6 @@ static int codeAllEqualityTerms( if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ zAff[j] = SQLITE_AFF_BLOB; } - if( zAff[j]==SQLITE_AFF_REAL ) zAff[j] = SQLITE_AFF_NUMERIC; } } } From f66bfcb740c823c9c6ffce1f7f0d0c2bb811046a Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 31 Aug 2019 17:14:35 +0000 Subject: [PATCH 193/221] If a DELETE trigger fired by an UPDATE OR REPLACE statement deletes the row being updated, do not attempt to proceed with the original UPDATE operation. Fix for [d6a0fbc1]. FossilOrigin-Name: 4145b3e05051ba6729105157a876793ad14a05d895fc10fe704f437eab16ea93 --- manifest | 17 ++++++------ manifest.uuid | 2 +- src/update.c | 24 ++++++++-------- test/conflict3.test | 68 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 6bede4ab76..7d0e3d14ee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\ssome\saffinity\stests\sthat\sbecame\sunreachable\sdue\sto\sthe\sprior\schange. -D 2019-08-31T01:33:19.183 +C If\sa\sDELETE\strigger\sfired\sby\san\sUPDATE\sOR\sREPLACE\sstatement\sdeletes\sthe\srow\sbeing\supdated,\sdo\snot\sattempt\sto\sproceed\swith\sthe\soriginal\sUPDATE\soperation.\sFix\sfor\s[d6a0fbc1]. +D 2019-08-31T17:14:35.569 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -590,7 +590,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c fc8c6c0a8a26afb3a97e3f844d65403dd27cf1450baf4415034fa4ccf00c4d7e F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c 3cb9150d2cf661d938e2f1b1749945f3faa767f88febdb739ab1793bbf895ff2 +F src/update.c ce478c8ad297833d1acc825891e35d82a99f5986cfce1e92f44c3b0d54670114 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 @@ -745,7 +745,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e F test/conflict.test c7cc007e2af151516ddf38f7412fe10d473a694f55e3df437e2c7b31c2590e8d F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c -F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 +F test/conflict3.test 56d18aedfa521a7ebffadb8254cfff10caf4e49cd8659cb54da39513aed478ba F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 F test/corrupt2.test bb50042cf9a1f1023d73af325d47eb02a6bb11e3c52f8812644b220c5d4bca35 @@ -1838,7 +1838,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e0d909c740b774d8a46731696e33342be83206cc4a95d07f42fdb3d8cc2d7a8e -R fb7480045131ad29a415b8e551946237 -U drh -Z 73deec9d190744adeeaa8d20a010bc12 +P e2db1123faac26c0e0b6a1ebef1685ea7633bfcafd1ff743ba5380700f7745af +R 1a919c61b513d8917573ee41d8ce4c15 +T +closed 2a0152c9f5f2ca56734189521b3b114ad6ba7ee7941d0f22d262081125436f72 +U dan +Z 6965309018f410a0aa2e8d19660bb27e diff --git a/manifest.uuid b/manifest.uuid index 9ee4cd5bb4..5a00355cf9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2db1123faac26c0e0b6a1ebef1685ea7633bfcafd1ff743ba5380700f7745af \ No newline at end of file +4145b3e05051ba6729105157a876793ad14a05d895fc10fe704f437eab16ea93 \ No newline at end of file diff --git a/src/update.c b/src/update.c index bbeaa3d5ce..05cef6f58e 100644 --- a/src/update.c +++ b/src/update.c @@ -715,28 +715,29 @@ void sqlite3Update( } if( !isView ){ - int addr1 = 0; /* Address of jump instruction */ - /* Do constraint checks. */ assert( regOldRowid>0 ); sqlite3GenerateConstraintChecks(pParse, pTab, aRegIdx, iDataCur, iIdxCur, regNewRowid, regOldRowid, chngKey, onError, labelContinue, &bReplace, aXRef, 0); + /* If REPLACE conflict handling may have been used, or if the PK of the + ** row is changing, then the GenerateConstraintChecks() above may have + ** moved cursor iDataCur. Reseek it. */ + if( bReplace || chngKey ){ + if( pPk ){ + sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); + }else{ + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); + } + } + /* Do FK constraint checks. */ if( hasFK ){ sqlite3FkCheck(pParse, pTab, regOldRowid, 0, aXRef, chngKey); } /* Delete the index entries associated with the current record. */ - if( bReplace || chngKey ){ - if( pPk ){ - addr1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey); - }else{ - addr1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); - } - VdbeCoverageNeverTaken(v); - } sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur, aRegIdx, -1); /* If changing the rowid value, or if there are foreign key constraints @@ -766,9 +767,6 @@ void sqlite3Update( sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); } #endif - if( bReplace || chngKey ){ - sqlite3VdbeJumpHere(v, addr1); - } if( hasFK ){ sqlite3FkCheck(pParse, pTab, 0, regNewRowid, aXRef, chngKey); diff --git a/test/conflict3.test b/test/conflict3.test index 751a442685..413e8241fe 100644 --- a/test/conflict3.test +++ b/test/conflict3.test @@ -366,5 +366,73 @@ do_execsql_test 12.3 { SELECT * FROM t2; } {111 111B 112 112} +#------------------------------------------------------------------------- +ifcapable trigger { + reset_db + do_execsql_test 13.1.0 { + PRAGMA recursive_triggers = true; + CREATE TABLE t0 (c0 UNIQUE, c1 UNIQUE); + CREATE TRIGGER tr0 AFTER DELETE ON t0 BEGIN + DELETE FROM t0; + END; + + INSERT INTO t0 VALUES(1, NULL); + INSERT INTO t0 VALUES(0, NULL); + } + + do_execsql_test 13.1.1 { + UPDATE OR REPLACE t0 SET c1 = 1; + } + + integrity_check 13.1.2 + + do_execsql_test 13.1.3 { + SELECT * FROM t0 + } {} + + do_execsql_test 13.2.0 { + CREATE TABLE t2 (a PRIMARY KEY, b UNIQUE, c UNIQUE) WITHOUT ROWID; + CREATE TRIGGER tr3 AFTER DELETE ON t2 BEGIN + DELETE FROM t2; + END; + + INSERT INTO t2 VALUES(1, 1, 1); + INSERT INTO t2 VALUES(2, 2, 2); + } + + do_execsql_test 13.2.1 { + UPDATE OR REPLACE t2 SET c = 0; + } + + integrity_check 13.2.2 + + do_execsql_test 13.2.3 { + SELECT * FROM t2 + } {} + + do_execsql_test 13.3.0 { + CREATE TABLE t1(a, b); + CREATE TABLE log(x); + CREATE INDEX i1 ON t1(a); + INSERT INTO t1 VALUES(1, 2); + + CREATE TRIGGER tb BEFORE UPDATE ON t1 BEGIN + DELETE FROM t1; + END; + CREATE TRIGGER ta AFTER UPDATE ON t1 BEGIN + INSERT INTO log VALUES('fired!'); + END; + + UPDATE t1 SET b=3; + } + + do_execsql_test 13.3.1 { + SELECT * FROM t1; + } {} + do_execsql_test 13.3.2 { + SELECT * FROM log; + } {} +} finish_test + From 80f6bfc064eac13c408aa7e46e2e154d1d40f297 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 31 Aug 2019 20:13:30 +0000 Subject: [PATCH 194/221] Improvements to the algorithm that determines which SELECT in a sequence of nested SELECT statements that an aggregate function belongs to. This resolves an issue identified by dbsqlfuzz. FossilOrigin-Name: d768007473f4ed40abbdf2c7e501b580b1cc37c1620c7cb90af1f208a8c35145 --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/expr.c | 8 ++++++-- test/aggnested.test | 30 +++++++++++++++++++++++++++++- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 7d0e3d14ee..388d7e7892 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sa\sDELETE\strigger\sfired\sby\san\sUPDATE\sOR\sREPLACE\sstatement\sdeletes\sthe\srow\sbeing\supdated,\sdo\snot\sattempt\sto\sproceed\swith\sthe\soriginal\sUPDATE\soperation.\sFix\sfor\s[d6a0fbc1]. -D 2019-08-31T17:14:35.569 +C Improvements\sto\sthe\salgorithm\sthat\sdetermines\swhich\sSELECT\sin\sa\ssequence\nof\snested\sSELECT\sstatements\sthat\san\saggregate\sfunction\sbelongs\sto.\s\sThis\nresolves\san\sissue\sidentified\sby\sdbsqlfuzz. +D 2019-08-31T20:13:30.510 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 60cf8c778c3291220487bea46667339160f15bbddaef57c1a703c56d5fc76c52 +F src/expr.c eb9b2e8b19d28ff58d20585964052166c0d38620593a8ab5c66214415f850261 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -618,7 +618,7 @@ F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test da465d3d490ab24ef64f7715b5953343a4967762b9350b29eb1462879ff3fb9e F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1 +F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 F test/alter.test 16ed8d2470193f34bc711e51506ff1211ebfab8025ca3b9510ff2aef139874cb @@ -1838,8 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e2db1123faac26c0e0b6a1ebef1685ea7633bfcafd1ff743ba5380700f7745af -R 1a919c61b513d8917573ee41d8ce4c15 -T +closed 2a0152c9f5f2ca56734189521b3b114ad6ba7ee7941d0f22d262081125436f72 -U dan -Z 6965309018f410a0aa2e8d19660bb27e +P 4145b3e05051ba6729105157a876793ad14a05d895fc10fe704f437eab16ea93 +R 30aae3120e96fb727d9d30a86d181e41 +U drh +Z e2cf69056f38cf2141131156d9461b54 diff --git a/manifest.uuid b/manifest.uuid index 5a00355cf9..cef6b58a19 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4145b3e05051ba6729105157a876793ad14a05d895fc10fe704f437eab16ea93 \ No newline at end of file +d768007473f4ed40abbdf2c7e501b580b1cc37c1620c7cb90af1f208a8c35145 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 0332dc3e53..ba464f9af6 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5297,7 +5297,10 @@ static int exprSrcCount(Walker *pWalker, Expr *pExpr){ } if( inThis++; - }else{ + }else if( nSrc==0 || pExpr->iTablea[0].iCursor ){ + /* In a well-formed parse tree (no name resolution errors), + /* TK_COLUMN nodes with smaller Expr.iTable values are in an + ** outer context. Those are the only ones to count as "other" */ p->nOther++; } } @@ -5314,8 +5317,9 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ Walker w; struct SrcCount cnt; assert( pExpr->op==TK_AGG_FUNCTION ); + memset(&w, 0, sizeof(w)); w.xExprCallback = exprSrcCount; - w.xSelectCallback = 0; + w.xSelectCallback = sqlite3SelectWalkNoop; w.u.pSrcCount = &cnt; cnt.pSrc = pSrcList; cnt.nThis = 0; diff --git a/test/aggnested.test b/test/aggnested.test index 91de63b768..d712c840f1 100644 --- a/test/aggnested.test +++ b/test/aggnested.test @@ -1,4 +1,4 @@ -# 2012 August 23 +# 2012-08-23 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: @@ -232,6 +232,34 @@ do_test aggnested-3.16 { GROUP BY id1; } } {12 2 34 4} + +# 2019-08-31 +# Problem found by dbsqlfuzz +# +do_execsql_test aggnested-4.1 { + DROP TABLE IF EXISTS aa; + DROP TABLE IF EXISTS bb; + CREATE TABLE aa(x INT); INSERT INTO aa(x) VALUES(123); + CREATE TABLE bb(y INT); INSERT INTO bb(y) VALUES(456); + SELECT (SELECT sum(x+(SELECT y)) FROM bb) FROM aa; +} {579} +do_execsql_test aggnested-4.2 { + SELECT (SELECT sum(x+y) FROM bb) FROM aa; +} {579} +do_execsql_test aggnested-4.3 { + DROP TABLE IF EXISTS tx; + DROP TABLE IF EXISTS ty; + CREATE TABLE tx(x INT); + INSERT INTO tx VALUES(1),(2),(3),(4),(5); + CREATE TABLE ty(y INT); + INSERT INTO ty VALUES(91),(92),(93); + SELECT min((SELECT count(y) FROM ty)) FROM tx; +} {3} +do_execsql_test aggnested-4.4 { + SELECT max((SELECT a FROM (SELECT count(*) AS a FROM ty) AS s)) FROM tx; +} {3} + + finish_test From 81d25cf53d27a4b352de086347850c69cf476aee Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 31 Aug 2019 20:26:06 +0000 Subject: [PATCH 195/221] Mark new VDBE branches never taken. FossilOrigin-Name: 83c2adffbfb6dcdddb38ad9f888647b0e39fa24dc0bff344238e1f75a6c7d2ed --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/update.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 388d7e7892..5d235eecce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\salgorithm\sthat\sdetermines\swhich\sSELECT\sin\sa\ssequence\nof\snested\sSELECT\sstatements\sthat\san\saggregate\sfunction\sbelongs\sto.\s\sThis\nresolves\san\sissue\sidentified\sby\sdbsqlfuzz. -D 2019-08-31T20:13:30.510 +C Mark\snew\sVDBE\sbranches\snever\staken. +D 2019-08-31T20:26:06.446 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -590,7 +590,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c fc8c6c0a8a26afb3a97e3f844d65403dd27cf1450baf4415034fa4ccf00c4d7e F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c ce478c8ad297833d1acc825891e35d82a99f5986cfce1e92f44c3b0d54670114 +F src/update.c 7f05fad5e145248a00048aeb0bac78b8fdb4ed17216e14a6eb24c55596e87ee7 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4145b3e05051ba6729105157a876793ad14a05d895fc10fe704f437eab16ea93 -R 30aae3120e96fb727d9d30a86d181e41 +P d768007473f4ed40abbdf2c7e501b580b1cc37c1620c7cb90af1f208a8c35145 +R 9655a2998ad4a94ca8d98590cef37323 U drh -Z e2cf69056f38cf2141131156d9461b54 +Z 4aa7a42c2ffc1c24ddf2d50e02e27484 diff --git a/manifest.uuid b/manifest.uuid index cef6b58a19..f08227ab52 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d768007473f4ed40abbdf2c7e501b580b1cc37c1620c7cb90af1f208a8c35145 \ No newline at end of file +83c2adffbfb6dcdddb38ad9f888647b0e39fa24dc0bff344238e1f75a6c7d2ed \ No newline at end of file diff --git a/src/update.c b/src/update.c index 05cef6f58e..458550b95d 100644 --- a/src/update.c +++ b/src/update.c @@ -730,6 +730,7 @@ void sqlite3Update( }else{ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); } + VdbeCoverageNeverTaken(v); } /* Do FK constraint checks. */ From 35a38e0836e64f9df6ab487a6844724e94fadce3 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 31 Aug 2019 20:29:28 +0000 Subject: [PATCH 196/221] Fix a harmless compiler warning. FossilOrigin-Name: 63c67a54b4d3e501f3059dcdfc6bb50c6b8dad63a34eb773e4408d9e4e780d7a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5d235eecce..e8b9c179d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\snew\sVDBE\sbranches\snever\staken. -D 2019-08-31T20:26:06.446 +C Fix\sa\sharmless\scompiler\swarning. +D 2019-08-31T20:29:28.511 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c eb9b2e8b19d28ff58d20585964052166c0d38620593a8ab5c66214415f850261 +F src/expr.c 150acd113edf50e807c70eedf1629b1d94b1177b8a56497e23d8ccf1e1e2a74f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d768007473f4ed40abbdf2c7e501b580b1cc37c1620c7cb90af1f208a8c35145 -R 9655a2998ad4a94ca8d98590cef37323 +P 83c2adffbfb6dcdddb38ad9f888647b0e39fa24dc0bff344238e1f75a6c7d2ed +R 37932a778dd889046a85359e8b20b826 U drh -Z 4aa7a42c2ffc1c24ddf2d50e02e27484 +Z d8bf046d3fa628e5022d569bcd7f67c8 diff --git a/manifest.uuid b/manifest.uuid index f08227ab52..353e3b4bbc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83c2adffbfb6dcdddb38ad9f888647b0e39fa24dc0bff344238e1f75a6c7d2ed \ No newline at end of file +63c67a54b4d3e501f3059dcdfc6bb50c6b8dad63a34eb773e4408d9e4e780d7a \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ba464f9af6..61b45b9923 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5299,7 +5299,7 @@ static int exprSrcCount(Walker *pWalker, Expr *pExpr){ p->nThis++; }else if( nSrc==0 || pExpr->iTablea[0].iCursor ){ /* In a well-formed parse tree (no name resolution errors), - /* TK_COLUMN nodes with smaller Expr.iTable values are in an + ** TK_COLUMN nodes with smaller Expr.iTable values are in an ** outer context. Those are the only ones to count as "other" */ p->nOther++; } From cc80db69e9c52304b50209a4aca66b1ae908b602 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 1 Sep 2019 23:36:33 +0000 Subject: [PATCH 197/221] Remove an obsolete paragraph from the OP_Column documentation. No code changes. FossilOrigin-Name: f6d8956cf8b5993a4332b9330e89d5c3d5f8872ea5a2ce3d2e91127406cc1839 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 5 ----- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index e8b9c179d0..6b305d6bfc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning. -D 2019-08-31T20:29:28.511 +C Remove\san\sobsolete\sparagraph\sfrom\sthe\sOP_Column\sdocumentation.\s\sNo\scode\nchanges. +D 2019-09-01T23:36:33.093 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -595,7 +595,7 @@ F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 351129b483cfbf4776fdb989dc92b460c8e9d4aa24a3ad553a2e18e4489fdca2 +F src/vdbe.c 145e417fda9377a809d9c754d4098de9a9620aec1bc3e4d2d4ca8f8d525dace3 F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 83c2adffbfb6dcdddb38ad9f888647b0e39fa24dc0bff344238e1f75a6c7d2ed -R 37932a778dd889046a85359e8b20b826 +P 63c67a54b4d3e501f3059dcdfc6bb50c6b8dad63a34eb773e4408d9e4e780d7a +R c1da51105a0bd41bcf8b282b1f2a62fa U drh -Z d8bf046d3fa628e5022d569bcd7f67c8 +Z 7a37af4640fc76b6e62eb0e6e9abd09a diff --git a/manifest.uuid b/manifest.uuid index 353e3b4bbc..22f0b4591b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -63c67a54b4d3e501f3059dcdfc6bb50c6b8dad63a34eb773e4408d9e4e780d7a \ No newline at end of file +f6d8956cf8b5993a4332b9330e89d5c3d5f8872ea5a2ce3d2e91127406cc1839 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index f931da3805..89adc31bf5 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2527,11 +2527,6 @@ case OP_Offset: { /* out3 */ ** if the P4 argument is a P4_MEM use the value of the P4 argument as ** the result. ** -** If the OPFLAG_CLEARCACHE bit is set on P5 and P1 is a pseudo-table cursor, -** then the cache of the cursor is reset prior to extracting the column. -** The first OP_Column against a pseudo-table after the value of the content -** register has changed should have this bit set. -** ** If the OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG bits are set on P5 then ** the result is guaranteed to only be used as the argument of a length() ** or typeof() function, respectively. The loading of large blobs can be From bffdd636339b32c706253e8c791ccca8b3f88f19 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 2 Sep 2019 00:58:44 +0000 Subject: [PATCH 198/221] When computing an expression value for an index-on-expression or a CHECK constraint and the expressions uses a REAL table column, but the value of that column is an integer (in other words, when it is using the store-real-as-integer optimization) be sure to promote the value to real before evaluating the expression. Ticket [57af00b6642ecd68]. FossilOrigin-Name: 0658c16e311393c8a347b1bd41fa5dbfd2e184aa75d84c011aa8dbac79b632e9 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 14 +++++++++++++- test/check.test | 14 ++++++++++++++ test/indexexpr1.test | 24 ++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6b305d6bfc..487542d132 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sobsolete\sparagraph\sfrom\sthe\sOP_Column\sdocumentation.\s\sNo\scode\nchanges. -D 2019-09-01T23:36:33.093 +C When\scomputing\san\sexpression\svalue\sfor\san\sindex-on-expression\sor\sa\sCHECK\nconstraint\sand\sthe\sexpressions\suses\sa\sREAL\stable\scolumn,\sbut\sthe\svalue\sof\nthat\scolumn\sis\san\sinteger\s(in\sother\swords,\swhen\sit\sis\susing\sthe\s\nstore-real-as-integer\soptimization)\sbe\ssure\sto\spromote\sthe\svalue\sto\sreal\nbefore\sevaluating\sthe\sexpression.\s\sTicket\s[57af00b6642ecd68]. +D 2019-09-02T00:58:44.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 150acd113edf50e807c70eedf1629b1d94b1177b8a56497e23d8ccf1e1e2a74f +F src/expr.c dcf6eb84656d3c5b41d6755cdb55a264a3f6f8f12e68bf87fa27bdd33e263ee3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -724,7 +724,7 @@ F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bc F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 3619f0c58c2e4b2a94aa86e75607e497d34ef40ab74418e71aef7b4ca5155895 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test e6527bed2b5557ffdbf5680765c4ae6fe61e9b68b7ee69a7f776787a4527b5da +F test/check.test 4b57ecbbb300336382ca21ef983dfa70b291a70ae430690494d13f1629f45a38 F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c @@ -1052,7 +1052,7 @@ F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e -F test/indexexpr1.test 0f293369ed6f56764cfc3db05685d45469d9e685ba87e3698527049ba359ae24 +F test/indexexpr1.test fb56f0b9a9d147b38979d154176f150b5e45fdd5d0162fab639a7f9478134fa3 F test/indexexpr2.test b580f378423bca443ffab47ada677203cfcf8a60f48a8aa20065f27c8f7739b5 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 63c67a54b4d3e501f3059dcdfc6bb50c6b8dad63a34eb773e4408d9e4e780d7a -R c1da51105a0bd41bcf8b282b1f2a62fa +P f6d8956cf8b5993a4332b9330e89d5c3d5f8872ea5a2ce3d2e91127406cc1839 +R cad500c6656aba1cd58b9ed6ead8c93d U drh -Z 7a37af4640fc76b6e62eb0e6e9abd09a +Z 159d6991963aae3d8bb85f2594c26695 diff --git a/manifest.uuid b/manifest.uuid index 22f0b4591b..73fff4cb11 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f6d8956cf8b5993a4332b9330e89d5c3d5f8872ea5a2ce3d2e91127406cc1839 \ No newline at end of file +0658c16e311393c8a347b1bd41fa5dbfd2e184aa75d84c011aa8dbac79b632e9 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 61b45b9923..622024eb22 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3532,7 +3532,19 @@ expr_code_doover: if( iTab<0 ){ if( pParse->iSelfTab<0 ){ /* Generating CHECK constraints or inserting into partial index */ - return pExpr->iColumn - pParse->iSelfTab; + assert( pExpr->y.pTab!=0 ); + assert( pExpr->iColumn>=XN_ROWID ); + assert( pExpr->iColumny.pTab->nCol ); + if( pExpr->iColumn>=0 + && pExpr->y.pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL + ){ + sqlite3VdbeAddOp2(v, OP_SCopy, pExpr->iColumn - pParse->iSelfTab, + target); + sqlite3VdbeAddOp1(v, OP_RealAffinity, target); + return target; + }else{ + return pExpr->iColumn - pParse->iSelfTab; + } }else{ /* Coding an expression that is part of an index where column names ** in the index refer to the table to which the index belongs */ diff --git a/test/check.test b/test/check.test index b703c75b00..e23043eb04 100644 --- a/test/check.test +++ b/test/check.test @@ -123,6 +123,11 @@ do_test check-2.1 { y REAL CONSTRAINT two CHECK( typeof(coalesce(y,0.1))=='real' ), z TEXT CONSTRAINT three CHECK( typeof(coalesce(z,''))=='text' ) ); + CREATE TABLE t2n( + x INTEGER CONSTRAINT one CHECK( typeof(coalesce(x,0))=="integer" ), + y NUMERIC CONSTRAINT two CHECK( typeof(coalesce(y,0.1))=='real' ), + z TEXT CONSTRAINT three CHECK( typeof(coalesce(z,''))=='text' ) + ); PRAGMA writable_schema = 0; } } {} @@ -146,9 +151,17 @@ do_test check-2.4 { } } {1 {CHECK constraint failed: one}} do_test check-2.5 { + # The 5 gets automatically promoted to 5.0 because the column type is REAL catchsql { INSERT INTO t2 VALUES(NULL, 5, NULL); } +} {0 {}} +do_test check-2.5b { + # This time the column type is NUMERIC, so not automatic promption to REAL + # occurs and the constraint fails. + catchsql { + INSERT INTO t2n VALUES(NULL, 5, NULL); + } } {1 {CHECK constraint failed: two}} do_test check-2.6 { catchsql { @@ -195,6 +208,7 @@ do_test check-2.cleanup { execsql { DROP TABLE IF EXISTS t2b; DROP TABLE IF EXISTS t2c; + DROP TABLE IF EXISTS t2n; } } {} diff --git a/test/indexexpr1.test b/test/indexexpr1.test index ed7d9ffbc2..353792875b 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -457,4 +457,28 @@ do_execsql_test indexexpr-1700 { SELECT * FROM t0 WHERE ((NULL IS FALSE) IS FALSE); } {0} +# 2019-09-02 https://www.sqlite.org/src/tktview/57af00b6642ecd6848 +# When the expression of an an index-on-expression references a +# table column of type REAL that is actually holding an MEM_IntReal +# value, be sure to use the REAL value and not the INT value when +# computing the expression. +# +do_execsql_test indexexpr-1800 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 REAL, c1 TEXT); + CREATE INDEX i0 ON t0(+c0, c0); + INSERT INTO t0(c0) VALUES(0); + SELECT CAST(+ t0.c0 AS BLOB) LIKE 0 FROM t0; +} {0} +do_execsql_test indexexpr-1810 { + SELECT CAST(+ t0.c0 AS BLOB) LIKE '0.0' FROM t0; +} {1} +do_execsql_test indexexpr-1820 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x REAL); + CREATE INDEX t1x ON t1(x, +x); + INSERT INTO t1(x) VALUES(2); + SELECT +x FROM t1 WHERE x=2; +} {2.0} + finish_test From 0167ef202b2279af622956a4a1a073531759c216 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 2 Sep 2019 01:25:07 +0000 Subject: [PATCH 199/221] Fix an obsolete comment that defines the meaning of one of the parameters to the sqlite3FindInIndex() subroutine. No changes to code. FossilOrigin-Name: 0c946f0846b2835f8facca806a4d4ecc2b2e97343de245a0d91716d998b2a829 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 487542d132..2a6ffeaf7b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\scomputing\san\sexpression\svalue\sfor\san\sindex-on-expression\sor\sa\sCHECK\nconstraint\sand\sthe\sexpressions\suses\sa\sREAL\stable\scolumn,\sbut\sthe\svalue\sof\nthat\scolumn\sis\san\sinteger\s(in\sother\swords,\swhen\sit\sis\susing\sthe\s\nstore-real-as-integer\soptimization)\sbe\ssure\sto\spromote\sthe\svalue\sto\sreal\nbefore\sevaluating\sthe\sexpression.\s\sTicket\s[57af00b6642ecd68]. -D 2019-09-02T00:58:44.169 +C Fix\san\sobsolete\scomment\sthat\sdefines\sthe\smeaning\sof\sone\sof\sthe\sparameters\nto\sthe\ssqlite3FindInIndex()\ssubroutine.\s\sNo\schanges\sto\scode. +D 2019-09-02T01:25:07.870 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c dcf6eb84656d3c5b41d6755cdb55a264a3f6f8f12e68bf87fa27bdd33e263ee3 +F src/expr.c 1deee9370bc77f62445ce1b08ff69cdd54392f5cf612115f7abb98c0d49aa01b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f6d8956cf8b5993a4332b9330e89d5c3d5f8872ea5a2ce3d2e91127406cc1839 -R cad500c6656aba1cd58b9ed6ead8c93d +P 0658c16e311393c8a347b1bd41fa5dbfd2e184aa75d84c011aa8dbac79b632e9 +R b2ce2af57b181c2a5634330a829a5023 U drh -Z 159d6991963aae3d8bb85f2594c26695 +Z 59d1e18494dcde88177cbb1d6f2d9350 diff --git a/manifest.uuid b/manifest.uuid index 73fff4cb11..bf91deb6a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0658c16e311393c8a347b1bd41fa5dbfd2e184aa75d84c011aa8dbac79b632e9 \ No newline at end of file +0c946f0846b2835f8facca806a4d4ecc2b2e97343de245a0d91716d998b2a829 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 622024eb22..fabb99cda5 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2399,7 +2399,7 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ #ifndef SQLITE_OMIT_SUBQUERY int sqlite3FindInIndex( Parse *pParse, /* Parsing context */ - Expr *pX, /* The right-hand side (RHS) of the IN operator */ + Expr *pX, /* The IN expression */ u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ int *prRhsHasNull, /* Register holding NULL status. See notes */ int *aiMap, /* Mapping from Index fields to RHS fields */ From dd668c26b5d7a7526638e39239844e01a1d251e0 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 2 Sep 2019 02:21:58 +0000 Subject: [PATCH 200/221] When applying the IN_INDEX_NOOP optimization and the LHS has REAL affinity, also apply REAL affinity to each element of the RHS. Ticket [2841e99d104c6436]. FossilOrigin-Name: 88833a9c2849c959a37a80e0e4d2b211ce3c83a48319724c89b172b060c876b4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 5 +++++ test/in.test | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2a6ffeaf7b..6823b43838 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sobsolete\scomment\sthat\sdefines\sthe\smeaning\sof\sone\sof\sthe\sparameters\nto\sthe\ssqlite3FindInIndex()\ssubroutine.\s\sNo\schanges\sto\scode. -D 2019-09-02T01:25:07.870 +C When\sapplying\sthe\sIN_INDEX_NOOP\soptimization\sand\sthe\sLHS\shas\sREAL\saffinity,\nalso\sapply\sREAL\saffinity\sto\seach\selement\sof\sthe\sRHS.\nTicket\s[2841e99d104c6436]. +D 2019-09-02T02:21:58.055 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -475,7 +475,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 1deee9370bc77f62445ce1b08ff69cdd54392f5cf612115f7abb98c0d49aa01b +F src/expr.c 718634de1cb95ffbeaa1c08416a2bcd250b5586552a3360c667a56c77dd8ade3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1025,7 +1025,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 41aa8847745a879b897a7febea0f8f9efc8e67fe8bf680589b6e07c7b0a1569a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 1f82966f8c3f380c0a2d5a04e4111a333c3f46d96f40fb540e022c70ace85c11 +F test/in.test 47b0666a90e3a60798e202f0abf98b43e595ba2a6352b0ffdf1fbd0cae3ab0a4 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test 0f77b0ff371549e6a119d0356be10bdba72258162e9701e83527a560482f5e98 @@ -1838,7 +1838,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0658c16e311393c8a347b1bd41fa5dbfd2e184aa75d84c011aa8dbac79b632e9 -R b2ce2af57b181c2a5634330a829a5023 +P 0c946f0846b2835f8facca806a4d4ecc2b2e97343de245a0d91716d998b2a829 +R b383caec03caa1393be330eb632af662 U drh -Z 59d1e18494dcde88177cbb1d6f2d9350 +Z 55e1775d24543874635834b1ff207b49 diff --git a/manifest.uuid b/manifest.uuid index bf91deb6a3..b19fb06e09 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c946f0846b2835f8facca806a4d4ecc2b2e97343de245a0d91716d998b2a829 \ No newline at end of file +88833a9c2849c959a37a80e0e4d2b211ce3c83a48319724c89b172b060c876b4 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index fabb99cda5..ac3d1c8e21 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3124,13 +3124,18 @@ static void sqlite3ExprCodeIN( int r2, regToFree; int regCkNull = 0; int ii; + int bLhsReal; /* True if the LHS of the IN has REAL affinity */ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); if( destIfNull!=destIfFalse ){ regCkNull = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_BitAnd, rLhs, rLhs, regCkNull); } + bLhsReal = sqlite3ExprAffinity(pExpr->pLeft)==SQLITE_AFF_REAL; for(ii=0; iinExpr; ii++){ r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); + if( bLhsReal ){ + sqlite3VdbeAddOp4(v, OP_Affinity, r2, 1, 0, "E", P4_STATIC); + } if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); } diff --git a/test/in.test b/test/in.test index f96dfcc11e..bd1209fb67 100644 --- a/test/in.test +++ b/test/in.test @@ -759,5 +759,21 @@ do_execsql_test in-18.1 { SELECT * FROM t0 WHERE '1' IN (t0.c0); } {} +# 2019-09-02 ticket https://www.sqlite.org/src/info/2841e99d104c6436 +# For the IN_INDEX_NOOP optimization, apply REAL affinity to the LHS +# values prior to comparison if the RHS has REAL affinity. +# +do_execsql_test in-19.1 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 REAL UNIQUE); + INSERT INTO t0(c0) VALUES(2.07093491255203046E18); + SELECT 1 FROM t0 WHERE c0 IN ('2070934912552030444'); +} {1} +do_execsql_test in-19.2 { + SELECT c0 IN ('2070934912552030444') FROM t0; +} {1} +do_execsql_test in-19.3 { + SELECT c0 IN ('2070934912552030444',2,3) FROM t0; +} {1} finish_test From 229ae1ae72d3693e675703be2b986f62fb536cb1 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 2 Sep 2019 14:46:12 +0000 Subject: [PATCH 201/221] Fix a potential crash in fts5 caused by using an auxiliary function on a "special" query like '*id' or '*reads'. FossilOrigin-Name: 9490683ae883561fa347cbe54ebdd61188d849b4852d904b508250ba5d0807ef --- ext/fts5/fts5_main.c | 6 ++-- ext/fts5/test/fts5misc.test | 63 +++++++++++++++++++++++++++++++++++++ manifest | 15 ++++----- manifest.uuid | 2 +- 4 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 ext/fts5/test/fts5misc.test diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 4bb3a9965f..da5deef846 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -988,10 +988,10 @@ static int fts5SpecialMatch( assert( pTab->p.base.zErrMsg==0 ); pCsr->ePlan = FTS5_PLAN_SPECIAL; - if( 0==sqlite3_strnicmp("reads", z, n) ){ + if( n==5 && 0==sqlite3_strnicmp("reads", z, n) ){ pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->p.pIndex); } - else if( 0==sqlite3_strnicmp("id", z, n) ){ + else if( n==2 && 0==sqlite3_strnicmp("id", z, n) ){ pCsr->iSpecial = pCsr->iCsrId; } else{ @@ -2239,7 +2239,7 @@ static void fts5ApiCallback( iCsrId = sqlite3_value_int64(argv[0]); pCsr = fts5CursorFromCsrid(pAux->pGlobal, iCsrId); - if( pCsr==0 ){ + if( pCsr==0 || pCsr->ePlan==0 ){ char *zErr = sqlite3_mprintf("no such cursor: %lld", iCsrId); sqlite3_result_error(context, zErr, -1); sqlite3_free(zErr); diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test new file mode 100644 index 0000000000..009f578dce --- /dev/null +++ b/ext/fts5/test/fts5misc.test @@ -0,0 +1,63 @@ +# 2019 September 02 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5misc + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a); +} + +do_catchsql_test 1.1.1 { + SELECT highlight(t1, 4, '', '') FROM t1('*'); +} {1 {unknown special query: }} +do_catchsql_test 1.1.2 { + SELECT a FROM t1 + WHERE rank = (SELECT highlight(t1, 4, '', '') FROM t1('*')); +} {1 {unknown special query: }} + +do_catchsql_test 1.2.1 { + SELECT highlight(t1, 4, '', '') FROM t1('*id'); +} {0 {{}}} + +do_catchsql_test 1.2.2 { + SELECT a FROM t1 + WHERE rank = (SELECT highlight(t1, 4, '', '') FROM t1('*id')); +} {0 {}} + +do_catchsql_test 1.3.1 { + SELECT highlight(t1, 4, '', '') FROM t1('*reads'); +} {1 {no such cursor: 1}} + +do_catchsql_test 1.3.2 { + SELECT a FROM t1 + WHERE rank = (SELECT highlight(t1, 4, '', '') FROM t1('*reads')); +} {1 {no such cursor: 1}} + +db close +sqlite3 db test.db + +do_catchsql_test 1.3.3 { + SELECT a FROM t1 + WHERE rank = (SELECT highlight(t1, 4, '', '') FROM t1('*reads')); +} {1 {no such cursor: 1}} + +finish_test + diff --git a/manifest b/manifest index 6823b43838..f5fececbb6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sapplying\sthe\sIN_INDEX_NOOP\soptimization\sand\sthe\sLHS\shas\sREAL\saffinity,\nalso\sapply\sREAL\saffinity\sto\seach\selement\sof\sthe\sRHS.\nTicket\s[2841e99d104c6436]. -D 2019-09-02T02:21:58.055 +C Fix\sa\spotential\scrash\sin\sfts5\scaused\sby\susing\san\sauxiliary\sfunction\son\sa\s"special"\squery\slike\s'*id'\sor\s'*reads'. +D 2019-09-02T14:46:12.332 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -117,7 +117,7 @@ F ext/fts5/fts5_config.c d7523cba5e66da077233c023aecbc3e6a37978ff75a18131c5ab5b1 F ext/fts5/fts5_expr.c 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c b062bdb836e195656aac8d6684e943585cff4bf7d7c593c80cb67c3b6cfef7ee -F ext/fts5/fts5_main.c b2c42f1cef9673ecdd498b22c38483a4380bcf1701d1e61b021a2945f18e42e1 +F ext/fts5/fts5_main.c 15dc14ea594ff2ea183f5e79c8f6fea14640ac7c4bd5d93ad1d506a4db80c998 F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -189,6 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 +F ext/fts5/test/fts5misc.test 5becd134b66f7370042968a2b127b92ea7748e249f16cb6a996f450812e89eec F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd F ext/fts5/test/fts5onepass.test f9b7d9b2c334900c6542a869760290e2ab5382af8fbd618834bf1fcc3e7b84da @@ -1838,7 +1839,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0c946f0846b2835f8facca806a4d4ecc2b2e97343de245a0d91716d998b2a829 -R b383caec03caa1393be330eb632af662 -U drh -Z 55e1775d24543874635834b1ff207b49 +P 88833a9c2849c959a37a80e0e4d2b211ce3c83a48319724c89b172b060c876b4 +R ecf23e7895e522aa6db47033eb1fe1d8 +U dan +Z 9a0d4ac9ca62f38c69e05c62c21dab75 diff --git a/manifest.uuid b/manifest.uuid index b19fb06e09..d58c001b4c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -88833a9c2849c959a37a80e0e4d2b211ce3c83a48319724c89b172b060c876b4 \ No newline at end of file +9490683ae883561fa347cbe54ebdd61188d849b4852d904b508250ba5d0807ef \ No newline at end of file From 4fc836546e035fc18a4bf66c3bb895dc5af10fa0 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 2 Sep 2019 22:13:06 +0000 Subject: [PATCH 202/221] Fix a bug introduced earlier today by check-in [88833a9c2849c959]. Ticket [29f635e0af71234b] FossilOrigin-Name: 6e7b4527d32cc1be0294614b9d7363d4b59cf654a954b86515b3f6888975ce73 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 5 ++++- test/in.test | 9 +++++++++ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f5fececbb6..8a800c1dc3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\scrash\sin\sfts5\scaused\sby\susing\san\sauxiliary\sfunction\son\sa\s"special"\squery\slike\s'*id'\sor\s'*reads'. -D 2019-09-02T14:46:12.332 +C Fix\sa\sbug\sintroduced\searlier\stoday\sby\scheck-in\s[88833a9c2849c959].\nTicket\s[29f635e0af71234b] +D 2019-09-02T22:13:06.403 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -476,7 +476,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 718634de1cb95ffbeaa1c08416a2bcd250b5586552a3360c667a56c77dd8ade3 +F src/expr.c 10d90c4676047a75276446779d18fb3f7d3a1f9debc8b322e3772d2bd51f52ff F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e F src/func.c 4ee36219698d50d672a28eca4adb0fd6b92e607a1883d318315e0d2fd5044467 @@ -1026,7 +1026,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 41aa8847745a879b897a7febea0f8f9efc8e67fe8bf680589b6e07c7b0a1569a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 47b0666a90e3a60798e202f0abf98b43e595ba2a6352b0ffdf1fbd0cae3ab0a4 +F test/in.test 3e9bd58597a444123a40a9ac94cae0fec8897e17e9f519b02fc370bcf5ba5175 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test 0f77b0ff371549e6a119d0356be10bdba72258162e9701e83527a560482f5e98 @@ -1839,7 +1839,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 88833a9c2849c959a37a80e0e4d2b211ce3c83a48319724c89b172b060c876b4 -R ecf23e7895e522aa6db47033eb1fe1d8 -U dan -Z 9a0d4ac9ca62f38c69e05c62c21dab75 +P 9490683ae883561fa347cbe54ebdd61188d849b4852d904b508250ba5d0807ef +R 931628c07078d6a1ec560a2e18a3f53f +U drh +Z 31499ded87036041191e77b0df0459dc diff --git a/manifest.uuid b/manifest.uuid index d58c001b4c..d9a9e049c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9490683ae883561fa347cbe54ebdd61188d849b4852d904b508250ba5d0807ef \ No newline at end of file +6e7b4527d32cc1be0294614b9d7363d4b59cf654a954b86515b3f6888975ce73 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ac3d1c8e21..949758b10e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3132,9 +3132,12 @@ static void sqlite3ExprCodeIN( } bLhsReal = sqlite3ExprAffinity(pExpr->pLeft)==SQLITE_AFF_REAL; for(ii=0; iinExpr; ii++){ - r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); if( bLhsReal ){ + r2 = regToFree = sqlite3GetTempReg(pParse); + sqlite3ExprCode(pParse, pList->a[ii].pExpr, r2); sqlite3VdbeAddOp4(v, OP_Affinity, r2, 1, 0, "E", P4_STATIC); + }else{ + r2 = sqlite3ExprCodeTemp(pParse, pList->a[ii].pExpr, ®ToFree); } if( regCkNull && sqlite3ExprCanBeNull(pList->a[ii].pExpr) ){ sqlite3VdbeAddOp3(v, OP_BitAnd, regCkNull, r2, regCkNull); diff --git a/test/in.test b/test/in.test index bd1209fb67..4595d5fd19 100644 --- a/test/in.test +++ b/test/in.test @@ -763,6 +763,8 @@ do_execsql_test in-18.1 { # For the IN_INDEX_NOOP optimization, apply REAL affinity to the LHS # values prior to comparison if the RHS has REAL affinity. # +# Also ticket https://sqlite.org/src/info/29f635e0af71234b +# do_execsql_test in-19.1 { DROP TABLE IF EXISTS t0; CREATE TABLE t0(c0 REAL UNIQUE); @@ -775,5 +777,12 @@ do_execsql_test in-19.2 { do_execsql_test in-19.3 { SELECT c0 IN ('2070934912552030444',2,3) FROM t0; } {1} +do_execsql_test in-19.4 { + DROP TABLE t0; + CREATE TABLE t0(c0 TEXT, c1 REAL, c2, PRIMARY KEY(c2, c0, c1)); + CREATE INDEX i0 ON t0(c1 IN (c0)); + INSERT INTO t0(c0, c2) VALUES (0, NULL) ON CONFLICT(c2, c1, c0) DO NOTHING; + PRAGMA integrity_check; +} {ok} finish_test From c7d12f4ad4283f1b3a09d140c489319c9d2eb8f8 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 3 Sep 2019 14:27:25 +0000 Subject: [PATCH 203/221] When we play games with COLLATE in order to commute an operator in the WHERE clause processing, be sure not to use the commuted operator to qualify a partial index, as insufficient COLLATE information is preserved to verify that the expression will correctly qualify the index. Ticket [767a8cbc6d20bd68] FossilOrigin-Name: 5351e920f489562f959ab8a376ff720f845ea165e0cdc7c3a271aac53c2aa64a --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/where.c | 4 +++- src/whereInt.h | 1 + src/whereexpr.c | 13 +++++++++++-- test/index6.test | 18 ++++++++++++++++++ 6 files changed, 43 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 8a800c1dc3..05386d4075 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sintroduced\searlier\stoday\sby\scheck-in\s[88833a9c2849c959].\nTicket\s[29f635e0af71234b] -D 2019-09-02T22:13:06.403 +C When\swe\splay\sgames\swith\sCOLLATE\sin\sorder\sto\scommute\san\soperator\sin\sthe\nWHERE\sclause\sprocessing,\sbe\ssure\snot\sto\suse\sthe\scommuted\soperator\sto\squalify\na\spartial\sindex,\sas\sinsufficient\sCOLLATE\sinformation\sis\spreserved\sto\sverify\nthat\sthe\sexpression\swill\scorrectly\squalify\sthe\sindex.\nTicket\s[767a8cbc6d20bd68] +D 2019-09-03T14:27:25.935 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -610,10 +610,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 -F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 +F src/where.c 9685d5988b79b93ebbe46941fbdb60d14861bb0fe3f9126117ef1753acc69b64 +F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b -F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f +F src/whereexpr.c b3bbae199e7acd8d0fa822c9a29cbb822ef2b3d84d68de55a3d60b013f5d5da4 F src/window.c 96b0c033d33408f16ac8b177eac6362ee53a23d9b6d7a51a04289ab2f956bb77 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test da465d3d490ab24ef64f7715b5953343a4967762b9350b29eb1462879ff3fb9e @@ -1048,7 +1048,7 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test bae04b456a1845d8d48af751ac5b9bba5571551b96ef39d2b5b1db48cadd0fac +F test/index6.test 4d1dd3cab97fba2ddf30bb70afc82eab35bd6e61788b3ac941e55263f81ef7e9 F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 @@ -1839,7 +1839,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9490683ae883561fa347cbe54ebdd61188d849b4852d904b508250ba5d0807ef -R 931628c07078d6a1ec560a2e18a3f53f +P 6e7b4527d32cc1be0294614b9d7363d4b59cf654a954b86515b3f6888975ce73 +R f93cc76f663e94933b1f2f65b53349fd U drh -Z 31499ded87036041191e77b0df0459dc +Z 391da90ad359183d92b0ba19729274a1 diff --git a/manifest.uuid b/manifest.uuid index d9a9e049c6..63c1adf712 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e7b4527d32cc1be0294614b9d7363d4b59cf654a954b86515b3f6888975ce73 \ No newline at end of file +5351e920f489562f959ab8a376ff720f845ea165e0cdc7c3a271aac53c2aa64a \ No newline at end of file diff --git a/src/where.c b/src/where.c index b51d4485c4..8c7874dc57 100644 --- a/src/where.c +++ b/src/where.c @@ -2800,7 +2800,9 @@ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){ } if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ - Expr *pExpr = pTerm->pExpr; + Expr *pExpr; + if( pTerm->wtFlags & TERM_NOPARTIDX ) continue; + pExpr = pTerm->pExpr; if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) ){ diff --git a/src/whereInt.h b/src/whereInt.h index e63ca46d53..64978cf110 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -291,6 +291,7 @@ struct WhereTerm { #define TERM_LIKE 0x400 /* The original LIKE operator */ #define TERM_IS 0x800 /* Term.pExpr is an IS operator */ #define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ +#define TERM_NOPARTIDX 0x2000 /* Not for use to enable a partial index */ /* ** An instance of the WhereScan object is used as an iterator for locating diff --git a/src/whereexpr.c b/src/whereexpr.c index d878bdb9ec..f6f966b9e1 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -117,10 +117,16 @@ static int allowedOp(int op){ ** the left hand side of a comparison overrides any collation sequence ** attached to the right. For the same reason the EP_Collate flag ** is not commuted. +** +** The return value is extra flags that are added to the WhereTerm object +** after it is commuted. The only extra flag ever added is TERM_NOPARTIDX +** which prevents the term from being used to enable a partial index if +** COLLATE changes have been made. */ -static void exprCommute(Parse *pParse, Expr *pExpr){ +static u16 exprCommute(Parse *pParse, Expr *pExpr){ u16 expRight = (pExpr->pRight->flags & EP_Collate); u16 expLeft = (pExpr->pLeft->flags & EP_Collate); + u16 wtFlags = 0; assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN ); if( expRight==expLeft ){ /* Either X and Y both have COLLATE operator or neither do */ @@ -128,11 +134,13 @@ static void exprCommute(Parse *pParse, Expr *pExpr){ /* Both X and Y have COLLATE operators. Make sure X is always ** used by clearing the EP_Collate flag from Y. */ pExpr->pRight->flags &= ~EP_Collate; + wtFlags |= TERM_NOPARTIDX; }else if( sqlite3ExprCollSeq(pParse, pExpr->pLeft)!=0 ){ /* Neither X nor Y have COLLATE operators, but X has a non-default ** collating sequence. So add the EP_Collate marker on X to cause ** it to be searched first. */ pExpr->pLeft->flags |= EP_Collate; + wtFlags |= TERM_NOPARTIDX; } } SWAP(Expr*,pExpr->pRight,pExpr->pLeft); @@ -144,6 +152,7 @@ static void exprCommute(Parse *pParse, Expr *pExpr){ assert( pExpr->op>=TK_GT && pExpr->op<=TK_GE ); pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; } + return wtFlags; } /* @@ -1140,7 +1149,7 @@ static void exprAnalyze( pDup = pExpr; pNew = pTerm; } - exprCommute(pParse, pDup); + pNew->wtFlags |= exprCommute(pParse, pDup); pNew->leftCursor = aiCurCol[0]; pNew->u.leftColumn = aiCurCol[1]; testcase( (prereqLeft | extraRight) != prereqLeft ); diff --git a/test/index6.test b/test/index6.test index d5bc77c0db..976c49fb86 100644 --- a/test/index6.test +++ b/test/index6.test @@ -462,5 +462,23 @@ do_execsql_test index6-15.5 { SELECT 1 FROM t0 WHERE (c0 IS FALSE) IN (FALSE); } {1} +# 2019-09-03 +# Ticket https://sqlite.org/src/info/767a8cbc6d20bd68 +do_execsql_test index6-16.1 { + DROP TABLE t0; + CREATE TABLE t0(c0 COLLATE NOCASE, c1); + CREATE INDEX i0 ON t0(0) WHERE c0 >= c1; + INSERT INTO t0 VALUES('a', 'B'); + SELECT c1 <= c0, c0 >= c1 FROM t0; +} {1 0} +do_execsql_test index6-16.2 { + SELECT 2 FROM t0 WHERE c0 >= c1; +} {} +do_execsql_test index6-16.3 { + SELECT 3 FROM t0 WHERE c1 <= c0; +} {3} + + + finish_test From 7dc3547eeb691d5397e9dc55206daab0927937d8 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 3 Sep 2019 16:23:41 +0000 Subject: [PATCH 204/221] Updates to the default settings in Makefile.linux-gcc. FossilOrigin-Name: 3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2d897d --- Makefile.linux-gcc | 26 +++++++++----------------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 16 insertions(+), 24 deletions(-) diff --git a/Makefile.linux-gcc b/Makefile.linux-gcc index 1491a4b02a..ad5d4dd093 100644 --- a/Makefile.linux-gcc +++ b/Makefile.linux-gcc @@ -19,7 +19,7 @@ TOP = ../sqlite #### C Compiler and options for use in building executables that # will run on the platform that is doing the build. # -BCC = gcc -g -O2 +BCC = gcc -g -O0 #BCC = /opt/ancic/bin/c89 -0 #### If the target operating system supports the "usleep()" system @@ -38,8 +38,8 @@ THREADSAFE = -DTHREADSAFE=0 #### Specify any extra linker options needed to make the library # thread safe # -#THREADLIB = -lpthread -THREADLIB = +THREADLIB = -lpthread -lm -ldl +#THREADLIB = #### Specify any extra libraries needed to access required functions. # @@ -54,11 +54,9 @@ TLIBS = # You can make the library go almost twice as fast if you compile # with -DNDEBUG=1 # -#OPTS = -DSQLITE_DEBUG=2 -#OPTS = -DSQLITE_DEBUG=1 -#OPTS = -OPTS = -DNDEBUG=1 -OPTS += -DHAVE_FDATASYNC=1 +OPTS += -DSQLITE_DEBUG=1 +OPTS += -DSQLITE_ENABLE_WHERETRACE +OPTS += -DSQLITE_ENABLE_SELECTTRACE #### The suffix to add to executable files. ".exe" for windows. # Nothing for unix. @@ -70,7 +68,7 @@ EXE = # will run on the target platform. This is usually the same # as BCC, unless you are cross-compiling. # -TCC = gcc -O6 +TCC = gcc -O0 #TCC = gcc -g -O0 -Wall #TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage #TCC = /opt/mingw/bin/i386-mingw32-gcc -O6 @@ -91,18 +89,12 @@ SHPREFIX = lib #### Extra compiler options needed for programs that use the TCL library. # -#TCL_FLAGS = -#TCL_FLAGS = -DSTATIC_BUILD=1 -TCL_FLAGS = -I/home/drh/tcltk/8.5linux -#TCL_FLAGS = -I/home/drh/tcltk/8.5win -DSTATIC_BUILD=1 -#TCL_FLAGS = -I/home/drh/tcltk/8.3hpux +TCL_FLAGS = -I/home/drh/tcl/include/tcl8.6 #### Linker options needed to link against the TCL library. # #LIBTCL = -ltcl -lm -ldl -LIBTCL = /home/drh/tcltk/8.5linux/libtcl8.5g.a -lm -ldl -#LIBTCL = /home/drh/tcltk/8.5win/libtcl85s.a -lmsvcrt -#LIBTCL = /home/drh/tcltk/8.3hpux/libtcl8.3.a -ldld -lm -lc +LIBTCL = /home/drh/tcl/lib/libtcl8.6.a -lm -lpthread -ldl -lz #### Additional objects for SQLite library when TCL support is enabled. #TCLOBJ = diff --git a/manifest b/manifest index 05386d4075..3921cbfbc9 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ -C When\swe\splay\sgames\swith\sCOLLATE\sin\sorder\sto\scommute\san\soperator\sin\sthe\nWHERE\sclause\sprocessing,\sbe\ssure\snot\sto\suse\sthe\scommuted\soperator\sto\squalify\na\spartial\sindex,\sas\sinsufficient\sCOLLATE\sinformation\sis\spreserved\sto\sverify\nthat\sthe\sexpression\swill\scorrectly\squalify\sthe\sindex.\nTicket\s[767a8cbc6d20bd68] -D 2019-09-03T14:27:25.935 +C Updates\sto\sthe\sdefault\ssettings\sin\sMakefile.linux-gcc. +D 2019-09-03T16:23:41.278 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 578f123620087ea459aa08fa872810a25ca7c0aaf16331de985bfcddb5f1e747 -F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 +F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc a463dca3c50d8a36094fe5c8c39077907f530b54edfc5388c66c85e2cfc8dc04 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1 @@ -1839,7 +1839,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6e7b4527d32cc1be0294614b9d7363d4b59cf654a954b86515b3f6888975ce73 -R f93cc76f663e94933b1f2f65b53349fd +P 5351e920f489562f959ab8a376ff720f845ea165e0cdc7c3a271aac53c2aa64a +R 925cc947a7aaed39ac73d111ffc8ed4f U drh -Z 391da90ad359183d92b0ba19729274a1 +Z 4a725e18713a18c2d331c90a708c61ac diff --git a/manifest.uuid b/manifest.uuid index 63c1adf712..c360ee3192 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5351e920f489562f959ab8a376ff720f845ea165e0cdc7c3a271aac53c2aa64a \ No newline at end of file +3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2d897d \ No newline at end of file From 1a97c413f8c26670d3bbf122a6eaa88dea0a0b5c Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 4 Sep 2019 06:56:43 +0000 Subject: [PATCH 205/221] Fix handling of NULL, text and blob values in window queries that use "RANGE BETWEEN A FOLLOWING AND B FOLLOWING", or "B PRECEDING AND A PRECEDING", where A>B. FossilOrigin-Name: cb3e2be674316e1d39968eb6567f1fe1b72f9d89af49640a9e83f944979c4cf0 --- manifest | 19 ++-- manifest.uuid | 2 +- src/window.c | 2 +- test/window8.tcl | 64 +++++++++++- test/window8.test | 253 +++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 324 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 3921cbfbc9..ad787c3946 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Updates\sto\sthe\sdefault\ssettings\sin\sMakefile.linux-gcc. -D 2019-09-03T16:23:41.278 +C Fix\shandling\sof\sNULL,\stext\sand\sblob\svalues\sin\swindow\squeries\sthat\suse\s"RANGE\sBETWEEN\sA\sFOLLOWING\sAND\sB\sFOLLOWING",\sor\s"B\sPRECEDING\sAND\sA\sPRECEDING",\swhere\sA>B. +D 2019-09-04T06:56:43.134 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/where.c 9685d5988b79b93ebbe46941fbdb60d14861bb0fe3f9126117ef1753acc69b64 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c b3bbae199e7acd8d0fa822c9a29cbb822ef2b3d84d68de55a3d60b013f5d5da4 -F src/window.c 96b0c033d33408f16ac8b177eac6362ee53a23d9b6d7a51a04289ab2f956bb77 +F src/window.c b1e56b1281538b5cdd796b4f6c6281549bef6f977aab63e2493704a2a9f31937 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test da465d3d490ab24ef64f7715b5953343a4967762b9350b29eb1462879ff3fb9e F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1712,8 +1712,8 @@ F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652 F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd -F test/window8.tcl 112bdc96dd310cfef93119fc5e4e9108c322080676fdb006ccc98d67d41c8acb -F test/window8.test 85ad3bd55615482c7a93f5286f0b0968f86ad0d62df5bca2f0ea50699e5aef31 +F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2 +F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 @@ -1839,7 +1839,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5351e920f489562f959ab8a376ff720f845ea165e0cdc7c3a271aac53c2aa64a -R 925cc947a7aaed39ac73d111ffc8ed4f -U drh -Z 4a725e18713a18c2d331c90a708c61ac +P 3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2d897d +R 8115b1008885358de7df7c995955e272 +T +closed 91875000a76cad5b7615ea87aafb2d1fec09441592b37424da4f51e7e025cbfd +U dan +Z 35e89c49c4707a04ab0cfaf64c9b5bb4 diff --git a/manifest.uuid b/manifest.uuid index c360ee3192..8dd06dd0f1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2d897d \ No newline at end of file +cb3e2be674316e1d39968eb6567f1fe1b72f9d89af49640a9e83f944979c4cf0 \ No newline at end of file diff --git a/src/window.c b/src/window.c index 7cb86e58be..ed2e32079f 100644 --- a/src/window.c +++ b/src/window.c @@ -2745,7 +2745,7 @@ void sqlite3WindowCodeStep( windowCheckValue(pParse, regEnd, 1 + (pMWin->eFrmType==TK_RANGE ? 3 : 0)); } - if( pMWin->eStart==pMWin->eEnd && regStart ){ + if( pMWin->eFrmType!=TK_RANGE && pMWin->eStart==pMWin->eEnd && regStart ){ int op = ((pMWin->eStart==TK_FOLLOWING) ? OP_Ge : OP_Le); int addrGe = sqlite3VdbeAddOp3(v, op, regStart, 0, regEnd); VdbeCoverageNeverNullIf(v, op==OP_Ge); /* NeverNull because bound */ diff --git a/test/window8.tcl b/test/window8.tcl index aa934a8267..a8333f1907 100644 --- a/test/window8.tcl +++ b/test/window8.tcl @@ -351,15 +351,75 @@ execsql_test 7.0 { INSERT INTO t2 VALUES(2, NULL); INSERT INTO t2 VALUES(3, NULL); INSERT INTO t2 VALUES(4, NULL); + INSERT INTO t2 VALUES(5, 66); + INSERT INTO t2 VALUES(6, 67); } -execsql_test 7.1 { - SELECT sum(a) OVER win FROM t2 +foreach {tn f ex} { + 1 sum "" + 2 min "" + 3 sum "EXCLUDE CURRENT ROW" + 4 max "EXCLUDE CURRENT ROW" +} { +execsql_test 7.$tn.1 " + SELECT $f (a) OVER win FROM t2 WINDOW win AS ( ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING ); +" +execsql_test 7.$tn.2 " + SELECT $f (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +" +execsql_test 7.$tn.3 " + SELECT $f (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +" +execsql_test 7.$tn.4 " + SELECT $f (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +" +execsql_test 7.$tn.5 " + SELECT $f (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +" + +execsql_test 7.$tn.6 " + SELECT $f (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING + ); +" +execsql_test 7.$tn.7 " + SELECT $f (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +" +execsql_test 7.$tn.8 " + SELECT $f (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING + ); +" +execsql_test 7.$tn.9 " + SELECT $f (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +" } + + finish_test diff --git a/test/window8.test b/test/window8.test index 0c7656b9a1..ed720ebd41 100644 --- a/test/window8.test +++ b/test/window8.test @@ -6213,13 +6213,260 @@ do_execsql_test 7.0 { INSERT INTO t2 VALUES(2, NULL); INSERT INTO t2 VALUES(3, NULL); INSERT INTO t2 VALUES(4, NULL); + INSERT INTO t2 VALUES(5, 66); + INSERT INTO t2 VALUES(6, 67); } {} -do_execsql_test 7.1 { - SELECT sum(a) OVER win FROM t2 +do_execsql_test 7.1.1 { + SELECT sum (a) OVER win FROM t2 WINDOW win AS ( ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING ); -} {9 9 9 9} +} {9 9 9 9 9 9} + +do_execsql_test 7.1.2 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +} {{} {} {} 9 9 9} + +do_execsql_test 7.1.3 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +} {{} {} {} 9 9 9} + +do_execsql_test 7.1.4 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +} {9 9 9 {} {} {}} + +do_execsql_test 7.1.5 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +} {9 9 9 {} {} {}} + +do_execsql_test 7.1.6 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING + ); +} {{} {} 1 9 9 9} + +do_execsql_test 7.1.7 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +} {{} {} {} 9 9 9} + +do_execsql_test 7.1.8 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING + ); +} {9 9 9 {} {} {}} + +do_execsql_test 7.1.9 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +} {9 9 9 {} {} {}} + +do_execsql_test 7.2.1 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING + ); +} {2 2 2 2 2 2} + +do_execsql_test 7.2.2 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +} {{} {} {} 2 2 2} + +do_execsql_test 7.2.3 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +} {{} {} {} 2 2 2} + +do_execsql_test 7.2.4 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +} {2 2 2 {} {} {}} + +do_execsql_test 7.2.5 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +} {2 2 2 {} {} {}} + +do_execsql_test 7.2.6 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING + ); +} {{} {} 1 2 2 2} + +do_execsql_test 7.2.7 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +} {{} {} {} 2 2 2} + +do_execsql_test 7.2.8 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING + ); +} {2 2 2 {} {} {}} + +do_execsql_test 7.2.9 { + SELECT min (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +} {2 2 2 {} {} {}} + +do_execsql_test 7.3.1 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING + ); +} {9 9 9 9 9 9} + +do_execsql_test 7.3.2 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +} {{} {} {} 9 9 9} + +do_execsql_test 7.3.3 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +} {{} {} {} 9 9 9} + +do_execsql_test 7.3.4 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +} {9 9 9 {} {} {}} + +do_execsql_test 7.3.5 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +} {9 9 9 {} {} {}} + +do_execsql_test 7.3.6 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING + ); +} {{} {} 1 9 9 9} + +do_execsql_test 7.3.7 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +} {{} {} {} 9 9 9} + +do_execsql_test 7.3.8 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING + ); +} {9 9 9 {} {} {}} + +do_execsql_test 7.3.9 { + SELECT sum (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +} {9 9 9 {} {} {}} + +do_execsql_test 7.4.1 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING + ); +} {4 4 4 4 4 4} + +do_execsql_test 7.4.2 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +} {{} {} {} 4 4 4} + +do_execsql_test 7.4.3 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +} {{} {} {} 4 4 4} + +do_execsql_test 7.4.4 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING + ); +} {4 4 4 {} {} {}} + +do_execsql_test 7.4.5 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING + ); +} {4 4 4 {} {} {}} + +do_execsql_test 7.4.6 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING + ); +} {{} {} 1 4 4 4} + +do_execsql_test 7.4.7 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +} {{} {} {} 4 4 4} + +do_execsql_test 7.4.8 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING + ); +} {4 4 4 {} {} {}} + +do_execsql_test 7.4.9 { + SELECT max (a) OVER win FROM t2 + WINDOW win AS ( + ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING + ); +} {4 4 4 {} {} {}} finish_test From e2ba6df9f0bbbf084db504c9559e7a5c7ebe023d Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 7 Sep 2019 18:20:43 +0000 Subject: [PATCH 206/221] Add the SQLITE_SUBTYPE flag, which can be passed to sqlite3_create_function() and similar to indicate to the core that a user function is likely to use sqlite3_result_subtype(). FossilOrigin-Name: 6aa438ce41d460a6782ae63503128b9140c28ff59c2b2eed48b004acf83e0560 --- ext/misc/json1.c | 6 +-- manifest | 25 ++++++----- manifest.uuid | 2 +- src/main.c | 2 +- src/sqlite.h.in | 5 +++ src/sqliteInt.h | 2 + src/window.c | 47 ++++++++++++++++++-- test/windowB.test | 106 ++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 176 insertions(+), 19 deletions(-) create mode 100644 test/windowB.test diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 3a9d10331c..1c63c3e409 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -2504,9 +2504,9 @@ int sqlite3Json1Init(sqlite3 *db){ #endif for(i=0; iB. -D 2019-09-04T06:56:43.134 +C Add\sthe\sSQLITE_SUBTYPE\sflag,\swhich\scan\sbe\spassed\sto\ssqlite3_create_function()\sand\ssimilar\sto\sindicate\sto\sthe\score\sthat\sa\suser\sfunction\sis\slikely\sto\suse\ssqlite3_result_subtype(). +D 2019-09-07T18:20:43.736 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -294,7 +294,7 @@ F ext/misc/fileio.c 288e7230e0fe464d71b0694e2d8bdd3a353118ac2e31da3964b95f460f09 F ext/misc/fossildelta.c 7708651072eb5620ab21bbfb518d184f27b2c29c0131b09b9a2d8852a8016430 F ext/misc/fuzzer.c c4e27daf41433a64cad5265cd27dbcb891147e9994d0422200ce81ce9a54b625 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c 71ce4e39793b743fc7e4790bc3bab15598e95cab57ad8da4326fa640ae5e5310 +F ext/misc/json1.c 5a2525f7a2268840e7fe6b44a06e2522f5f065a06ba95495ec2de127fb6f92f2 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 @@ -488,7 +488,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 40557ebd69f4115e7a273f9304a8ab637a47ce44f3c6923396928f023967b5e8 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c a045bb3425a9a633cc0f78e93d9beda6866f4c0f15bfdee735aba7c6b39f5cc4 -F src/main.c 51c55eb579eac4180bfcc6242741084710911350d2cd0c3fdd0f9fde55442128 +F src/main.c 3851950717170ade4f6d718c18c6c7400ef5994c2a654679af2cff2ffd0fb2b9 F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -526,10 +526,10 @@ F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c e4fe08c3da81a38061454fb7de2c1b31c36ed76cd1a4bbefd2b5fc4ebb472a5b F src/shell.c.in e5fb91505f29ae9458cabf1a63bbd1faf6b4b34eabca33d0f75a06aacecca21b -F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 +F src/sqlite.h.in aa8eab4a0ad30e10be68223469edbc9add18a6d01bd25ef63015379cabe572ec F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h b1fca535f01f02ae6927dd44e760c6ab54c7a181e88f813d16b55a1bc95d13c0 +F src/sqliteInt.h 34cc038470f74a961ce9c1155df4c3926c2c88d784631272943ae0b7e9bd2aa2 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -614,7 +614,7 @@ F src/where.c 9685d5988b79b93ebbe46941fbdb60d14861bb0fe3f9126117ef1753acc69b64 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c b3bbae199e7acd8d0fa822c9a29cbb822ef2b3d84d68de55a3d60b013f5d5da4 -F src/window.c b1e56b1281538b5cdd796b4f6c6281549bef6f977aab63e2493704a2a9f31937 +F src/window.c b85ce577416ddd9cdbe42222120e2f496a631f0835feccf860e3df0dc0917702 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test da465d3d490ab24ef64f7715b5953343a4967762b9350b29eb1462879ff3fb9e F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1716,6 +1716,7 @@ F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1 F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be +F test/windowB.test 24daa26628291b6e584064efd34b1914aa69058280ece8a512b2e59ba71b6f02 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 @@ -1839,8 +1840,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 3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2d897d -R 8115b1008885358de7df7c995955e272 -T +closed 91875000a76cad5b7615ea87aafb2d1fec09441592b37424da4f51e7e025cbfd +P cb3e2be674316e1d39968eb6567f1fe1b72f9d89af49640a9e83f944979c4cf0 +R d1b9853f176533fc61f0716439115fae +T *branch * window-functions-subtype-fix +T *sym-window-functions-subtype-fix * +T -sym-trunk * U dan -Z 35e89c49c4707a04ab0cfaf64c9b5bb4 +Z 3b4f60d3aa156d677d66f1a5addfe61e diff --git a/manifest.uuid b/manifest.uuid index 8dd06dd0f1..fa760b9d20 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb3e2be674316e1d39968eb6567f1fe1b72f9d89af49640a9e83f944979c4cf0 \ No newline at end of file +6aa438ce41d460a6782ae63503128b9140c28ff59c2b2eed48b004acf83e0560 \ No newline at end of file diff --git a/src/main.c b/src/main.c index a8c1d4dc63..3ef3a3d9fb 100644 --- a/src/main.c +++ b/src/main.c @@ -1719,7 +1719,7 @@ int sqlite3CreateFunc( assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC ); assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY ); - extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY); + extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY|SQLITE_SUBTYPE); enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY); #ifndef SQLITE_OMIT_UTF16 diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 521ddffdb4..8136889ee1 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4987,9 +4987,14 @@ int sqlite3_create_window_function( ** ** The SQLITE_DIRECTONLY flag means that the function may only be invoked ** from top-level SQL, and cannot be used in VIEWs or TRIGGERs. +** +** The SQLITE_SUBTYPE flag indicates to SQLite that the function may call +** [sqlite3_result_subtype()] in order to configure its return value with +** a sub-type. */ #define SQLITE_DETERMINISTIC 0x000000800 #define SQLITE_DIRECTONLY 0x000080000 +#define SQLITE_SUBTYPE 0x000100000 /* ** CAPI3REF: Deprecated Functions diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d3f7ffe260..e7c1d9c1f2 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1686,6 +1686,7 @@ struct FuncDestructor { #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ #define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ +#define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -3611,6 +3612,7 @@ struct Window { int regOne; /* Register containing constant value 1 */ int regStartRowid; int regEndRowid; + u8 bExprArgs; }; #ifndef SQLITE_OMIT_WINDOWFUNC diff --git a/src/window.c b/src/window.c index ed2e32079f..b889930444 100644 --- a/src/window.c +++ b/src/window.c @@ -868,6 +868,32 @@ static void selectWindowRewriteEList( *ppSub = sRewrite.pSub; } +/* +** Return true if the top-level of list pList contains an SQL function +** with the SQLITE_FUNC_SUBTYPE flag set. Return false otherwise. +*/ +int exprListContainsSubtype(Parse *pParse, ExprList *pList){ + if( pList ){ + sqlite3 *db = pParse->db; + int i; + for(i=0; inExpr; i++){ + Expr *p = pList->a[i].pExpr; + if( p->op==TK_FUNCTION ){ + FuncDef *pDef; + int nArg = 0; + if( !ExprHasProperty(p, EP_TokenOnly) && p->x.pList ){ + nArg = p->x.pList->nExpr; + } + pDef = sqlite3FindFunction(db, p->u.zToken, nArg, db->enc, 0); + if( pDef && (pDef->funcFlags & SQLITE_FUNC_SUBTYPE) ){ + return 1; + } + } + } + } + return 0; +} + /* ** Append a copy of each expression in expression-list pAppend to ** expression list pList. Return a pointer to the result list. @@ -965,8 +991,15 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** window function - one for the accumulator, another for interim ** results. */ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); - pSublist = exprListAppendList(pParse, pSublist, pWin->pOwner->x.pList, 0); + ExprList *pArgs = pWin->pOwner->x.pList; + if( exprListContainsSubtype(pParse, pArgs) ){ + selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); + pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); + pWin->bExprArgs = 1; + }else{ + pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); + pSublist = exprListAppendList(pParse, pSublist, pArgs, 0); + } if( pWin->pFilter ){ Expr *pFilter = sqlite3ExprDup(db, pWin->pFilter, 0); pSublist = sqlite3ExprListAppend(pParse, pSublist, pFilter); @@ -1432,7 +1465,7 @@ static void windowAggStep( for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ FuncDef *pFunc = pWin->pFunc; int regArg; - int nArg = windowArgCount(pWin); + int nArg = pWin->bExprArgs ? 0 : windowArgCount(pWin); int i; assert( bInverse==0 || pWin->eStart!=TK_UNBOUNDED ); @@ -1482,6 +1515,11 @@ static void windowAggStep( VdbeCoverage(v); sqlite3ReleaseTempReg(pParse, regTmp); } + if( pWin->bExprArgs ){ + nArg = pWin->pOwner->x.pList->nExpr; + regArg = sqlite3GetTempRange(pParse, nArg); + sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0); + } if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ CollSeq *pColl; assert( nArg>0 ); @@ -1492,6 +1530,9 @@ static void windowAggStep( bInverse, regArg, pWin->regAccum); sqlite3VdbeAppendP4(v, pFunc, P4_FUNCDEF); sqlite3VdbeChangeP5(v, (u8)nArg); + if( pWin->bExprArgs ){ + sqlite3ReleaseTempRange(pParse, regArg, nArg); + } if( addrIf ) sqlite3VdbeJumpHere(v, addrIf); } } diff --git a/test/windowB.test b/test/windowB.test new file mode 100644 index 0000000000..0c242acc70 --- /dev/null +++ b/test/windowB.test @@ -0,0 +1,106 @@ +# 2019-08-30 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# Test cases for RANGE BETWEEN and especially with NULLS LAST +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix windowB + +ifcapable !windowfunc { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(NULL, 1); + INSERT INTO t1 VALUES(NULL, 2); + INSERT INTO t1 VALUES(NULL, 3); +} {} + +foreach {tn win} { + 1 { ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING } + 2 { ORDER BY a NULLS LAST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING } + 3 { ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING } + 4 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING } + + 5 { ORDER BY a NULLS LAST RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING } + 6 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 FOLLOWING AND 2 FOLLOWING } + + 7 { ORDER BY a NULLS LAST RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING } + 8 { ORDER BY a DESC NULLS FIRST RANGE BETWEEN 2 PRECEDING AND 1 PRECEDING } +} { + do_execsql_test 1.$tn " + SELECT sum(b) OVER win FROM t1 + WINDOW win AS ( $win ) + " {6 6 6} +} + +do_execsql_test 1.2 { + SELECT sum(b) OVER win FROM t1 + WINDOW win AS ( + ORDER BY a DESC NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) +} {6 6 6} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, NULL); + INSERT INTO t1 VALUES(2, 45); + INSERT INTO t1 VALUES(3, 66.2); + INSERT INTO t1 VALUES(4, 'hello world'); + INSERT INTO t1 VALUES(5, 'hello world'); + INSERT INTO t1 VALUES(6, X'1234'); + INSERT INTO t1 VALUES(7, X'1234'); + INSERT INTO t1 VALUES(8, NULL); +} + +foreach {tn win} { + 1 "ORDER BY b RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING" + 2 "ORDER BY b RANGE BETWEEN 2 FOLLOWING AND 2 FOLLOWING" + 3 "ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING" + 4 "ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 2 FOLLOWING" +} { + do_execsql_test 2.1.$tn " + SELECT a, sum(a) OVER win FROM t1 + WINDOW win AS ( $win ) + ORDER BY 1 + " {1 9 2 {} 3 {} 4 9 5 9 6 13 7 13 8 9} +} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 3.0 { + CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT); + INSERT INTO testjson VALUES(1, '{"a":1}'); + INSERT INTO testjson VALUES(2, '{"b":2}'); +} + +do_execsql_test 3.1 { + SELECT json_group_array(json(j)) FROM testjson; +} { + {[{"a":1},{"b":2}]} +} + +breakpoint +do_execsql_test 3.2 { + SELECT json_group_array(json(j)) OVER (ORDER BY id) FROM testjson; +} { + {[{"a":1}]} + {[{"a":1},{"b":2}]} +} + + +finish_test + From e08663946ee6d0f5c8429aa035c9db2186ed4766 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 9 Sep 2019 19:49:42 +0000 Subject: [PATCH 207/221] Ensure the columns of views and sub-selects in the FROM clause of a select are always assigned implicit collation sequences, just as table columns are. Possible fix for [a7debbe0]. FossilOrigin-Name: 1863b7bf12521bdd2b51c5b8d3a4634bff3e15d3713e0b5343952df7da02f794 --- manifest | 17 ++++--- manifest.uuid | 2 +- src/select.c | 15 ++++++ test/tkt-a7debbe0.test | 103 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 test/tkt-a7debbe0.test diff --git a/manifest b/manifest index ad787c3946..df599d99d4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\shandling\sof\sNULL,\stext\sand\sblob\svalues\sin\swindow\squeries\sthat\suse\s"RANGE\sBETWEEN\sA\sFOLLOWING\sAND\sB\sFOLLOWING",\sor\s"B\sPRECEDING\sAND\sA\sPRECEDING",\swhere\sA>B. -D 2019-09-04T06:56:43.134 +C Ensure\sthe\scolumns\sof\sviews\sand\ssub-selects\sin\sthe\sFROM\sclause\sof\sa\sselect\sare\salways\sassigned\simplicit\scollation\ssequences,\sjust\sas\stable\scolumns\sare.\sPossible\sfix\sfor\s[a7debbe0]. +D 2019-09-09T19:49:42.715 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c e4fe08c3da81a38061454fb7de2c1b31c36ed76cd1a4bbefd2b5fc4ebb472a5b +F src/select.c 8685adae94dffa6e4542e2194e491d69e27d5b79fe72b219e9255b08e56eaf76 F src/shell.c.in e5fb91505f29ae9458cabf1a63bbd1faf6b4b34eabca33d0f75a06aacecca21b F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1448,6 +1448,7 @@ F test/tkt-9a8b09f8e6.test b2ef151d0984b2ebf237760dbeaa50724e5a0667 F test/tkt-9d68c883.test 16f7cb96781ba579bc2e19bb14b4ad609d9774b6 F test/tkt-9f2eb3abac.test cb6123ac695a08b4454c3792fbe85108f67fabf8 F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 +F test/tkt-a7debbe0.test 27b977fea9d42021d9ef67e5811bdc56fd0b9599517e0244c528dddd3264ed4e F test/tkt-a8a0d2996a.test 002e1cde8fc30c39611b52cf981c88200b858765748556822da72e0d32fac73e F test/tkt-b1d3a2e531.test 8f7576e41ca179289ee1a8fee28386fd8e4b0550 F test/tkt-b351d95f9.test d14a503c414c5c58fdde3e80f9a3cfef986498c0 @@ -1839,8 +1840,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 3044cf6917ea8324175fc91657e9a5978af9748f72e1914bc361753f0b2d897d -R 8115b1008885358de7df7c995955e272 -T +closed 91875000a76cad5b7615ea87aafb2d1fec09441592b37424da4f51e7e025cbfd +P cb3e2be674316e1d39968eb6567f1fe1b72f9d89af49640a9e83f944979c4cf0 +R 8499ff2bdbcbd0ce456fbfc5655f865d +T *branch * tkt-a7debbe0. +T *sym-tkt-a7debbe0. * +T -sym-trunk * U dan -Z 35e89c49c4707a04ab0cfaf64c9b5bb4 +Z b93432e9313cfc8d7991fd66b06bef63 diff --git a/manifest.uuid b/manifest.uuid index 8dd06dd0f1..9e8c7a5c15 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb3e2be674316e1d39968eb6567f1fe1b72f9d89af49640a9e83f944979c4cf0 \ No newline at end of file +1863b7bf12521bdd2b51c5b8d3a4634bff3e15d3713e0b5343952df7da02f794 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 0bf5451834..f446a89f10 100644 --- a/src/select.c +++ b/src/select.c @@ -3418,6 +3418,7 @@ typedef struct SubstContext { int iNewTable; /* New table number */ int isLeftJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ ExprList *pEList; /* Replacement expressions */ + int bFlattener; /* True for query-flattener, false otherwise */ } SubstContext; /* Forward Declarations */ @@ -3478,6 +3479,18 @@ static Expr *substExpr( } sqlite3ExprDelete(db, pExpr); pExpr = pNew; + + /* If this call is part of query-flattening, ensure that the + ** new expression has an implicit collation sequence. */ + if( pSubst->bFlattener && pExpr ){ + if( pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE ){ + CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pExpr); + pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, + (pColl ? pColl->zName : "BINARY") + ); + } + ExprClearProperty(pExpr, EP_Collate); + } } } }else{ @@ -4043,6 +4056,7 @@ static int flattenSubquery( x.iNewTable = iNewParent; x.isLeftJoin = isLeftJoin; x.pEList = pSub->pEList; + x.bFlattener = 1; substSelect(&x, pParent, 0); } @@ -4368,6 +4382,7 @@ static int pushDownWhereTerms( x.iNewTable = iCursor; x.isLeftJoin = 0; x.pEList = pSubq->pEList; + x.bFlattener = 0; pNew = substExpr(&x, pNew); if( pSubq->selFlags & SF_Aggregate ){ pSubq->pHaving = sqlite3ExprAnd(pParse, pSubq->pHaving, pNew); diff --git a/test/tkt-a7debbe0.test b/test/tkt-a7debbe0.test new file mode 100644 index 0000000000..a49a0bac88 --- /dev/null +++ b/test/tkt-a7debbe0.test @@ -0,0 +1,103 @@ +# 2019 September 10 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. In particular, +# that problems related to ticket a7debbe0ad1 have been fixed. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix tkt-a7debbe0 + +foreach tn {1 2} { + reset_db + if {$tn==1} { + # Disable the flattener + optimization_control db query-flattener 0 + } else { + # Enable the flattener + optimization_control db query-flattener 1 + } + + do_execsql_test $tn.1.0 { + CREATE TABLE t0(xyz INTEGER); + INSERT INTO t0(xyz) VALUES(456); + CREATE VIEW v2(a, B) AS + SELECT 'a', 'B' COLLATE NOCASE FROM t0; + CREATE TABLE t2(a, B COLLATE NOCASE); + INSERT INTO t2 VALUES('a', 'B'); + CREATE VIEW v3(a, B) AS + SELECT 'a' COLLATE BINARY, 'B' COLLATE NOCASE FROM t0; + + CREATE VIEW v4(a, B) AS + SELECT 'a', +CAST('B' COLLATE NOCASE AS TEXT) FROM t0; + + CREATE VIEW v5(a, B) AS + SELECT 'a', ('B' COLLATE NOCASE) || '' FROM t0; + } + + # Table t2 and views v2 through v5 should all be equivalent. + do_execsql_test $tn.1.1.1 { SELECT a >= B FROM t2; } 1 + do_execsql_test $tn.1.1.2 { SELECT 'a' >= 'B' COLLATE NOCASE } 0 + do_execsql_test $tn.1.1.3 { SELECT a >= B FROM v2 } 1 + do_execsql_test $tn.1.1.4 { SELECT a >= B FROM v3 } 1 + do_execsql_test $tn.1.1.5 { SELECT a >= B FROM v4 } 1 + do_execsql_test $tn.1.1.6 { SELECT a >= B FROM v5 } 1 + + do_execsql_test $tn.1.2.1 { SELECT B < a FROM t2 } 0 + do_execsql_test $tn.1.2.2 { SELECT 'B' COLLATE NOCASE < 'a' } 0 + do_execsql_test $tn.1.2.3 { SELECT B < a FROM v2 } 0 + do_execsql_test $tn.1.2.4 { SELECT B < a FROM v3 } 0 + do_execsql_test $tn.1.2.5 { SELECT a < B FROM v4 } 0 + do_execsql_test $tn.1.2.6 { SELECT a < B FROM v5 } 0 + + #------------------------------------------------------------------------- + do_execsql_test 2.0 { + CREATE TABLE t5(a, b COLLATE NOCASE); + INSERT INTO t5 VALUES(1, 'XYZ'); + } + + # Result should be 0, as column "xyz" from the sub-query has implicit + # collation sequence BINARY. + do_execsql_test 2.1 { + SELECT xyz==b FROM ( SELECT a, 'xyz' AS xyz FROM t5 ), t5; + } {0} + + # Result should be 1, as literal 'xyz' has no collation sequence, so + # the comparison uses the implicit collation sequence of the RHS - NOCASE. + do_execsql_test 2.2 { + SELECT 'xyz'==b FROM ( SELECT a, 'xyz' AS xyz FROM t5 ), t5; + } {1} + + #----------------------------------------------------------------------- + # The test case submitted with the ticket. + # + do_execsql_test 3.0 { + DROP TABLE t0; + DROP VIEW v2; + + CREATE TABLE t0(c0); + INSERT INTO t0(c0) VALUES(''); + CREATE VIEW v2(c0, c1) AS + SELECT 'B' COLLATE NOCASE, 'a' FROM t0 ORDER BY t0.c0; + SELECT SUM(count) FROM ( + SELECT v2.c1 BETWEEN v2.c0 AND v2.c1 as count FROM v2 + ); + } 1 + + # The result is 1, as the collation used is the implicit collation sequence + # of v2.c1 - BINARY. + do_execsql_test 3.1 { + SELECT v2.c1 BETWEEN v2.c0 AND v2.c1 as count FROM v2; + } 1 +} + +finish_test + From fa5083491497d7c3bfade8a115007a1f88bc7cc7 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 10 Sep 2019 15:33:52 +0000 Subject: [PATCH 208/221] Ensure the columns of views and sub-queries maintain their implicit collation sequences when the "push-down" optimization is applied. Fix for [18458b1a]. FossilOrigin-Name: 36997c4ade2ef3a274cd1ac52b44118fb3a05325adb650b7b338ecb43d060575 --- manifest | 16 ++++++------- manifest.uuid | 2 +- src/select.c | 9 +++---- src/test1.c | 1 + test/tkt-18458b1a.test | 53 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 15 deletions(-) create mode 100644 test/tkt-18458b1a.test diff --git a/manifest b/manifest index 41eb8b12cd..bc79f4017a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthe\scolumns\sof\sviews\sand\ssub-selects\sin\sthe\sFROM\sclause\sof\sa\sselect\sare\salways\sassigned\simplicit\scollation\ssequences,\sjust\sas\stable\scolumns\sare.\sFix\sfor\s[a7debbe0]. -D 2019-09-09T20:17:24.283 +C Ensure\sthe\scolumns\sof\sviews\sand\ssub-queries\smaintain\stheir\simplicit\scollation\ssequences\swhen\sthe\s"push-down"\soptimization\sis\sapplied.\sFix\sfor\s[18458b1a]. +D 2019-09-10T15:33:52.829 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -524,7 +524,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 8685adae94dffa6e4542e2194e491d69e27d5b79fe72b219e9255b08e56eaf76 +F src/select.c e2c870548541d33d090a066e89ab2e7943299006e2827c1abfae39561041fc0b F src/shell.c.in e5fb91505f29ae9458cabf1a63bbd1faf6b4b34eabca33d0f75a06aacecca21b F src/sqlite.h.in 50fc0914ccd347437db9a0278a47d7541df3a45eb6e641e9680750c6f98dad27 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -534,7 +534,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 50c93be3e1c03b4e6cf6756e5197afcfe7f5cd0497d83a7ac317cde09e19b290 -F src/test1.c 8ce455da8dcec886a0e1e608da0fee7de67c8195b14517a8824a2a40c2d11fbf +F src/test1.c 07d774ae3fcd3aed48248483d550cef55cfb417bddab54f4c616b3ac8faa8e32 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -1413,6 +1413,7 @@ F test/threadtest3.c 38a612ea62854349ed66372f330a40d73c5cf956 F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90 F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c +F test/tkt-18458b1a.test c543c4b8e8c7c2200579a635e72c15bc374a92d44eddb1d588d4fdeca9cca532 F test/tkt-26ff0c2d1e.test c15bec890c4d226c0da2f35ff30f9e84c169cfef90e73a8cb5cec11d723dfa96 F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2 F test/tkt-2d1a5c67d.test be1326f3061caec85085f4c9ee4490561ca037c0 @@ -1840,8 +1841,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cb3e2be674316e1d39968eb6567f1fe1b72f9d89af49640a9e83f944979c4cf0 1863b7bf12521bdd2b51c5b8d3a4634bff3e15d3713e0b5343952df7da02f794 -R 9270371da6f28852caf725eea0dfbe33 -T +closed 1863b7bf12521bdd2b51c5b8d3a4634bff3e15d3713e0b5343952df7da02f794 +P b9ec72203c19c2b95e648ac1dfad74eec98d4ff82581cdc10dc4221ba551728f +R cd3dfdd19ee61439a8f3dafd644637dd U dan -Z e9dd23bc0c9ea40830f2a6e0c2945039 +Z 5c236b65c054109c04d341f131258a9f diff --git a/manifest.uuid b/manifest.uuid index bfa3f56c30..4cebedacd4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b9ec72203c19c2b95e648ac1dfad74eec98d4ff82581cdc10dc4221ba551728f \ No newline at end of file +36997c4ade2ef3a274cd1ac52b44118fb3a05325adb650b7b338ecb43d060575 \ No newline at end of file diff --git a/src/select.c b/src/select.c index f446a89f10..811671dd69 100644 --- a/src/select.c +++ b/src/select.c @@ -3418,7 +3418,6 @@ typedef struct SubstContext { int iNewTable; /* New table number */ int isLeftJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ ExprList *pEList; /* Replacement expressions */ - int bFlattener; /* True for query-flattener, false otherwise */ } SubstContext; /* Forward Declarations */ @@ -3480,9 +3479,9 @@ static Expr *substExpr( sqlite3ExprDelete(db, pExpr); pExpr = pNew; - /* If this call is part of query-flattening, ensure that the - ** new expression has an implicit collation sequence. */ - if( pSubst->bFlattener && pExpr ){ + /* Ensure that the expression now has an implicit collation sequence, + ** just as it did when it was a column of a view or sub-query. */ + if( pExpr ){ if( pExpr->op!=TK_COLUMN && pExpr->op!=TK_COLLATE ){ CollSeq *pColl = sqlite3ExprCollSeq(pSubst->pParse, pExpr); pExpr = sqlite3ExprAddCollateString(pSubst->pParse, pExpr, @@ -4056,7 +4055,6 @@ static int flattenSubquery( x.iNewTable = iNewParent; x.isLeftJoin = isLeftJoin; x.pEList = pSub->pEList; - x.bFlattener = 1; substSelect(&x, pParent, 0); } @@ -4382,7 +4380,6 @@ static int pushDownWhereTerms( x.iNewTable = iCursor; x.isLeftJoin = 0; x.pEList = pSubq->pEList; - x.bFlattener = 0; pNew = substExpr(&x, pNew); if( pSubq->selFlags & SF_Aggregate ){ pSubq->pHaving = sqlite3ExprAnd(pParse, pSubq->pHaving, pNew); diff --git a/src/test1.c b/src/test1.c index c6c9e17afe..6de1ff57f2 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7200,6 +7200,7 @@ static int SQLITE_TCLAPI optimization_control( { "omit-noop-join", SQLITE_OmitNoopJoin }, { "stat4", SQLITE_Stat4 }, { "skip-scan", SQLITE_SkipScan }, + { "push-down", SQLITE_PushDown }, }; if( objc!=4 ){ diff --git a/test/tkt-18458b1a.test b/test/tkt-18458b1a.test new file mode 100644 index 0000000000..996ca88451 --- /dev/null +++ b/test/tkt-18458b1a.test @@ -0,0 +1,53 @@ +# 2019 September 10 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. In particular, +# that problems related to ticket [18458b1a] have been fixed. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix tkt-18458b1a + +foreach tn {1 2} { + reset_db + if {$tn==1} { + # Disable the flattener and push-down optimizations + optimization_control db query-flattener 0 + optimization_control db push-down 0 + } else { + # Enable them + optimization_control db query-flattener 1 + optimization_control db push-down 1 + } + + db cache size 0 + + do_execsql_test $tn.1.1 { + CREATE TABLE t0(c0 COLLATE NOCASE); + INSERT INTO t0(c0) VALUES ('B'); + CREATE VIEW v0(c0, c1) AS SELECT DISTINCT t0.c0, 'a' FROM t0; + } + + do_execsql_test $tn.1.2 { + SELECT count(*) FROM v0 WHERE c1 >= c0; + } 1 + + do_execsql_test $tn.1.3 { + SELECT count(*) FROM v0 WHERE NOT NOT (c1 >= c0); + } 1 + + do_execsql_test $tn.1.4 { + SELECT count(*) FROM v0 WHERE ((c1 >= c0) OR 0+0); + } 1 +} + +finish_test + From c204d81a6c043305cfae10e7e9c9338d3702d1a6 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 10 Sep 2019 17:51:27 +0000 Subject: [PATCH 209/221] Enhance treeview to show SOFT-COLLATE for TK_COLLATE operators that omit the EP_Collate flag. FossilOrigin-Name: a97804620a27acc30bebd2aaa04e38f2f36de48b0931038ca8bdc9cb0c36b8f4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/treeview.c | 8 +++++++- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index bc79f4017a..22c156a669 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthe\scolumns\sof\sviews\sand\ssub-queries\smaintain\stheir\simplicit\scollation\ssequences\swhen\sthe\s"push-down"\soptimization\sis\sapplied.\sFix\sfor\s[18458b1a]. -D 2019-09-10T15:33:52.829 +C Enhance\streeview\sto\sshow\sSOFT-COLLATE\sfor\sTK_COLLATE\soperators\sthat\somit\nthe\sEP_Collate\sflag. +D 2019-09-10T17:51:27.783 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -589,7 +589,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e -F src/treeview.c fc8c6c0a8a26afb3a97e3f844d65403dd27cf1450baf4415034fa4ccf00c4d7e +F src/treeview.c dd92b189d8c0623d6cf59cf2e136e4c3b2389ded133eaa15ca51d4714866ebb4 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e F src/update.c 7f05fad5e145248a00048aeb0bac78b8fdb4ed17216e14a6eb24c55596e87ee7 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 @@ -1841,7 +1841,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b9ec72203c19c2b95e648ac1dfad74eec98d4ff82581cdc10dc4221ba551728f -R cd3dfdd19ee61439a8f3dafd644637dd -U dan -Z 5c236b65c054109c04d341f131258a9f +P 36997c4ade2ef3a274cd1ac52b44118fb3a05325adb650b7b338ecb43d060575 +R f5a1c0f164d27201c013c3daaa104b97 +U drh +Z 4233ce0b10c0fb1f5285adf400752dbf diff --git a/manifest.uuid b/manifest.uuid index 4cebedacd4..7f2e23c390 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36997c4ade2ef3a274cd1ac52b44118fb3a05325adb650b7b338ecb43d060575 \ No newline at end of file +a97804620a27acc30bebd2aaa04e38f2f36de48b0931038ca8bdc9cb0c36b8f4 \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 6dfdccd7ee..dcc81b8767 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -536,7 +536,13 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ } case TK_COLLATE: { - sqlite3TreeViewLine(pView, "COLLATE %Q", pExpr->u.zToken); + /* COLLATE operators without the EP_Collate flag are intended to + ** emulate collation associated with a table column. Explicit + ** COLLATE operators that appear in the original SQL always have + ** the EP_Collate bit set */ + sqlite3TreeViewLine(pView, "%sCOLLATE %Q%s", + !ExprHasProperty(pExpr, EP_Collate) ? "SOFT-" : "", + pExpr->u.zToken, zFlgs); sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); break; } From acf6e08d20a663de5d4012effba666675bd23fe9 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 11 Sep 2019 15:25:26 +0000 Subject: [PATCH 210/221] Fix typo for one instance of line number handling in the Lemon tool. FossilOrigin-Name: 980be1730dc1239c63a107923bf2e32b4ec7d4bc31b9190e711cc35f18cc2bb4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/lemon.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 22c156a669..dccb38d831 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\streeview\sto\sshow\sSOFT-COLLATE\sfor\sTK_COLLATE\soperators\sthat\somit\nthe\sEP_Collate\sflag. -D 2019-09-10T17:51:27.783 +C Fix\stypo\sfor\sone\sinstance\sof\sline\snumber\shandling\sin\sthe\sLemon\stool. +D 2019-09-11T15:25:26.595 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1760,7 +1760,7 @@ F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c c9848ef9694689d244a5097238ca1f83df85cc52c80ad149a4cf49595a0ee9c2 +F tool/lemon.c 61d5f0af1eff8f754b75ddca668c9897fd30759e389bfffb42ce9e4d38fd4746 F tool/lempar.c eb2841e2a7fd484cf44b1f526b06e7ab0f216d2f41818bf9485e8f38e3d1db19 F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 @@ -1841,7 +1841,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 36997c4ade2ef3a274cd1ac52b44118fb3a05325adb650b7b338ecb43d060575 -R f5a1c0f164d27201c013c3daaa104b97 -U drh -Z 4233ce0b10c0fb1f5285adf400752dbf +P a97804620a27acc30bebd2aaa04e38f2f36de48b0931038ca8bdc9cb0c36b8f4 +R 5065e0b2c7f4ffc5b218b4bab44bb95f +U mistachkin +Z 05d39d001f8aeefdace9f8a8f5ba54b9 diff --git a/manifest.uuid b/manifest.uuid index 7f2e23c390..70e92dabd6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a97804620a27acc30bebd2aaa04e38f2f36de48b0931038ca8bdc9cb0c36b8f4 \ No newline at end of file +980be1730dc1239c63a107923bf2e32b4ec7d4bc31b9190e711cc35f18cc2bb4 \ No newline at end of file diff --git a/tool/lemon.c b/tool/lemon.c index 893e1d18b9..6efc6af301 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -4426,7 +4426,7 @@ void ReportTable( } i++; } - if( j>0 ) fprintf(out, "\n"); lineno++; + if( j>0 ){ fprintf(out, "\n"); lineno++; } fprintf(out, "};\n"); lineno++; /* Output the yy_shift_ofst[] table */ From 685b2ee0c3e4cfafe0e3e8d121fb302d673d011f Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 12 Sep 2019 19:38:40 +0000 Subject: [PATCH 211/221] Allow fts5 to filter on multiple MATCH clauses in a single scan. FossilOrigin-Name: 9d418a7a491761eeb38a70898677a493e2631e5d62e75ee88431f52d3dfd2344 --- ext/fts5/fts5Int.h | 1 + ext/fts5/fts5_config.c | 2 +- ext/fts5/fts5_expr.c | 36 +++++ ext/fts5/fts5_main.c | 261 +++++++++++++++++++++------------- ext/fts5/test/fts5faultB.test | 22 +++ ext/fts5/test/fts5multi.test | 99 +++++++++++++ ext/fts5/test/fts5plan.test | 6 +- ext/fts5/test/fts5simple.test | 13 ++ manifest | 27 ++-- manifest.uuid | 2 +- 10 files changed, 349 insertions(+), 120 deletions(-) create mode 100644 ext/fts5/test/fts5multi.test diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index d0bb543e4c..c29b42b7ad 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -695,6 +695,7 @@ int sqlite3Fts5ExprEof(Fts5Expr*); i64 sqlite3Fts5ExprRowid(Fts5Expr*); void sqlite3Fts5ExprFree(Fts5Expr*); +int sqlite3Fts5ExprAnd(Fts5Expr **pp1, Fts5Expr *p2); /* Called during startup to register a UDF with SQLite */ int sqlite3Fts5ExprInit(Fts5Global*, sqlite3*); diff --git a/ext/fts5/fts5_config.c b/ext/fts5/fts5_config.c index 7a16e38c93..4e1707b3f4 100644 --- a/ext/fts5/fts5_config.c +++ b/ext/fts5/fts5_config.c @@ -683,7 +683,7 @@ int sqlite3Fts5ConfigDeclareVtab(Fts5Config *pConfig){ rc = sqlite3_declare_vtab(pConfig->db, zSql); sqlite3_free(zSql); } - + return rc; } diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index f1bf3f2abc..ce462af0f0 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -309,6 +309,42 @@ void sqlite3Fts5ExprFree(Fts5Expr *p){ } } +int sqlite3Fts5ExprAnd(Fts5Expr **pp1, Fts5Expr *p2){ + Fts5Parse sParse; + memset(&sParse, 0, sizeof(sParse)); + + if( *pp1 ){ + Fts5Expr *p1 = *pp1; + int nPhrase = p1->nPhrase + p2->nPhrase; + + p1->pRoot = sqlite3Fts5ParseNode(&sParse, FTS5_AND, p1->pRoot, p2->pRoot,0); + p2->pRoot = 0; + + if( sParse.rc==SQLITE_OK ){ + Fts5ExprPhrase **ap = (Fts5ExprPhrase**)sqlite3_realloc( + p1->apExprPhrase, nPhrase * sizeof(Fts5ExprPhrase*) + ); + if( ap==0 ){ + sParse.rc = SQLITE_NOMEM; + }else{ + int i; + memmove(&ap[p2->nPhrase], ap, p1->nPhrase*sizeof(Fts5ExprPhrase*)); + for(i=0; inPhrase; i++){ + ap[i] = p2->apExprPhrase[i]; + } + p1->nPhrase = nPhrase; + p1->apExprPhrase = ap; + } + } + sqlite3_free(p2->apExprPhrase); + sqlite3_free(p2); + }else{ + *pp1 = p2; + } + + return sParse.rc; +} + /* ** Argument pTerm must be a synonym iterator. Return the current rowid ** that it points to. diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index da5deef846..c073135c86 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -465,17 +465,39 @@ static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){ ** Implementation of the xBestIndex method for FTS5 tables. Within the ** WHERE constraint, it searches for the following: ** -** 1. A MATCH constraint against the special column. +** 1. A MATCH constraint against the table column. ** 2. A MATCH constraint against the "rank" column. -** 3. An == constraint against the rowid column. -** 4. A < or <= constraint against the rowid column. -** 5. A > or >= constraint against the rowid column. +** 3. A MATCH constraint against some other column. +** 4. An == constraint against the rowid column. +** 5. A < or <= constraint against the rowid column. +** 6. A > or >= constraint against the rowid column. ** -** Within the ORDER BY, either: +** Within the ORDER BY, the following are supported: ** ** 5. ORDER BY rank [ASC|DESC] ** 6. ORDER BY rowid [ASC|DESC] ** +** Information for the xFilter call is passed via both the idxNum and +** idxStr variables. Specifically, idxNum is a bitmask of the following +** flags used to encode the ORDER BY clause: +** +** FTS5_BI_ORDER_RANK +** FTS5_BI_ORDER_ROWID +** FTS5_BI_ORDER_DESC +** +** idxStr is used to encode data from the WHERE clause. For each argument +** passed to the xFilter method, the following is appended to idxStr: +** +** Match against table column: "m" +** Match against rank column: "r" +** Match against other column: "" +** Equality constraint against the rowid: "=" +** A < or <= against the rowid: "<" +** A > or >= against the rowid: ">" +** +** This function ensures that there is at most one "r" or "=". And that if +** there exists an "=" then there is no "<" or ">". +** ** Costs are assigned as follows: ** ** a) If an unusable MATCH operator is present in the WHERE clause, the @@ -503,32 +525,18 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ Fts5Config *pConfig = pTab->pConfig; const int nCol = pConfig->nCol; int idxFlags = 0; /* Parameter passed through to xFilter() */ - int bHasMatch; - int iNext; int i; - struct Constraint { - int op; /* Mask against sqlite3_index_constraint.op */ - int fts5op; /* FTS5 mask for idxFlags */ - int iCol; /* 0==rowid, 1==tbl, 2==rank */ - int omit; /* True to omit this if found */ - int iConsIndex; /* Index in pInfo->aConstraint[] */ - } aConstraint[] = { - {SQLITE_INDEX_CONSTRAINT_MATCH|SQLITE_INDEX_CONSTRAINT_EQ, - FTS5_BI_MATCH, 1, 1, -1}, - {SQLITE_INDEX_CONSTRAINT_MATCH|SQLITE_INDEX_CONSTRAINT_EQ, - FTS5_BI_RANK, 2, 1, -1}, - {SQLITE_INDEX_CONSTRAINT_EQ, FTS5_BI_ROWID_EQ, 0, 0, -1}, - {SQLITE_INDEX_CONSTRAINT_LT|SQLITE_INDEX_CONSTRAINT_LE, - FTS5_BI_ROWID_LE, 0, 0, -1}, - {SQLITE_INDEX_CONSTRAINT_GT|SQLITE_INDEX_CONSTRAINT_GE, - FTS5_BI_ROWID_GE, 0, 0, -1}, - }; + char *idxStr; + int iIdxStr = 0; + int iCons = 0; + + int bSeenEq = 0; + int bSeenGt = 0; + int bSeenLt = 0; + int bSeenMatch = 0; + int bSeenRank = 0; - int aColMap[3]; - aColMap[0] = -1; - aColMap[1] = nCol; - aColMap[2] = nCol+1; assert( SQLITE_INDEX_CONSTRAINT_EQnConstraint * 6 + 1); + if( idxStr==0 ) return SQLITE_NOMEM; + pInfo->idxStr = idxStr; + pInfo->needToFreeIdxStr = 1; + for(i=0; inConstraint; i++){ struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; int iCol = p->iColumn; - - if( (p->op==SQLITE_INDEX_CONSTRAINT_MATCH && iCol>=0 && iCol<=nCol) - || (p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol==nCol) + if( p->op==SQLITE_INDEX_CONSTRAINT_MATCH + || (p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol>=nCol) ){ /* A MATCH operator or equivalent */ - if( p->usable ){ - idxFlags = (idxFlags & 0xFFFF) | FTS5_BI_MATCH | (iCol << 16); - aConstraint[0].iConsIndex = i; - }else{ + if( p->usable==0 || iCol<0 ){ /* As there exists an unusable MATCH constraint this is an ** unusable plan. Set a prohibitively high cost. */ pInfo->estimatedCost = 1e50; return SQLITE_OK; + }else{ + if( iCol==nCol+1 ){ + if( bSeenRank ) continue; + idxStr[iIdxStr++] = 'r'; + bSeenRank = 1; + }else{ + bSeenMatch = 1; + idxStr[iIdxStr++] = 'm'; + if( iColaConstraintUsage[i].argvIndex = ++iCons; + pInfo->aConstraintUsage[i].omit = 1; } - }else if( p->op<=SQLITE_INDEX_CONSTRAINT_MATCH ){ - int j; - for(j=1; jiCol] && (p->op & pC->op) && p->usable ){ - pC->iConsIndex = i; - idxFlags |= pC->fts5op; + } + else if( p->usable && bSeenEq==0 + && p->op==SQLITE_INDEX_CONSTRAINT_EQ && iCol<0 + ){ + idxStr[iIdxStr++] = '='; + bSeenEq = 1; + pInfo->aConstraintUsage[i].argvIndex = ++iCons; + } + } + + if( bSeenEq==0 ){ + for(i=0; inConstraint; i++){ + struct sqlite3_index_constraint *p = &pInfo->aConstraint[i]; + if( p->iColumn<0 && p->usable ){ + int op = p->op; + if( op==SQLITE_INDEX_CONSTRAINT_LT || op==SQLITE_INDEX_CONSTRAINT_LE ){ + if( bSeenLt ) continue; + idxStr[iIdxStr++] = '<'; + pInfo->aConstraintUsage[i].argvIndex = ++iCons; + bSeenLt = 1; + }else + if( op==SQLITE_INDEX_CONSTRAINT_GT || op==SQLITE_INDEX_CONSTRAINT_GE ){ + if( bSeenGt ) continue; + idxStr[iIdxStr++] = '>'; + pInfo->aConstraintUsage[i].argvIndex = ++iCons; + bSeenGt = 1; } } } } + idxStr[iIdxStr] = '\0'; /* Set idxFlags flags for the ORDER BY clause */ if( pInfo->nOrderBy==1 ){ int iSort = pInfo->aOrderBy[0].iColumn; - if( iSort==(pConfig->nCol+1) && BitFlagTest(idxFlags, FTS5_BI_MATCH) ){ + if( iSort==(pConfig->nCol+1) && bSeenMatch ){ idxFlags |= FTS5_BI_ORDER_RANK; }else if( iSort==-1 ){ idxFlags |= FTS5_BI_ORDER_ROWID; @@ -590,26 +634,15 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ } /* Calculate the estimated cost based on the flags set in idxFlags. */ - bHasMatch = BitFlagTest(idxFlags, FTS5_BI_MATCH); - if( BitFlagTest(idxFlags, FTS5_BI_ROWID_EQ) ){ - pInfo->estimatedCost = bHasMatch ? 100.0 : 10.0; - if( bHasMatch==0 ) fts5SetUniqueFlag(pInfo); - }else if( BitFlagAllTest(idxFlags, FTS5_BI_ROWID_LE|FTS5_BI_ROWID_GE) ){ - pInfo->estimatedCost = bHasMatch ? 500.0 : 250000.0; - }else if( BitFlagTest(idxFlags, FTS5_BI_ROWID_LE|FTS5_BI_ROWID_GE) ){ - pInfo->estimatedCost = bHasMatch ? 750.0 : 750000.0; + if( bSeenEq ){ + pInfo->estimatedCost = bSeenMatch ? 100.0 : 10.0; + if( bSeenMatch==0 ) fts5SetUniqueFlag(pInfo); + }else if( bSeenLt && bSeenGt ){ + pInfo->estimatedCost = bSeenMatch ? 500.0 : 250000.0; + }else if( bSeenLt || bSeenGt ){ + pInfo->estimatedCost = bSeenMatch ? 750.0 : 750000.0; }else{ - pInfo->estimatedCost = bHasMatch ? 1000.0 : 1000000.0; - } - - /* Assign argvIndex values to each constraint in use. */ - iNext = 1; - for(i=0; iiConsIndex>=0 ){ - pInfo->aConstraintUsage[pC->iConsIndex].argvIndex = iNext++; - pInfo->aConstraintUsage[pC->iConsIndex].omit = (unsigned char)pC->omit; - } + pInfo->estimatedCost = bSeenMatch ? 1000.0 : 1000000.0; } pInfo->idxNum = idxFlags; @@ -1132,7 +1165,7 @@ static i64 fts5GetRowidLimit(sqlite3_value *pVal, i64 iDefault){ static int fts5FilterMethod( sqlite3_vtab_cursor *pCursor, /* The cursor used for this query */ int idxNum, /* Strategy index */ - const char *zUnused, /* Unused */ + const char *idxStr, /* Unused */ int nVal, /* Number of elements in apVal */ sqlite3_value **apVal /* Arguments for the indexing scheme */ ){ @@ -1140,7 +1173,6 @@ static int fts5FilterMethod( Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; /* Error code */ - int iVal = 0; /* Counter for apVal[] */ int bDesc; /* True if ORDER BY [rank|rowid] DESC */ int bOrderByRank; /* True if ORDER BY rank */ sqlite3_value *pMatch = 0; /* MATCH ? expression (or NULL) */ @@ -1150,9 +1182,9 @@ static int fts5FilterMethod( sqlite3_value *pRowidGe = 0; /* rowid >= ? expression (or NULL) */ int iCol; /* Column on LHS of MATCH operator */ char **pzErrmsg = pConfig->pzErrmsg; - - UNUSED_PARAM(zUnused); - UNUSED_PARAM(nVal); + int i; + int iIdxStr = 0; + Fts5Expr *pExpr = 0; if( pCsr->ePlan ){ fts5FreeCursorComponents(pCsr); @@ -1165,23 +1197,60 @@ static int fts5FilterMethod( assert( pCsr->pRank==0 ); assert( pCsr->zRank==0 ); assert( pCsr->zRankArgs==0 ); + assert( pTab->pSortCsr==0 || nVal==0 ); assert( pzErrmsg==0 || pzErrmsg==&pTab->p.base.zErrMsg ); pConfig->pzErrmsg = &pTab->p.base.zErrMsg; - /* Decode the arguments passed through to this function. - ** - ** Note: The following set of if(...) statements must be in the same - ** order as the corresponding entries in the struct at the top of - ** fts5BestIndexMethod(). */ - if( BitFlagTest(idxNum, FTS5_BI_MATCH) ) pMatch = apVal[iVal++]; - if( BitFlagTest(idxNum, FTS5_BI_RANK) ) pRank = apVal[iVal++]; - if( BitFlagTest(idxNum, FTS5_BI_ROWID_EQ) ) pRowidEq = apVal[iVal++]; - if( BitFlagTest(idxNum, FTS5_BI_ROWID_LE) ) pRowidLe = apVal[iVal++]; - if( BitFlagTest(idxNum, FTS5_BI_ROWID_GE) ) pRowidGe = apVal[iVal++]; - iCol = (idxNum>>16); - assert( iCol>=0 && iCol<=pConfig->nCol ); - assert( iVal==nVal ); + /* Decode the arguments passed through to this function. */ + for(i=0; i='0' && idxStr[iIdxStr]<='9' ){ + iCol = 0; + do{ + iCol = iCol*10 + (idxStr[iIdxStr]-'0'); + iIdxStr++; + }while( idxStr[iIdxStr]>='0' && idxStr[iIdxStr]<='9' ); + }else{ + iCol = pConfig->nCol; + } + + if( zText[0]=='*' ){ + /* The user has issued a query of the form "MATCH '*...'". This + ** indicates that the MATCH expression is not a full text query, + ** but a request for an internal parameter. */ + rc = fts5SpecialMatch(pTab, pCsr, &zText[1]); + goto filter_out; + }else{ + char **pzErr = &pTab->p.base.zErrMsg; + rc = sqlite3Fts5ExprNew(pConfig, iCol, zText, &pExpr, pzErr); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5ExprAnd(&pCsr->pExpr, pExpr); + pExpr = 0; + } + if( rc!=SQLITE_OK ) goto filter_out; + } + + break; + } + case '=': + pRowidEq = apVal[i]; + break; + case '<': + pRowidLe = apVal[i]; + break; + default: assert( idxStr[iIdxStr-1]=='>' ); + pRowidGe = apVal[i]; + break; + } + } bOrderByRank = ((idxNum & FTS5_BI_ORDER_RANK) ? 1 : 0); pCsr->bDesc = bDesc = ((idxNum & FTS5_BI_ORDER_DESC) ? 1 : 0); @@ -1221,29 +1290,15 @@ static int fts5FilterMethod( pCsr->ePlan = FTS5_PLAN_SOURCE; pCsr->pExpr = pTab->pSortCsr->pExpr; rc = fts5CursorFirst(pTab, pCsr, bDesc); - }else if( pMatch ){ - const char *zExpr = (const char*)sqlite3_value_text(apVal[0]); - if( zExpr==0 ) zExpr = ""; - + }else if( pCsr->pExpr ){ rc = fts5CursorParseRank(pConfig, pCsr, pRank); if( rc==SQLITE_OK ){ - if( zExpr[0]=='*' ){ - /* The user has issued a query of the form "MATCH '*...'". This - ** indicates that the MATCH expression is not a full text query, - ** but a request for an internal parameter. */ - rc = fts5SpecialMatch(pTab, pCsr, &zExpr[1]); + if( bOrderByRank ){ + pCsr->ePlan = FTS5_PLAN_SORTED_MATCH; + rc = fts5CursorFirstSorted(pTab, pCsr, bDesc); }else{ - char **pzErr = &pTab->p.base.zErrMsg; - rc = sqlite3Fts5ExprNew(pConfig, iCol, zExpr, &pCsr->pExpr, pzErr); - if( rc==SQLITE_OK ){ - if( bOrderByRank ){ - pCsr->ePlan = FTS5_PLAN_SORTED_MATCH; - rc = fts5CursorFirstSorted(pTab, pCsr, bDesc); - }else{ - pCsr->ePlan = FTS5_PLAN_MATCH; - rc = fts5CursorFirst(pTab, pCsr, bDesc); - } - } + pCsr->ePlan = FTS5_PLAN_MATCH; + rc = fts5CursorFirst(pTab, pCsr, bDesc); } } }else if( pConfig->zContent==0 ){ @@ -1260,7 +1315,7 @@ static int fts5FilterMethod( ); if( rc==SQLITE_OK ){ if( pCsr->ePlan==FTS5_PLAN_ROWID ){ - sqlite3_bind_value(pCsr->pStmt, 1, apVal[0]); + sqlite3_bind_value(pCsr->pStmt, 1, pRowidEq); }else{ sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iFirstRowid); sqlite3_bind_int64(pCsr->pStmt, 2, pCsr->iLastRowid); @@ -1269,6 +1324,8 @@ static int fts5FilterMethod( } } + filter_out: + sqlite3Fts5ExprFree(pExpr); pConfig->pzErrmsg = pzErrmsg; return rc; } diff --git a/ext/fts5/test/fts5faultB.test b/ext/fts5/test/fts5faultB.test index 2faec706d5..e5fc514d09 100644 --- a/ext/fts5/test/fts5faultB.test +++ b/ext/fts5/test/fts5faultB.test @@ -147,5 +147,27 @@ do_faultsim_test 5.1 -faults oom* -body { faultsim_test_result {0 {1 4}} } +#------------------------------------------------------------------------- +# Test OOM injection in a query with two MATCH expressions +# +reset_db +do_execsql_test 6.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a); + INSERT INTO t1 VALUES('a b c d'); -- 1 + INSERT INTO t1 VALUES('d a b c'); -- 2 + INSERT INTO t1 VALUES('c d a b'); -- 3 + INSERT INTO t1 VALUES('b c d a'); -- 4 +} +do_faultsim_test 6.1 -faults oom* -body { + execsql { SELECT rowid FROM t1 WHERE t1 MATCH 'a' AND t1 MATCH 'b' } +} -test { + faultsim_test_result {0 {1 2 3 4}} +} +do_faultsim_test 6.2 -faults oom* -body { + execsql { SELECT rowid FROM t1 WHERE t1 MATCH 'a OR b' AND t1 MATCH 'c OR d' } +} -test { + faultsim_test_result {0 {1 2 3 4}} +} + finish_test diff --git a/ext/fts5/test/fts5multi.test b/ext/fts5/test/fts5multi.test new file mode 100644 index 0000000000..7878cede7e --- /dev/null +++ b/ext/fts5/test/fts5multi.test @@ -0,0 +1,99 @@ +# 2014 September 13 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5multi + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +fts5_aux_test_functions db + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a, b, c); + INSERT INTO t1 VALUES('gg bb bb' ,'gg ff gg' ,'ii ii'); + INSERT INTO t1 VALUES('dd dd hh kk','jj' ,'aa'); + INSERT INTO t1 VALUES('kk gg ee' ,'hh cc' ,'hh jj aa cc'); + INSERT INTO t1 VALUES('hh' ,'bb jj cc' ,'kk ii'); + INSERT INTO t1 VALUES('kk dd kk ii','aa ee aa' ,'ee'); + INSERT INTO t1 VALUES('ee' ,'ff gg kk aa','ee ff ee'); + INSERT INTO t1 VALUES('ff jj' ,'gg ee' ,'kk ee gg kk'); + INSERT INTO t1 VALUES('ff ee dd hh','kk ee' ,'gg dd'); + INSERT INTO t1 VALUES('bb' ,'aa' ,'bb aa'); + INSERT INTO t1 VALUES('hh cc bb' ,'ff bb' ,'cc'); + INSERT INTO t1 VALUES('jj' ,'ff dd bb aa','dd dd ff ff'); + INSERT INTO t1 VALUES('ff dd gg dd','gg aa bb ff','cc'); + INSERT INTO t1 VALUES('ff aa cc jj','kk' ,'ii dd'); + INSERT INTO t1 VALUES('jj dd' ,'cc' ,'ii hh ee aa'); + INSERT INTO t1 VALUES('ff ii hh' ,'dd' ,'gg'); + INSERT INTO t1 VALUES('ff dd gg hh','hh' ,'ff dd'); + INSERT INTO t1 VALUES('cc cc' ,'ff dd ff' ,'bb'); + INSERT INTO t1 VALUES('ii' ,'bb ii' ,'jj kk'); + INSERT INTO t1 VALUES('ff hh' ,'hh bb' ,'bb dd ee'); + INSERT INTO t1 VALUES('jj kk' ,'jj' ,'gg ff cc'); + INSERT INTO t1 VALUES('dd kk' ,'ii gg' ,'dd'); + INSERT INTO t1 VALUES('cc' ,'aa ff' ,'ii'); + INSERT INTO t1 VALUES('bb ff bb ii','bb kk bb aa','hh ff ii dd'); + INSERT INTO t1 VALUES('aa' ,'ee bb jj jj','dd'); + INSERT INTO t1 VALUES('kk dd cc' ,'aa jj' ,'ee aa ff'); + INSERT INTO t1 VALUES('aa gg aa' ,'jj' ,'ii kk hh gg'); + INSERT INTO t1 VALUES('ff hh aa' ,'jj ii' ,'hh dd bb jj'); + INSERT INTO t1 VALUES('hh' ,'aa gg kk' ,'bb ee'); + INSERT INTO t1 VALUES('bb' ,'ee' ,'gg'); + INSERT INTO t1 VALUES('dd kk' ,'kk bb aa' ,'ee'); +} + +foreach {tn c1 e1 c2 e2} { + 1 t1 aa t1 bb + 2 a aa b bb + 3 a "aa OR bb OR cc" b "jj OR ii OR hh" + 4 t1 "aa AND bb" t1 "cc" + 5 c "kk" b "aa OR bb OR cc OR dd OR ee" +} { + if {$c1=="t1"} { + set lhs "( $e1 )" + } else { + set lhs "$c1 : ( $e1 )" + } + if {$c2=="t1"} { + set rhs "( $e2 )" + } else { + set rhs "$c2 : ( $e2 )" + } + + set q1 "t1 MATCH '($lhs) AND ($rhs)'" + set q2 "$c1 MATCH '$e1' AND $c2 MATCH '$e2'" + + set ret [execsql "SELECT rowid FROM t1 WHERE $q1"] + set N [llength $ret] + do_execsql_test 1.$tn.1.($N) "SELECT rowid FROM t1 WHERE $q2" $ret + + set ret [execsql "SELECT fts5_test_poslist(t1) FROM t1 WHERE $q1"] + do_execsql_test 1.$tn.2.($N) " + SELECT fts5_test_poslist(t1) FROM t1 WHERE $q2 + " $ret +} + +do_catchsql_test 2.1.1 { + SELECT rowid FROM t1 WHERE t1 MATCH '(NOT' AND t1 MATCH 'aa bb'; +} {1 {fts5: syntax error near "NOT"}} +do_catchsql_test 2.1.2 { + SELECT rowid FROM t1 WHERE t1 MATCH 'aa bb' AND t1 MATCH '(NOT'; +} {1 {fts5: syntax error near "NOT"}} + +finish_test + diff --git a/ext/fts5/test/fts5plan.test b/ext/fts5/test/fts5plan.test index 8f57e39a81..46ac234ff7 100644 --- a/ext/fts5/test/fts5plan.test +++ b/ext/fts5/test/fts5plan.test @@ -31,7 +31,7 @@ do_eqp_test 1.1 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCAN TABLE f1 VIRTUAL TABLE INDEX 65537: + `--SCAN TABLE f1 VIRTUAL TABLE INDEX 0:m } do_eqp_test 1.2 { @@ -46,7 +46,7 @@ do_eqp_test 1.3 { SELECT * FROM f1 WHERE f1 MATCH ? ORDER BY ff } { QUERY PLAN - |--SCAN TABLE f1 VIRTUAL TABLE INDEX 65537: + |--SCAN TABLE f1 VIRTUAL TABLE INDEX 0:m `--USE TEMP B-TREE FOR ORDER BY } @@ -60,6 +60,6 @@ do_eqp_test 1.4 { do_eqp_test 1.5 { SELECT * FROM f1 WHERE rank MATCH ? -} {SCAN TABLE f1 VIRTUAL TABLE INDEX 2:} +} {SCAN TABLE f1 VIRTUAL TABLE INDEX 0:r} finish_test diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index 7fb0681dc8..936bbb2549 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -467,4 +467,17 @@ do_execsql_test 21.3 { SELECT rowid FROM x1($doc); } {11112} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 22.0 { + CREATE VIRTUAL TABLE x1 USING fts5(x); + INSERT INTO x1(x) VALUES('a b c'); + INSERT INTO x1(x) VALUES('x y z'); + INSERT INTO x1(x) VALUES('c b a'); + INSERT INTO x1(x) VALUES('z y x'); +} + +do_catchsql_test 22.1 {SELECT * FROM x1('')} {1 {fts5: syntax error near ""}} +do_catchsql_test 22.2 {SELECT * FROM x1(NULL)} {1 {fts5: syntax error near ""}} + finish_test diff --git a/manifest b/manifest index dccb38d831..242da89195 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stypo\sfor\sone\sinstance\sof\sline\snumber\shandling\sin\sthe\sLemon\stool. -D 2019-09-11T15:25:26.595 +C Allow\sfts5\sto\sfilter\son\smultiple\sMATCH\sclauses\sin\sa\ssingle\sscan. +D 2019-09-12T19:38:40.141 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -110,14 +110,14 @@ F ext/fts3/unicode/mkunicode.tcl bf7fcaa6d68e6d38223467983785d054f1cff4d9e3905dd F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 7c9da96f2b9dcfa4dd94081fb2d87ec418d8cdb35b25df56756c334b6b558fd7 -F ext/fts5/fts5Int.h d87fb17d12296613cdec2d1f4213ecd8840d3deb34837b6d3889b830d06baac4 +F ext/fts5/fts5Int.h 0ec19a906a54c0e53f8a380c0ff70f11a866aa259490bc13aa39f8d2491800fd F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 -F ext/fts5/fts5_config.c d7523cba5e66da077233c023aecbc3e6a37978ff75a18131c5ab5b1229d5bac7 -F ext/fts5/fts5_expr.c 840c88d55e78083a5e61a35968df877712ae28791b347eced1e98e3b337d2d3c +F ext/fts5/fts5_config.c 606a29f2962a8f4508923e6ad833974b32a3ab4093f63fd6de0fb33a87eed54c +F ext/fts5/fts5_expr.c 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c b062bdb836e195656aac8d6684e943585cff4bf7d7c593c80cb67c3b6cfef7ee -F ext/fts5/fts5_main.c 15dc14ea594ff2ea183f5e79c8f6fea14640ac7c4bd5d93ad1d506a4db80c998 +F ext/fts5/fts5_main.c e6db945454a0dae2dafcf29905d7d5272b64b00da34a43bd4ce732e2079a159d F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -176,7 +176,7 @@ F ext/fts5/test/fts5fault7.test 0acbec416edb24b8881f154e99c31e9ccf73f539cfcd1640 F ext/fts5/test/fts5fault8.test 318238659d35f82ad215ecb57ca4c87486ea85d45dbeedaee42f148ff5105ee2 F ext/fts5/test/fts5fault9.test 098e6b894bbdf9b2192f994a30f4043673fb3f338b6b8ab1624c704422f39119 F ext/fts5/test/fts5faultA.test be4487576bff8c22cee6597d1893b312f306504a8c6ccd3c53ca85af12290c8c -F ext/fts5/test/fts5faultB.test e6d04f9ea7b21be1d89abb8df2cb4baf65b0453b744d5a805fcd3ef45ff86a7e +F ext/fts5/test/fts5faultB.test d606bdb8e81aaeb6f41de3fc9fc7ae315733f0903fbff05cf54f5b045b729ab5 F ext/fts5/test/fts5faultD.test cc5d1225556e356615e719c612e845d41bff7d5a F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079 F ext/fts5/test/fts5full.test 49b565da02918c06e58f51f0b953b0302b96f155aa68baba24782b81570685e2 @@ -190,12 +190,13 @@ F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 F ext/fts5/test/fts5misc.test 5becd134b66f7370042968a2b127b92ea7748e249f16cb6a996f450812e89eec +F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd F ext/fts5/test/fts5onepass.test f9b7d9b2c334900c6542a869760290e2ab5382af8fbd618834bf1fcc3e7b84da F ext/fts5/test/fts5optimize.test 36a752d24c818792032e4ff502936fc9cc5ef938721696396fdc79214b2717f1 F ext/fts5/test/fts5phrase.test 13e5d8e9083077b3d9c74315b3c92ec723cc6eb37c8155e0bfe1bba00559f07b -F ext/fts5/test/fts5plan.test 00dc4c974938b509db7cb3680407f068ee6e9cc824f492f68cb741a7b679fe41 +F ext/fts5/test/fts5plan.test 771b999d161e24fd803ce0290adb7c6e7c9b9cc2c6a0adb344813fb89473aa32 F ext/fts5/test/fts5porter.test 8d08010c28527db66bc3feebd2b8767504aaeb9b101a986342fa7833d49d0d15 F ext/fts5/test/fts5porter2.test 0d251a673f02fa13ca7f011654873b3add20745f7402f108600a23e52d8c7457 F ext/fts5/test/fts5prefix.test a0fa67b06650f2deaa7bf27745899d94e0fb547ad9ecbd08bfad98c04912c056 @@ -204,7 +205,7 @@ F ext/fts5/test/fts5rank.test c9fd4a1e36b4fa92d572ec13d846469b97da249d1c2f7fd3ee F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7 F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415 F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6 -F ext/fts5/test/fts5simple.test 313ad28ef38ebe25f0a1673dd18f2fac446e25feb15bbb0c223a65ea00594f72 +F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0 F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f F ext/fts5/test/fts5synonym.test 1651815b8008de170e8e600dcacc17521d765482ea8f074ae82cfa870d8bb7fb @@ -1841,7 +1842,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a97804620a27acc30bebd2aaa04e38f2f36de48b0931038ca8bdc9cb0c36b8f4 -R 5065e0b2c7f4ffc5b218b4bab44bb95f -U mistachkin -Z 05d39d001f8aeefdace9f8a8f5ba54b9 +P 980be1730dc1239c63a107923bf2e32b4ec7d4bc31b9190e711cc35f18cc2bb4 +R f455101857a1853760c9098b8cd2af2d +U dan +Z 191c94e283a8422844a9aa5307aa3f27 diff --git a/manifest.uuid b/manifest.uuid index 70e92dabd6..505907fee0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -980be1730dc1239c63a107923bf2e32b4ec7d4bc31b9190e711cc35f18cc2bb4 \ No newline at end of file +9d418a7a491761eeb38a70898677a493e2631e5d62e75ee88431f52d3dfd2344 \ No newline at end of file From fbb9a5b1e377224f8f409bec03d3947188417623 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Sep 2019 12:24:58 +0000 Subject: [PATCH 212/221] Fix harmless compiler warnings. FossilOrigin-Name: a8927d14f88c44828e794787bab080455ab62705c93f65ce7d8db83478aa5a8e --- ext/fts5/fts5_main.c | 5 ++--- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index c073135c86..09041ba494 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1175,7 +1175,6 @@ static int fts5FilterMethod( int rc = SQLITE_OK; /* Error code */ int bDesc; /* True if ORDER BY [rank|rowid] DESC */ int bOrderByRank; /* True if ORDER BY rank */ - sqlite3_value *pMatch = 0; /* MATCH ? expression (or NULL) */ sqlite3_value *pRank = 0; /* rank MATCH ? expression (or NULL) */ sqlite3_value *pRowidEq = 0; /* rowid = ? expression (or NULL) */ sqlite3_value *pRowidLe = 0; /* rowid <= ? expression (or NULL) */ @@ -1209,7 +1208,7 @@ static int fts5FilterMethod( pRank = apVal[i]; break; case 'm': { - char *zText = sqlite3_value_text(apVal[i]); + const char *zText = (const char*)sqlite3_value_text(apVal[i]); if( zText==0 ) zText = ""; if( idxStr[iIdxStr]>='0' && idxStr[iIdxStr]<='9' ){ @@ -1277,7 +1276,7 @@ static int fts5FilterMethod( ** (pCursor) is used to execute the query issued by function ** fts5CursorFirstSorted() above. */ assert( pRowidEq==0 && pRowidLe==0 && pRowidGe==0 && pRank==0 ); - assert( nVal==0 && pMatch==0 && bOrderByRank==0 && bDesc==0 ); + assert( nVal==0 && bOrderByRank==0 && bDesc==0 ); assert( pCsr->iLastRowid==LARGEST_INT64 ); assert( pCsr->iFirstRowid==SMALLEST_INT64 ); if( pTab->pSortCsr->bDesc ){ diff --git a/manifest b/manifest index 242da89195..6420f20d18 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sfts5\sto\sfilter\son\smultiple\sMATCH\sclauses\sin\sa\ssingle\sscan. -D 2019-09-12T19:38:40.141 +C Fix\sharmless\scompiler\swarnings. +D 2019-09-13T12:24:58.472 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -117,7 +117,7 @@ F ext/fts5/fts5_config.c 606a29f2962a8f4508923e6ad833974b32a3ab4093f63fd6de0fb33 F ext/fts5/fts5_expr.c 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c b062bdb836e195656aac8d6684e943585cff4bf7d7c593c80cb67c3b6cfef7ee -F ext/fts5/fts5_main.c e6db945454a0dae2dafcf29905d7d5272b64b00da34a43bd4ce732e2079a159d +F ext/fts5/fts5_main.c c589c81760579fd5cc3ed6c5c31eb6059b4d61a89770b7003f749a30d10c36f2 F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -1842,7 +1842,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 980be1730dc1239c63a107923bf2e32b4ec7d4bc31b9190e711cc35f18cc2bb4 -R f455101857a1853760c9098b8cd2af2d -U dan -Z 191c94e283a8422844a9aa5307aa3f27 +P 9d418a7a491761eeb38a70898677a493e2631e5d62e75ee88431f52d3dfd2344 +R 081d79e579f06000a847b33f6c7ba7a5 +U drh +Z 573c86de16a248cef196a4da7e7449bd diff --git a/manifest.uuid b/manifest.uuid index 505907fee0..a7169b4460 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d418a7a491761eeb38a70898677a493e2631e5d62e75ee88431f52d3dfd2344 \ No newline at end of file +a8927d14f88c44828e794787bab080455ab62705c93f65ce7d8db83478aa5a8e \ No newline at end of file From 3f3f2c73575ea8ae9a46ea30b3af6dfc342cd6c9 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Sep 2019 13:23:13 +0000 Subject: [PATCH 213/221] Ensure that the idxStr for FTS5 is always zero-terminated. Fix for check-in [e6db945454a0dae2] FossilOrigin-Name: 090cd07d37904da4610d6a6787a3cc825c9a8bdcc5f051267d4608bba9b49d03 --- ext/fts5/fts5_main.c | 2 ++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 09041ba494..fc4ec0c482 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -567,6 +567,8 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ /* As there exists an unusable MATCH constraint this is an ** unusable plan. Set a prohibitively high cost. */ pInfo->estimatedCost = 1e50; + assert( iIdxStr < pInfo->nConstraint*6 + 1 ); + idxStr[iIdxStr] = 0; return SQLITE_OK; }else{ if( iCol==nCol+1 ){ diff --git a/manifest b/manifest index 6420f20d18..f7bb1bed41 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings. -D 2019-09-13T12:24:58.472 +C Ensure\sthat\sthe\sidxStr\sfor\sFTS5\sis\salways\szero-terminated.\nFix\sfor\scheck-in\s[e6db945454a0dae2] +D 2019-09-13T13:23:13.490 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -117,7 +117,7 @@ F ext/fts5/fts5_config.c 606a29f2962a8f4508923e6ad833974b32a3ab4093f63fd6de0fb33 F ext/fts5/fts5_expr.c 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 F ext/fts5/fts5_index.c b062bdb836e195656aac8d6684e943585cff4bf7d7c593c80cb67c3b6cfef7ee -F ext/fts5/fts5_main.c c589c81760579fd5cc3ed6c5c31eb6059b4d61a89770b7003f749a30d10c36f2 +F ext/fts5/fts5_main.c bf637030722badf06667d28f7159e4c209dbafd7aa76c33f387104b78ad147e1 F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -1842,7 +1842,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9d418a7a491761eeb38a70898677a493e2631e5d62e75ee88431f52d3dfd2344 -R 081d79e579f06000a847b33f6c7ba7a5 +P a8927d14f88c44828e794787bab080455ab62705c93f65ce7d8db83478aa5a8e +R 1b0d381d385e92afee32191d4d702401 U drh -Z 573c86de16a248cef196a4da7e7449bd +Z bf931f65c31f45c41d3fdaadb23bca9e diff --git a/manifest.uuid b/manifest.uuid index a7169b4460..528dcf10a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a8927d14f88c44828e794787bab080455ab62705c93f65ce7d8db83478aa5a8e \ No newline at end of file +090cd07d37904da4610d6a6787a3cc825c9a8bdcc5f051267d4608bba9b49d03 \ No newline at end of file From 01a3b6b1b2dae46b1a54264ce78ff95fb7fc2d95 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 13 Sep 2019 17:05:48 +0000 Subject: [PATCH 214/221] Change the meaning of the SQLITE_SUBTYPE flag so that it indicates that the user-defined function cares about the subtypes of its arguments. FossilOrigin-Name: af1bc20f502816db460d2b2d353f715da5cf660e59095de5214c829c1cb20981 --- ext/misc/json1.c | 8 ++++---- manifest | 19 +++++++++++-------- manifest.uuid | 2 +- src/sqlite.h.in | 10 +++++++--- src/window.c | 28 +--------------------------- 5 files changed, 24 insertions(+), 43 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 1c63c3e409..b3130eaf07 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -2504,14 +2504,14 @@ int sqlite3Json1Init(sqlite3 *db){ #endif for(i=0; idb; - int i; - for(i=0; inExpr; i++){ - Expr *p = pList->a[i].pExpr; - if( p->op==TK_FUNCTION ){ - FuncDef *pDef; - int nArg = 0; - if( !ExprHasProperty(p, EP_TokenOnly) && p->x.pList ){ - nArg = p->x.pList->nExpr; - } - pDef = sqlite3FindFunction(db, p->u.zToken, nArg, db->enc, 0); - if( pDef && (pDef->funcFlags & SQLITE_FUNC_SUBTYPE) ){ - return 1; - } - } - } - } - return 0; -} - /* ** Append a copy of each expression in expression-list pAppend to ** expression list pList. Return a pointer to the result list. @@ -992,7 +966,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ ** results. */ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ ExprList *pArgs = pWin->pOwner->x.pList; - if( exprListContainsSubtype(pParse, pArgs) ){ + if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); pWin->bExprArgs = 1; From 477f1f12e2b9a13c663aab985d28ad589d37a1ea Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Sep 2019 17:30:24 +0000 Subject: [PATCH 215/221] Fix a typo in the carray extension header comment - the comment that serves as the documentation to this extension. FossilOrigin-Name: 658a42d3633b31fda260f2c5a1a2c7dd8eb4eb0114d322369017c56faf5ecd42 --- ext/misc/carray.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/carray.c b/ext/misc/carray.c index b39904ae15..32fec3406e 100644 --- a/ext/misc/carray.c +++ b/ext/misc/carray.c @@ -24,7 +24,7 @@ ** ** static int aX[] = { 53, 9, 17, 2231, 4, 99 }; ** int i = sqlite3_bind_parameter_index(pStmt, "$ptr"); -** sqlite3_bind_value(pStmt, i, aX, "carray", 0); +** sqlite3_bind_pointer(pStmt, i, aX, "carray", 0); ** ** There is an optional third parameter to determine the datatype of ** the C-language array. Allowed values of the third parameter are diff --git a/manifest b/manifest index f7bb1bed41..c2333b555e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\sidxStr\sfor\sFTS5\sis\salways\szero-terminated.\nFix\sfor\scheck-in\s[e6db945454a0dae2] -D 2019-09-13T13:23:13.490 +C Fix\sa\stypo\sin\sthe\scarray\sextension\sheader\scomment\s-\sthe\scomment\sthat\sserves\nas\sthe\sdocumentation\sto\sthis\sextension. +D 2019-09-13T17:30:24.452 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -282,7 +282,7 @@ F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a2 F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c 4f0ebf278f46e68e6306c667917766cebc5550fd35d5de17847988e22892d4d2 -F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005 +F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c cec672d40604075bb341a7f11ac48393efdcd90a979269b8fe7977ea62d0547f F ext/misc/compress.c dd4f8a6d0baccff3c694757db5b430f3bbd821d8686d1fc24df55cf9f035b189 @@ -1842,7 +1842,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a8927d14f88c44828e794787bab080455ab62705c93f65ce7d8db83478aa5a8e -R 1b0d381d385e92afee32191d4d702401 +P 090cd07d37904da4610d6a6787a3cc825c9a8bdcc5f051267d4608bba9b49d03 +R a8c45dcd00465c1593cf4300db620ee6 U drh -Z bf931f65c31f45c41d3fdaadb23bca9e +Z 17496dbdca5aeac5a2f3f36b6a26cda7 diff --git a/manifest.uuid b/manifest.uuid index 528dcf10a8..3cdaf86f59 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -090cd07d37904da4610d6a6787a3cc825c9a8bdcc5f051267d4608bba9b49d03 \ No newline at end of file +658a42d3633b31fda260f2c5a1a2c7dd8eb4eb0114d322369017c56faf5ecd42 \ No newline at end of file From e087a7c35b1bedfb37c2b41baac77e794ed89f63 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Sep 2019 18:59:04 +0000 Subject: [PATCH 216/221] Fix the windowB test module so that it works even if SQLite is built without JSON support. FossilOrigin-Name: 807975c76b36347f02aa0ce9661d608adbffe1f7e77c15f8da677e47e1187153 --- manifest | 15 +++++++-------- manifest.uuid | 2 +- test/windowB.test | 25 ++++++++++++------------- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 100f9e3219..9aa66f4bda 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_SUBTYPE\sflag,\swhich\smay\sbe\spassed\sto\ssqlite3_create_window_function()\sto\sindicate\sthat\sthe\swindow\sfunction\suses\ssqlite3_value_subtype()\sto\scheck\sthe\ssub-type\sof\sits\sarguments. -D 2019-09-13T18:27:17.192 +C Fix\sthe\swindowB\stest\smodule\sso\sthat\sit\sworks\seven\sif\sSQLite\sis\sbuilt\swithout\nJSON\ssupport. +D 2019-09-13T18:59:04.975 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1719,7 +1719,7 @@ F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1 F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test 24daa26628291b6e584064efd34b1914aa69058280ece8a512b2e59ba71b6f02 +F test/windowB.test 3f0ae24a7860abaae9f092589f275a87787804b6d98ad6f23a0bc87fb4491d43 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 @@ -1843,8 +1843,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 658a42d3633b31fda260f2c5a1a2c7dd8eb4eb0114d322369017c56faf5ecd42 af1bc20f502816db460d2b2d353f715da5cf660e59095de5214c829c1cb20981 -R 919177d10d46e9cfa222a1bf25a1d5fb -T +closed af1bc20f502816db460d2b2d353f715da5cf660e59095de5214c829c1cb20981 -U dan -Z 7f5ff2b3722751f14dcaaa30ef08814d +P ba2ebc3a348decc5cedaf14960e30e7ae26a26824cfa198727f2499162142ef3 +R bae0d8d6f0a49acfd1c53d207a1b5d08 +U drh +Z 2837255703db522fd15af08765e39ee9 diff --git a/manifest.uuid b/manifest.uuid index bf7e581e98..f1017be8a5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ba2ebc3a348decc5cedaf14960e30e7ae26a26824cfa198727f2499162142ef3 \ No newline at end of file +807975c76b36347f02aa0ce9661d608adbffe1f7e77c15f8da677e47e1187153 \ No newline at end of file diff --git a/test/windowB.test b/test/windowB.test index 0c242acc70..0c3c56dec8 100644 --- a/test/windowB.test +++ b/test/windowB.test @@ -87,20 +87,19 @@ do_execsql_test 3.0 { INSERT INTO testjson VALUES(2, '{"b":2}'); } -do_execsql_test 3.1 { - SELECT json_group_array(json(j)) FROM testjson; -} { - {[{"a":1},{"b":2}]} -} +ifcapable json1 { + do_execsql_test 3.1 { + SELECT json_group_array(json(j)) FROM testjson; + } { + {[{"a":1},{"b":2}]} + } -breakpoint -do_execsql_test 3.2 { - SELECT json_group_array(json(j)) OVER (ORDER BY id) FROM testjson; -} { - {[{"a":1}]} - {[{"a":1},{"b":2}]} + do_execsql_test 3.2 { + SELECT json_group_array(json(j)) OVER (ORDER BY id) FROM testjson; + } { + {[{"a":1}]} + {[{"a":1},{"b":2}]} + } } - finish_test - From 51a75aaa76c300b3826e434013ddaf73c49e57c1 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 13 Sep 2019 20:42:46 +0000 Subject: [PATCH 217/221] Fix a problem with using json1 window functions with an EXCLUDE clause. FossilOrigin-Name: 4a1978814da41608a16f6953bd575c97d587a34bd80b7ac0e619d62bfdc903d2 --- manifest | 16 ++++----- manifest.uuid | 2 +- src/window.c | 14 ++++++-- test/windowB.test | 87 ++++++++++++++++++++++++++++++++++++++++++----- 4 files changed, 99 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 9aa66f4bda..02392e71b4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\swindowB\stest\smodule\sso\sthat\sit\sworks\seven\sif\sSQLite\sis\sbuilt\swithout\nJSON\ssupport. -D 2019-09-13T18:59:04.975 +C Fix\sa\sproblem\swith\susing\sjson1\swindow\sfunctions\swith\san\sEXCLUDE\sclause. +D 2019-09-13T20:42:46.328 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -615,7 +615,7 @@ F src/where.c 9685d5988b79b93ebbe46941fbdb60d14861bb0fe3f9126117ef1753acc69b64 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c b3bbae199e7acd8d0fa822c9a29cbb822ef2b3d84d68de55a3d60b013f5d5da4 -F src/window.c a35ad309132c639d075344a7c12f3133a8a738da238a35d8338f5034bd94c0a0 +F src/window.c 2a10191a3ec7dd3422f8c77dac423d0e55019dee9efe319613ebd0f02b98991e F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test da465d3d490ab24ef64f7715b5953343a4967762b9350b29eb1462879ff3fb9e F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1719,7 +1719,7 @@ F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1 F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test 3f0ae24a7860abaae9f092589f275a87787804b6d98ad6f23a0bc87fb4491d43 +F test/windowB.test fae072a311cea62715007b482afd40b1124fef56dcc9988bffb85b29ccabb5dd F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 @@ -1843,7 +1843,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ba2ebc3a348decc5cedaf14960e30e7ae26a26824cfa198727f2499162142ef3 -R bae0d8d6f0a49acfd1c53d207a1b5d08 -U drh -Z 2837255703db522fd15af08765e39ee9 +P 807975c76b36347f02aa0ce9661d608adbffe1f7e77c15f8da677e47e1187153 +R 19b6534ebeb3a6a9bfaaa41ce75a9354 +U dan +Z e45766b9d1c40d7379299659b41fb108 diff --git a/manifest.uuid b/manifest.uuid index f1017be8a5..4bf78a743d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -807975c76b36347f02aa0ce9661d608adbffe1f7e77c15f8da677e47e1187153 \ No newline at end of file +4a1978814da41608a16f6953bd575c97d587a34bd80b7ac0e619d62bfdc903d2 \ No newline at end of file diff --git a/src/window.c b/src/window.c index 43946dd55a..15f38ee006 100644 --- a/src/window.c +++ b/src/window.c @@ -1481,8 +1481,8 @@ static void windowAggStep( int addrIf = 0; if( pWin->pFilter ){ int regTmp; - assert( nArg==0 || nArg==pWin->pOwner->x.pList->nExpr ); - assert( nArg || pWin->pOwner->x.pList==0 ); + assert( pWin->bExprArgs || !nArg ||nArg==pWin->pOwner->x.pList->nExpr ); + assert( pWin->bExprArgs || nArg ||pWin->pOwner->x.pList==0 ); regTmp = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_Column, csr, pWin->iArgCol+nArg,regTmp); addrIf = sqlite3VdbeAddOp3(v, OP_IfNot, regTmp, 0, 1); @@ -1490,9 +1490,19 @@ static void windowAggStep( sqlite3ReleaseTempReg(pParse, regTmp); } if( pWin->bExprArgs ){ + int iStart = sqlite3VdbeCurrentAddr(v); + VdbeOp *pOp, *pEnd; + nArg = pWin->pOwner->x.pList->nExpr; regArg = sqlite3GetTempRange(pParse, nArg); sqlite3ExprCodeExprList(pParse, pWin->pOwner->x.pList, regArg, 0, 0); + + pEnd = sqlite3VdbeGetOp(v, -1); + for(pOp=sqlite3VdbeGetOp(v, iStart); pOp<=pEnd; pOp++){ + if( pOp->opcode==OP_Column && pOp->p1==pWin->iEphCsr ){ + pOp->p1 = csr; + } + } } if( pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){ CollSeq *pColl; diff --git a/test/windowB.test b/test/windowB.test index 0c3c56dec8..2fbbe2064a 100644 --- a/test/windowB.test +++ b/test/windowB.test @@ -80,25 +80,94 @@ foreach {tn win} { } #------------------------------------------------------------------------- -reset_db -do_execsql_test 3.0 { - CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT); - INSERT INTO testjson VALUES(1, '{"a":1}'); - INSERT INTO testjson VALUES(2, '{"b":2}'); -} - ifcapable json1 { + reset_db + do_execsql_test 3.0 { + CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT); + INSERT INTO testjson VALUES(1, '{"a":1}'); + INSERT INTO testjson VALUES(2, '{"b":2}'); + INSERT INTO testjson VALUES(3, '{"c":3}'); + INSERT INTO testjson VALUES(4, '{"d":4}'); + } + do_execsql_test 3.1 { SELECT json_group_array(json(j)) FROM testjson; } { - {[{"a":1},{"b":2}]} + {[{"a":1},{"b":2},{"c":3},{"d":4}]} } - + do_execsql_test 3.2 { SELECT json_group_array(json(j)) OVER (ORDER BY id) FROM testjson; } { {[{"a":1}]} {[{"a":1},{"b":2}]} + {[{"a":1},{"b":2},{"c":3}]} + {[{"a":1},{"b":2},{"c":3},{"d":4}]} + } + + do_execsql_test 3.3 { + SELECT json_group_array(json(j)) OVER ( + ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES + ) FROM testjson; + } { + {[{"a":1}]} + {[{"a":1},{"b":2}]} + {[{"a":1},{"b":2},{"c":3}]} + {[{"a":1},{"b":2},{"c":3},{"d":4}]} + } + + do_execsql_test 3.4 { + SELECT json_group_array(json(j)) OVER ( + ORDER BY id ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING + ) FROM testjson; + } { + {[{"a":1},{"b":2}]} + {[{"a":1},{"b":2},{"c":3}]} + {[{"b":2},{"c":3},{"d":4}]} + {[{"c":3},{"d":4}]} + } + + do_execsql_test 3.5 { + SELECT json_group_array(json(j)) OVER ( + ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING + ) FROM testjson; + } { + {[]} + {[{"a":1}]} + {[{"a":1},{"b":2}]} + {[{"b":2},{"c":3}]} + } + + if 0 { + + do_execsql_test 3.5 { + SELECT json_group_array(json(j)) OVER ( + ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING + ) FROM testjson; + } { + {[]} + {[{"a":1}]} + {[{"a":1},{"b":2}]} + {[{"b":2},{"c":3}]} + } + + explain_i { + SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER ( + ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING + ) FROM testjson; + } + do_execsql_test 3.7 { + PRAGMA vdbe_trace = 1; + SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER ( + ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING + ) FROM testjson; + } { + {[]} + {[{"a":1}]} + {[{"a":1}]} + {[{"c":3}]} + } + } } From fab5b07395796f7761dbf3ba8604325889af9522 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 14 Sep 2019 00:21:34 +0000 Subject: [PATCH 218/221] Fix the windows inverse function on the JSON aggregates. FossilOrigin-Name: f464d847af490dd3ec45565dcc4c2e6ff4ed1ebb65036f30ca0b3ce2e73080e6 --- ext/misc/json1.c | 20 ++++++++---- manifest | 16 ++++----- manifest.uuid | 2 +- test/windowB.test | 83 ++++++++++++++++++++++++++++++++--------------- 4 files changed, 80 insertions(+), 41 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index b3130eaf07..251fd14afc 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -1820,7 +1820,7 @@ static void jsonArrayStep( if( pStr->zBuf==0 ){ jsonInit(pStr, ctx); jsonAppendChar(pStr, '['); - }else{ + }else if( pStr->nUsed>1 ){ jsonAppendChar(pStr, ','); pStr->pCtx = ctx; } @@ -1870,7 +1870,9 @@ static void jsonGroupInverse( ){ int i; int inStr = 0; + int nNest = 0; char *z; + char c; JsonString *pStr; UNUSED_PARAM(argc); UNUSED_PARAM(argv); @@ -1881,12 +1883,18 @@ static void jsonGroupInverse( if( NEVER(!pStr) ) return; #endif z = pStr->zBuf; - for(i=1; z[i]!=',' || inStr; i++){ - assert( inUsed ); - if( z[i]=='"' ){ + for(i=1; (c = z[i])!=',' || inStr || nNest; i++){ + if( i>=pStr->nUsed ){ + pStr->nUsed = 1; + return; + } + if( c=='"' ){ inStr = !inStr; - }else if( z[i]=='\\' ){ + }else if( c=='\\' ){ i++; + }else if( !inStr ){ + if( c=='{' || c=='[' ) nNest++; + if( c=='}' || c==']' ) nNest--; } } pStr->nUsed -= i; @@ -1916,7 +1924,7 @@ static void jsonObjectStep( if( pStr->zBuf==0 ){ jsonInit(pStr, ctx); jsonAppendChar(pStr, '{'); - }else{ + }else if( pStr->nUsed>1 ){ jsonAppendChar(pStr, ','); pStr->pCtx = ctx; } diff --git a/manifest b/manifest index 02392e71b4..d398e3ef45 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\susing\sjson1\swindow\sfunctions\swith\san\sEXCLUDE\sclause. -D 2019-09-13T20:42:46.328 +C Fix\sthe\swindows\sinverse\sfunction\son\sthe\sJSON\saggregates. +D 2019-09-14T00:21:34.282 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -295,7 +295,7 @@ F ext/misc/fileio.c 288e7230e0fe464d71b0694e2d8bdd3a353118ac2e31da3964b95f460f09 F ext/misc/fossildelta.c 7708651072eb5620ab21bbfb518d184f27b2c29c0131b09b9a2d8852a8016430 F ext/misc/fuzzer.c c4e27daf41433a64cad5265cd27dbcb891147e9994d0422200ce81ce9a54b625 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c 5e94e787ddce590585227ace85005bb7dd2a768def24bc77d7fc4a386989dd76 +F ext/misc/json1.c 061950860e6b8b7af6fc40029bf673fb97887ab04d6a33950c32a0ced6775577 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 @@ -1719,7 +1719,7 @@ F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1 F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test fae072a311cea62715007b482afd40b1124fef56dcc9988bffb85b29ccabb5dd +F test/windowB.test af8f3b0a24cc5e7f296e13ef4d312391427d95ace391e248120e1fb90226c3b2 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 @@ -1843,7 +1843,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 807975c76b36347f02aa0ce9661d608adbffe1f7e77c15f8da677e47e1187153 -R 19b6534ebeb3a6a9bfaaa41ce75a9354 -U dan -Z e45766b9d1c40d7379299659b41fb108 +P 4a1978814da41608a16f6953bd575c97d587a34bd80b7ac0e619d62bfdc903d2 +R 476ca0efeffea95d421b220f4123feec +U drh +Z 549cbff31496c774b10a02d54a853bdd diff --git a/manifest.uuid b/manifest.uuid index 4bf78a743d..5a92e55ff6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a1978814da41608a16f6953bd575c97d587a34bd80b7ac0e619d62bfdc903d2 \ No newline at end of file +f464d847af490dd3ec45565dcc4c2e6ff4ed1ebb65036f30ca0b3ce2e73080e6 \ No newline at end of file diff --git a/test/windowB.test b/test/windowB.test index 2fbbe2064a..fcefbd4e85 100644 --- a/test/windowB.test +++ b/test/windowB.test @@ -83,11 +83,11 @@ foreach {tn win} { ifcapable json1 { reset_db do_execsql_test 3.0 { - CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT); - INSERT INTO testjson VALUES(1, '{"a":1}'); - INSERT INTO testjson VALUES(2, '{"b":2}'); - INSERT INTO testjson VALUES(3, '{"c":3}'); - INSERT INTO testjson VALUES(4, '{"d":4}'); + CREATE TABLE testjson(id INTEGER PRIMARY KEY, j TEXT, x TEXT); + INSERT INTO testjson VALUES(1, '{"a":1}', 'a'); + INSERT INTO testjson VALUES(2, '{"b":2}', 'b'); + INSERT INTO testjson VALUES(3, '{"c":3}', 'c'); + INSERT INTO testjson VALUES(4, '{"d":4}', 'd'); } do_execsql_test 3.1 { @@ -107,7 +107,8 @@ ifcapable json1 { do_execsql_test 3.3 { SELECT json_group_array(json(j)) OVER ( - ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES + ORDER BY id RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW + EXCLUDE TIES ) FROM testjson; } { {[{"a":1}]} @@ -138,36 +139,66 @@ ifcapable json1 { {[{"b":2},{"c":3}]} } - if 0 { - - do_execsql_test 3.5 { + do_execsql_test 3.5a { + UPDATE testjson SET j = replace(j,char(125),',"e":9'||char(125)); + SELECT j FROM testjson; + } { + {{"a":1,"e":9}} + {{"b":2,"e":9}} + {{"c":3,"e":9}} + {{"d":4,"e":9}} + } + do_execsql_test 3.5b { + SELECT group_concat(x,'') OVER ( + ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING + ) FROM testjson ORDER BY id; + } {bc cd d {}} + do_execsql_test 3.5c { SELECT json_group_array(json(j)) OVER ( ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING ) FROM testjson; } { + {[{"b":2,"e":9},{"c":3,"e":9}]} + {[{"c":3,"e":9},{"d":4,"e":9}]} + {[{"d":4,"e":9}]} {[]} - {[{"a":1}]} - {[{"a":1},{"b":2}]} - {[{"b":2},{"c":3}]} } - - explain_i { - SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER ( - ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING - ) FROM testjson; - } - do_execsql_test 3.7 { - PRAGMA vdbe_trace = 1; - SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER ( - ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING + do_execsql_test 3.5d { + SELECT json_group_object(x,json(j)) OVER ( + ORDER BY id ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING ) FROM testjson; } { - {[]} - {[{"a":1}]} - {[{"a":1}]} - {[{"c":3}]} + {{"b":{"b":2,"e":9},"c":{"c":3,"e":9}}} + {{"c":{"c":3,"e":9},"d":{"d":4,"e":9}}} + {{"d":{"d":4,"e":9}}} + {{}} } + do_execsql_test 3.7b { + SELECT group_concat(x,'') FILTER (WHERE id!=2) OVER ( + ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING + ) FROM testjson; + } {{} a a c} + + do_execsql_test 3.7c { + SELECT json_group_array(json(j)) FILTER (WHERE id!=2) OVER ( + ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING + ) FROM testjson + } { + {[]} + {[{"a":1,"e":9}]} + {[{"a":1,"e":9}]} + {[{"c":3,"e":9}]} + } + do_execsql_test 3.7d { + SELECT json_group_object(x,json(j)) FILTER (WHERE id!=2) OVER ( + ORDER BY id ROWS BETWEEN 2 PRECEDING AND 1 PRECEDING + ) FROM testjson + } { + {{}} + {{"a":{"a":1,"e":9}}} + {{"a":{"a":1,"e":9}}} + {{"c":{"c":3,"e":9}}} } } From d44c617ad444717fbf9f213c8a654d2661fc64e7 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 14 Sep 2019 16:21:02 +0000 Subject: [PATCH 219/221] Extra comments on fields of the Window object. FossilOrigin-Name: 3dbed162518a73213bbfb137c763064518fdc2daeae3952cfab39ce0e6813d3f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 7 ++++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index d398e3ef45..b3ace16386 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\swindows\sinverse\sfunction\son\sthe\sJSON\saggregates. -D 2019-09-14T00:21:34.282 +C Extra\scomments\son\sfields\sof\sthe\sWindow\sobject. +D 2019-09-14T16:21:02.133 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -530,7 +530,7 @@ F src/shell.c.in e5fb91505f29ae9458cabf1a63bbd1faf6b4b34eabca33d0f75a06aacecca21 F src/sqlite.h.in 155fea14c0747f8842c4e592e04734f47ad8218d0f33c511849b15d410a7fb5c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 34cc038470f74a961ce9c1155df4c3926c2c88d784631272943ae0b7e9bd2aa2 +F src/sqliteInt.h 4a478f7fa0937d7c3141393d8c30c49e242e5e696e6976e19281e4d933a8ab95 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1843,7 +1843,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4a1978814da41608a16f6953bd575c97d587a34bd80b7ac0e619d62bfdc903d2 -R 476ca0efeffea95d421b220f4123feec +P f464d847af490dd3ec45565dcc4c2e6ff4ed1ebb65036f30ca0b3ce2e73080e6 +R ecd7799055991f616443bfa6b30bbda4 U drh -Z 549cbff31496c774b10a02d54a853bdd +Z 99d49b049fe9df8372384c89d49f686e diff --git a/manifest.uuid b/manifest.uuid index 5a92e55ff6..0b68def461 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f464d847af490dd3ec45565dcc4c2e6ff4ed1ebb65036f30ca0b3ce2e73080e6 \ No newline at end of file +3dbed162518a73213bbfb137c763064518fdc2daeae3952cfab39ce0e6813d3f \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e7c1d9c1f2..0a3c432bf0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3601,8 +3601,8 @@ struct Window { Expr *pFilter; /* The FILTER expression */ FuncDef *pFunc; /* The function */ int iEphCsr; /* Partition buffer or Peer buffer */ - int regAccum; - int regResult; + int regAccum; /* Accumulator */ + int regResult; /* Interim result */ int csrApp; /* Function cursor (used by min/max) */ int regApp; /* Function register (also used by min/max) */ int regPart; /* Array of registers for PARTITION BY values */ @@ -3612,7 +3612,8 @@ struct Window { int regOne; /* Register containing constant value 1 */ int regStartRowid; int regEndRowid; - u8 bExprArgs; + u8 bExprArgs; /* Defer evaluation of window function arguments + ** due to the SQLITE_SUBTYPE flag */ }; #ifndef SQLITE_OMIT_WINDOWFUNC From 8cce6b8310da057f5c4ffce3ce117ac84264e2ab Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 14 Sep 2019 16:44:51 +0000 Subject: [PATCH 220/221] Add the --no-rowids option to the ".recover" command. FossilOrigin-Name: 01d71b947a7422081d5c7d6ac2c91b9c936dc41926ab58c92f4a088a64e8c051 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 20 +++++++++++++++++--- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index b3ace16386..d1eb00a791 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Extra\scomments\son\sfields\sof\sthe\sWindow\sobject. -D 2019-09-14T16:21:02.133 +C Add\sthe\s--no-rowids\soption\sto\sthe\s".recover"\scommand. +D 2019-09-14T16:44:51.726 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -526,7 +526,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 9891cf5fd155bb199f8b1ff5d1429b9f70484487f4c455bba94348d4cb6f829f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c e2c870548541d33d090a066e89ab2e7943299006e2827c1abfae39561041fc0b -F src/shell.c.in e5fb91505f29ae9458cabf1a63bbd1faf6b4b34eabca33d0f75a06aacecca21b +F src/shell.c.in 68698630c21c5489fb3dc961a3ab3840e726c3c01e475dab96055788a7b6e5e6 F src/sqlite.h.in 155fea14c0747f8842c4e592e04734f47ad8218d0f33c511849b15d410a7fb5c F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 @@ -1843,7 +1843,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f464d847af490dd3ec45565dcc4c2e6ff4ed1ebb65036f30ca0b3ce2e73080e6 -R ecd7799055991f616443bfa6b30bbda4 -U drh -Z 99d49b049fe9df8372384c89d49f686e +P 3dbed162518a73213bbfb137c763064518fdc2daeae3952cfab39ce0e6813d3f +R 893a8c502e7609a361861540de405b55 +U dan +Z 284f9491bb2c84cd052f56239d66ee3a diff --git a/manifest.uuid b/manifest.uuid index 0b68def461..ba52a328a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3dbed162518a73213bbfb137c763064518fdc2daeae3952cfab39ce0e6813d3f \ No newline at end of file +01d71b947a7422081d5c7d6ac2c91b9c936dc41926ab58c92f4a088a64e8c051 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 9ae39a1d64..bde360b0eb 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3588,6 +3588,8 @@ static const char *(azHelp[]) = { " --freelist-corrupt Assume the freelist is corrupt", " --recovery-db NAME Store recovery metadata in database file NAME", " --lost-and-found TABLE Alternative name for the lost-and-found table", + " --no-rowids Do not attempt to recover rowid values", + " that are not also INTEGER PRIMARY KEYs", #endif ".restore ?DB? FILE Restore content of DB (default \"main\") from FILE", ".save FILE Write in-memory database into FILE", @@ -6592,6 +6594,7 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ RecoverTable *pOrphan = 0; int bFreelist = 1; /* 0 if --freelist-corrupt is specified */ + int bRowids = 1; /* 0 if --no-rowids */ for(i=1; idb, &rc, "SELECT pgno FROM recovery.map WHERE root=?", &pPages ); + shellPrepare(pState->db, &rc, - "SELECT max(field), group_concat(shell_escape_crnl(quote(value)), ', ')" + "SELECT max(field), group_concat(shell_escape_crnl(quote" + "(case when (? AND field<0) then NULL else value end)" + "), ', ')" ", min(field) " "FROM sqlite_dbdata WHERE pgno = ? AND field != ?" "GROUP BY cell", &pCells @@ -6808,11 +6817,16 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ raw_printf(pState->out, "DELETE FROM sqlite_sequence;\n"); } sqlite3_bind_int(pPages, 1, iRoot); - sqlite3_bind_int(pCells, 2, pTab->iPk); + if( bRowids==0 && pTab->iPk<0 ){ + sqlite3_bind_int(pCells, 1, 1); + }else{ + sqlite3_bind_int(pCells, 1, 0); + } + sqlite3_bind_int(pCells, 3, pTab->iPk); while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pPages) ){ int iPgno = sqlite3_column_int(pPages, 0); - sqlite3_bind_int(pCells, 1, iPgno); + sqlite3_bind_int(pCells, 2, iPgno); while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pCells) ){ int nField = sqlite3_column_int(pCells, 0); int iMin = sqlite3_column_int(pCells, 2); From b42eb3571c35341ae2171fcd5dc63ca9a49784c0 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 16 Sep 2019 05:34:08 +0000 Subject: [PATCH 221/221] Fix a problem with processing CTEs that use a WINDOW clause. FossilOrigin-Name: ca564d4b5b19fe56842a04f31bb61352e6ae9d72a7e7634eb27ebcf5f670545a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/window.c | 2 ++ test/windowB.test | 28 ++++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d1eb00a791..3e4365572a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--no-rowids\soption\sto\sthe\s".recover"\scommand. -D 2019-09-14T16:44:51.726 +C Fix\sa\sproblem\swith\sprocessing\sCTEs\sthat\suse\sa\sWINDOW\sclause. +D 2019-09-16T05:34:08.899 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -615,7 +615,7 @@ F src/where.c 9685d5988b79b93ebbe46941fbdb60d14861bb0fe3f9126117ef1753acc69b64 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b F src/whereexpr.c b3bbae199e7acd8d0fa822c9a29cbb822ef2b3d84d68de55a3d60b013f5d5da4 -F src/window.c 2a10191a3ec7dd3422f8c77dac423d0e55019dee9efe319613ebd0f02b98991e +F src/window.c bf055d1baec203de508c9d7ed3ac20146d5551518f2f77009f781876b8d0fdd5 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test da465d3d490ab24ef64f7715b5953343a4967762b9350b29eb1462879ff3fb9e F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1719,7 +1719,7 @@ F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1 F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b F test/window9.test 20a6b590be718b6bc98a5356d4396d6cdf19329c547da084fa225b92d68e1693 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test af8f3b0a24cc5e7f296e13ef4d312391427d95ace391e248120e1fb90226c3b2 +F test/windowB.test be2ecc1298021e87eef375af35906288cc929fc21f2651139f7dd50a5844b120 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 @@ -1843,7 +1843,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3dbed162518a73213bbfb137c763064518fdc2daeae3952cfab39ce0e6813d3f -R 893a8c502e7609a361861540de405b55 +P 01d71b947a7422081d5c7d6ac2c91b9c936dc41926ab58c92f4a088a64e8c051 +R c92814bccf2f0531ff265b831a716091 U dan -Z 284f9491bb2c84cd052f56239d66ee3a +Z cfe2dcdda6abe970278e2187a7ab525e diff --git a/manifest.uuid b/manifest.uuid index ba52a328a7..177b32dc78 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -01d71b947a7422081d5c7d6ac2c91b9c936dc41926ab58c92f4a088a64e8c051 \ No newline at end of file +ca564d4b5b19fe56842a04f31bb61352e6ae9d72a7e7634eb27ebcf5f670545a \ No newline at end of file diff --git a/src/window.c b/src/window.c index 15f38ee006..0fb8eb461d 100644 --- a/src/window.c +++ b/src/window.c @@ -2215,6 +2215,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ pNew = sqlite3DbMallocZero(db, sizeof(Window)); if( pNew ){ pNew->zName = sqlite3DbStrDup(db, p->zName); + pNew->zBase = sqlite3DbStrDup(db, p->zBase); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); pNew->pFunc = p->pFunc; pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); @@ -2227,6 +2228,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ pNew->pStart = sqlite3ExprDup(db, p->pStart, 0); pNew->pEnd = sqlite3ExprDup(db, p->pEnd, 0); pNew->pOwner = pOwner; + pNew->bImplicitFrame = p->bImplicitFrame; } } return pNew; diff --git a/test/windowB.test b/test/windowB.test index fcefbd4e85..d28ee0da19 100644 --- a/test/windowB.test +++ b/test/windowB.test @@ -202,4 +202,32 @@ ifcapable json1 { } } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE TABLE x(a); + INSERT INTO x VALUES(1); + INSERT INTO x VALUES(2); +} + +do_execsql_test 4.1 { + WITH y AS ( + SELECT Row_Number() OVER (win) FROM x WINDOW win AS (PARTITION BY a) + ) + SELECT * FROM y; +} { + 1 1 +} + +do_catchsql_test 4.2 { + WITH y AS ( + SELECT Row_Number() OVER (win) FROM x WINDOW win AS (PARTITION + BY fake_column)) + SELECT * FROM y; +} {1 {no such column: fake_column}} + +do_catchsql_test 4.3 { + SELECT 1 WINDOW win AS (PARTITION BY fake_column); +} {0 1} + finish_test