|
@@ -1188,7 +1188,7 @@ extern "C" {
|
|
|
*/
|
|
*/
|
|
|
#define SQLITE_VERSION "3.36.0"
|
|
#define SQLITE_VERSION "3.36.0"
|
|
|
#define SQLITE_VERSION_NUMBER 3036000
|
|
#define SQLITE_VERSION_NUMBER 3036000
|
|
|
-#define SQLITE_SOURCE_ID "2021-04-23 00:59:38 fac12115a994a1b4347586e68faf38895ee9cb588eaa84c6f71cf9afd4c4alt1"
|
|
|
|
|
|
|
+#define SQLITE_SOURCE_ID "2021-04-27 17:18:10 ff3538ae37a02f4f36a15cddd1245171e724aac9c84b2e576980fd380630alt1"
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
@@ -74428,7 +74428,8 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){
|
|
|
assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 );
|
|
assert( (flags & ~(BTREE_SAVEPOSITION | BTREE_AUXDELETE))==0 );
|
|
|
if( pCur->eState==CURSOR_REQUIRESEEK ){
|
|
if( pCur->eState==CURSOR_REQUIRESEEK ){
|
|
|
rc = btreeRestoreCursorPosition(pCur);
|
|
rc = btreeRestoreCursorPosition(pCur);
|
|
|
- if( rc ) return rc;
|
|
|
|
|
|
|
+ assert( rc!=SQLITE_OK || CORRUPT_DB || pCur->eState==CURSOR_VALID );
|
|
|
|
|
+ if( rc || pCur->eState!=CURSOR_VALID ) return rc;
|
|
|
}
|
|
}
|
|
|
assert( CORRUPT_DB || pCur->eState==CURSOR_VALID );
|
|
assert( CORRUPT_DB || pCur->eState==CURSOR_VALID );
|
|
|
|
|
|
|
@@ -99071,7 +99072,10 @@ static void resolveAlias(
|
|
|
assert( pOrig!=0 );
|
|
assert( pOrig!=0 );
|
|
|
db = pParse->db;
|
|
db = pParse->db;
|
|
|
pDup = sqlite3ExprDup(db, pOrig, 0);
|
|
pDup = sqlite3ExprDup(db, pOrig, 0);
|
|
|
- if( pDup!=0 ){
|
|
|
|
|
|
|
+ if( db->mallocFailed ){
|
|
|
|
|
+ sqlite3ExprDelete(db, pDup);
|
|
|
|
|
+ pDup = 0;
|
|
|
|
|
+ }else{
|
|
|
incrAggFunctionDepth(pDup, nSubquery);
|
|
incrAggFunctionDepth(pDup, nSubquery);
|
|
|
if( pExpr->op==TK_COLLATE ){
|
|
if( pExpr->op==TK_COLLATE ){
|
|
|
pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
|
|
pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken);
|
|
@@ -99093,10 +99097,8 @@ static void resolveAlias(
|
|
|
pExpr->flags |= EP_MemToken;
|
|
pExpr->flags |= EP_MemToken;
|
|
|
}
|
|
}
|
|
|
if( ExprHasProperty(pExpr, EP_WinFunc) ){
|
|
if( ExprHasProperty(pExpr, EP_WinFunc) ){
|
|
|
- if( pExpr->y.pWin!=0 ){
|
|
|
|
|
|
|
+ if( ALWAYS(pExpr->y.pWin!=0) ){
|
|
|
pExpr->y.pWin->pOwner = pExpr;
|
|
pExpr->y.pWin->pOwner = pExpr;
|
|
|
- }else{
|
|
|
|
|
- assert( db->mallocFailed );
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
sqlite3DbFree(db, pDup);
|
|
sqlite3DbFree(db, pDup);
|
|
@@ -101110,7 +101112,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprAddCollateToken(
|
|
|
if( pExpr==0 ) return 0;
|
|
if( pExpr==0 ) return 0;
|
|
|
if( pExpr->op==TK_VECTOR ){
|
|
if( pExpr->op==TK_VECTOR ){
|
|
|
ExprList *pList = pExpr->x.pList;
|
|
ExprList *pList = pExpr->x.pList;
|
|
|
- if( pList!=0 ){
|
|
|
|
|
|
|
+ if( ALWAYS(pList!=0) ){
|
|
|
int i;
|
|
int i;
|
|
|
for(i=0; i<pList->nExpr; i++){
|
|
for(i=0; i<pList->nExpr; i++){
|
|
|
pList->a[i].pExpr = sqlite3ExprAddCollateToken(pParse,pList->a[i].pExpr,
|
|
pList->a[i].pExpr = sqlite3ExprAddCollateToken(pParse,pList->a[i].pExpr,
|
|
@@ -102334,6 +102336,7 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
|
|
|
if( pzBuffer ){
|
|
if( pzBuffer ){
|
|
|
zAlloc = *pzBuffer;
|
|
zAlloc = *pzBuffer;
|
|
|
staticFlag = EP_Static;
|
|
staticFlag = EP_Static;
|
|
|
|
|
+ assert( zAlloc!=0 );
|
|
|
}else{
|
|
}else{
|
|
|
zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags));
|
|
zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags));
|
|
|
staticFlag = 0;
|
|
staticFlag = 0;
|
|
@@ -103366,8 +103369,10 @@ SQLITE_PRIVATE int sqlite3ExprIsInteger(Expr *p, int *pValue){
|
|
|
*/
|
|
*/
|
|
|
SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){
|
|
SQLITE_PRIVATE int sqlite3ExprCanBeNull(const Expr *p){
|
|
|
u8 op;
|
|
u8 op;
|
|
|
|
|
+ assert( p!=0 );
|
|
|
while( p->op==TK_UPLUS || p->op==TK_UMINUS ){
|
|
while( p->op==TK_UPLUS || p->op==TK_UMINUS ){
|
|
|
p = p->pLeft;
|
|
p = p->pLeft;
|
|
|
|
|
+ assert( p!=0 );
|
|
|
}
|
|
}
|
|
|
op = p->op;
|
|
op = p->op;
|
|
|
if( op==TK_REGISTER ) op = p->op2;
|
|
if( op==TK_REGISTER ) op = p->op2;
|
|
@@ -112596,7 +112601,7 @@ SQLITE_PRIVATE Table *sqlite3LocateTable(
|
|
|
/* If zName is the not the name of a table in the schema created using
|
|
/* If zName is the not the name of a table in the schema created using
|
|
|
** CREATE, then check to see if it is the name of an virtual table that
|
|
** CREATE, then check to see if it is the name of an virtual table that
|
|
|
** can be an eponymous virtual table. */
|
|
** can be an eponymous virtual table. */
|
|
|
- if( pParse->disableVtab==0 ){
|
|
|
|
|
|
|
+ if( pParse->disableVtab==0 && db->init.busy==0 ){
|
|
|
Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName);
|
|
Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName);
|
|
|
if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){
|
|
if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){
|
|
|
pMod = sqlite3PragmaVtabRegister(db, zName);
|
|
pMod = sqlite3PragmaVtabRegister(db, zName);
|
|
@@ -113481,6 +113486,7 @@ SQLITE_PRIVATE void sqlite3AddReturning(Parse *pParse, ExprList *pList){
|
|
|
pRet->retTrig.tr_tm = TRIGGER_AFTER;
|
|
pRet->retTrig.tr_tm = TRIGGER_AFTER;
|
|
|
pRet->retTrig.bReturning = 1;
|
|
pRet->retTrig.bReturning = 1;
|
|
|
pRet->retTrig.pSchema = db->aDb[1].pSchema;
|
|
pRet->retTrig.pSchema = db->aDb[1].pSchema;
|
|
|
|
|
+ pRet->retTrig.pTabSchema = db->aDb[1].pSchema;
|
|
|
pRet->retTrig.step_list = &pRet->retTStep;
|
|
pRet->retTrig.step_list = &pRet->retTStep;
|
|
|
pRet->retTStep.op = TK_RETURNING;
|
|
pRet->retTStep.op = TK_RETURNING;
|
|
|
pRet->retTStep.pTrig = &pRet->retTrig;
|
|
pRet->retTStep.pTrig = &pRet->retTrig;
|
|
@@ -135616,7 +135622,10 @@ static void srclistRenumberCursors(
|
|
|
for(i=0, pItem=pSrc->a; i<pSrc->nSrc; i++, pItem++){
|
|
for(i=0, pItem=pSrc->a; i<pSrc->nSrc; i++, pItem++){
|
|
|
if( i!=iExcept ){
|
|
if( i!=iExcept ){
|
|
|
Select *p;
|
|
Select *p;
|
|
|
- pItem->iCursor = aCsrMap[pItem->iCursor] = pParse->nTab++;
|
|
|
|
|
|
|
+ if( !pItem->fg.isRecursive || aCsrMap[pItem->iCursor]==0 ){
|
|
|
|
|
+ aCsrMap[pItem->iCursor] = pParse->nTab++;
|
|
|
|
|
+ }
|
|
|
|
|
+ pItem->iCursor = aCsrMap[pItem->iCursor];
|
|
|
for(p=pItem->pSelect; p; p=p->pPrior){
|
|
for(p=pItem->pSelect; p; p=p->pPrior){
|
|
|
srclistRenumberCursors(pParse, aCsrMap, p->pSrc, -1);
|
|
srclistRenumberCursors(pParse, aCsrMap, p->pSrc, -1);
|
|
|
}
|
|
}
|
|
@@ -139408,33 +139417,41 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
|
|
|
}
|
|
}
|
|
|
pTmpSchema = pParse->db->aDb[1].pSchema;
|
|
pTmpSchema = pParse->db->aDb[1].pSchema;
|
|
|
p = sqliteHashFirst(&pTmpSchema->trigHash);
|
|
p = sqliteHashFirst(&pTmpSchema->trigHash);
|
|
|
- if( p==0 ){
|
|
|
|
|
- return pTab->pTrigger;
|
|
|
|
|
- }
|
|
|
|
|
pList = pTab->pTrigger;
|
|
pList = pTab->pTrigger;
|
|
|
- if( pTmpSchema!=pTab->pSchema ){
|
|
|
|
|
- while( p ){
|
|
|
|
|
- Trigger *pTrig = (Trigger *)sqliteHashData(p);
|
|
|
|
|
- if( pTrig->pTabSchema==pTab->pSchema
|
|
|
|
|
- && 0==sqlite3StrICmp(pTrig->table, pTab->zName)
|
|
|
|
|
- ){
|
|
|
|
|
- pTrig->pNext = pList;
|
|
|
|
|
- pList = pTrig;
|
|
|
|
|
- }else if( pTrig->op==TK_RETURNING
|
|
|
|
|
|
|
+ while( p ){
|
|
|
|
|
+ Trigger *pTrig = (Trigger *)sqliteHashData(p);
|
|
|
|
|
+ if( pTrig->pTabSchema==pTab->pSchema
|
|
|
|
|
+ && pTrig->table
|
|
|
|
|
+ && 0==sqlite3StrICmp(pTrig->table, pTab->zName)
|
|
|
|
|
+ && pTrig->pTabSchema!=pTmpSchema
|
|
|
|
|
+ ){
|
|
|
|
|
+ pTrig->pNext = pList;
|
|
|
|
|
+ pList = pTrig;
|
|
|
|
|
+ }else if( pTrig->op==TK_RETURNING
|
|
|
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
|
#ifndef SQLITE_OMIT_VIRTUALTABLE
|
|
|
- && pParse->db->pVtabCtx==0
|
|
|
|
|
|
|
+ && pParse->db->pVtabCtx==0
|
|
|
#endif
|
|
#endif
|
|
|
- ){
|
|
|
|
|
- assert( pParse->bReturning );
|
|
|
|
|
- assert( &(pParse->u1.pReturning->retTrig) == pTrig );
|
|
|
|
|
- pTrig->table = pTab->zName;
|
|
|
|
|
- pTrig->pTabSchema = pTab->pSchema;
|
|
|
|
|
- pTrig->pNext = pList;
|
|
|
|
|
- pList = pTrig;
|
|
|
|
|
- }
|
|
|
|
|
- p = sqliteHashNext(p);
|
|
|
|
|
|
|
+ ){
|
|
|
|
|
+ assert( pParse->bReturning );
|
|
|
|
|
+ assert( &(pParse->u1.pReturning->retTrig) == pTrig );
|
|
|
|
|
+ pTrig->table = pTab->zName;
|
|
|
|
|
+ pTrig->pTabSchema = pTab->pSchema;
|
|
|
|
|
+ pTrig->pNext = pList;
|
|
|
|
|
+ pList = pTrig;
|
|
|
}
|
|
}
|
|
|
|
|
+ p = sqliteHashNext(p);
|
|
|
}
|
|
}
|
|
|
|
|
+#if 0
|
|
|
|
|
+ if( pList ){
|
|
|
|
|
+ Trigger *pX;
|
|
|
|
|
+ printf("Triggers for %s:", pTab->zName);
|
|
|
|
|
+ for(pX=pList; pX; pX=pX->pNext){
|
|
|
|
|
+ printf(" %s", pX->zName);
|
|
|
|
|
+ }
|
|
|
|
|
+ printf("\n");
|
|
|
|
|
+ fflush(stdout);
|
|
|
|
|
+ }
|
|
|
|
|
+#endif
|
|
|
return pList;
|
|
return pList;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -153021,6 +153038,10 @@ static i8 wherePathSatisfiesOrderBy(
|
|
|
assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) );
|
|
assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) );
|
|
|
assert( pIndex->aiColumn[nColumn-1]==XN_ROWID
|
|
assert( pIndex->aiColumn[nColumn-1]==XN_ROWID
|
|
|
|| !HasRowid(pIndex->pTable));
|
|
|| !HasRowid(pIndex->pTable));
|
|
|
|
|
+ /* All relevant terms of the index must also be non-NULL in order
|
|
|
|
|
+ ** for isOrderDistinct to be true. So the isOrderDistint value
|
|
|
|
|
+ ** computed here might be a false positive. Corrections will be
|
|
|
|
|
+ ** made at tag-20210426-1 below */
|
|
|
isOrderDistinct = IsUniqueIndex(pIndex)
|
|
isOrderDistinct = IsUniqueIndex(pIndex)
|
|
|
&& (pLoop->wsFlags & WHERE_SKIPSCAN)==0;
|
|
&& (pLoop->wsFlags & WHERE_SKIPSCAN)==0;
|
|
|
}
|
|
}
|
|
@@ -153088,14 +153109,18 @@ static i8 wherePathSatisfiesOrderBy(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* An unconstrained column that might be NULL means that this
|
|
/* An unconstrained column that might be NULL means that this
|
|
|
- ** WhereLoop is not well-ordered
|
|
|
|
|
|
|
+ ** WhereLoop is not well-ordered. tag-20210426-1
|
|
|
*/
|
|
*/
|
|
|
- if( isOrderDistinct
|
|
|
|
|
- && iColumn>=0
|
|
|
|
|
- && j>=pLoop->u.btree.nEq
|
|
|
|
|
- && pIndex->pTable->aCol[iColumn].notNull==0
|
|
|
|
|
- ){
|
|
|
|
|
- isOrderDistinct = 0;
|
|
|
|
|
|
|
+ if( isOrderDistinct ){
|
|
|
|
|
+ if( iColumn>=0
|
|
|
|
|
+ && j>=pLoop->u.btree.nEq
|
|
|
|
|
+ && pIndex->pTable->aCol[iColumn].notNull==0
|
|
|
|
|
+ ){
|
|
|
|
|
+ isOrderDistinct = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ if( iColumn==XN_EXPR ){
|
|
|
|
|
+ isOrderDistinct = 0;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Find the ORDER BY term that corresponds to the j-th column
|
|
/* Find the ORDER BY term that corresponds to the j-th column
|
|
@@ -156354,6 +156379,7 @@ struct WindowCodeArg {
|
|
|
int regGosub; /* Register used with OP_Gosub(addrGosub) */
|
|
int regGosub; /* Register used with OP_Gosub(addrGosub) */
|
|
|
int regArg; /* First in array of accumulator registers */
|
|
int regArg; /* First in array of accumulator registers */
|
|
|
int eDelete; /* See above */
|
|
int eDelete; /* See above */
|
|
|
|
|
+ int regRowid;
|
|
|
|
|
|
|
|
WindowCsrAndReg start;
|
|
WindowCsrAndReg start;
|
|
|
WindowCsrAndReg current;
|
|
WindowCsrAndReg current;
|
|
@@ -157030,16 +157056,24 @@ static int windowCodeOp(
|
|
|
/* If this is a (RANGE BETWEEN a FOLLOWING AND b FOLLOWING) or
|
|
/* If this is a (RANGE BETWEEN a FOLLOWING AND b FOLLOWING) or
|
|
|
** (RANGE BETWEEN b PRECEDING AND a PRECEDING) frame, ensure the
|
|
** (RANGE BETWEEN b PRECEDING AND a PRECEDING) frame, ensure the
|
|
|
** start cursor does not advance past the end cursor within the
|
|
** start cursor does not advance past the end cursor within the
|
|
|
- ** temporary table. It otherwise might, if (a>b). */
|
|
|
|
|
|
|
+ ** temporary table. It otherwise might, if (a>b). Also ensure that,
|
|
|
|
|
+ ** if the input cursor is still finding new rows, that the end
|
|
|
|
|
+ ** cursor does not go past it to EOF. */
|
|
|
if( pMWin->eStart==pMWin->eEnd && regCountdown
|
|
if( pMWin->eStart==pMWin->eEnd && regCountdown
|
|
|
- && pMWin->eFrmType==TK_RANGE && op==WINDOW_AGGINVERSE
|
|
|
|
|
|
|
+ && pMWin->eFrmType==TK_RANGE
|
|
|
){
|
|
){
|
|
|
int regRowid1 = sqlite3GetTempReg(pParse);
|
|
int regRowid1 = sqlite3GetTempReg(pParse);
|
|
|
int regRowid2 = sqlite3GetTempReg(pParse);
|
|
int regRowid2 = sqlite3GetTempReg(pParse);
|
|
|
- sqlite3VdbeAddOp2(v, OP_Rowid, p->start.csr, regRowid1);
|
|
|
|
|
- sqlite3VdbeAddOp2(v, OP_Rowid, p->end.csr, regRowid2);
|
|
|
|
|
- sqlite3VdbeAddOp3(v, OP_Ge, regRowid2, lblDone, regRowid1);
|
|
|
|
|
- VdbeCoverage(v);
|
|
|
|
|
|
|
+ if( op==WINDOW_AGGINVERSE ){
|
|
|
|
|
+ sqlite3VdbeAddOp2(v, OP_Rowid, p->start.csr, regRowid1);
|
|
|
|
|
+ sqlite3VdbeAddOp2(v, OP_Rowid, p->end.csr, regRowid2);
|
|
|
|
|
+ sqlite3VdbeAddOp3(v, OP_Ge, regRowid2, lblDone, regRowid1);
|
|
|
|
|
+ VdbeCoverage(v);
|
|
|
|
|
+ }else if( p->regRowid ){
|
|
|
|
|
+ sqlite3VdbeAddOp2(v, OP_Rowid, p->end.csr, regRowid1);
|
|
|
|
|
+ sqlite3VdbeAddOp3(v, OP_Ge, p->regRowid, lblDone, regRowid1);
|
|
|
|
|
+ VdbeCoverage(v);
|
|
|
|
|
+ }
|
|
|
sqlite3ReleaseTempReg(pParse, regRowid1);
|
|
sqlite3ReleaseTempReg(pParse, regRowid1);
|
|
|
sqlite3ReleaseTempReg(pParse, regRowid2);
|
|
sqlite3ReleaseTempReg(pParse, regRowid2);
|
|
|
assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING );
|
|
assert( pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING );
|
|
@@ -157536,7 +157570,6 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep(
|
|
|
int addrEmpty; /* Address of OP_Rewind in flush: */
|
|
int addrEmpty; /* Address of OP_Rewind in flush: */
|
|
|
int regNew; /* Array of registers holding new input row */
|
|
int regNew; /* Array of registers holding new input row */
|
|
|
int regRecord; /* regNew array in record form */
|
|
int regRecord; /* regNew array in record form */
|
|
|
- int regRowid; /* Rowid for regRecord in eph table */
|
|
|
|
|
int regNewPeer = 0; /* Peer values for new row (part of regNew) */
|
|
int regNewPeer = 0; /* Peer values for new row (part of regNew) */
|
|
|
int regPeer = 0; /* Peer values for current row */
|
|
int regPeer = 0; /* Peer values for current row */
|
|
|
int regFlushPart = 0; /* Register for "Gosub flush_partition" */
|
|
int regFlushPart = 0; /* Register for "Gosub flush_partition" */
|
|
@@ -157608,7 +157641,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep(
|
|
|
regNew = pParse->nMem+1;
|
|
regNew = pParse->nMem+1;
|
|
|
pParse->nMem += nInput;
|
|
pParse->nMem += nInput;
|
|
|
regRecord = ++pParse->nMem;
|
|
regRecord = ++pParse->nMem;
|
|
|
- regRowid = ++pParse->nMem;
|
|
|
|
|
|
|
+ s.regRowid = ++pParse->nMem;
|
|
|
|
|
|
|
|
/* If the window frame contains an "<expr> PRECEDING" or "<expr> FOLLOWING"
|
|
/* If the window frame contains an "<expr> PRECEDING" or "<expr> FOLLOWING"
|
|
|
** clause, allocate registers to store the results of evaluating each
|
|
** clause, allocate registers to store the results of evaluating each
|
|
@@ -157664,9 +157697,9 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* Insert the new row into the ephemeral table */
|
|
/* Insert the new row into the ephemeral table */
|
|
|
- sqlite3VdbeAddOp2(v, OP_NewRowid, csrWrite, regRowid);
|
|
|
|
|
- sqlite3VdbeAddOp3(v, OP_Insert, csrWrite, regRecord, regRowid);
|
|
|
|
|
- addrNe = sqlite3VdbeAddOp3(v, OP_Ne, pMWin->regOne, 0, regRowid);
|
|
|
|
|
|
|
+ sqlite3VdbeAddOp2(v, OP_NewRowid, csrWrite, s.regRowid);
|
|
|
|
|
+ sqlite3VdbeAddOp3(v, OP_Insert, csrWrite, regRecord, s.regRowid);
|
|
|
|
|
+ addrNe = sqlite3VdbeAddOp3(v, OP_Ne, pMWin->regOne, 0, s.regRowid);
|
|
|
VdbeCoverageNeverNull(v);
|
|
VdbeCoverageNeverNull(v);
|
|
|
|
|
|
|
|
/* This block is run for the first row of each partition */
|
|
/* This block is run for the first row of each partition */
|
|
@@ -157784,6 +157817,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeStep(
|
|
|
sqlite3VdbeJumpHere(v, addrGosubFlush);
|
|
sqlite3VdbeJumpHere(v, addrGosubFlush);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ s.regRowid = 0;
|
|
|
addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite);
|
|
addrEmpty = sqlite3VdbeAddOp1(v, OP_Rewind, csrWrite);
|
|
|
VdbeCoverage(v);
|
|
VdbeCoverage(v);
|
|
|
if( pMWin->eEnd==TK_PRECEDING ){
|
|
if( pMWin->eEnd==TK_PRECEDING ){
|
|
@@ -163239,6 +163273,7 @@ SQLITE_PRIVATE int sqlite3ParserFallback(int iToken){
|
|
|
#define CC_ID 27 /* unicode characters usable in IDs */
|
|
#define CC_ID 27 /* unicode characters usable in IDs */
|
|
|
#define CC_ILLEGAL 28 /* Illegal character */
|
|
#define CC_ILLEGAL 28 /* Illegal character */
|
|
|
#define CC_NUL 29 /* 0x00 */
|
|
#define CC_NUL 29 /* 0x00 */
|
|
|
|
|
+#define CC_BOM 30 /* First byte of UTF8 BOM: 0xEF 0xBB 0xBF */
|
|
|
|
|
|
|
|
static const unsigned char aiClass[] = {
|
|
static const unsigned char aiClass[] = {
|
|
|
#ifdef SQLITE_ASCII
|
|
#ifdef SQLITE_ASCII
|
|
@@ -163251,14 +163286,14 @@ static const unsigned char aiClass[] = {
|
|
|
/* 5x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 9, 28, 28, 28, 2,
|
|
/* 5x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 9, 28, 28, 28, 2,
|
|
|
/* 6x */ 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
/* 6x */ 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
|
/* 7x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 28, 10, 28, 25, 28,
|
|
/* 7x */ 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 28, 10, 28, 25, 28,
|
|
|
-/* 8x */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
|
|
-/* 9x */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
|
|
-/* Ax */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
|
|
-/* Bx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
|
|
-/* Cx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
|
|
-/* Dx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
|
|
-/* Ex */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
|
|
|
-/* Fx */ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
|
|
|
|
|
|
|
+/* 8x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
|
|
|
+/* 9x */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
|
|
|
+/* Ax */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
|
|
|
+/* Bx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
|
|
|
+/* Cx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
|
|
|
+/* Dx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
|
|
|
|
|
+/* Ex */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 30,
|
|
|
|
|
+/* Fx */ 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27
|
|
|
#endif
|
|
#endif
|
|
|
#ifdef SQLITE_EBCDIC
|
|
#ifdef SQLITE_EBCDIC
|
|
|
/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */
|
|
/* x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf */
|
|
@@ -164204,6 +164239,14 @@ SQLITE_PRIVATE int sqlite3GetToken(const unsigned char *z, int *tokenType){
|
|
|
i = 1;
|
|
i = 1;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
|
|
+ case CC_BOM: {
|
|
|
|
|
+ if( z[1]==0xbb && z[2]==0xbf ){
|
|
|
|
|
+ *tokenType = TK_SPACE;
|
|
|
|
|
+ return 3;
|
|
|
|
|
+ }
|
|
|
|
|
+ i = 1;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
case CC_NUL: {
|
|
case CC_NUL: {
|
|
|
*tokenType = TK_ILLEGAL;
|
|
*tokenType = TK_ILLEGAL;
|
|
|
return 0;
|
|
return 0;
|
|
@@ -223015,7 +223058,7 @@ struct Fts5SegIter {
|
|
|
int iLeafPgno; /* Current leaf page number */
|
|
int iLeafPgno; /* Current leaf page number */
|
|
|
Fts5Data *pLeaf; /* Current leaf data */
|
|
Fts5Data *pLeaf; /* Current leaf data */
|
|
|
Fts5Data *pNextLeaf; /* Leaf page (iLeafPgno+1) */
|
|
Fts5Data *pNextLeaf; /* Leaf page (iLeafPgno+1) */
|
|
|
- int iLeafOffset; /* Byte offset within current leaf */
|
|
|
|
|
|
|
+ i64 iLeafOffset; /* Byte offset within current leaf */
|
|
|
|
|
|
|
|
/* Next method */
|
|
/* Next method */
|
|
|
void (*xNext)(Fts5Index*, Fts5SegIter*, int*);
|
|
void (*xNext)(Fts5Index*, Fts5SegIter*, int*);
|
|
@@ -224195,7 +224238,7 @@ static void fts5SegIterLoadNPos(Fts5Index *p, Fts5SegIter *pIter){
|
|
|
|
|
|
|
|
static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){
|
|
static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){
|
|
|
u8 *a = pIter->pLeaf->p; /* Buffer to read data from */
|
|
u8 *a = pIter->pLeaf->p; /* Buffer to read data from */
|
|
|
- int iOff = pIter->iLeafOffset;
|
|
|
|
|
|
|
+ i64 iOff = pIter->iLeafOffset;
|
|
|
|
|
|
|
|
ASSERT_SZLEAF_OK(pIter->pLeaf);
|
|
ASSERT_SZLEAF_OK(pIter->pLeaf);
|
|
|
if( iOff>=pIter->pLeaf->szLeaf ){
|
|
if( iOff>=pIter->pLeaf->szLeaf ){
|
|
@@ -224228,7 +224271,7 @@ static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){
|
|
|
*/
|
|
*/
|
|
|
static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){
|
|
static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){
|
|
|
u8 *a = pIter->pLeaf->p; /* Buffer to read data from */
|
|
u8 *a = pIter->pLeaf->p; /* Buffer to read data from */
|
|
|
- int iOff = pIter->iLeafOffset; /* Offset to read at */
|
|
|
|
|
|
|
+ i64 iOff = pIter->iLeafOffset; /* Offset to read at */
|
|
|
int nNew; /* Bytes of new data */
|
|
int nNew; /* Bytes of new data */
|
|
|
|
|
|
|
|
iOff += fts5GetVarint32(&a[iOff], nNew);
|
|
iOff += fts5GetVarint32(&a[iOff], nNew);
|
|
@@ -227663,7 +227706,8 @@ static void fts5MergePrefixLists(
|
|
|
nTail = pHead->iter.nPoslist - pHead->iOff;
|
|
nTail = pHead->iter.nPoslist - pHead->iOff;
|
|
|
|
|
|
|
|
/* WRITEPOSLISTSIZE */
|
|
/* WRITEPOSLISTSIZE */
|
|
|
- assert( tmp.n+nTail<=nTmp );
|
|
|
|
|
|
|
+ assert_nc( tmp.n+nTail<=nTmp );
|
|
|
|
|
+ assert( tmp.n+nTail<=nTmp+nMerge*10 );
|
|
|
if( tmp.n+nTail>nTmp-FTS5_DATA_ZERO_PADDING ){
|
|
if( tmp.n+nTail>nTmp-FTS5_DATA_ZERO_PADDING ){
|
|
|
if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT;
|
|
if( p->rc==SQLITE_OK ) p->rc = FTS5_CORRUPT;
|
|
|
break;
|
|
break;
|
|
@@ -232109,7 +232153,7 @@ static void fts5SourceIdFunc(
|
|
|
){
|
|
){
|
|
|
assert( nArg==0 );
|
|
assert( nArg==0 );
|
|
|
UNUSED_PARAM2(nArg, apUnused);
|
|
UNUSED_PARAM2(nArg, apUnused);
|
|
|
- sqlite3_result_text(pCtx, "fts5: 2021-04-23 00:59:38 fac12115a994a1b4347586e68faf38895ee9cb588eaa84c6f71cf9afd4c488b4", -1, SQLITE_TRANSIENT);
|
|
|
|
|
|
|
+ sqlite3_result_text(pCtx, "fts5: 2021-04-27 17:18:10 ff3538ae37a02f4f36a15cddd1245171e724aac9c84b2e576980fd3806302775", -1, SQLITE_TRANSIENT);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -245618,9 +245662,9 @@ SQLITE_API int sqlite3_uuid_init(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/************** End of uuid.c ************************************************/
|
|
/************** End of uuid.c ************************************************/
|
|
|
-#if __LINE__!=245621
|
|
|
|
|
|
|
+#if __LINE__!=245665
|
|
|
#undef SQLITE_SOURCE_ID
|
|
#undef SQLITE_SOURCE_ID
|
|
|
-#define SQLITE_SOURCE_ID "2021-04-23 00:59:38 fac12115a994a1b4347586e68faf38895ee9cb588eaa84c6f71cf9afd4c4alt2"
|
|
|
|
|
|
|
+#define SQLITE_SOURCE_ID "2021-04-27 17:18:10 ff3538ae37a02f4f36a15cddd1245171e724aac9c84b2e576980fd380630alt2"
|
|
|
#endif
|
|
#endif
|
|
|
/* Return the source-id for this library */
|
|
/* Return the source-id for this library */
|
|
|
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
|
|
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
|