| | @@ -16,11 +16,11 @@ |
| 16 | 16 | ** if you want a wrapper to interface SQLite with your choice of programming |
| 17 | 17 | ** language. The code for the "sqlite3" command-line shell is also in a |
| 18 | 18 | ** separate file. This file contains only code for the core SQLite library. |
| 19 | 19 | ** |
| 20 | 20 | ** The content in this amalgamation comes from Fossil check-in |
| 21 | | -** a63e412b6b2939422ecfa99d91fccb7a9c61. |
| 21 | +** 62e11a3a78edf9853b74d6495ccd8ae9ac19. |
| 22 | 22 | */ |
| 23 | 23 | #define SQLITE_CORE 1 |
| 24 | 24 | #define SQLITE_AMALGAMATION 1 |
| 25 | 25 | #ifndef SQLITE_PRIVATE |
| 26 | 26 | # define SQLITE_PRIVATE static |
| | @@ -462,11 +462,11 @@ |
| 462 | 462 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 463 | 463 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 464 | 464 | */ |
| 465 | 465 | #define SQLITE_VERSION "3.47.0" |
| 466 | 466 | #define SQLITE_VERSION_NUMBER 3047000 |
| 467 | | -#define SQLITE_SOURCE_ID "2024-09-17 22:57:08 a63e412b6b2939422ecfa99d91fccb7a9c61e1533bb0db20ff12f3815ef41a2c" |
| 467 | +#define SQLITE_SOURCE_ID "2024-09-21 15:57:06 62e11a3a78edf9853b74d6495ccd8ae9ac1966c7d78eb3682cf2d5885e3740ec" |
| 468 | 468 | |
| 469 | 469 | /* |
| 470 | 470 | ** CAPI3REF: Run-Time Library Version Numbers |
| 471 | 471 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 472 | 472 | ** |
| | @@ -21381,11 +21381,11 @@ |
| 21381 | 21381 | SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8); |
| 21382 | 21382 | SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*); |
| 21383 | 21383 | SQLITE_PRIVATE int sqlite3GetUInt32(const char*, u32*); |
| 21384 | 21384 | SQLITE_PRIVATE int sqlite3Atoi(const char*); |
| 21385 | 21385 | #ifndef SQLITE_OMIT_UTF16 |
| 21386 | | -SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar); |
| 21386 | +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nByte, int nChar); |
| 21387 | 21387 | #endif |
| 21388 | 21388 | SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte); |
| 21389 | 21389 | SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8**); |
| 21390 | 21390 | SQLITE_PRIVATE int sqlite3Utf8ReadLimited(const u8*, int, u32*); |
| 21391 | 21391 | SQLITE_PRIVATE LogEst sqlite3LogEst(u64); |
| | @@ -23840,10 +23840,11 @@ |
| 23840 | 23840 | i64 iKey1; /* First key value passed to hook */ |
| 23841 | 23841 | i64 iKey2; /* Second key value passed to hook */ |
| 23842 | 23842 | Mem *aNew; /* Array of new.* values */ |
| 23843 | 23843 | Table *pTab; /* Schema object being updated */ |
| 23844 | 23844 | Index *pPk; /* PK index if pTab is WITHOUT ROWID */ |
| 23845 | + sqlite3_value **apDflt; /* Array of default values, if required */ |
| 23845 | 23846 | }; |
| 23846 | 23847 | |
| 23847 | 23848 | /* |
| 23848 | 23849 | ** An instance of this object is used to pass an vector of values into |
| 23849 | 23850 | ** OP_VFilter, the xFilter method of a virtual table. The vector is the |
| | @@ -35078,24 +35079,26 @@ |
| 35078 | 35079 | assert( m.z || db->mallocFailed ); |
| 35079 | 35080 | return m.z; |
| 35080 | 35081 | } |
| 35081 | 35082 | |
| 35082 | 35083 | /* |
| 35083 | | -** zIn is a UTF-16 encoded unicode string at least nChar characters long. |
| 35084 | +** zIn is a UTF-16 encoded unicode string at least nByte bytes long. |
| 35084 | 35085 | ** Return the number of bytes in the first nChar unicode characters |
| 35085 | | -** in pZ. nChar must be non-negative. |
| 35086 | +** in pZ. nChar must be non-negative. Surrogate pairs count as a single |
| 35087 | +** character. |
| 35086 | 35088 | */ |
| 35087 | | -SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nChar){ |
| 35089 | +SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *zIn, int nByte, int nChar){ |
| 35088 | 35090 | int c; |
| 35089 | 35091 | unsigned char const *z = zIn; |
| 35092 | + unsigned char const *zEnd = &z[nByte-1]; |
| 35090 | 35093 | int n = 0; |
| 35091 | 35094 | |
| 35092 | 35095 | if( SQLITE_UTF16NATIVE==SQLITE_UTF16LE ) z++; |
| 35093 | | - while( n<nChar ){ |
| 35096 | + while( n<nChar && ALWAYS(z<=zEnd) ){ |
| 35094 | 35097 | c = z[0]; |
| 35095 | 35098 | z += 2; |
| 35096 | | - if( c>=0xd8 && c<0xdc && z[0]>=0xdc && z[0]<0xe0 ) z += 2; |
| 35099 | + if( c>=0xd8 && c<0xdc && z<=zEnd && z[0]>=0xdc && z[0]<0xe0 ) z += 2; |
| 35097 | 35100 | n++; |
| 35098 | 35101 | } |
| 35099 | 35102 | return (int)(z-(unsigned char const *)zIn) |
| 35100 | 35103 | - (SQLITE_UTF16NATIVE==SQLITE_UTF16LE); |
| 35101 | 35104 | } |
| | @@ -84551,11 +84554,12 @@ |
| 84551 | 84554 | if( apVal==0 ){ |
| 84552 | 84555 | rc = SQLITE_NOMEM_BKPT; |
| 84553 | 84556 | goto value_from_function_out; |
| 84554 | 84557 | } |
| 84555 | 84558 | for(i=0; i<nVal; i++){ |
| 84556 | | - rc = sqlite3ValueFromExpr(db, pList->a[i].pExpr, enc, aff, &apVal[i]); |
| 84559 | + rc = sqlite3Stat4ValueFromExpr(pCtx->pParse, pList->a[i].pExpr, aff, |
| 84560 | + &apVal[i]); |
| 84557 | 84561 | if( apVal[i]==0 || rc!=SQLITE_OK ) goto value_from_function_out; |
| 84558 | 84562 | } |
| 84559 | 84563 | } |
| 84560 | 84564 | |
| 84561 | 84565 | pVal = valueNew(db, pCtx); |
| | @@ -90615,10 +90619,17 @@ |
| 90615 | 90619 | for(i=0; i<pCsr->nField; i++){ |
| 90616 | 90620 | sqlite3VdbeMemRelease(&preupdate.aNew[i]); |
| 90617 | 90621 | } |
| 90618 | 90622 | sqlite3DbNNFreeNN(db, preupdate.aNew); |
| 90619 | 90623 | } |
| 90624 | + if( preupdate.apDflt ){ |
| 90625 | + int i; |
| 90626 | + for(i=0; i<pTab->nCol; i++){ |
| 90627 | + sqlite3ValueFree(preupdate.apDflt[i]); |
| 90628 | + } |
| 90629 | + sqlite3DbFree(db, preupdate.apDflt); |
| 90630 | + } |
| 90620 | 90631 | } |
| 90621 | 90632 | #endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ |
| 90622 | 90633 | |
| 90623 | 90634 | /************** End of vdbeaux.c *********************************************/ |
| 90624 | 90635 | /************** Begin file vdbeapi.c *****************************************/ |
| | @@ -92844,11 +92855,34 @@ |
| 92844 | 92855 | |
| 92845 | 92856 | pMem = *ppValue = &p->pUnpacked->aMem[iIdx]; |
| 92846 | 92857 | if( iIdx==p->pTab->iPKey ){ |
| 92847 | 92858 | sqlite3VdbeMemSetInt64(pMem, p->iKey1); |
| 92848 | 92859 | }else if( iIdx>=p->pUnpacked->nField ){ |
| 92849 | | - *ppValue = (sqlite3_value *)columnNullValue(); |
| 92860 | + /* This occurs when the table has been extended using ALTER TABLE |
| 92861 | + ** ADD COLUMN. The value to return is the default value of the column. */ |
| 92862 | + Column *pCol = &p->pTab->aCol[iIdx]; |
| 92863 | + if( pCol->iDflt>0 ){ |
| 92864 | + if( p->apDflt==0 ){ |
| 92865 | + int nByte = sizeof(sqlite3_value*)*p->pTab->nCol; |
| 92866 | + p->apDflt = (sqlite3_value**)sqlite3DbMallocZero(db, nByte); |
| 92867 | + if( p->apDflt==0 ) goto preupdate_old_out; |
| 92868 | + } |
| 92869 | + if( p->apDflt[iIdx]==0 ){ |
| 92870 | + sqlite3_value *pVal = 0; |
| 92871 | + Expr *pDflt; |
| 92872 | + assert( p->pTab!=0 && IsOrdinaryTable(p->pTab) ); |
| 92873 | + pDflt = p->pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr; |
| 92874 | + rc = sqlite3ValueFromExpr(db, pDflt, ENC(db), pCol->affinity, &pVal); |
| 92875 | + if( rc==SQLITE_OK && pVal==0 ){ |
| 92876 | + rc = SQLITE_CORRUPT_BKPT; |
| 92877 | + } |
| 92878 | + p->apDflt[iIdx] = pVal; |
| 92879 | + } |
| 92880 | + *ppValue = p->apDflt[iIdx]; |
| 92881 | + }else{ |
| 92882 | + *ppValue = (sqlite3_value *)columnNullValue(); |
| 92883 | + } |
| 92850 | 92884 | }else if( p->pTab->aCol[iIdx].affinity==SQLITE_AFF_REAL ){ |
| 92851 | 92885 | if( pMem->flags & (MEM_Int|MEM_IntReal) ){ |
| 92852 | 92886 | testcase( pMem->flags & MEM_Int ); |
| 92853 | 92887 | testcase( pMem->flags & MEM_IntReal ); |
| 92854 | 92888 | sqlite3VdbeMemRealify(pMem); |
| | @@ -108153,12 +108187,12 @@ |
| 108153 | 108187 | } |
| 108154 | 108188 | |
| 108155 | 108189 | /* Resolve function names |
| 108156 | 108190 | */ |
| 108157 | 108191 | case TK_FUNCTION: { |
| 108158 | | - ExprList *pList = pExpr->x.pList; /* The argument list */ |
| 108159 | | - int n = pList ? pList->nExpr : 0; /* Number of arguments */ |
| 108192 | + ExprList *pList; /* The argument list */ |
| 108193 | + int n; /* Number of arguments */ |
| 108160 | 108194 | int no_such_func = 0; /* True if no such function exists */ |
| 108161 | 108195 | int wrong_num_args = 0; /* True if wrong number of arguments */ |
| 108162 | 108196 | int is_agg = 0; /* True if is an aggregate function */ |
| 108163 | 108197 | const char *zId; /* The function name. */ |
| 108164 | 108198 | FuncDef *pDef; /* Information about the function */ |
| | @@ -108167,10 +108201,12 @@ |
| 108167 | 108201 | #ifndef SQLITE_OMIT_WINDOWFUNC |
| 108168 | 108202 | Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0); |
| 108169 | 108203 | #endif |
| 108170 | 108204 | assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); |
| 108171 | 108205 | assert( pExpr->pLeft==0 || pExpr->pLeft->op==TK_ORDER ); |
| 108206 | + pList = pExpr->x.pList; |
| 108207 | + n = pList ? pList->nExpr : 0; |
| 108172 | 108208 | zId = pExpr->u.zToken; |
| 108173 | 108209 | pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0); |
| 108174 | 108210 | if( pDef==0 ){ |
| 108175 | 108211 | pDef = sqlite3FindFunction(pParse->db, zId, -2, enc, 0); |
| 108176 | 108212 | if( pDef==0 ){ |
| | @@ -128254,10 +128290,11 @@ |
| 128254 | 128290 | ** 4) The table is a shadow table, the database connection is in |
| 128255 | 128291 | ** defensive mode, and the current sqlite3_prepare() |
| 128256 | 128292 | ** is for a top-level SQL statement. |
| 128257 | 128293 | */ |
| 128258 | 128294 | static int vtabIsReadOnly(Parse *pParse, Table *pTab){ |
| 128295 | + assert( IsVirtual(pTab) ); |
| 128259 | 128296 | if( sqlite3GetVTable(pParse->db, pTab)->pMod->pModule->xUpdate==0 ){ |
| 128260 | 128297 | return 1; |
| 128261 | 128298 | } |
| 128262 | 128299 | |
| 128263 | 128300 | /* Within triggers: |
| | @@ -143399,16 +143436,28 @@ |
| 143399 | 143436 | #endif |
| 143400 | 143437 | *ppStmt = 0; |
| 143401 | 143438 | if( !sqlite3SafetyCheckOk(db)||zSql==0 ){ |
| 143402 | 143439 | return SQLITE_MISUSE_BKPT; |
| 143403 | 143440 | } |
| 143441 | + |
| 143442 | + /* Make sure nBytes is non-negative and correct. It should be the |
| 143443 | + ** number of bytes until the end of the input buffer or until the first |
| 143444 | + ** U+0000 character. If the input nBytes is odd, convert it into |
| 143445 | + ** an even number. If the input nBytes is negative, then the input |
| 143446 | + ** must be terminated by at least one U+0000 character */ |
| 143404 | 143447 | if( nBytes>=0 ){ |
| 143405 | 143448 | int sz; |
| 143406 | 143449 | const char *z = (const char*)zSql; |
| 143407 | 143450 | for(sz=0; sz<nBytes && (z[sz]!=0 || z[sz+1]!=0); sz += 2){} |
| 143408 | 143451 | nBytes = sz; |
| 143452 | + }else{ |
| 143453 | + int sz; |
| 143454 | + const char *z = (const char*)zSql; |
| 143455 | + for(sz=0; z[sz]!=0 || z[sz+1]!=0; sz += 2){} |
| 143456 | + nBytes = sz; |
| 143409 | 143457 | } |
| 143458 | + |
| 143410 | 143459 | sqlite3_mutex_enter(db->mutex); |
| 143411 | 143460 | zSql8 = sqlite3Utf16to8(db, zSql, nBytes, SQLITE_UTF16NATIVE); |
| 143412 | 143461 | if( zSql8 ){ |
| 143413 | 143462 | rc = sqlite3LockAndPrepare(db, zSql8, -1, prepFlags, 0, ppStmt, &zTail8); |
| 143414 | 143463 | } |
| | @@ -143418,11 +143467,11 @@ |
| 143418 | 143467 | ** equivalent pointer into the UTF-16 string by counting the unicode |
| 143419 | 143468 | ** characters between zSql8 and zTail8, and then returning a pointer |
| 143420 | 143469 | ** the same number of characters into the UTF-16 string. |
| 143421 | 143470 | */ |
| 143422 | 143471 | int chars_parsed = sqlite3Utf8CharLen(zSql8, (int)(zTail8-zSql8)); |
| 143423 | | - *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, chars_parsed); |
| 143472 | + *pzTail = (u8 *)zSql + sqlite3Utf16ByteLen(zSql, nBytes, chars_parsed); |
| 143424 | 143473 | } |
| 143425 | 143474 | sqlite3DbFree(db, zSql8); |
| 143426 | 143475 | rc = sqlite3ApiExit(db, rc); |
| 143427 | 143476 | sqlite3_mutex_leave(db->mutex); |
| 143428 | 143477 | return rc; |
| | @@ -157010,10 +157059,11 @@ |
| 157010 | 157059 | assert( sParse.zErrMsg==0 ); |
| 157011 | 157060 | if( !pTab->aCol ){ |
| 157012 | 157061 | Table *pNew = sParse.pNewTable; |
| 157013 | 157062 | Index *pIdx; |
| 157014 | 157063 | pTab->aCol = pNew->aCol; |
| 157064 | + assert( IsOrdinaryTable(pNew) ); |
| 157015 | 157065 | sqlite3ExprListDelete(db, pNew->u.tab.pDfltList); |
| 157016 | 157066 | pTab->nNVCol = pTab->nCol = pNew->nCol; |
| 157017 | 157067 | pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); |
| 157018 | 157068 | pNew->nCol = 0; |
| 157019 | 157069 | pNew->aCol = 0; |
| | @@ -164607,13 +164657,15 @@ |
| 164607 | 164657 | ** Whether or not an error is returned, it is the responsibility of the |
| 164608 | 164658 | ** caller to eventually free p->idxStr if p->needToFreeIdxStr indicates |
| 164609 | 164659 | ** that this is required. |
| 164610 | 164660 | */ |
| 164611 | 164661 | static int vtabBestIndex(Parse *pParse, Table *pTab, sqlite3_index_info *p){ |
| 164612 | | - sqlite3_vtab *pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; |
| 164613 | 164662 | int rc; |
| 164663 | + sqlite3_vtab *pVtab; |
| 164614 | 164664 | |
| 164665 | + assert( IsVirtual(pTab) ); |
| 164666 | + pVtab = sqlite3GetVTable(pParse->db, pTab)->pVtab; |
| 164615 | 164667 | whereTraceIndexInfoInputs(p, pTab); |
| 164616 | 164668 | pParse->db->nSchemaLock++; |
| 164617 | 164669 | rc = pVtab->pModule->xBestIndex(pVtab, p); |
| 164618 | 164670 | pParse->db->nSchemaLock--; |
| 164619 | 164671 | whereTraceIndexInfoOutputs(p, pTab); |
| | @@ -184429,10 +184481,11 @@ |
| 184429 | 184481 | testcase( (1<<(flags&7))==0x04 ); /* READWRITE */ |
| 184430 | 184482 | testcase( (1<<(flags&7))==0x40 ); /* READWRITE | CREATE */ |
| 184431 | 184483 | if( ((1<<(flags&7)) & 0x46)==0 ){ |
| 184432 | 184484 | rc = SQLITE_MISUSE_BKPT; /* IMP: R-18321-05872 */ |
| 184433 | 184485 | }else{ |
| 184486 | + if( zFilename==0 ) zFilename = ":memory:"; |
| 184434 | 184487 | rc = sqlite3ParseUri(zVfs, zFilename, &flags, &db->pVfs, &zOpen, &zErrMsg); |
| 184435 | 184488 | } |
| 184436 | 184489 | if( rc!=SQLITE_OK ){ |
| 184437 | 184490 | if( rc==SQLITE_NOMEM ) sqlite3OomFault(db); |
| 184438 | 184491 | sqlite3ErrorWithMsg(db, rc, zErrMsg ? "%s" : 0, zErrMsg); |
| | @@ -227932,20 +227985,23 @@ |
| 227932 | 227985 | /* Figure out how large an allocation is required */ |
| 227933 | 227986 | nByte = sizeof(SessionChange); |
| 227934 | 227987 | for(i=0; i<(pTab->nCol-pTab->bRowid); i++){ |
| 227935 | 227988 | sqlite3_value *p = 0; |
| 227936 | 227989 | if( op!=SQLITE_INSERT ){ |
| 227937 | | - TESTONLY(int trc = ) pSession->hook.xOld(pSession->hook.pCtx, i, &p); |
| 227938 | | - assert( trc==SQLITE_OK ); |
| 227990 | + /* This may fail if the column has a non-NULL default and was added |
| 227991 | + ** using ALTER TABLE ADD COLUMN after this record was created. */ |
| 227992 | + rc = pSession->hook.xOld(pSession->hook.pCtx, i, &p); |
| 227939 | 227993 | }else if( pTab->abPK[i] ){ |
| 227940 | 227994 | TESTONLY(int trc = ) pSession->hook.xNew(pSession->hook.pCtx, i, &p); |
| 227941 | 227995 | assert( trc==SQLITE_OK ); |
| 227942 | 227996 | } |
| 227943 | 227997 | |
| 227944 | | - /* This may fail if SQLite value p contains a utf-16 string that must |
| 227945 | | - ** be converted to utf-8 and an OOM error occurs while doing so. */ |
| 227946 | | - rc = sessionSerializeValue(0, p, &nByte); |
| 227998 | + if( rc==SQLITE_OK ){ |
| 227999 | + /* This may fail if SQLite value p contains a utf-16 string that must |
| 228000 | + ** be converted to utf-8 and an OOM error occurs while doing so. */ |
| 228001 | + rc = sessionSerializeValue(0, p, &nByte); |
| 228002 | + } |
| 227947 | 228003 | if( rc!=SQLITE_OK ) goto error_out; |
| 227948 | 228004 | } |
| 227949 | 228005 | if( pTab->bRowid ){ |
| 227950 | 228006 | nByte += 9; /* Size of rowid field - an integer */ |
| 227951 | 228007 | } |
| | @@ -231835,10 +231891,13 @@ |
| 231835 | 231891 | if( op==SQLITE_INSERT || (op==SQLITE_DELETE && pGrp->bPatch==0) ){ |
| 231836 | 231892 | /* Append the missing default column values to the record. */ |
| 231837 | 231893 | sessionAppendBlob(pOut, aRec, nRec, &rc); |
| 231838 | 231894 | if( rc==SQLITE_OK && pTab->pDfltStmt==0 ){ |
| 231839 | 231895 | rc = sessionPrepareDfltStmt(pGrp->db, pTab, &pTab->pDfltStmt); |
| 231896 | + if( rc==SQLITE_OK && SQLITE_ROW!=sqlite3_step(pTab->pDfltStmt) ){ |
| 231897 | + rc = sqlite3_errcode(pGrp->db); |
| 231898 | + } |
| 231840 | 231899 | } |
| 231841 | 231900 | for(ii=nCol; rc==SQLITE_OK && ii<pTab->nCol; ii++){ |
| 231842 | 231901 | int eType = sqlite3_column_type(pTab->pDfltStmt, ii); |
| 231843 | 231902 | sessionAppendByte(pOut, eType, &rc); |
| 231844 | 231903 | switch( eType ){ |
| | @@ -231851,10 +231910,11 @@ |
| 231851 | 231910 | double rVal = sqlite3_column_int64(pTab->pDfltStmt, ii); |
| 231852 | 231911 | memcpy(&iVal, &rVal, sizeof(i64)); |
| 231853 | 231912 | } |
| 231854 | 231913 | if( SQLITE_OK==sessionBufferGrow(pOut, 8, &rc) ){ |
| 231855 | 231914 | sessionPutI64(&pOut->aBuf[pOut->nBuf], iVal); |
| 231915 | + pOut->nBuf += 8; |
| 231856 | 231916 | } |
| 231857 | 231917 | break; |
| 231858 | 231918 | } |
| 231859 | 231919 | |
| 231860 | 231920 | case SQLITE_BLOB: |
| | @@ -254665,11 +254725,11 @@ |
| 254665 | 254725 | int nArg, /* Number of args */ |
| 254666 | 254726 | sqlite3_value **apUnused /* Function arguments */ |
| 254667 | 254727 | ){ |
| 254668 | 254728 | assert( nArg==0 ); |
| 254669 | 254729 | UNUSED_PARAM2(nArg, apUnused); |
| 254670 | | - sqlite3_result_text(pCtx, "fts5: 2024-09-17 22:57:08 a63e412b6b2939422ecfa99d91fccb7a9c61e1533bb0db20ff12f3815ef41a2c", -1, SQLITE_TRANSIENT); |
| 254730 | + sqlite3_result_text(pCtx, "fts5: 2024-09-21 15:57:06 62e11a3a78edf9853b74d6495ccd8ae9ac1966c7d78eb3682cf2d5885e3740ec", -1, SQLITE_TRANSIENT); |
| 254671 | 254731 | } |
| 254672 | 254732 | |
| 254673 | 254733 | /* |
| 254674 | 254734 | ** Implementation of fts5_locale(LOCALE, TEXT) function. |
| 254675 | 254735 | ** |
| 254676 | 254736 | |