UI: Update SQLite to 3.46.1

This commit is contained in:
Nodir Temirkhodjaev 2024-08-13 18:10:34 +05:00
parent e30491d955
commit 4cf040f0f0
2 changed files with 83 additions and 77 deletions

View File

@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite ** This file is an amalgamation of many separate C source files from SQLite
** version 3.46.0. By combining all the individual C code files into this ** version 3.46.1. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a single translation ** single large file, the entire code can be compiled as a single translation
** unit. This allows many compilers to do optimizations that would not be ** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements ** possible if the files were compiled separately. Performance improvements
@ -18,7 +18,7 @@
** separate file. This file contains only code for the core SQLite library. ** separate file. This file contains only code for the core SQLite library.
** **
** The content in this amalgamation comes from Fossil check-in ** The content in this amalgamation comes from Fossil check-in
** 96c92aba00c8375bc32fafcdf12429c58bd8. ** c9c2ab54ba1f5f46360f1b4f35d849cd3f08.
*/ */
#define SQLITE_CORE 1 #define SQLITE_CORE 1
#define SQLITE_AMALGAMATION 1 #define SQLITE_AMALGAMATION 1
@ -459,9 +459,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()]. ** [sqlite_version()] and [sqlite_source_id()].
*/ */
#define SQLITE_VERSION "3.46.0" #define SQLITE_VERSION "3.46.1"
#define SQLITE_VERSION_NUMBER 3046000 #define SQLITE_VERSION_NUMBER 3046001
#define SQLITE_SOURCE_ID "2024-05-23 13:25:27 96c92aba00c8375bc32fafcdf12429c58bd8aabfcadab6683e35bbb9cdebf19e" #define SQLITE_SOURCE_ID "2024-08-13 09:16:08 c9c2ab54ba1f5f46360f1b4f35d849cd3f080e6fc2b6c60e91b16c63f69a1e33"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers
@ -19361,7 +19361,7 @@ struct SrcList {
#define WHERE_AGG_DISTINCT 0x0400 /* Query is "SELECT agg(DISTINCT ...)" */ #define WHERE_AGG_DISTINCT 0x0400 /* Query is "SELECT agg(DISTINCT ...)" */
#define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ #define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */
#define WHERE_RIGHT_JOIN 0x1000 /* Processing a RIGHT JOIN */ #define WHERE_RIGHT_JOIN 0x1000 /* Processing a RIGHT JOIN */
/* 0x2000 not currently used */ #define WHERE_KEEP_ALL_JOINS 0x2000 /* Do not do the omit-noop-join opt */
#define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ #define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */
/* 0x8000 not currently used */ /* 0x8000 not currently used */
@ -90173,7 +90173,8 @@ SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff
assert( iVar>0 ); assert( iVar>0 );
if( v ){ if( v ){
Mem *pMem = &v->aVar[iVar-1]; Mem *pMem = &v->aVar[iVar-1];
assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); assert( (v->db->flags & SQLITE_EnableQPSG)==0
|| (v->db->mDbFlags & DBFLAG_InternalFunc)!=0 );
if( 0==(pMem->flags & MEM_Null) ){ if( 0==(pMem->flags & MEM_Null) ){
sqlite3_value *pRet = sqlite3ValueNew(v->db); sqlite3_value *pRet = sqlite3ValueNew(v->db);
if( pRet ){ if( pRet ){
@ -90193,7 +90194,8 @@ SQLITE_PRIVATE sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe *v, int iVar, u8 aff
*/ */
SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ SQLITE_PRIVATE void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){
assert( iVar>0 ); assert( iVar>0 );
assert( (v->db->flags & SQLITE_EnableQPSG)==0 ); assert( (v->db->flags & SQLITE_EnableQPSG)==0
|| (v->db->mDbFlags & DBFLAG_InternalFunc)!=0 );
if( iVar>=32 ){ if( iVar>=32 ){
v->expmask |= 0x80000000; v->expmask |= 0x80000000;
}else{ }else{
@ -106950,7 +106952,7 @@ static void extendFJMatch(
static SQLITE_NOINLINE int isValidSchemaTableName( static SQLITE_NOINLINE int isValidSchemaTableName(
const char *zTab, /* Name as it appears in the SQL */ const char *zTab, /* Name as it appears in the SQL */
Table *pTab, /* The schema table we are trying to match */ Table *pTab, /* The schema table we are trying to match */
Schema *pSchema /* non-NULL if a database qualifier is present */ const char *zDb /* non-NULL if a database qualifier is present */
){ ){
const char *zLegacy; const char *zLegacy;
assert( pTab!=0 ); assert( pTab!=0 );
@ -106961,7 +106963,7 @@ static SQLITE_NOINLINE int isValidSchemaTableName(
if( sqlite3StrICmp(zTab+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){ if( sqlite3StrICmp(zTab+7, &PREFERRED_TEMP_SCHEMA_TABLE[7])==0 ){
return 1; return 1;
} }
if( pSchema==0 ) return 0; if( zDb==0 ) return 0;
if( sqlite3StrICmp(zTab+7, &LEGACY_SCHEMA_TABLE[7])==0 ) return 1; if( sqlite3StrICmp(zTab+7, &LEGACY_SCHEMA_TABLE[7])==0 ) return 1;
if( sqlite3StrICmp(zTab+7, &PREFERRED_SCHEMA_TABLE[7])==0 ) return 1; if( sqlite3StrICmp(zTab+7, &PREFERRED_SCHEMA_TABLE[7])==0 ) return 1;
}else{ }else{
@ -107144,7 +107146,7 @@ static int lookupName(
} }
}else if( sqlite3StrICmp(zTab, pTab->zName)!=0 ){ }else if( sqlite3StrICmp(zTab, pTab->zName)!=0 ){
if( pTab->tnum!=1 ) continue; if( pTab->tnum!=1 ) continue;
if( !isValidSchemaTableName(zTab, pTab, pSchema) ) continue; if( !isValidSchemaTableName(zTab, pTab, zDb) ) continue;
} }
assert( ExprUseYTab(pExpr) ); assert( ExprUseYTab(pExpr) );
if( IN_RENAME_OBJECT && pItem->zAlias ){ if( IN_RENAME_OBJECT && pItem->zAlias ){
@ -108876,6 +108878,9 @@ SQLITE_PRIVATE int sqlite3ResolveExprNames(
** Resolve all names for all expression in an expression list. This is ** Resolve all names for all expression in an expression list. This is
** just like sqlite3ResolveExprNames() except that it works for an expression ** just like sqlite3ResolveExprNames() except that it works for an expression
** list rather than a single expression. ** list rather than a single expression.
**
** The return value is SQLITE_OK (0) for success or SQLITE_ERROR (1) for a
** failure.
*/ */
SQLITE_PRIVATE int sqlite3ResolveExprListNames( SQLITE_PRIVATE int sqlite3ResolveExprListNames(
NameContext *pNC, /* Namespace to resolve expressions in. */ NameContext *pNC, /* Namespace to resolve expressions in. */
@ -108884,7 +108889,7 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames(
int i; int i;
int savedHasAgg = 0; int savedHasAgg = 0;
Walker w; Walker w;
if( pList==0 ) return WRC_Continue; if( pList==0 ) return SQLITE_OK;
w.pParse = pNC->pParse; w.pParse = pNC->pParse;
w.xExprCallback = resolveExprStep; w.xExprCallback = resolveExprStep;
w.xSelectCallback = resolveSelectStep; w.xSelectCallback = resolveSelectStep;
@ -108898,7 +108903,7 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames(
#if SQLITE_MAX_EXPR_DEPTH>0 #if SQLITE_MAX_EXPR_DEPTH>0
w.pParse->nHeight += pExpr->nHeight; w.pParse->nHeight += pExpr->nHeight;
if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){ if( sqlite3ExprCheckHeight(w.pParse, w.pParse->nHeight) ){
return WRC_Abort; return SQLITE_ERROR;
} }
#endif #endif
sqlite3WalkExprNN(&w, pExpr); sqlite3WalkExprNN(&w, pExpr);
@ -108915,10 +108920,10 @@ SQLITE_PRIVATE int sqlite3ResolveExprListNames(
(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg);
} }
if( w.pParse->nErr>0 ) return WRC_Abort; if( w.pParse->nErr>0 ) return SQLITE_ERROR;
} }
pNC->ncFlags |= savedHasAgg; pNC->ncFlags |= savedHasAgg;
return WRC_Continue; return SQLITE_OK;
} }
/* /*
@ -117457,7 +117462,7 @@ static int renameResolveTrigger(Parse *pParse){
/* ALWAYS() because if the table of the trigger does not exist, the /* ALWAYS() because if the table of the trigger does not exist, the
** error would have been hit before this point */ ** error would have been hit before this point */
if( ALWAYS(pParse->pTriggerTab) ){ if( ALWAYS(pParse->pTriggerTab) ){
rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab); rc = sqlite3ViewGetColumnNames(pParse, pParse->pTriggerTab)!=0;
} }
/* Resolve symbols in WHEN clause */ /* Resolve symbols in WHEN clause */
@ -124426,8 +124431,9 @@ create_view_fail:
#if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
/* /*
** The Table structure pTable is really a VIEW. Fill in the names of ** The Table structure pTable is really a VIEW. Fill in the names of
** the columns of the view in the pTable structure. Return the number ** the columns of the view in the pTable structure. Return non-zero if
** of errors. If an error is seen leave an error message in pParse->zErrMsg. ** there are errors. If an error is seen an error message is left
** in pParse->zErrMsg.
*/ */
static SQLITE_NOINLINE int viewGetColumnNames(Parse *pParse, Table *pTable){ static SQLITE_NOINLINE int viewGetColumnNames(Parse *pParse, Table *pTable){
Table *pSelTab; /* A fake table from which we get the result set */ Table *pSelTab; /* A fake table from which we get the result set */
@ -124550,7 +124556,7 @@ static SQLITE_NOINLINE int viewGetColumnNames(Parse *pParse, Table *pTable){
sqlite3DeleteColumnNames(db, pTable); sqlite3DeleteColumnNames(db, pTable);
} }
#endif /* SQLITE_OMIT_VIEW */ #endif /* SQLITE_OMIT_VIEW */
return nErr; return nErr + pParse->nErr;
} }
SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){
assert( pTable!=0 ); assert( pTable!=0 );
@ -130848,6 +130854,8 @@ static void groupConcatValue(sqlite3_context *context){
sqlite3_result_error_toobig(context); sqlite3_result_error_toobig(context);
}else if( pAccum->accError==SQLITE_NOMEM ){ }else if( pAccum->accError==SQLITE_NOMEM ){
sqlite3_result_error_nomem(context); sqlite3_result_error_nomem(context);
}else if( pGCC->nAccum>0 && pAccum->nChar==0 ){
sqlite3_result_text(context, "", 1, SQLITE_STATIC);
}else{ }else{
const char *zText = sqlite3_str_value(pAccum); const char *zText = sqlite3_str_value(pAccum);
sqlite3_result_text(context, zText, pAccum->nChar, SQLITE_TRANSIENT); sqlite3_result_text(context, zText, pAccum->nChar, SQLITE_TRANSIENT);
@ -133602,6 +133610,7 @@ SQLITE_PRIVATE Select *sqlite3MultiValues(Parse *pParse, Select *pLeft, ExprList
pRet->pSrc->nSrc = 1; pRet->pSrc->nSrc = 1;
pRet->pPrior = pLeft->pPrior; pRet->pPrior = pLeft->pPrior;
pRet->op = pLeft->op; pRet->op = pLeft->op;
if( pRet->pPrior ) pRet->selFlags |= SF_Values;
pLeft->pPrior = 0; pLeft->pPrior = 0;
pLeft->op = TK_SELECT; pLeft->op = TK_SELECT;
assert( pLeft->pNext==0 ); assert( pLeft->pNext==0 );
@ -166067,7 +166076,9 @@ static int whereLoopAddBtree(
" according to whereIsCoveringIndex()\n", pProbe->zName)); " according to whereIsCoveringIndex()\n", pProbe->zName));
} }
} }
}else if( m==0 ){ }else if( m==0
&& (HasRowid(pTab) || pWInfo->pSelect!=0 || sqlite3FaultSim(700))
){
WHERETRACE(0x200, WHERETRACE(0x200,
("-> %s a covering index according to bitmasks\n", ("-> %s a covering index according to bitmasks\n",
pProbe->zName, m==0 ? "is" : "is not")); pProbe->zName, m==0 ? "is" : "is not"));
@ -167956,6 +167967,10 @@ static void showAllWhereLoops(WhereInfo *pWInfo, WhereClause *pWC){
** the right-most table of a subquery that was flattened into the ** the right-most table of a subquery that was flattened into the
** main query and that subquery was the right-hand operand of an ** main query and that subquery was the right-hand operand of an
** inner join that held an ON or USING clause. ** inner join that held an ON or USING clause.
** 6) The ORDER BY clause has 63 or fewer terms
** 7) The omit-noop-join optimization is enabled.
**
** Items (1), (6), and (7) are checked by the caller.
** **
** For example, given: ** For example, given:
** **
@ -168369,6 +168384,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
if( pOrderBy && pOrderBy->nExpr>=BMS ){ if( pOrderBy && pOrderBy->nExpr>=BMS ){
pOrderBy = 0; pOrderBy = 0;
wctrlFlags &= ~WHERE_WANT_DISTINCT; wctrlFlags &= ~WHERE_WANT_DISTINCT;
wctrlFlags |= WHERE_KEEP_ALL_JOINS; /* Disable omit-noop-join opt */
} }
/* The number of tables in the FROM clause is limited by the number of /* The number of tables in the FROM clause is limited by the number of
@ -168669,10 +168685,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
** in-line sqlite3WhereCodeOneLoopStart() for performance reasons. ** in-line sqlite3WhereCodeOneLoopStart() for performance reasons.
*/ */
notReady = ~(Bitmask)0; notReady = ~(Bitmask)0;
if( pWInfo->nLevel>=2 if( pWInfo->nLevel>=2 /* Must be a join, or this opt8n is pointless */
&& pResultSet!=0 /* these two combine to guarantee */ && pResultSet!=0 /* Condition (1) */
&& 0==(wctrlFlags & WHERE_AGG_DISTINCT) /* condition (1) above */ && 0==(wctrlFlags & (WHERE_AGG_DISTINCT|WHERE_KEEP_ALL_JOINS)) /* (1),(6) */
&& OptimizationEnabled(db, SQLITE_OmitNoopJoin) && OptimizationEnabled(db, SQLITE_OmitNoopJoin) /* (7) */
){ ){
notReady = whereOmitNoopJoin(pWInfo, notReady); notReady = whereOmitNoopJoin(pWInfo, notReady);
nTabList = pWInfo->nLevel; nTabList = pWInfo->nLevel;
@ -168992,26 +169008,6 @@ whereBeginError:
} }
#endif #endif
#ifdef SQLITE_DEBUG
/*
** Return true if cursor iCur is opened by instruction k of the
** bytecode. Used inside of assert() only.
*/
static int cursorIsOpen(Vdbe *v, int iCur, int k){
while( k>=0 ){
VdbeOp *pOp = sqlite3VdbeGetOp(v,k--);
if( pOp->p1!=iCur ) continue;
if( pOp->opcode==OP_Close ) return 0;
if( pOp->opcode==OP_OpenRead ) return 1;
if( pOp->opcode==OP_OpenWrite ) return 1;
if( pOp->opcode==OP_OpenDup ) return 1;
if( pOp->opcode==OP_OpenAutoindex ) return 1;
if( pOp->opcode==OP_OpenEphemeral ) return 1;
}
return 0;
}
#endif /* SQLITE_DEBUG */
/* /*
** Generate the end of the WHERE loop. See comments on ** Generate the end of the WHERE loop. See comments on
** sqlite3WhereBegin() for additional information. ** sqlite3WhereBegin() for additional information.
@ -169311,16 +169307,10 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
** reference. Verify that this is harmless - that the ** reference. Verify that this is harmless - that the
** table being referenced really is open. ** table being referenced really is open.
*/ */
#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC if( pLoop->wsFlags & WHERE_IDX_ONLY ){
assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 sqlite3ErrorMsg(pParse, "internal query planner error");
|| cursorIsOpen(v,pOp->p1,k) pParse->rc = SQLITE_INTERNAL;
|| pOp->opcode==OP_Offset }
);
#else
assert( (pLoop->wsFlags & WHERE_IDX_ONLY)==0
|| cursorIsOpen(v,pOp->p1,k)
);
#endif
} }
}else if( pOp->opcode==OP_Rowid ){ }else if( pOp->opcode==OP_Rowid ){
pOp->p1 = pLevel->iIdxCur; pOp->p1 = pLevel->iIdxCur;
@ -172591,9 +172581,9 @@ static void updateDeleteLimitError(
break; break;
} }
} }
if( (p->selFlags & SF_MultiValue)==0 && if( (p->selFlags & (SF_MultiValue|SF_Values))==0
(mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && && (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0
cnt>mxSelect && cnt>mxSelect
){ ){
sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); sqlite3ErrorMsg(pParse, "too many terms in compound SELECT");
} }
@ -237004,7 +236994,11 @@ static int sqlite3Fts5ExprNew(
} }
sqlite3_free(sParse.apPhrase); sqlite3_free(sParse.apPhrase);
*pzErr = sParse.zErr; if( 0==*pzErr ){
*pzErr = sParse.zErr;
}else{
sqlite3_free(sParse.zErr);
}
return sParse.rc; return sParse.rc;
} }
@ -239132,6 +239126,7 @@ static Fts5ExprNode *sqlite3Fts5ParseImplicitAnd(
assert( pRight->eType==FTS5_STRING assert( pRight->eType==FTS5_STRING
|| pRight->eType==FTS5_TERM || pRight->eType==FTS5_TERM
|| pRight->eType==FTS5_EOF || pRight->eType==FTS5_EOF
|| (pRight->eType==FTS5_AND && pParse->bPhraseToAnd)
); );
if( pLeft->eType==FTS5_AND ){ if( pLeft->eType==FTS5_AND ){
@ -251299,6 +251294,7 @@ static int fts5UpdateMethod(
rc = SQLITE_ERROR; rc = SQLITE_ERROR;
}else{ }else{
rc = fts5SpecialDelete(pTab, apVal); rc = fts5SpecialDelete(pTab, apVal);
bUpdateOrDelete = 1;
} }
}else{ }else{
rc = fts5SpecialInsert(pTab, z, apVal[2 + pConfig->nCol + 1]); rc = fts5SpecialInsert(pTab, z, apVal[2 + pConfig->nCol + 1]);
@ -252473,14 +252469,16 @@ static int sqlite3Fts5GetTokenizer(
if( pMod==0 ){ if( pMod==0 ){
assert( nArg>0 ); assert( nArg>0 );
rc = SQLITE_ERROR; rc = SQLITE_ERROR;
*pzErr = sqlite3_mprintf("no such tokenizer: %s", azArg[0]); if( pzErr ) *pzErr = sqlite3_mprintf("no such tokenizer: %s", azArg[0]);
}else{ }else{
rc = pMod->x.xCreate( rc = pMod->x.xCreate(
pMod->pUserData, (azArg?&azArg[1]:0), (nArg?nArg-1:0), &pConfig->pTok pMod->pUserData, (azArg?&azArg[1]:0), (nArg?nArg-1:0), &pConfig->pTok
); );
pConfig->pTokApi = &pMod->x; pConfig->pTokApi = &pMod->x;
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
if( pzErr ) *pzErr = sqlite3_mprintf("error in tokenizer constructor"); if( pzErr && rc!=SQLITE_NOMEM ){
*pzErr = sqlite3_mprintf("error in tokenizer constructor");
}
}else{ }else{
pConfig->ePattern = sqlite3Fts5TokenizerPattern( pConfig->ePattern = sqlite3Fts5TokenizerPattern(
pMod->x.xCreate, pConfig->pTok pMod->x.xCreate, pConfig->pTok
@ -252539,7 +252537,7 @@ static void fts5SourceIdFunc(
){ ){
assert( nArg==0 ); assert( nArg==0 );
UNUSED_PARAM2(nArg, apUnused); UNUSED_PARAM2(nArg, apUnused);
sqlite3_result_text(pCtx, "fts5: 2024-05-23 13:25:27 96c92aba00c8375bc32fafcdf12429c58bd8aabfcadab6683e35bbb9cdebf19e", -1, SQLITE_TRANSIENT); sqlite3_result_text(pCtx, "fts5: 2024-08-13 09:16:08 c9c2ab54ba1f5f46360f1b4f35d849cd3f080e6fc2b6c60e91b16c63f69a1e33", -1, SQLITE_TRANSIENT);
} }
/* /*
@ -252574,17 +252572,23 @@ static int fts5IntegrityMethod(
assert( pzErr!=0 && *pzErr==0 ); assert( pzErr!=0 && *pzErr==0 );
UNUSED_PARAM(isQuick); UNUSED_PARAM(isQuick);
assert( pTab->p.pConfig->pzErrmsg==0 );
pTab->p.pConfig->pzErrmsg = pzErr;
rc = sqlite3Fts5StorageIntegrity(pTab->pStorage, 0); rc = sqlite3Fts5StorageIntegrity(pTab->pStorage, 0);
if( (rc&0xff)==SQLITE_CORRUPT ){ if( *pzErr==0 && rc!=SQLITE_OK ){
*pzErr = sqlite3_mprintf("malformed inverted index for FTS5 table %s.%s", if( (rc&0xff)==SQLITE_CORRUPT ){
zSchema, zTabname); *pzErr = sqlite3_mprintf("malformed inverted index for FTS5 table %s.%s",
rc = (*pzErr) ? SQLITE_OK : SQLITE_NOMEM; zSchema, zTabname);
}else if( rc!=SQLITE_OK ){ rc = (*pzErr) ? SQLITE_OK : SQLITE_NOMEM;
*pzErr = sqlite3_mprintf("unable to validate the inverted index for" }else{
" FTS5 table %s.%s: %s", *pzErr = sqlite3_mprintf("unable to validate the inverted index for"
zSchema, zTabname, sqlite3_errstr(rc)); " FTS5 table %s.%s: %s",
zSchema, zTabname, sqlite3_errstr(rc));
}
} }
sqlite3Fts5IndexCloseReader(pTab->p.pIndex); sqlite3Fts5IndexCloseReader(pTab->p.pIndex);
pTab->p.pConfig->pzErrmsg = 0;
return rc; return rc;
} }
@ -254018,7 +254022,7 @@ static int fts5AsciiCreate(
int i; int i;
memset(p, 0, sizeof(AsciiTokenizer)); memset(p, 0, sizeof(AsciiTokenizer));
memcpy(p->aTokenChar, aAsciiTokenChar, sizeof(aAsciiTokenChar)); memcpy(p->aTokenChar, aAsciiTokenChar, sizeof(aAsciiTokenChar));
for(i=0; rc==SQLITE_OK && i<nArg; i+=2){ for(i=0; rc==SQLITE_OK && i<nArg-1; i+=2){
const char *zArg = azArg[i+1]; const char *zArg = azArg[i+1];
if( 0==sqlite3_stricmp(azArg[i], "tokenchars") ){ if( 0==sqlite3_stricmp(azArg[i], "tokenchars") ){
fts5AsciiAddExceptions(p, zArg, 1); fts5AsciiAddExceptions(p, zArg, 1);
@ -254029,6 +254033,7 @@ static int fts5AsciiCreate(
rc = SQLITE_ERROR; rc = SQLITE_ERROR;
} }
} }
if( rc==SQLITE_OK && i<nArg ) rc = SQLITE_ERROR;
if( rc!=SQLITE_OK ){ if( rc!=SQLITE_OK ){
fts5AsciiDelete((Fts5Tokenizer*)p); fts5AsciiDelete((Fts5Tokenizer*)p);
p = 0; p = 0;
@ -254320,17 +254325,16 @@ static int fts5UnicodeCreate(
} }
/* Search for a "categories" argument */ /* Search for a "categories" argument */
for(i=0; rc==SQLITE_OK && i<nArg; i+=2){ for(i=0; rc==SQLITE_OK && i<nArg-1; i+=2){
if( 0==sqlite3_stricmp(azArg[i], "categories") ){ if( 0==sqlite3_stricmp(azArg[i], "categories") ){
zCat = azArg[i+1]; zCat = azArg[i+1];
} }
} }
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
rc = unicodeSetCategories(p, zCat); rc = unicodeSetCategories(p, zCat);
} }
for(i=0; rc==SQLITE_OK && i<nArg; i+=2){ for(i=0; rc==SQLITE_OK && i<nArg-1; i+=2){
const char *zArg = azArg[i+1]; const char *zArg = azArg[i+1];
if( 0==sqlite3_stricmp(azArg[i], "remove_diacritics") ){ if( 0==sqlite3_stricmp(azArg[i], "remove_diacritics") ){
if( (zArg[0]!='0' && zArg[0]!='1' && zArg[0]!='2') || zArg[1] ){ if( (zArg[0]!='0' && zArg[0]!='1' && zArg[0]!='2') || zArg[1] ){
@ -254355,6 +254359,7 @@ static int fts5UnicodeCreate(
rc = SQLITE_ERROR; rc = SQLITE_ERROR;
} }
} }
if( i<nArg && rc==SQLITE_OK ) rc = SQLITE_ERROR;
}else{ }else{
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;
@ -255237,7 +255242,7 @@ static int fts5TriCreate(
int i; int i;
pNew->bFold = 1; pNew->bFold = 1;
pNew->iFoldParam = 0; pNew->iFoldParam = 0;
for(i=0; rc==SQLITE_OK && i<nArg; i+=2){ for(i=0; rc==SQLITE_OK && i<nArg-1; i+=2){
const char *zArg = azArg[i+1]; const char *zArg = azArg[i+1];
if( 0==sqlite3_stricmp(azArg[i], "case_sensitive") ){ if( 0==sqlite3_stricmp(azArg[i], "case_sensitive") ){
if( (zArg[0]!='0' && zArg[0]!='1') || zArg[1] ){ if( (zArg[0]!='0' && zArg[0]!='1') || zArg[1] ){
@ -255255,6 +255260,7 @@ static int fts5TriCreate(
rc = SQLITE_ERROR; rc = SQLITE_ERROR;
} }
} }
if( i<nArg && rc==SQLITE_OK ) rc = SQLITE_ERROR;
if( pNew->iFoldParam!=0 && pNew->bFold==0 ){ if( pNew->iFoldParam!=0 && pNew->bFold==0 ){
rc = SQLITE_ERROR; rc = SQLITE_ERROR;

View File

@ -146,9 +146,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()]. ** [sqlite_version()] and [sqlite_source_id()].
*/ */
#define SQLITE_VERSION "3.46.0" #define SQLITE_VERSION "3.46.1"
#define SQLITE_VERSION_NUMBER 3046000 #define SQLITE_VERSION_NUMBER 3046001
#define SQLITE_SOURCE_ID "2024-05-23 13:25:27 96c92aba00c8375bc32fafcdf12429c58bd8aabfcadab6683e35bbb9cdebf19e" #define SQLITE_SOURCE_ID "2024-08-13 09:16:08 c9c2ab54ba1f5f46360f1b4f35d849cd3f080e6fc2b6c60e91b16c63f69a1e33"
/* /*
** CAPI3REF: Run-Time Library Version Numbers ** CAPI3REF: Run-Time Library Version Numbers