Fossil SCM

Update the built-in SQLite to the latest 3.43.0 beta for testing.

drh 2023-08-18 14:15 trunk
Commit b5aa9f8ab41a5f7f6ef70ebc0264b17abbd8a61beded3b2016a091189131b8f5
+28 -5
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -20580,20 +20580,22 @@
2058020580
" Options:",
2058120581
" --append Use the appendvfs",
2058220582
" --async Write to FILE without journal and fsync()",
2058320583
#endif
2058420584
".bail on|off Stop after hitting an error. Default OFF",
20585
- ".binary on|off Turn binary output on or off. Default OFF",
2058620585
#ifndef SQLITE_SHELL_FIDDLE
2058720586
".cd DIRECTORY Change the working directory to DIRECTORY",
2058820587
#endif
2058920588
".changes on|off Show number of rows changed by SQL",
2059020589
#ifndef SQLITE_SHELL_FIDDLE
2059120590
".check GLOB Fail if output since .testcase does not match",
2059220591
".clone NEWDB Clone data into NEWDB from the existing database",
2059320592
#endif
2059420593
".connection [close] [#] Open or close an auxiliary database connection",
20594
+#if defined(_WIN32) || defined(WIN32)
20595
+ ".crnl on|off Turn translate \\n to \\r\\n. Default ON",
20596
+#endif
2059520597
".databases List names and files of attached databases",
2059620598
".dbconfig ?op? ?val? List or change sqlite3_db_config() options",
2059720599
#if SQLITE_SHELL_HAVE_RECOVER
2059820600
".dbinfo ?DB? Show status information about the database",
2059920601
#endif
@@ -23945,18 +23947,21 @@
2394523947
raw_printf(stderr, "Usage: .bail on|off\n");
2394623948
rc = 1;
2394723949
}
2394823950
}else
2394923951
23952
+ /* Undocumented. Legacy only. See "crnl" below */
2395023953
if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
2395123954
if( nArg==2 ){
2395223955
if( booleanValue(azArg[1]) ){
2395323956
setBinaryMode(p->out, 1);
2395423957
}else{
2395523958
setTextMode(p->out, 1);
2395623959
}
2395723960
}else{
23961
+ raw_printf(stderr, "The \".binary\" command is deprecated."
23962
+ " Use \".crnl\" instead.\n");
2395823963
raw_printf(stderr, "Usage: .binary on|off\n");
2395923964
rc = 1;
2396023965
}
2396123966
}else
2396223967
@@ -24079,10 +24084,26 @@
2407924084
}else{
2408024085
raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
2408124086
rc = 1;
2408224087
}
2408324088
}else
24089
+
24090
+ if( c=='c' && n==4 && cli_strncmp(azArg[0], "crnl", n)==0 ){
24091
+ if( nArg==2 ){
24092
+ if( booleanValue(azArg[1]) ){
24093
+ setTextMode(p->out, 1);
24094
+ }else{
24095
+ setBinaryMode(p->out, 1);
24096
+ }
24097
+ }else{
24098
+#if !defined(_WIN32) && !defined(WIN32)
24099
+ raw_printf(stderr, "The \".crnl\" is a no-op on non-Windows machines.\n");
24100
+#endif
24101
+ raw_printf(stderr, "Usage: .crnl on|off\n");
24102
+ rc = 1;
24103
+ }
24104
+ }else
2408424105
2408524106
if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
2408624107
char **azName = 0;
2408724108
int nName = 0;
2408824109
sqlite3_stmt *pStmt;
@@ -27064,10 +27085,11 @@
2706427085
}
2706527086
}else
2706627087
#endif /* SQLITE_USER_AUTHENTICATION */
2706727088
2706827089
if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
27090
+ char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
2706927091
utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
2707027092
sqlite3_libversion(), sqlite3_sourceid());
2707127093
#if SQLITE_HAVE_ZLIB
2707227094
utf8_printf(p->out, "zlib version %s\n", zlibVersion());
2707327095
#endif
@@ -27074,15 +27096,15 @@
2707427096
#define CTIMEOPT_VAL_(opt) #opt
2707527097
#define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
2707627098
#if defined(__clang__) && defined(__clang_major__)
2707727099
utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
2707827100
CTIMEOPT_VAL(__clang_minor__) "."
27079
- CTIMEOPT_VAL(__clang_patchlevel__) "\n");
27101
+ CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
2708027102
#elif defined(_MSC_VER)
27081
- utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
27103
+ utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
2708227104
#elif defined(__GNUC__) && defined(__VERSION__)
27083
- utf8_printf(p->out, "gcc-" __VERSION__ "\n");
27105
+ utf8_printf(p->out, "gcc-" __VERSION__ " (%s)\n", zPtrSz);
2708427106
#endif
2708527107
}else
2708627108
2708727109
if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
2708827110
const char *zDbName = nArg==2 ? azArg[1] : "main";
@@ -28252,11 +28274,12 @@
2825228274
*/
2825328275
ShellSetFlag(&data, SHFLG_Backslash);
2825428276
}else if( cli_strcmp(z,"-bail")==0 ){
2825528277
/* No-op. The bail_on_error flag should already be set. */
2825628278
}else if( cli_strcmp(z,"-version")==0 ){
28257
- printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
28279
+ printf("%s %s (%d-bit)\n", sqlite3_libversion(), sqlite3_sourceid(),
28280
+ 8*(int)sizeof(char*));
2825828281
return 0;
2825928282
}else if( cli_strcmp(z,"-interactive")==0 ){
2826028283
stdin_is_interactive = 1;
2826128284
}else if( cli_strcmp(z,"-batch")==0 ){
2826228285
stdin_is_interactive = 0;
2826328286
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -20580,20 +20580,22 @@
20580 " Options:",
20581 " --append Use the appendvfs",
20582 " --async Write to FILE without journal and fsync()",
20583 #endif
20584 ".bail on|off Stop after hitting an error. Default OFF",
20585 ".binary on|off Turn binary output on or off. Default OFF",
20586 #ifndef SQLITE_SHELL_FIDDLE
20587 ".cd DIRECTORY Change the working directory to DIRECTORY",
20588 #endif
20589 ".changes on|off Show number of rows changed by SQL",
20590 #ifndef SQLITE_SHELL_FIDDLE
20591 ".check GLOB Fail if output since .testcase does not match",
20592 ".clone NEWDB Clone data into NEWDB from the existing database",
20593 #endif
20594 ".connection [close] [#] Open or close an auxiliary database connection",
 
 
 
20595 ".databases List names and files of attached databases",
20596 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options",
20597 #if SQLITE_SHELL_HAVE_RECOVER
20598 ".dbinfo ?DB? Show status information about the database",
20599 #endif
@@ -23945,18 +23947,21 @@
23945 raw_printf(stderr, "Usage: .bail on|off\n");
23946 rc = 1;
23947 }
23948 }else
23949
 
23950 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
23951 if( nArg==2 ){
23952 if( booleanValue(azArg[1]) ){
23953 setBinaryMode(p->out, 1);
23954 }else{
23955 setTextMode(p->out, 1);
23956 }
23957 }else{
 
 
23958 raw_printf(stderr, "Usage: .binary on|off\n");
23959 rc = 1;
23960 }
23961 }else
23962
@@ -24079,10 +24084,26 @@
24079 }else{
24080 raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
24081 rc = 1;
24082 }
24083 }else
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24084
24085 if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
24086 char **azName = 0;
24087 int nName = 0;
24088 sqlite3_stmt *pStmt;
@@ -27064,10 +27085,11 @@
27064 }
27065 }else
27066 #endif /* SQLITE_USER_AUTHENTICATION */
27067
27068 if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
 
27069 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
27070 sqlite3_libversion(), sqlite3_sourceid());
27071 #if SQLITE_HAVE_ZLIB
27072 utf8_printf(p->out, "zlib version %s\n", zlibVersion());
27073 #endif
@@ -27074,15 +27096,15 @@
27074 #define CTIMEOPT_VAL_(opt) #opt
27075 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
27076 #if defined(__clang__) && defined(__clang_major__)
27077 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
27078 CTIMEOPT_VAL(__clang_minor__) "."
27079 CTIMEOPT_VAL(__clang_patchlevel__) "\n");
27080 #elif defined(_MSC_VER)
27081 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) "\n");
27082 #elif defined(__GNUC__) && defined(__VERSION__)
27083 utf8_printf(p->out, "gcc-" __VERSION__ "\n");
27084 #endif
27085 }else
27086
27087 if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
27088 const char *zDbName = nArg==2 ? azArg[1] : "main";
@@ -28252,11 +28274,12 @@
28252 */
28253 ShellSetFlag(&data, SHFLG_Backslash);
28254 }else if( cli_strcmp(z,"-bail")==0 ){
28255 /* No-op. The bail_on_error flag should already be set. */
28256 }else if( cli_strcmp(z,"-version")==0 ){
28257 printf("%s %s\n", sqlite3_libversion(), sqlite3_sourceid());
 
28258 return 0;
28259 }else if( cli_strcmp(z,"-interactive")==0 ){
28260 stdin_is_interactive = 1;
28261 }else if( cli_strcmp(z,"-batch")==0 ){
28262 stdin_is_interactive = 0;
28263
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -20580,20 +20580,22 @@
20580 " Options:",
20581 " --append Use the appendvfs",
20582 " --async Write to FILE without journal and fsync()",
20583 #endif
20584 ".bail on|off Stop after hitting an error. Default OFF",
 
20585 #ifndef SQLITE_SHELL_FIDDLE
20586 ".cd DIRECTORY Change the working directory to DIRECTORY",
20587 #endif
20588 ".changes on|off Show number of rows changed by SQL",
20589 #ifndef SQLITE_SHELL_FIDDLE
20590 ".check GLOB Fail if output since .testcase does not match",
20591 ".clone NEWDB Clone data into NEWDB from the existing database",
20592 #endif
20593 ".connection [close] [#] Open or close an auxiliary database connection",
20594 #if defined(_WIN32) || defined(WIN32)
20595 ".crnl on|off Turn translate \\n to \\r\\n. Default ON",
20596 #endif
20597 ".databases List names and files of attached databases",
20598 ".dbconfig ?op? ?val? List or change sqlite3_db_config() options",
20599 #if SQLITE_SHELL_HAVE_RECOVER
20600 ".dbinfo ?DB? Show status information about the database",
20601 #endif
@@ -23945,18 +23947,21 @@
23947 raw_printf(stderr, "Usage: .bail on|off\n");
23948 rc = 1;
23949 }
23950 }else
23951
23952 /* Undocumented. Legacy only. See "crnl" below */
23953 if( c=='b' && n>=3 && cli_strncmp(azArg[0], "binary", n)==0 ){
23954 if( nArg==2 ){
23955 if( booleanValue(azArg[1]) ){
23956 setBinaryMode(p->out, 1);
23957 }else{
23958 setTextMode(p->out, 1);
23959 }
23960 }else{
23961 raw_printf(stderr, "The \".binary\" command is deprecated."
23962 " Use \".crnl\" instead.\n");
23963 raw_printf(stderr, "Usage: .binary on|off\n");
23964 rc = 1;
23965 }
23966 }else
23967
@@ -24079,10 +24084,26 @@
24084 }else{
24085 raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n");
24086 rc = 1;
24087 }
24088 }else
24089
24090 if( c=='c' && n==4 && cli_strncmp(azArg[0], "crnl", n)==0 ){
24091 if( nArg==2 ){
24092 if( booleanValue(azArg[1]) ){
24093 setTextMode(p->out, 1);
24094 }else{
24095 setBinaryMode(p->out, 1);
24096 }
24097 }else{
24098 #if !defined(_WIN32) && !defined(WIN32)
24099 raw_printf(stderr, "The \".crnl\" is a no-op on non-Windows machines.\n");
24100 #endif
24101 raw_printf(stderr, "Usage: .crnl on|off\n");
24102 rc = 1;
24103 }
24104 }else
24105
24106 if( c=='d' && n>1 && cli_strncmp(azArg[0], "databases", n)==0 ){
24107 char **azName = 0;
24108 int nName = 0;
24109 sqlite3_stmt *pStmt;
@@ -27064,10 +27085,11 @@
27085 }
27086 }else
27087 #endif /* SQLITE_USER_AUTHENTICATION */
27088
27089 if( c=='v' && cli_strncmp(azArg[0], "version", n)==0 ){
27090 char *zPtrSz = sizeof(void*)==8 ? "64-bit" : "32-bit";
27091 utf8_printf(p->out, "SQLite %s %s\n" /*extra-version-info*/,
27092 sqlite3_libversion(), sqlite3_sourceid());
27093 #if SQLITE_HAVE_ZLIB
27094 utf8_printf(p->out, "zlib version %s\n", zlibVersion());
27095 #endif
@@ -27074,15 +27096,15 @@
27096 #define CTIMEOPT_VAL_(opt) #opt
27097 #define CTIMEOPT_VAL(opt) CTIMEOPT_VAL_(opt)
27098 #if defined(__clang__) && defined(__clang_major__)
27099 utf8_printf(p->out, "clang-" CTIMEOPT_VAL(__clang_major__) "."
27100 CTIMEOPT_VAL(__clang_minor__) "."
27101 CTIMEOPT_VAL(__clang_patchlevel__) " (%s)\n", zPtrSz);
27102 #elif defined(_MSC_VER)
27103 utf8_printf(p->out, "msvc-" CTIMEOPT_VAL(_MSC_VER) " (%s)\n", zPtrSz);
27104 #elif defined(__GNUC__) && defined(__VERSION__)
27105 utf8_printf(p->out, "gcc-" __VERSION__ " (%s)\n", zPtrSz);
27106 #endif
27107 }else
27108
27109 if( c=='v' && cli_strncmp(azArg[0], "vfsinfo", n)==0 ){
27110 const char *zDbName = nArg==2 ? azArg[1] : "main";
@@ -28252,11 +28274,12 @@
28274 */
28275 ShellSetFlag(&data, SHFLG_Backslash);
28276 }else if( cli_strcmp(z,"-bail")==0 ){
28277 /* No-op. The bail_on_error flag should already be set. */
28278 }else if( cli_strcmp(z,"-version")==0 ){
28279 printf("%s %s (%d-bit)\n", sqlite3_libversion(), sqlite3_sourceid(),
28280 8*(int)sizeof(char*));
28281 return 0;
28282 }else if( cli_strcmp(z,"-interactive")==0 ){
28283 stdin_is_interactive = 1;
28284 }else if( cli_strcmp(z,"-batch")==0 ){
28285 stdin_is_interactive = 0;
28286
+70 -22
--- extsrc/sqlite3.c
+++ extsrc/sqlite3.c
@@ -16,11 +16,11 @@
1616
** if you want a wrapper to interface SQLite with your choice of programming
1717
** language. The code for the "sqlite3" command-line shell is also in a
1818
** separate file. This file contains only code for the core SQLite library.
1919
**
2020
** The content in this amalgamation comes from Fossil check-in
21
-** bc0693c4633f545f09dbee702e25354504b.
21
+** c7eeb055bfb0e5a4467d8a45fa53d84bb8a.
2222
*/
2323
#define SQLITE_CORE 1
2424
#define SQLITE_AMALGAMATION 1
2525
#ifndef SQLITE_PRIVATE
2626
# define SQLITE_PRIVATE static
@@ -459,11 +459,11 @@
459459
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
460460
** [sqlite_version()] and [sqlite_source_id()].
461461
*/
462462
#define SQLITE_VERSION "3.43.0"
463463
#define SQLITE_VERSION_NUMBER 3043000
464
-#define SQLITE_SOURCE_ID "2023-08-11 22:40:06 3bc0693c4633f545f09dbee702e25354504b20836373a068447e6c61cb2ebd79"
464
+#define SQLITE_SOURCE_ID "2023-08-18 12:15:44 ec7eeb055bfb0e5a4467d8a45fa53d84bb8ae80ca0474b687e2783e971648008"
465465
466466
/*
467467
** CAPI3REF: Run-Time Library Version Numbers
468468
** KEYWORDS: sqlite3_version sqlite3_sourceid
469469
**
@@ -13346,12 +13346,12 @@
1334613346
** extra disk space, as no extra entries are added to the FTS index.
1334713347
** On the other hand, it may require more CPU cycles to run MATCH queries,
1334813348
** as separate queries of the FTS index are required for each synonym.
1334913349
**
1335013350
** When using methods (2) or (3), it is important that the tokenizer only
13351
-** provide synonyms when tokenizing document text (method (2)) or query
13352
-** text (method (3)), not both. Doing so will not cause any errors, but is
13351
+** provide synonyms when tokenizing document text (method (3)) or query
13352
+** text (method (2)), not both. Doing so will not cause any errors, but is
1335313353
** inefficient.
1335413354
*/
1335513355
typedef struct Fts5Tokenizer Fts5Tokenizer;
1335613356
typedef struct fts5_tokenizer fts5_tokenizer;
1335713357
struct fts5_tokenizer {
@@ -34768,11 +34768,15 @@
3476834768
while( e<=-10 ){ e+=10; r *= 1.0e-10L; }
3476934769
while( e<=-1 ){ e+=1; r *= 1.0e-01L; }
3477034770
}
3477134771
assert( r>=0.0 );
3477234772
if( r>+1.7976931348623157081452742373e+308L ){
34773
+#ifdef INFINITY
3477334774
*pResult = +INFINITY;
34775
+#else
34776
+ *pResult = 1.0e308*10.0;
34777
+#endif
3477434778
}else{
3477534779
*pResult = (double)r;
3477634780
}
3477734781
}else{
3477834782
double rr[2];
@@ -50534,10 +50538,11 @@
5053450538
static char zChars[] =
5053550539
"abcdefghijklmnopqrstuvwxyz"
5053650540
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
5053750541
"0123456789";
5053850542
size_t i, j;
50543
+ DWORD pid;
5053950544
int nPre = sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX);
5054050545
int nMax, nBuf, nDir, nLen;
5054150546
char *zBuf;
5054250547
5054350548
/* It's odd to simulate an io-error here, but really this is just
@@ -50746,11 +50751,14 @@
5074650751
5074750752
sqlite3_snprintf(nBuf-16-nLen, zBuf+nLen, SQLITE_TEMP_FILE_PREFIX);
5074850753
5074950754
j = sqlite3Strlen30(zBuf);
5075050755
sqlite3_randomness(15, &zBuf[j]);
50756
+ pid = osGetCurrentProcessId();
5075150757
for(i=0; i<15; i++, j++){
50758
+ zBuf[j] += pid & 0xff;
50759
+ pid >>= 8;
5075250760
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
5075350761
}
5075450762
zBuf[j] = 0;
5075550763
zBuf[j+1] = 0;
5075650764
*pzBuf = zBuf;
@@ -64488,10 +64496,12 @@
6448864496
const char *zWalName; /* Name of WAL file */
6448964497
u32 nCkpt; /* Checkpoint sequence counter in the wal-header */
6449064498
#ifdef SQLITE_USE_SEH
6449164499
u32 lockMask; /* Mask of locks held */
6449264500
void *pFree; /* Pointer to sqlite3_free() if exception thrown */
64501
+ u32 *pWiValue; /* Value to write into apWiData[iWiPg] */
64502
+ int iWiPg; /* Write pWiValue into apWiData[iWiPg] */
6449364503
int iSysErrno; /* System error code following exception */
6449464504
#endif
6449564505
#ifdef SQLITE_DEBUG
6449664506
int nSehTry; /* Number of nested SEH_TRY{} blocks */
6449764507
u8 lockError; /* True if a locking error has occurred */
@@ -64659,15 +64669,28 @@
6465964669
** be freed. In the second case, pPtr must be the registered pointer.
6466064670
*/
6466164671
#define SEH_FREE_ON_ERROR(X,Y) \
6466264672
assert( (X==0 || Y==0) && pWal->pFree==X ); pWal->pFree = Y
6466364673
64674
+/*
64675
+** There are two ways to use this macro. To arrange for pWal->apWiData[iPg]
64676
+** to be set to pValue if an exception is thrown:
64677
+**
64678
+** SEH_SET_ON_ERROR(iPg, pValue);
64679
+**
64680
+** and to cancel the same:
64681
+**
64682
+** SEH_SET_ON_ERROR(0, 0);
64683
+*/
64684
+#define SEH_SET_ON_ERROR(X,Y) pWal->iWiPg = X; pWal->pWiValue = Y
64685
+
6466464686
#else
6466564687
# define SEH_TRY VVA_ONLY(pWal->nSehTry++);
6466664688
# define SEH_EXCEPT(X) VVA_ONLY(pWal->nSehTry--); assert( pWal->nSehTry==0 );
6466764689
# define SEH_INJECT_FAULT assert( pWal->nSehTry>0 );
6466864690
# define SEH_FREE_ON_ERROR(X,Y)
64691
+# define SEH_SET_ON_ERROR(X,Y)
6466964692
#endif /* ifdef SQLITE_USE_SEH */
6467064693
6467164694
6467264695
/*
6467364696
** Obtain a pointer to the iPage'th page of the wal-index. The wal-index
@@ -65424,10 +65447,11 @@
6542465447
u32 iFirst = 1 + (iPg==0?0:HASHTABLE_NPAGE_ONE+(iPg-1)*HASHTABLE_NPAGE);
6542565448
u32 nHdr, nHdr32;
6542665449
rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare);
6542765450
assert( aShare!=0 || rc!=SQLITE_OK );
6542865451
if( aShare==0 ) break;
65452
+ SEH_SET_ON_ERROR(iPg, aShare);
6542965453
pWal->apWiData[iPg] = aPrivate;
6543065454
6543165455
for(iFrame=iFirst; iFrame<=iLast; iFrame++){
6543265456
i64 iOffset = walFrameOffset(iFrame, szPage);
6543365457
u32 pgno; /* Database page number for frame */
@@ -65451,10 +65475,11 @@
6545165475
aFrameCksum[0] = pWal->hdr.aFrameCksum[0];
6545265476
aFrameCksum[1] = pWal->hdr.aFrameCksum[1];
6545365477
}
6545465478
}
6545565479
pWal->apWiData[iPg] = aShare;
65480
+ SEH_SET_ON_ERROR(0,0);
6545665481
nHdr = (iPg==0 ? WALINDEX_HDR_SIZE : 0);
6545765482
nHdr32 = nHdr / sizeof(u32);
6545865483
#ifndef SQLITE_SAFER_WALINDEX_RECOVERY
6545965484
/* Memcpy() should work fine here, on all reasonable implementations.
6546065485
** Technically, memcpy() might change the destination to some
@@ -66344,11 +66369,13 @@
6634466369
** held locks are assumed to be transient locks that would have been
6634566370
** released had the exception not been thrown and are dropped.
6634666371
**
6634766372
** 2) Frees the pointer at Wal.pFree, if any, using sqlite3_free().
6634866373
**
66349
-** 3) Returns SQLITE_IOERR.
66374
+** 3) Set pWal->apWiData[pWal->iWiPg] to pWal->pWiValue if not NULL
66375
+**
66376
+** 4) Returns SQLITE_IOERR.
6635066377
*/
6635166378
static int walHandleException(Wal *pWal){
6635266379
if( pWal->exclusiveMode==0 ){
6635366380
static const int S = 1;
6635466381
static const int E = (1<<SQLITE_SHM_NLOCK);
@@ -66363,10 +66390,14 @@
6636366390
if( (E<<ii) & mUnlock ) walUnlockExclusive(pWal, ii, 1);
6636466391
}
6636566392
}
6636666393
sqlite3_free(pWal->pFree);
6636766394
pWal->pFree = 0;
66395
+ if( pWal->pWiValue ){
66396
+ pWal->apWiData[pWal->iWiPg] = pWal->pWiValue;
66397
+ pWal->pWiValue = 0;
66398
+ }
6636866399
return SQLITE_IOERR_IN_PAGE;
6636966400
}
6637066401
6637166402
/*
6637266403
** Assert that the Wal.lockMask mask, which indicates the locks held
@@ -67120,11 +67151,12 @@
6712067151
i64 iDbOff; /* Offset of db file entry */
6712167152
i64 iWalOff; /* Offset of wal file entry */
6712267153
6712367154
rc = walHashGet(pWal, walFramePage(i), &sLoc);
6712467155
if( rc!=SQLITE_OK ) break;
67125
- pgno = sLoc.aPgno[i-sLoc.iZero];
67156
+ assert( i - sLoc.iZero - 1 >=0 );
67157
+ pgno = sLoc.aPgno[i-sLoc.iZero-1];
6712667158
iDbOff = (i64)(pgno-1) * szPage;
6712767159
6712867160
if( iDbOff+szPage<=szDb ){
6712967161
iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE;
6713067162
rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff);
@@ -91009,11 +91041,11 @@
9100991041
*/
9101091042
SQLITE_API int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){
9101191043
Vdbe *v = (Vdbe*)pStmt;
9101291044
int rc;
9101391045
sqlite3_mutex_enter(v->db->mutex);
91014
- if( v->explain==eMode ){
91046
+ if( ((int)v->explain)==eMode ){
9101591047
rc = SQLITE_OK;
9101691048
}else if( eMode<0 || eMode>2 ){
9101791049
rc = SQLITE_ERROR;
9101891050
}else if( (v->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){
9101991051
rc = SQLITE_ERROR;
@@ -128754,23 +128786,28 @@
128754128786
** Re-register the built-in LIKE functions. The caseSensitive
128755128787
** parameter determines whether or not the LIKE operator is case
128756128788
** sensitive.
128757128789
*/
128758128790
SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
128791
+ FuncDef *pDef;
128759128792
struct compareInfo *pInfo;
128760128793
int flags;
128794
+ int nArg;
128761128795
if( caseSensitive ){
128762128796
pInfo = (struct compareInfo*)&likeInfoAlt;
128763128797
flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE;
128764128798
}else{
128765128799
pInfo = (struct compareInfo*)&likeInfoNorm;
128766128800
flags = SQLITE_FUNC_LIKE;
128767128801
}
128768
- sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0);
128769
- sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0);
128770
- sqlite3FindFunction(db, "like", 2, SQLITE_UTF8, 0)->funcFlags |= flags;
128771
- sqlite3FindFunction(db, "like", 3, SQLITE_UTF8, 0)->funcFlags |= flags;
128802
+ for(nArg=2; nArg<=3; nArg++){
128803
+ sqlite3CreateFunc(db, "like", nArg, SQLITE_UTF8, pInfo, likeFunc,
128804
+ 0, 0, 0, 0, 0);
128805
+ pDef = sqlite3FindFunction(db, "like", nArg, SQLITE_UTF8, 0);
128806
+ pDef->funcFlags |= flags;
128807
+ pDef->funcFlags &= ~SQLITE_FUNC_UNSAFE;
128808
+ }
128772128809
}
128773128810
128774128811
/*
128775128812
** pExpr points to an expression which implements a function. If
128776128813
** it is appropriate to apply the LIKE optimization to that function
@@ -134435,10 +134472,12 @@
134435134472
const char *(*db_name)(sqlite3*,int);
134436134473
/* Version 3.40.0 and later */
134437134474
int (*value_encoding)(sqlite3_value*);
134438134475
/* Version 3.41.0 and later */
134439134476
int (*is_interrupted)(sqlite3*);
134477
+ /* Version 3.43.0 and later */
134478
+ int (*stmt_explain)(sqlite3_stmt*,int);
134440134479
};
134441134480
134442134481
/*
134443134482
** This is the function signature used for all extension entry points. It
134444134483
** is also defined in the file "loadext.c".
@@ -134763,10 +134802,12 @@
134763134802
#define sqlite3_db_name sqlite3_api->db_name
134764134803
/* Version 3.40.0 and later */
134765134804
#define sqlite3_value_encoding sqlite3_api->value_encoding
134766134805
/* Version 3.41.0 and later */
134767134806
#define sqlite3_is_interrupted sqlite3_api->is_interrupted
134807
+/* Version 3.43.0 and later */
134808
+#define sqlite3_stmt_explain sqlite3_api->stmt_explain
134768134809
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
134769134810
134770134811
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
134771134812
/* This case when the file really is being compiled as a loadable
134772134813
** extension */
@@ -135279,11 +135320,13 @@
135279135320
#endif
135280135321
sqlite3_db_name,
135281135322
/* Version 3.40.0 and later */
135282135323
sqlite3_value_encoding,
135283135324
/* Version 3.41.0 and later */
135284
- sqlite3_is_interrupted
135325
+ sqlite3_is_interrupted,
135326
+ /* Version 3.43.0 and later */
135327
+ sqlite3_stmt_explain
135285135328
};
135286135329
135287135330
/* True if x is the directory separator character
135288135331
*/
135289135332
#if SQLITE_OS_WIN
@@ -151690,13 +151733,13 @@
151690151733
if( aXRef[i]>=0 ){
151691151734
pList = sqlite3ExprListAppend(pParse, pList,
151692151735
sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0)
151693151736
);
151694151737
}else{
151695
- Expr *pRow = exprRowColumn(pParse, i);
151696
- if( pRow ) pRow->op2 = OPFLAG_NOCHNG;
151697
- pList = sqlite3ExprListAppend(pParse, pList, pRow);
151738
+ Expr *pRowExpr = exprRowColumn(pParse, i);
151739
+ if( pRowExpr ) pRowExpr->op2 = OPFLAG_NOCHNG;
151740
+ pList = sqlite3ExprListAppend(pParse, pList, pRowExpr);
151698151741
}
151699151742
}
151700151743
151701151744
updateFromSelect(pParse, ephemTab, pPk, pList, pSrc, pWhere, 0, 0);
151702151745
sqlite3ExprListDelete(db, pList);
@@ -151977,11 +152020,11 @@
151977152020
sCol[0].pLeft = &sCol[1];
151978152021
sCol[1].iColumn = pIdx->aiColumn[ii];
151979152022
pExpr = &sCol[0];
151980152023
}
151981152024
for(jj=0; jj<nn; jj++){
151982
- if( sqlite3ExprCompare(pParse,pTarget->a[jj].pExpr,pExpr,iCursor)<2 ){
152025
+ if( sqlite3ExprCompare(0,pTarget->a[jj].pExpr,pExpr,iCursor)<2 ){
151983152026
break; /* Column ii of the index matches column jj of target */
151984152027
}
151985152028
}
151986152029
if( jj>=nn ){
151987152030
/* The target contains no match for column jj of the index */
@@ -226230,12 +226273,12 @@
226230226273
** extra disk space, as no extra entries are added to the FTS index.
226231226274
** On the other hand, it may require more CPU cycles to run MATCH queries,
226232226275
** as separate queries of the FTS index are required for each synonym.
226233226276
**
226234226277
** When using methods (2) or (3), it is important that the tokenizer only
226235
-** provide synonyms when tokenizing document text (method (2)) or query
226236
-** text (method (3)), not both. Doing so will not cause any errors, but is
226278
+** provide synonyms when tokenizing document text (method (3)) or query
226279
+** text (method (2)), not both. Doing so will not cause any errors, but is
226237226280
** inefficient.
226238226281
*/
226239226282
typedef struct Fts5Tokenizer Fts5Tokenizer;
226240226283
typedef struct fts5_tokenizer fts5_tokenizer;
226241226284
struct fts5_tokenizer {
@@ -233429,10 +233472,12 @@
233429233472
233430233473
if( zRet ) zRet = fts5PrintfAppend(zRet, "}");
233431233474
if( zRet==0 ) return 0;
233432233475
}
233433233476
233477
+ }else if( pExpr->eType==0 ){
233478
+ zRet = sqlite3_mprintf("{}");
233434233479
}else{
233435233480
char const *zOp = 0;
233436233481
int i;
233437233482
switch( pExpr->eType ){
233438233483
case FTS5_AND: zOp = "AND"; break;
@@ -242379,11 +242424,11 @@
242379242424
iTermOff = szLeaf;
242380242425
}
242381242426
fts5DecodeRowidList(&rc, &s, &a[4], iTermOff-4);
242382242427
242383242428
iOff = iTermOff;
242384
- while( iOff<szLeaf ){
242429
+ while( iOff<szLeaf && rc==SQLITE_OK ){
242385242430
int nAppend;
242386242431
242387242432
/* Read the term data for the next term*/
242388242433
iOff += fts5GetVarint32(&a[iOff], nAppend);
242389242434
term.n = nKeep;
@@ -242399,12 +242444,15 @@
242399242444
iPgidxOff += fts5GetVarint32(&a[iPgidxOff], nIncr);
242400242445
iTermOff += nIncr;
242401242446
}else{
242402242447
iTermOff = szLeaf;
242403242448
}
242404
-
242405
- fts5DecodeRowidList(&rc, &s, &a[iOff], iTermOff-iOff);
242449
+ if( iTermOff>szLeaf ){
242450
+ rc = FTS5_CORRUPT;
242451
+ }else{
242452
+ fts5DecodeRowidList(&rc, &s, &a[iOff], iTermOff-iOff);
242453
+ }
242406242454
iOff = iTermOff;
242407242455
if( iOff<szLeaf ){
242408242456
iOff += fts5GetVarint32(&a[iOff], nKeep);
242409242457
}
242410242458
}
@@ -245683,11 +245731,11 @@
245683245731
int nArg, /* Number of args */
245684245732
sqlite3_value **apUnused /* Function arguments */
245685245733
){
245686245734
assert( nArg==0 );
245687245735
UNUSED_PARAM2(nArg, apUnused);
245688
- sqlite3_result_text(pCtx, "fts5: 2023-08-11 22:40:06 3bc0693c4633f545f09dbee702e25354504b20836373a068447e6c61cb2ebd79", -1, SQLITE_TRANSIENT);
245736
+ sqlite3_result_text(pCtx, "fts5: 2023-08-17 17:48:20 3c06709335eb4b98e3a684e3ebbae69eeb6a21b452bce29159c82bb632d6a042", -1, SQLITE_TRANSIENT);
245689245737
}
245690245738
245691245739
/*
245692245740
** Return true if zName is the extension on one of the shadow tables used
245693245741
** by this module.
245694245742
--- extsrc/sqlite3.c
+++ extsrc/sqlite3.c
@@ -16,11 +16,11 @@
16 ** if you want a wrapper to interface SQLite with your choice of programming
17 ** language. The code for the "sqlite3" command-line shell is also in a
18 ** separate file. This file contains only code for the core SQLite library.
19 **
20 ** The content in this amalgamation comes from Fossil check-in
21 ** bc0693c4633f545f09dbee702e25354504b.
22 */
23 #define SQLITE_CORE 1
24 #define SQLITE_AMALGAMATION 1
25 #ifndef SQLITE_PRIVATE
26 # define SQLITE_PRIVATE static
@@ -459,11 +459,11 @@
459 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
460 ** [sqlite_version()] and [sqlite_source_id()].
461 */
462 #define SQLITE_VERSION "3.43.0"
463 #define SQLITE_VERSION_NUMBER 3043000
464 #define SQLITE_SOURCE_ID "2023-08-11 22:40:06 3bc0693c4633f545f09dbee702e25354504b20836373a068447e6c61cb2ebd79"
465
466 /*
467 ** CAPI3REF: Run-Time Library Version Numbers
468 ** KEYWORDS: sqlite3_version sqlite3_sourceid
469 **
@@ -13346,12 +13346,12 @@
13346 ** extra disk space, as no extra entries are added to the FTS index.
13347 ** On the other hand, it may require more CPU cycles to run MATCH queries,
13348 ** as separate queries of the FTS index are required for each synonym.
13349 **
13350 ** When using methods (2) or (3), it is important that the tokenizer only
13351 ** provide synonyms when tokenizing document text (method (2)) or query
13352 ** text (method (3)), not both. Doing so will not cause any errors, but is
13353 ** inefficient.
13354 */
13355 typedef struct Fts5Tokenizer Fts5Tokenizer;
13356 typedef struct fts5_tokenizer fts5_tokenizer;
13357 struct fts5_tokenizer {
@@ -34768,11 +34768,15 @@
34768 while( e<=-10 ){ e+=10; r *= 1.0e-10L; }
34769 while( e<=-1 ){ e+=1; r *= 1.0e-01L; }
34770 }
34771 assert( r>=0.0 );
34772 if( r>+1.7976931348623157081452742373e+308L ){
 
34773 *pResult = +INFINITY;
 
 
 
34774 }else{
34775 *pResult = (double)r;
34776 }
34777 }else{
34778 double rr[2];
@@ -50534,10 +50538,11 @@
50534 static char zChars[] =
50535 "abcdefghijklmnopqrstuvwxyz"
50536 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
50537 "0123456789";
50538 size_t i, j;
 
50539 int nPre = sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX);
50540 int nMax, nBuf, nDir, nLen;
50541 char *zBuf;
50542
50543 /* It's odd to simulate an io-error here, but really this is just
@@ -50746,11 +50751,14 @@
50746
50747 sqlite3_snprintf(nBuf-16-nLen, zBuf+nLen, SQLITE_TEMP_FILE_PREFIX);
50748
50749 j = sqlite3Strlen30(zBuf);
50750 sqlite3_randomness(15, &zBuf[j]);
 
50751 for(i=0; i<15; i++, j++){
 
 
50752 zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
50753 }
50754 zBuf[j] = 0;
50755 zBuf[j+1] = 0;
50756 *pzBuf = zBuf;
@@ -64488,10 +64496,12 @@
64488 const char *zWalName; /* Name of WAL file */
64489 u32 nCkpt; /* Checkpoint sequence counter in the wal-header */
64490 #ifdef SQLITE_USE_SEH
64491 u32 lockMask; /* Mask of locks held */
64492 void *pFree; /* Pointer to sqlite3_free() if exception thrown */
 
 
64493 int iSysErrno; /* System error code following exception */
64494 #endif
64495 #ifdef SQLITE_DEBUG
64496 int nSehTry; /* Number of nested SEH_TRY{} blocks */
64497 u8 lockError; /* True if a locking error has occurred */
@@ -64659,15 +64669,28 @@
64659 ** be freed. In the second case, pPtr must be the registered pointer.
64660 */
64661 #define SEH_FREE_ON_ERROR(X,Y) \
64662 assert( (X==0 || Y==0) && pWal->pFree==X ); pWal->pFree = Y
64663
 
 
 
 
 
 
 
 
 
 
 
 
64664 #else
64665 # define SEH_TRY VVA_ONLY(pWal->nSehTry++);
64666 # define SEH_EXCEPT(X) VVA_ONLY(pWal->nSehTry--); assert( pWal->nSehTry==0 );
64667 # define SEH_INJECT_FAULT assert( pWal->nSehTry>0 );
64668 # define SEH_FREE_ON_ERROR(X,Y)
 
64669 #endif /* ifdef SQLITE_USE_SEH */
64670
64671
64672 /*
64673 ** Obtain a pointer to the iPage'th page of the wal-index. The wal-index
@@ -65424,10 +65447,11 @@
65424 u32 iFirst = 1 + (iPg==0?0:HASHTABLE_NPAGE_ONE+(iPg-1)*HASHTABLE_NPAGE);
65425 u32 nHdr, nHdr32;
65426 rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare);
65427 assert( aShare!=0 || rc!=SQLITE_OK );
65428 if( aShare==0 ) break;
 
65429 pWal->apWiData[iPg] = aPrivate;
65430
65431 for(iFrame=iFirst; iFrame<=iLast; iFrame++){
65432 i64 iOffset = walFrameOffset(iFrame, szPage);
65433 u32 pgno; /* Database page number for frame */
@@ -65451,10 +65475,11 @@
65451 aFrameCksum[0] = pWal->hdr.aFrameCksum[0];
65452 aFrameCksum[1] = pWal->hdr.aFrameCksum[1];
65453 }
65454 }
65455 pWal->apWiData[iPg] = aShare;
 
65456 nHdr = (iPg==0 ? WALINDEX_HDR_SIZE : 0);
65457 nHdr32 = nHdr / sizeof(u32);
65458 #ifndef SQLITE_SAFER_WALINDEX_RECOVERY
65459 /* Memcpy() should work fine here, on all reasonable implementations.
65460 ** Technically, memcpy() might change the destination to some
@@ -66344,11 +66369,13 @@
66344 ** held locks are assumed to be transient locks that would have been
66345 ** released had the exception not been thrown and are dropped.
66346 **
66347 ** 2) Frees the pointer at Wal.pFree, if any, using sqlite3_free().
66348 **
66349 ** 3) Returns SQLITE_IOERR.
 
 
66350 */
66351 static int walHandleException(Wal *pWal){
66352 if( pWal->exclusiveMode==0 ){
66353 static const int S = 1;
66354 static const int E = (1<<SQLITE_SHM_NLOCK);
@@ -66363,10 +66390,14 @@
66363 if( (E<<ii) & mUnlock ) walUnlockExclusive(pWal, ii, 1);
66364 }
66365 }
66366 sqlite3_free(pWal->pFree);
66367 pWal->pFree = 0;
 
 
 
 
66368 return SQLITE_IOERR_IN_PAGE;
66369 }
66370
66371 /*
66372 ** Assert that the Wal.lockMask mask, which indicates the locks held
@@ -67120,11 +67151,12 @@
67120 i64 iDbOff; /* Offset of db file entry */
67121 i64 iWalOff; /* Offset of wal file entry */
67122
67123 rc = walHashGet(pWal, walFramePage(i), &sLoc);
67124 if( rc!=SQLITE_OK ) break;
67125 pgno = sLoc.aPgno[i-sLoc.iZero];
 
67126 iDbOff = (i64)(pgno-1) * szPage;
67127
67128 if( iDbOff+szPage<=szDb ){
67129 iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE;
67130 rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff);
@@ -91009,11 +91041,11 @@
91009 */
91010 SQLITE_API int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){
91011 Vdbe *v = (Vdbe*)pStmt;
91012 int rc;
91013 sqlite3_mutex_enter(v->db->mutex);
91014 if( v->explain==eMode ){
91015 rc = SQLITE_OK;
91016 }else if( eMode<0 || eMode>2 ){
91017 rc = SQLITE_ERROR;
91018 }else if( (v->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){
91019 rc = SQLITE_ERROR;
@@ -128754,23 +128786,28 @@
128754 ** Re-register the built-in LIKE functions. The caseSensitive
128755 ** parameter determines whether or not the LIKE operator is case
128756 ** sensitive.
128757 */
128758 SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
 
128759 struct compareInfo *pInfo;
128760 int flags;
 
128761 if( caseSensitive ){
128762 pInfo = (struct compareInfo*)&likeInfoAlt;
128763 flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE;
128764 }else{
128765 pInfo = (struct compareInfo*)&likeInfoNorm;
128766 flags = SQLITE_FUNC_LIKE;
128767 }
128768 sqlite3CreateFunc(db, "like", 2, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0);
128769 sqlite3CreateFunc(db, "like", 3, SQLITE_UTF8, pInfo, likeFunc, 0, 0, 0, 0, 0);
128770 sqlite3FindFunction(db, "like", 2, SQLITE_UTF8, 0)->funcFlags |= flags;
128771 sqlite3FindFunction(db, "like", 3, SQLITE_UTF8, 0)->funcFlags |= flags;
 
 
 
128772 }
128773
128774 /*
128775 ** pExpr points to an expression which implements a function. If
128776 ** it is appropriate to apply the LIKE optimization to that function
@@ -134435,10 +134472,12 @@
134435 const char *(*db_name)(sqlite3*,int);
134436 /* Version 3.40.0 and later */
134437 int (*value_encoding)(sqlite3_value*);
134438 /* Version 3.41.0 and later */
134439 int (*is_interrupted)(sqlite3*);
 
 
134440 };
134441
134442 /*
134443 ** This is the function signature used for all extension entry points. It
134444 ** is also defined in the file "loadext.c".
@@ -134763,10 +134802,12 @@
134763 #define sqlite3_db_name sqlite3_api->db_name
134764 /* Version 3.40.0 and later */
134765 #define sqlite3_value_encoding sqlite3_api->value_encoding
134766 /* Version 3.41.0 and later */
134767 #define sqlite3_is_interrupted sqlite3_api->is_interrupted
 
 
134768 #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
134769
134770 #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
134771 /* This case when the file really is being compiled as a loadable
134772 ** extension */
@@ -135279,11 +135320,13 @@
135279 #endif
135280 sqlite3_db_name,
135281 /* Version 3.40.0 and later */
135282 sqlite3_value_encoding,
135283 /* Version 3.41.0 and later */
135284 sqlite3_is_interrupted
 
 
135285 };
135286
135287 /* True if x is the directory separator character
135288 */
135289 #if SQLITE_OS_WIN
@@ -151690,13 +151733,13 @@
151690 if( aXRef[i]>=0 ){
151691 pList = sqlite3ExprListAppend(pParse, pList,
151692 sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0)
151693 );
151694 }else{
151695 Expr *pRow = exprRowColumn(pParse, i);
151696 if( pRow ) pRow->op2 = OPFLAG_NOCHNG;
151697 pList = sqlite3ExprListAppend(pParse, pList, pRow);
151698 }
151699 }
151700
151701 updateFromSelect(pParse, ephemTab, pPk, pList, pSrc, pWhere, 0, 0);
151702 sqlite3ExprListDelete(db, pList);
@@ -151977,11 +152020,11 @@
151977 sCol[0].pLeft = &sCol[1];
151978 sCol[1].iColumn = pIdx->aiColumn[ii];
151979 pExpr = &sCol[0];
151980 }
151981 for(jj=0; jj<nn; jj++){
151982 if( sqlite3ExprCompare(pParse,pTarget->a[jj].pExpr,pExpr,iCursor)<2 ){
151983 break; /* Column ii of the index matches column jj of target */
151984 }
151985 }
151986 if( jj>=nn ){
151987 /* The target contains no match for column jj of the index */
@@ -226230,12 +226273,12 @@
226230 ** extra disk space, as no extra entries are added to the FTS index.
226231 ** On the other hand, it may require more CPU cycles to run MATCH queries,
226232 ** as separate queries of the FTS index are required for each synonym.
226233 **
226234 ** When using methods (2) or (3), it is important that the tokenizer only
226235 ** provide synonyms when tokenizing document text (method (2)) or query
226236 ** text (method (3)), not both. Doing so will not cause any errors, but is
226237 ** inefficient.
226238 */
226239 typedef struct Fts5Tokenizer Fts5Tokenizer;
226240 typedef struct fts5_tokenizer fts5_tokenizer;
226241 struct fts5_tokenizer {
@@ -233429,10 +233472,12 @@
233429
233430 if( zRet ) zRet = fts5PrintfAppend(zRet, "}");
233431 if( zRet==0 ) return 0;
233432 }
233433
 
 
233434 }else{
233435 char const *zOp = 0;
233436 int i;
233437 switch( pExpr->eType ){
233438 case FTS5_AND: zOp = "AND"; break;
@@ -242379,11 +242424,11 @@
242379 iTermOff = szLeaf;
242380 }
242381 fts5DecodeRowidList(&rc, &s, &a[4], iTermOff-4);
242382
242383 iOff = iTermOff;
242384 while( iOff<szLeaf ){
242385 int nAppend;
242386
242387 /* Read the term data for the next term*/
242388 iOff += fts5GetVarint32(&a[iOff], nAppend);
242389 term.n = nKeep;
@@ -242399,12 +242444,15 @@
242399 iPgidxOff += fts5GetVarint32(&a[iPgidxOff], nIncr);
242400 iTermOff += nIncr;
242401 }else{
242402 iTermOff = szLeaf;
242403 }
242404
242405 fts5DecodeRowidList(&rc, &s, &a[iOff], iTermOff-iOff);
 
 
 
242406 iOff = iTermOff;
242407 if( iOff<szLeaf ){
242408 iOff += fts5GetVarint32(&a[iOff], nKeep);
242409 }
242410 }
@@ -245683,11 +245731,11 @@
245683 int nArg, /* Number of args */
245684 sqlite3_value **apUnused /* Function arguments */
245685 ){
245686 assert( nArg==0 );
245687 UNUSED_PARAM2(nArg, apUnused);
245688 sqlite3_result_text(pCtx, "fts5: 2023-08-11 22:40:06 3bc0693c4633f545f09dbee702e25354504b20836373a068447e6c61cb2ebd79", -1, SQLITE_TRANSIENT);
245689 }
245690
245691 /*
245692 ** Return true if zName is the extension on one of the shadow tables used
245693 ** by this module.
245694
--- extsrc/sqlite3.c
+++ extsrc/sqlite3.c
@@ -16,11 +16,11 @@
16 ** if you want a wrapper to interface SQLite with your choice of programming
17 ** language. The code for the "sqlite3" command-line shell is also in a
18 ** separate file. This file contains only code for the core SQLite library.
19 **
20 ** The content in this amalgamation comes from Fossil check-in
21 ** c7eeb055bfb0e5a4467d8a45fa53d84bb8a.
22 */
23 #define SQLITE_CORE 1
24 #define SQLITE_AMALGAMATION 1
25 #ifndef SQLITE_PRIVATE
26 # define SQLITE_PRIVATE static
@@ -459,11 +459,11 @@
459 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
460 ** [sqlite_version()] and [sqlite_source_id()].
461 */
462 #define SQLITE_VERSION "3.43.0"
463 #define SQLITE_VERSION_NUMBER 3043000
464 #define SQLITE_SOURCE_ID "2023-08-18 12:15:44 ec7eeb055bfb0e5a4467d8a45fa53d84bb8ae80ca0474b687e2783e971648008"
465
466 /*
467 ** CAPI3REF: Run-Time Library Version Numbers
468 ** KEYWORDS: sqlite3_version sqlite3_sourceid
469 **
@@ -13346,12 +13346,12 @@
13346 ** extra disk space, as no extra entries are added to the FTS index.
13347 ** On the other hand, it may require more CPU cycles to run MATCH queries,
13348 ** as separate queries of the FTS index are required for each synonym.
13349 **
13350 ** When using methods (2) or (3), it is important that the tokenizer only
13351 ** provide synonyms when tokenizing document text (method (3)) or query
13352 ** text (method (2)), not both. Doing so will not cause any errors, but is
13353 ** inefficient.
13354 */
13355 typedef struct Fts5Tokenizer Fts5Tokenizer;
13356 typedef struct fts5_tokenizer fts5_tokenizer;
13357 struct fts5_tokenizer {
@@ -34768,11 +34768,15 @@
34768 while( e<=-10 ){ e+=10; r *= 1.0e-10L; }
34769 while( e<=-1 ){ e+=1; r *= 1.0e-01L; }
34770 }
34771 assert( r>=0.0 );
34772 if( r>+1.7976931348623157081452742373e+308L ){
34773 #ifdef INFINITY
34774 *pResult = +INFINITY;
34775 #else
34776 *pResult = 1.0e308*10.0;
34777 #endif
34778 }else{
34779 *pResult = (double)r;
34780 }
34781 }else{
34782 double rr[2];
@@ -50534,10 +50538,11 @@
50538 static char zChars[] =
50539 "abcdefghijklmnopqrstuvwxyz"
50540 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
50541 "0123456789";
50542 size_t i, j;
50543 DWORD pid;
50544 int nPre = sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX);
50545 int nMax, nBuf, nDir, nLen;
50546 char *zBuf;
50547
50548 /* It's odd to simulate an io-error here, but really this is just
@@ -50746,11 +50751,14 @@
50751
50752 sqlite3_snprintf(nBuf-16-nLen, zBuf+nLen, SQLITE_TEMP_FILE_PREFIX);
50753
50754 j = sqlite3Strlen30(zBuf);
50755 sqlite3_randomness(15, &zBuf[j]);
50756 pid = osGetCurrentProcessId();
50757 for(i=0; i<15; i++, j++){
50758 zBuf[j] += pid & 0xff;
50759 pid >>= 8;
50760 zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];
50761 }
50762 zBuf[j] = 0;
50763 zBuf[j+1] = 0;
50764 *pzBuf = zBuf;
@@ -64488,10 +64496,12 @@
64496 const char *zWalName; /* Name of WAL file */
64497 u32 nCkpt; /* Checkpoint sequence counter in the wal-header */
64498 #ifdef SQLITE_USE_SEH
64499 u32 lockMask; /* Mask of locks held */
64500 void *pFree; /* Pointer to sqlite3_free() if exception thrown */
64501 u32 *pWiValue; /* Value to write into apWiData[iWiPg] */
64502 int iWiPg; /* Write pWiValue into apWiData[iWiPg] */
64503 int iSysErrno; /* System error code following exception */
64504 #endif
64505 #ifdef SQLITE_DEBUG
64506 int nSehTry; /* Number of nested SEH_TRY{} blocks */
64507 u8 lockError; /* True if a locking error has occurred */
@@ -64659,15 +64669,28 @@
64669 ** be freed. In the second case, pPtr must be the registered pointer.
64670 */
64671 #define SEH_FREE_ON_ERROR(X,Y) \
64672 assert( (X==0 || Y==0) && pWal->pFree==X ); pWal->pFree = Y
64673
64674 /*
64675 ** There are two ways to use this macro. To arrange for pWal->apWiData[iPg]
64676 ** to be set to pValue if an exception is thrown:
64677 **
64678 ** SEH_SET_ON_ERROR(iPg, pValue);
64679 **
64680 ** and to cancel the same:
64681 **
64682 ** SEH_SET_ON_ERROR(0, 0);
64683 */
64684 #define SEH_SET_ON_ERROR(X,Y) pWal->iWiPg = X; pWal->pWiValue = Y
64685
64686 #else
64687 # define SEH_TRY VVA_ONLY(pWal->nSehTry++);
64688 # define SEH_EXCEPT(X) VVA_ONLY(pWal->nSehTry--); assert( pWal->nSehTry==0 );
64689 # define SEH_INJECT_FAULT assert( pWal->nSehTry>0 );
64690 # define SEH_FREE_ON_ERROR(X,Y)
64691 # define SEH_SET_ON_ERROR(X,Y)
64692 #endif /* ifdef SQLITE_USE_SEH */
64693
64694
64695 /*
64696 ** Obtain a pointer to the iPage'th page of the wal-index. The wal-index
@@ -65424,10 +65447,11 @@
65447 u32 iFirst = 1 + (iPg==0?0:HASHTABLE_NPAGE_ONE+(iPg-1)*HASHTABLE_NPAGE);
65448 u32 nHdr, nHdr32;
65449 rc = walIndexPage(pWal, iPg, (volatile u32**)&aShare);
65450 assert( aShare!=0 || rc!=SQLITE_OK );
65451 if( aShare==0 ) break;
65452 SEH_SET_ON_ERROR(iPg, aShare);
65453 pWal->apWiData[iPg] = aPrivate;
65454
65455 for(iFrame=iFirst; iFrame<=iLast; iFrame++){
65456 i64 iOffset = walFrameOffset(iFrame, szPage);
65457 u32 pgno; /* Database page number for frame */
@@ -65451,10 +65475,11 @@
65475 aFrameCksum[0] = pWal->hdr.aFrameCksum[0];
65476 aFrameCksum[1] = pWal->hdr.aFrameCksum[1];
65477 }
65478 }
65479 pWal->apWiData[iPg] = aShare;
65480 SEH_SET_ON_ERROR(0,0);
65481 nHdr = (iPg==0 ? WALINDEX_HDR_SIZE : 0);
65482 nHdr32 = nHdr / sizeof(u32);
65483 #ifndef SQLITE_SAFER_WALINDEX_RECOVERY
65484 /* Memcpy() should work fine here, on all reasonable implementations.
65485 ** Technically, memcpy() might change the destination to some
@@ -66344,11 +66369,13 @@
66369 ** held locks are assumed to be transient locks that would have been
66370 ** released had the exception not been thrown and are dropped.
66371 **
66372 ** 2) Frees the pointer at Wal.pFree, if any, using sqlite3_free().
66373 **
66374 ** 3) Set pWal->apWiData[pWal->iWiPg] to pWal->pWiValue if not NULL
66375 **
66376 ** 4) Returns SQLITE_IOERR.
66377 */
66378 static int walHandleException(Wal *pWal){
66379 if( pWal->exclusiveMode==0 ){
66380 static const int S = 1;
66381 static const int E = (1<<SQLITE_SHM_NLOCK);
@@ -66363,10 +66390,14 @@
66390 if( (E<<ii) & mUnlock ) walUnlockExclusive(pWal, ii, 1);
66391 }
66392 }
66393 sqlite3_free(pWal->pFree);
66394 pWal->pFree = 0;
66395 if( pWal->pWiValue ){
66396 pWal->apWiData[pWal->iWiPg] = pWal->pWiValue;
66397 pWal->pWiValue = 0;
66398 }
66399 return SQLITE_IOERR_IN_PAGE;
66400 }
66401
66402 /*
66403 ** Assert that the Wal.lockMask mask, which indicates the locks held
@@ -67120,11 +67151,12 @@
67151 i64 iDbOff; /* Offset of db file entry */
67152 i64 iWalOff; /* Offset of wal file entry */
67153
67154 rc = walHashGet(pWal, walFramePage(i), &sLoc);
67155 if( rc!=SQLITE_OK ) break;
67156 assert( i - sLoc.iZero - 1 >=0 );
67157 pgno = sLoc.aPgno[i-sLoc.iZero-1];
67158 iDbOff = (i64)(pgno-1) * szPage;
67159
67160 if( iDbOff+szPage<=szDb ){
67161 iWalOff = walFrameOffset(i, szPage) + WAL_FRAME_HDRSIZE;
67162 rc = sqlite3OsRead(pWal->pWalFd, pBuf1, szPage, iWalOff);
@@ -91009,11 +91041,11 @@
91041 */
91042 SQLITE_API int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){
91043 Vdbe *v = (Vdbe*)pStmt;
91044 int rc;
91045 sqlite3_mutex_enter(v->db->mutex);
91046 if( ((int)v->explain)==eMode ){
91047 rc = SQLITE_OK;
91048 }else if( eMode<0 || eMode>2 ){
91049 rc = SQLITE_ERROR;
91050 }else if( (v->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ){
91051 rc = SQLITE_ERROR;
@@ -128754,23 +128786,28 @@
128786 ** Re-register the built-in LIKE functions. The caseSensitive
128787 ** parameter determines whether or not the LIKE operator is case
128788 ** sensitive.
128789 */
128790 SQLITE_PRIVATE void sqlite3RegisterLikeFunctions(sqlite3 *db, int caseSensitive){
128791 FuncDef *pDef;
128792 struct compareInfo *pInfo;
128793 int flags;
128794 int nArg;
128795 if( caseSensitive ){
128796 pInfo = (struct compareInfo*)&likeInfoAlt;
128797 flags = SQLITE_FUNC_LIKE | SQLITE_FUNC_CASE;
128798 }else{
128799 pInfo = (struct compareInfo*)&likeInfoNorm;
128800 flags = SQLITE_FUNC_LIKE;
128801 }
128802 for(nArg=2; nArg<=3; nArg++){
128803 sqlite3CreateFunc(db, "like", nArg, SQLITE_UTF8, pInfo, likeFunc,
128804 0, 0, 0, 0, 0);
128805 pDef = sqlite3FindFunction(db, "like", nArg, SQLITE_UTF8, 0);
128806 pDef->funcFlags |= flags;
128807 pDef->funcFlags &= ~SQLITE_FUNC_UNSAFE;
128808 }
128809 }
128810
128811 /*
128812 ** pExpr points to an expression which implements a function. If
128813 ** it is appropriate to apply the LIKE optimization to that function
@@ -134435,10 +134472,12 @@
134472 const char *(*db_name)(sqlite3*,int);
134473 /* Version 3.40.0 and later */
134474 int (*value_encoding)(sqlite3_value*);
134475 /* Version 3.41.0 and later */
134476 int (*is_interrupted)(sqlite3*);
134477 /* Version 3.43.0 and later */
134478 int (*stmt_explain)(sqlite3_stmt*,int);
134479 };
134480
134481 /*
134482 ** This is the function signature used for all extension entry points. It
134483 ** is also defined in the file "loadext.c".
@@ -134763,10 +134802,12 @@
134802 #define sqlite3_db_name sqlite3_api->db_name
134803 /* Version 3.40.0 and later */
134804 #define sqlite3_value_encoding sqlite3_api->value_encoding
134805 /* Version 3.41.0 and later */
134806 #define sqlite3_is_interrupted sqlite3_api->is_interrupted
134807 /* Version 3.43.0 and later */
134808 #define sqlite3_stmt_explain sqlite3_api->stmt_explain
134809 #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
134810
134811 #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
134812 /* This case when the file really is being compiled as a loadable
134813 ** extension */
@@ -135279,11 +135320,13 @@
135320 #endif
135321 sqlite3_db_name,
135322 /* Version 3.40.0 and later */
135323 sqlite3_value_encoding,
135324 /* Version 3.41.0 and later */
135325 sqlite3_is_interrupted,
135326 /* Version 3.43.0 and later */
135327 sqlite3_stmt_explain
135328 };
135329
135330 /* True if x is the directory separator character
135331 */
135332 #if SQLITE_OS_WIN
@@ -151690,13 +151733,13 @@
151733 if( aXRef[i]>=0 ){
151734 pList = sqlite3ExprListAppend(pParse, pList,
151735 sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0)
151736 );
151737 }else{
151738 Expr *pRowExpr = exprRowColumn(pParse, i);
151739 if( pRowExpr ) pRowExpr->op2 = OPFLAG_NOCHNG;
151740 pList = sqlite3ExprListAppend(pParse, pList, pRowExpr);
151741 }
151742 }
151743
151744 updateFromSelect(pParse, ephemTab, pPk, pList, pSrc, pWhere, 0, 0);
151745 sqlite3ExprListDelete(db, pList);
@@ -151977,11 +152020,11 @@
152020 sCol[0].pLeft = &sCol[1];
152021 sCol[1].iColumn = pIdx->aiColumn[ii];
152022 pExpr = &sCol[0];
152023 }
152024 for(jj=0; jj<nn; jj++){
152025 if( sqlite3ExprCompare(0,pTarget->a[jj].pExpr,pExpr,iCursor)<2 ){
152026 break; /* Column ii of the index matches column jj of target */
152027 }
152028 }
152029 if( jj>=nn ){
152030 /* The target contains no match for column jj of the index */
@@ -226230,12 +226273,12 @@
226273 ** extra disk space, as no extra entries are added to the FTS index.
226274 ** On the other hand, it may require more CPU cycles to run MATCH queries,
226275 ** as separate queries of the FTS index are required for each synonym.
226276 **
226277 ** When using methods (2) or (3), it is important that the tokenizer only
226278 ** provide synonyms when tokenizing document text (method (3)) or query
226279 ** text (method (2)), not both. Doing so will not cause any errors, but is
226280 ** inefficient.
226281 */
226282 typedef struct Fts5Tokenizer Fts5Tokenizer;
226283 typedef struct fts5_tokenizer fts5_tokenizer;
226284 struct fts5_tokenizer {
@@ -233429,10 +233472,12 @@
233472
233473 if( zRet ) zRet = fts5PrintfAppend(zRet, "}");
233474 if( zRet==0 ) return 0;
233475 }
233476
233477 }else if( pExpr->eType==0 ){
233478 zRet = sqlite3_mprintf("{}");
233479 }else{
233480 char const *zOp = 0;
233481 int i;
233482 switch( pExpr->eType ){
233483 case FTS5_AND: zOp = "AND"; break;
@@ -242379,11 +242424,11 @@
242424 iTermOff = szLeaf;
242425 }
242426 fts5DecodeRowidList(&rc, &s, &a[4], iTermOff-4);
242427
242428 iOff = iTermOff;
242429 while( iOff<szLeaf && rc==SQLITE_OK ){
242430 int nAppend;
242431
242432 /* Read the term data for the next term*/
242433 iOff += fts5GetVarint32(&a[iOff], nAppend);
242434 term.n = nKeep;
@@ -242399,12 +242444,15 @@
242444 iPgidxOff += fts5GetVarint32(&a[iPgidxOff], nIncr);
242445 iTermOff += nIncr;
242446 }else{
242447 iTermOff = szLeaf;
242448 }
242449 if( iTermOff>szLeaf ){
242450 rc = FTS5_CORRUPT;
242451 }else{
242452 fts5DecodeRowidList(&rc, &s, &a[iOff], iTermOff-iOff);
242453 }
242454 iOff = iTermOff;
242455 if( iOff<szLeaf ){
242456 iOff += fts5GetVarint32(&a[iOff], nKeep);
242457 }
242458 }
@@ -245683,11 +245731,11 @@
245731 int nArg, /* Number of args */
245732 sqlite3_value **apUnused /* Function arguments */
245733 ){
245734 assert( nArg==0 );
245735 UNUSED_PARAM2(nArg, apUnused);
245736 sqlite3_result_text(pCtx, "fts5: 2023-08-17 17:48:20 3c06709335eb4b98e3a684e3ebbae69eeb6a21b452bce29159c82bb632d6a042", -1, SQLITE_TRANSIENT);
245737 }
245738
245739 /*
245740 ** Return true if zName is the extension on one of the shadow tables used
245741 ** by this module.
245742
--- extsrc/sqlite3.h
+++ extsrc/sqlite3.h
@@ -146,11 +146,11 @@
146146
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
147147
** [sqlite_version()] and [sqlite_source_id()].
148148
*/
149149
#define SQLITE_VERSION "3.43.0"
150150
#define SQLITE_VERSION_NUMBER 3043000
151
-#define SQLITE_SOURCE_ID "2023-08-11 22:40:06 3bc0693c4633f545f09dbee702e25354504b20836373a068447e6c61cb2ebd79"
151
+#define SQLITE_SOURCE_ID "2023-08-18 12:15:44 ec7eeb055bfb0e5a4467d8a45fa53d84bb8ae80ca0474b687e2783e971648008"
152152
153153
/*
154154
** CAPI3REF: Run-Time Library Version Numbers
155155
** KEYWORDS: sqlite3_version sqlite3_sourceid
156156
**
@@ -13033,12 +13033,12 @@
1303313033
** extra disk space, as no extra entries are added to the FTS index.
1303413034
** On the other hand, it may require more CPU cycles to run MATCH queries,
1303513035
** as separate queries of the FTS index are required for each synonym.
1303613036
**
1303713037
** When using methods (2) or (3), it is important that the tokenizer only
13038
-** provide synonyms when tokenizing document text (method (2)) or query
13039
-** text (method (3)), not both. Doing so will not cause any errors, but is
13038
+** provide synonyms when tokenizing document text (method (3)) or query
13039
+** text (method (2)), not both. Doing so will not cause any errors, but is
1304013040
** inefficient.
1304113041
*/
1304213042
typedef struct Fts5Tokenizer Fts5Tokenizer;
1304313043
typedef struct fts5_tokenizer fts5_tokenizer;
1304413044
struct fts5_tokenizer {
1304513045
--- extsrc/sqlite3.h
+++ extsrc/sqlite3.h
@@ -146,11 +146,11 @@
146 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
147 ** [sqlite_version()] and [sqlite_source_id()].
148 */
149 #define SQLITE_VERSION "3.43.0"
150 #define SQLITE_VERSION_NUMBER 3043000
151 #define SQLITE_SOURCE_ID "2023-08-11 22:40:06 3bc0693c4633f545f09dbee702e25354504b20836373a068447e6c61cb2ebd79"
152
153 /*
154 ** CAPI3REF: Run-Time Library Version Numbers
155 ** KEYWORDS: sqlite3_version sqlite3_sourceid
156 **
@@ -13033,12 +13033,12 @@
13033 ** extra disk space, as no extra entries are added to the FTS index.
13034 ** On the other hand, it may require more CPU cycles to run MATCH queries,
13035 ** as separate queries of the FTS index are required for each synonym.
13036 **
13037 ** When using methods (2) or (3), it is important that the tokenizer only
13038 ** provide synonyms when tokenizing document text (method (2)) or query
13039 ** text (method (3)), not both. Doing so will not cause any errors, but is
13040 ** inefficient.
13041 */
13042 typedef struct Fts5Tokenizer Fts5Tokenizer;
13043 typedef struct fts5_tokenizer fts5_tokenizer;
13044 struct fts5_tokenizer {
13045
--- extsrc/sqlite3.h
+++ extsrc/sqlite3.h
@@ -146,11 +146,11 @@
146 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
147 ** [sqlite_version()] and [sqlite_source_id()].
148 */
149 #define SQLITE_VERSION "3.43.0"
150 #define SQLITE_VERSION_NUMBER 3043000
151 #define SQLITE_SOURCE_ID "2023-08-18 12:15:44 ec7eeb055bfb0e5a4467d8a45fa53d84bb8ae80ca0474b687e2783e971648008"
152
153 /*
154 ** CAPI3REF: Run-Time Library Version Numbers
155 ** KEYWORDS: sqlite3_version sqlite3_sourceid
156 **
@@ -13033,12 +13033,12 @@
13033 ** extra disk space, as no extra entries are added to the FTS index.
13034 ** On the other hand, it may require more CPU cycles to run MATCH queries,
13035 ** as separate queries of the FTS index are required for each synonym.
13036 **
13037 ** When using methods (2) or (3), it is important that the tokenizer only
13038 ** provide synonyms when tokenizing document text (method (3)) or query
13039 ** text (method (2)), not both. Doing so will not cause any errors, but is
13040 ** inefficient.
13041 */
13042 typedef struct Fts5Tokenizer Fts5Tokenizer;
13043 typedef struct fts5_tokenizer fts5_tokenizer;
13044 struct fts5_tokenizer {
13045

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button