| | @@ -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 | | -** 121f4d97f9a855131859d342bc2ade5f8c34 with changes in files: |
| 21 | +** 20acd630b91609725794ce84f9eda01d5f3c with changes in files: |
| 22 | 22 | ** |
| 23 | 23 | ** |
| 24 | 24 | */ |
| 25 | 25 | #ifndef SQLITE_AMALGAMATION |
| 26 | 26 | #define SQLITE_CORE 1 |
| | @@ -465,11 +465,11 @@ |
| 465 | 465 | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], |
| 466 | 466 | ** [sqlite_version()] and [sqlite_source_id()]. |
| 467 | 467 | */ |
| 468 | 468 | #define SQLITE_VERSION "3.50.0" |
| 469 | 469 | #define SQLITE_VERSION_NUMBER 3050000 |
| 470 | | -#define SQLITE_SOURCE_ID "2025-03-27 23:29:25 121f4d97f9a855131859d342bc2ade5f8c34ba7732029ae156d02cec7cb6dd85" |
| 470 | +#define SQLITE_SOURCE_ID "2025-04-10 10:18:07 20acd630b91609725794ce84f9eda01d5f3c898407f0948264830851d25ccaa6" |
| 471 | 471 | |
| 472 | 472 | /* |
| 473 | 473 | ** CAPI3REF: Run-Time Library Version Numbers |
| 474 | 474 | ** KEYWORDS: sqlite3_version sqlite3_sourceid |
| 475 | 475 | ** |
| | @@ -35446,11 +35446,11 @@ |
| 35446 | 35446 | unsigned char const *z = zIn; |
| 35447 | 35447 | unsigned char const *zEnd = &z[nByte-1]; |
| 35448 | 35448 | int n = 0; |
| 35449 | 35449 | |
| 35450 | 35450 | if( SQLITE_UTF16NATIVE==SQLITE_UTF16LE ) z++; |
| 35451 | | - while( n<nChar && ALWAYS(z<=zEnd) ){ |
| 35451 | + while( n<nChar && z<=zEnd ){ |
| 35452 | 35452 | c = z[0]; |
| 35453 | 35453 | z += 2; |
| 35454 | 35454 | if( c>=0xd8 && c<0xdc && z<=zEnd && z[0]>=0xdc && z[0]<0xe0 ) z += 2; |
| 35455 | 35455 | n++; |
| 35456 | 35456 | } |
| | @@ -84036,11 +84036,11 @@ |
| 84036 | 84036 | ** many different strings can be converted into the same int or real. |
| 84037 | 84037 | ** If a table contains a numeric value and an index is based on the |
| 84038 | 84038 | ** corresponding string value, then it is important that the string be |
| 84039 | 84039 | ** derived from the numeric value, not the other way around, to ensure |
| 84040 | 84040 | ** that the index and table are consistent. See ticket |
| 84041 | | -** https://www.sqlite.org/src/info/343634942dd54ab (2018-01-31) for |
| 84041 | +** https://sqlite.org/src/info/343634942dd54ab (2018-01-31) for |
| 84042 | 84042 | ** an example. |
| 84043 | 84043 | ** |
| 84044 | 84044 | ** This routine looks at pMem to verify that if it has both a numeric |
| 84045 | 84045 | ** representation and a string representation then the string rep has |
| 84046 | 84046 | ** been derived from the numeric and not the other way around. It returns |
| | @@ -93324,11 +93324,11 @@ |
| 93324 | 93324 | unsigned char enc |
| 93325 | 93325 | ){ |
| 93326 | 93326 | assert( xDel!=SQLITE_DYNAMIC ); |
| 93327 | 93327 | if( enc!=SQLITE_UTF8 ){ |
| 93328 | 93328 | if( enc==SQLITE_UTF16 ) enc = SQLITE_UTF16NATIVE; |
| 93329 | | - nData &= ~(u16)1; |
| 93329 | + nData &= ~(u64)1; |
| 93330 | 93330 | } |
| 93331 | 93331 | return bindText(pStmt, i, zData, nData, xDel, enc); |
| 93332 | 93332 | } |
| 93333 | 93333 | #ifndef SQLITE_OMIT_UTF16 |
| 93334 | 93334 | SQLITE_API int sqlite3_bind_text16( |
| | @@ -125476,11 +125476,11 @@ |
| 125476 | 125476 | if( !isDupColumn(pIdx, pIdx->nKeyCol, pPk, i) ){ |
| 125477 | 125477 | testcase( hasColumn(pIdx->aiColumn, pIdx->nKeyCol, pPk->aiColumn[i]) ); |
| 125478 | 125478 | pIdx->aiColumn[j] = pPk->aiColumn[i]; |
| 125479 | 125479 | pIdx->azColl[j] = pPk->azColl[i]; |
| 125480 | 125480 | if( pPk->aSortOrder[i] ){ |
| 125481 | | - /* See ticket https://www.sqlite.org/src/info/bba7b69f9849b5bf */ |
| 125481 | + /* See ticket https://sqlite.org/src/info/bba7b69f9849b5bf */ |
| 125482 | 125482 | pIdx->bAscKeyBug = 1; |
| 125483 | 125483 | } |
| 125484 | 125484 | j++; |
| 125485 | 125485 | } |
| 125486 | 125486 | } |
| | @@ -126853,11 +126853,11 @@ |
| 126853 | 126853 | /* This OP_SeekEnd opcode makes index insert for a REINDEX go much |
| 126854 | 126854 | ** faster by avoiding unnecessary seeks. But the optimization does |
| 126855 | 126855 | ** not work for UNIQUE constraint indexes on WITHOUT ROWID tables |
| 126856 | 126856 | ** with DESC primary keys, since those indexes have there keys in |
| 126857 | 126857 | ** a different order from the main table. |
| 126858 | | - ** See ticket: https://www.sqlite.org/src/info/bba7b69f9849b5bf |
| 126858 | + ** See ticket: https://sqlite.org/src/info/bba7b69f9849b5bf |
| 126859 | 126859 | */ |
| 126860 | 126860 | sqlite3VdbeAddOp1(v, OP_SeekEnd, iIdx); |
| 126861 | 126861 | } |
| 126862 | 126862 | sqlite3VdbeAddOp2(v, OP_IdxInsert, iIdx, regRecord); |
| 126863 | 126863 | sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); |
| | @@ -136942,11 +136942,11 @@ |
| 136942 | 136942 | ** OE_Update guarantees that only a single row will change, so it |
| 136943 | 136943 | ** must happen before OE_Replace. Technically, OE_Abort and OE_Rollback |
| 136944 | 136944 | ** could happen in any order, but they are grouped up front for |
| 136945 | 136945 | ** convenience. |
| 136946 | 136946 | ** |
| 136947 | | - ** 2018-08-14: Ticket https://www.sqlite.org/src/info/908f001483982c43 |
| 136947 | + ** 2018-08-14: Ticket https://sqlite.org/src/info/908f001483982c43 |
| 136948 | 136948 | ** The order of constraints used to have OE_Update as (2) and OE_Abort |
| 136949 | 136949 | ** and so forth as (1). But apparently PostgreSQL checks the OE_Update |
| 136950 | 136950 | ** constraint before any others, so it had to be moved. |
| 136951 | 136951 | ** |
| 136952 | 136952 | ** Constraint checking code is generated in this order: |
| | @@ -150434,11 +150434,11 @@ |
| 150434 | 150434 | ** |
| 150435 | 150435 | ** This transformation is necessary because the multiSelectOrderBy() routine |
| 150436 | 150436 | ** above that generates the code for a compound SELECT with an ORDER BY clause |
| 150437 | 150437 | ** uses a merge algorithm that requires the same collating sequence on the |
| 150438 | 150438 | ** result columns as on the ORDER BY clause. See ticket |
| 150439 | | -** http://www.sqlite.org/src/info/6709574d2a |
| 150439 | +** http://sqlite.org/src/info/6709574d2a |
| 150440 | 150440 | ** |
| 150441 | 150441 | ** This transformation is only needed for EXCEPT, INTERSECT, and UNION. |
| 150442 | 150442 | ** The UNION ALL operator works fine with multiSelectOrderBy() even when |
| 150443 | 150443 | ** there are COLLATE terms in the ORDER BY. |
| 150444 | 150444 | */ |
| | @@ -157236,11 +157236,11 @@ |
| 157236 | 157236 | iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); |
| 157237 | 157237 | if( iDb<0 ) goto build_vacuum_end; |
| 157238 | 157238 | #else |
| 157239 | 157239 | /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments |
| 157240 | 157240 | ** to VACUUM are silently ignored. This is a back-out of a bug fix that |
| 157241 | | - ** occurred on 2016-08-19 (https://www.sqlite.org/src/info/083f9e6270). |
| 157241 | + ** occurred on 2016-08-19 (https://sqlite.org/src/info/083f9e6270). |
| 157242 | 157242 | ** The buggy behavior is required for binary compatibility with some |
| 157243 | 157243 | ** legacy applications. */ |
| 157244 | 157244 | iDb = sqlite3FindDb(pParse->db, pNm); |
| 157245 | 157245 | if( iDb<0 ) iDb = 0; |
| 157246 | 157246 | #endif |
| | @@ -161953,11 +161953,11 @@ |
| 161953 | 161953 | ** ON or USING clause of a LEFT JOIN, and terms that are usable as |
| 161954 | 161954 | ** indices. |
| 161955 | 161955 | ** |
| 161956 | 161956 | ** This optimization also only applies if the (x1 OR x2 OR ...) term |
| 161957 | 161957 | ** is not contained in the ON clause of a LEFT JOIN. |
| 161958 | | - ** See ticket http://www.sqlite.org/src/info/f2369304e4 |
| 161958 | + ** See ticket http://sqlite.org/src/info/f2369304e4 |
| 161959 | 161959 | ** |
| 161960 | 161960 | ** 2022-02-04: Do not push down slices of a row-value comparison. |
| 161961 | 161961 | ** In other words, "w" or "y" may not be a slice of a vector. Otherwise, |
| 161962 | 161962 | ** the initialization of the right-hand operand of the vector comparison |
| 161963 | 161963 | ** might not occur, or might occur only in an OR branch that is not |
| | @@ -199281,11 +199281,11 @@ |
| 199281 | 199281 | UNUSED_PARAMETER(nVal); |
| 199282 | 199282 | |
| 199283 | 199283 | fts3tokResetCursor(pCsr); |
| 199284 | 199284 | if( idxNum==1 ){ |
| 199285 | 199285 | const char *zByte = (const char *)sqlite3_value_text(apVal[0]); |
| 199286 | | - int nByte = sqlite3_value_bytes(apVal[0]); |
| 199286 | + sqlite3_int64 nByte = sqlite3_value_bytes(apVal[0]); |
| 199287 | 199287 | pCsr->zInput = sqlite3_malloc64(nByte+1); |
| 199288 | 199288 | if( pCsr->zInput==0 ){ |
| 199289 | 199289 | rc = SQLITE_NOMEM; |
| 199290 | 199290 | }else{ |
| 199291 | 199291 | if( nByte>0 ) memcpy(pCsr->zInput, zByte, nByte); |
| | @@ -207828,12 +207828,12 @@ |
| 207828 | 207828 | ** with JSON-5 extensions is accepted as input. |
| 207829 | 207829 | ** |
| 207830 | 207830 | ** Beginning with version 3.45.0 (circa 2024-01-01), these routines also |
| 207831 | 207831 | ** accept BLOB values that have JSON encoded using a binary representation |
| 207832 | 207832 | ** called "JSONB". The name JSONB comes from PostgreSQL, however the on-disk |
| 207833 | | -** format SQLite JSONB is completely different and incompatible with |
| 207834 | | -** PostgreSQL JSONB. |
| 207833 | +** format for SQLite-JSONB is completely different and incompatible with |
| 207834 | +** PostgreSQL-JSONB. |
| 207835 | 207835 | ** |
| 207836 | 207836 | ** Decoding and interpreting JSONB is still O(N) where N is the size of |
| 207837 | 207837 | ** the input, the same as text JSON. However, the constant of proportionality |
| 207838 | 207838 | ** for JSONB is much smaller due to faster parsing. The size of each |
| 207839 | 207839 | ** element in JSONB is encoded in its header, so there is no need to search |
| | @@ -207886,21 +207886,21 @@ |
| 207886 | 207886 | ** 14 4 byte (0-4294967295) 5 |
| 207887 | 207887 | ** 15 8 byte (0-1.8e19) 9 |
| 207888 | 207888 | ** |
| 207889 | 207889 | ** The payload size need not be expressed in its minimal form. For example, |
| 207890 | 207890 | ** if the payload size is 10, the size can be expressed in any of 5 different |
| 207891 | | -** ways: (1) (X>>4)==10, (2) (X>>4)==12 following by on 0x0a byte, |
| 207891 | +** ways: (1) (X>>4)==10, (2) (X>>4)==12 following by one 0x0a byte, |
| 207892 | 207892 | ** (3) (X>>4)==13 followed by 0x00 and 0x0a, (4) (X>>4)==14 followed by |
| 207893 | 207893 | ** 0x00 0x00 0x00 0x0a, or (5) (X>>4)==15 followed by 7 bytes of 0x00 and |
| 207894 | 207894 | ** a single byte of 0x0a. The shorter forms are preferred, of course, but |
| 207895 | 207895 | ** sometimes when generating JSONB, the payload size is not known in advance |
| 207896 | 207896 | ** and it is convenient to reserve sufficient header space to cover the |
| 207897 | 207897 | ** largest possible payload size and then come back later and patch up |
| 207898 | 207898 | ** the size when it becomes known, resulting in a non-minimal encoding. |
| 207899 | 207899 | ** |
| 207900 | 207900 | ** The value (X>>4)==15 is not actually used in the current implementation |
| 207901 | | -** (as SQLite is currently unable handle BLOBs larger than about 2GB) |
| 207901 | +** (as SQLite is currently unable to handle BLOBs larger than about 2GB) |
| 207902 | 207902 | ** but is included in the design to allow for future enhancements. |
| 207903 | 207903 | ** |
| 207904 | 207904 | ** The payload follows the header. NULL, TRUE, and FALSE have no payload and |
| 207905 | 207905 | ** their payload size must always be zero. The payload for INT, INT5, |
| 207906 | 207906 | ** FLOAT, FLOAT5, TEXT, TEXTJ, TEXT5, and TEXTROW is text. Note that the |
| | @@ -208970,11 +208970,11 @@ |
| 208970 | 208970 | if( jsonBlobExpand(pParse, pParse->nBlob+szPayload+9) ) return; |
| 208971 | 208971 | jsonBlobAppendNode(pParse, eType, szPayload, aPayload); |
| 208972 | 208972 | } |
| 208973 | 208973 | |
| 208974 | 208974 | |
| 208975 | | -/* Append an node type byte together with the payload size and |
| 208975 | +/* Append a node type byte together with the payload size and |
| 208976 | 208976 | ** possibly also the payload. |
| 208977 | 208977 | ** |
| 208978 | 208978 | ** If aPayload is not NULL, then it is a pointer to the payload which |
| 208979 | 208979 | ** is also appended. If aPayload is NULL, the pParse->aBlob[] array |
| 208980 | 208980 | ** is resized (if necessary) so that it is big enough to hold the |
| | @@ -210304,10 +210304,86 @@ |
| 210304 | 210304 | (void)jsonbPayloadSize(pParse, iRoot, &sz); |
| 210305 | 210305 | pParse->nBlob = nBlob; |
| 210306 | 210306 | sz += pParse->delta; |
| 210307 | 210307 | pParse->delta += jsonBlobChangePayloadSize(pParse, iRoot, sz); |
| 210308 | 210308 | } |
| 210309 | + |
| 210310 | +/* |
| 210311 | +** If the JSONB at aIns[0..nIns-1] can be expanded (by denormalizing the |
| 210312 | +** size field) by d bytes, then write the expansion into aOut[] and |
| 210313 | +** return true. In this way, an overwrite happens without changing the |
| 210314 | +** size of the JSONB, which reduces memcpy() operations and also make it |
| 210315 | +** faster and easier to update the B-Tree entry that contains the JSONB |
| 210316 | +** in the database. |
| 210317 | +** |
| 210318 | +** If the expansion of aIns[] by d bytes cannot be (easily) accomplished |
| 210319 | +** then return false. |
| 210320 | +** |
| 210321 | +** The d parameter is guaranteed to be between 1 and 8. |
| 210322 | +** |
| 210323 | +** This routine is an optimization. A correct answer is obtained if it |
| 210324 | +** always leaves the output unchanged and returns false. |
| 210325 | +*/ |
| 210326 | +static int jsonBlobOverwrite( |
| 210327 | + u8 *aOut, /* Overwrite here */ |
| 210328 | + const u8 *aIns, /* New content */ |
| 210329 | + u32 nIns, /* Bytes of new content */ |
| 210330 | + u32 d /* Need to expand new content by this much */ |
| 210331 | +){ |
| 210332 | + u32 szPayload; /* Bytes of payload */ |
| 210333 | + u32 i; /* New header size, after expansion & a loop counter */ |
| 210334 | + u8 szHdr; /* Size of header before expansion */ |
| 210335 | + |
| 210336 | + /* Lookup table for finding the upper 4 bits of the first byte of the |
| 210337 | + ** expanded aIns[], based on the size of the expanded aIns[] header: |
| 210338 | + ** |
| 210339 | + ** 2 3 4 5 6 7 8 9 */ |
| 210340 | + static const u8 aType[] = { 0xc0, 0xd0, 0, 0xe0, 0, 0, 0, 0xf0 }; |
| 210341 | + |
| 210342 | + if( (aIns[0]&0x0f)<=2 ) return 0; /* Cannot enlarge NULL, true, false */ |
| 210343 | + switch( aIns[0]>>4 ){ |
| 210344 | + default: { /* aIns[] header size 1 */ |
| 210345 | + if( ((1<<d)&0x116)==0 ) return 0; /* d must be 1, 2, 4, or 8 */ |
| 210346 | + i = d + 1; /* New hdr sz: 2, 3, 5, or 9 */ |
| 210347 | + szHdr = 1; |
| 210348 | + break; |
| 210349 | + } |
| 210350 | + case 12: { /* aIns[] header size is 2 */ |
| 210351 | + if( ((1<<d)&0x8a)==0) return 0; /* d must be 1, 3, or 7 */ |
| 210352 | + i = d + 2; /* New hdr sz: 2, 5, or 9 */ |
| 210353 | + szHdr = 2; |
| 210354 | + break; |
| 210355 | + } |
| 210356 | + case 13: { /* aIns[] header size is 3 */ |
| 210357 | + if( d!=2 && d!=6 ) return 0; /* d must be 2 or 6 */ |
| 210358 | + i = d + 3; /* New hdr sz: 5 or 9 */ |
| 210359 | + szHdr = 3; |
| 210360 | + break; |
| 210361 | + } |
| 210362 | + case 14: { /* aIns[] header size is 5 */ |
| 210363 | + if( d!=4 ) return 0; /* d must be 4 */ |
| 210364 | + i = 9; /* New hdr sz: 9 */ |
| 210365 | + szHdr = 5; |
| 210366 | + break; |
| 210367 | + } |
| 210368 | + case 15: { /* aIns[] header size is 9 */ |
| 210369 | + return 0; /* No solution */ |
| 210370 | + } |
| 210371 | + } |
| 210372 | + assert( i>=2 && i<=9 && aType[i-2]!=0 ); |
| 210373 | + aOut[0] = (aIns[0] & 0x0f) | aType[i-2]; |
| 210374 | + memcpy(&aOut[i], &aIns[szHdr], nIns-szHdr); |
| 210375 | + szPayload = nIns - szHdr; |
| 210376 | + while( 1/*edit-by-break*/ ){ |
| 210377 | + i--; |
| 210378 | + aOut[i] = szPayload & 0xff; |
| 210379 | + if( i==1 ) break; |
| 210380 | + szPayload >>= 8; |
| 210381 | + } |
| 210382 | + assert( (szPayload>>8)==0 ); |
| 210383 | + return 1; |
| 210384 | +} |
| 210309 | 210385 | |
| 210310 | 210386 | /* |
| 210311 | 210387 | ** Modify the JSONB blob at pParse->aBlob by removing nDel bytes of |
| 210312 | 210388 | ** content beginning at iDel, and replacing them with nIns bytes of |
| 210313 | 210389 | ** content given by aIns. |
| | @@ -210326,10 +210402,15 @@ |
| 210326 | 210402 | u32 nDel, /* Number of bytes to remove */ |
| 210327 | 210403 | const u8 *aIns, /* Content to insert */ |
| 210328 | 210404 | u32 nIns /* Bytes of content to insert */ |
| 210329 | 210405 | ){ |
| 210330 | 210406 | i64 d = (i64)nIns - (i64)nDel; |
| 210407 | + if( d<0 && d>=(-8) && aIns!=0 |
| 210408 | + && jsonBlobOverwrite(&pParse->aBlob[iDel], aIns, nIns, (int)-d) |
| 210409 | + ){ |
| 210410 | + return; |
| 210411 | + } |
| 210331 | 210412 | if( d!=0 ){ |
| 210332 | 210413 | if( pParse->nBlob + d > pParse->nBlobAlloc ){ |
| 210333 | 210414 | jsonBlobExpand(pParse, pParse->nBlob+d); |
| 210334 | 210415 | if( pParse->oom ) return; |
| 210335 | 210416 | } |
| | @@ -210337,11 +210418,13 @@ |
| 210337 | 210418 | &pParse->aBlob[iDel+nDel], |
| 210338 | 210419 | pParse->nBlob - (iDel+nDel)); |
| 210339 | 210420 | pParse->nBlob += d; |
| 210340 | 210421 | pParse->delta += d; |
| 210341 | 210422 | } |
| 210342 | | - if( nIns && aIns ) memcpy(&pParse->aBlob[iDel], aIns, nIns); |
| 210423 | + if( nIns && aIns ){ |
| 210424 | + memcpy(&pParse->aBlob[iDel], aIns, nIns); |
| 210425 | + } |
| 210343 | 210426 | } |
| 210344 | 210427 | |
| 210345 | 210428 | /* |
| 210346 | 210429 | ** Return the number of escaped newlines to be ignored. |
| 210347 | 210430 | ** An escaped newline is a one of the following byte sequences: |
| | @@ -211100,11 +211183,11 @@ |
| 211100 | 211183 | } |
| 211101 | 211184 | return 0; |
| 211102 | 211185 | } |
| 211103 | 211186 | |
| 211104 | 211187 | /* argv[0] is a BLOB that seems likely to be a JSONB. Subsequent |
| 211105 | | -** arguments come in parse where each pair contains a JSON path and |
| 211188 | +** arguments come in pairs where each pair contains a JSON path and |
| 211106 | 211189 | ** content to insert or set at that patch. Do the updates |
| 211107 | 211190 | ** and return the result. |
| 211108 | 211191 | ** |
| 211109 | 211192 | ** The specific operation is determined by eEdit, which can be one |
| 211110 | 211193 | ** of JEDIT_INS, JEDIT_REPL, or JEDIT_SET. |
| | @@ -230169,11 +230252,13 @@ |
| 230169 | 230252 | char *zExpr = 0; |
| 230170 | 230253 | sqlite3 *db = pSession->db; |
| 230171 | 230254 | SessionTable *pTo; /* Table zTbl */ |
| 230172 | 230255 | |
| 230173 | 230256 | /* Locate and if necessary initialize the target table object */ |
| 230257 | + pSession->bAutoAttach++; |
| 230174 | 230258 | rc = sessionFindTable(pSession, zTbl, &pTo); |
| 230259 | + pSession->bAutoAttach--; |
| 230175 | 230260 | if( pTo==0 ) goto diff_out; |
| 230176 | 230261 | if( sessionInitTable(pSession, pTo, pSession->db, pSession->zDb) ){ |
| 230177 | 230262 | rc = pSession->rc; |
| 230178 | 230263 | goto diff_out; |
| 230179 | 230264 | } |
| | @@ -257088,11 +257173,11 @@ |
| 257088 | 257173 | int nArg, /* Number of args */ |
| 257089 | 257174 | sqlite3_value **apUnused /* Function arguments */ |
| 257090 | 257175 | ){ |
| 257091 | 257176 | assert( nArg==0 ); |
| 257092 | 257177 | UNUSED_PARAM2(nArg, apUnused); |
| 257093 | | - sqlite3_result_text(pCtx, "fts5: 2025-03-27 23:29:25 121f4d97f9a855131859d342bc2ade5f8c34ba7732029ae156d02cec7cb6dd85", -1, SQLITE_TRANSIENT); |
| 257178 | + sqlite3_result_text(pCtx, "fts5: 2025-04-10 10:18:07 20acd630b91609725794ce84f9eda01d5f3c898407f0948264830851d25ccaa6", -1, SQLITE_TRANSIENT); |
| 257094 | 257179 | } |
| 257095 | 257180 | |
| 257096 | 257181 | /* |
| 257097 | 257182 | ** Implementation of fts5_locale(LOCALE, TEXT) function. |
| 257098 | 257183 | ** |
| | @@ -261151,11 +261236,10 @@ |
| 261151 | 261236 | } |
| 261152 | 261237 | iTbl++; |
| 261153 | 261238 | } |
| 261154 | 261239 | aAscii[0] = 0; /* 0x00 is never a token character */ |
| 261155 | 261240 | } |
| 261156 | | - |
| 261157 | 261241 | |
| 261158 | 261242 | /* |
| 261159 | 261243 | ** 2015 May 30 |
| 261160 | 261244 | ** |
| 261161 | 261245 | ** The author disclaims copyright to this source code. In place of |
| 261162 | 261246 | |