Fossil SCM

Update the built-in SQLite to the latest trunk check-in for testing.

drh 2026-01-09 16:44 trunk
Commit 2b2530dd077db1a20387a6410da71c962fdb6fa6342fe068fe5c58c0b1ab7901
+50 -10
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -79,10 +79,14 @@
7979
** should only be used when building the "fiddle" web application, as
8080
** the browser-mode build has much different user input requirements
8181
** and this build mode rewires the user input subsystem to account for
8282
** that.
8383
*/
84
+#if defined(SQLITE_SHELL_FIDDLE)
85
+# undef SQLITE_OMIT_LOAD_EXTENSION
86
+# define SQLITE_OMIT_LOAD_EXTENSION 1
87
+#endif
8488
8589
/*
8690
** Warning pragmas copied from msvc.h in the core.
8791
*/
8892
#if defined(_MSC_VER)
@@ -995,10 +999,19 @@
995999
*/
9961000
static void qrfOom(Qrf *p){
9971001
qrfError(p, SQLITE_NOMEM, "out of memory");
9981002
}
9991003
1004
+/*
1005
+** Transfer any error in pStr over into p.
1006
+*/
1007
+static void qrfStrErr(Qrf *p, sqlite3_str *pStr){
1008
+ int rc = pStr ? sqlite3_str_errcode(pStr) : 0;
1009
+ if( rc ){
1010
+ qrfError(p, rc, sqlite3_errstr(rc));
1011
+ }
1012
+}
10001013
10011014
10021015
/*
10031016
** Add a new entry to the EXPLAIN QUERY PLAN data
10041017
*/
@@ -1217,11 +1230,13 @@
12171230
sqlite3_str_reset(pLine);
12181231
}else{
12191232
qrfEqpAppend(p, iId, iPid, zo);
12201233
}
12211234
}
1235
+ qrfStrErr(p, pLine);
12221236
sqlite3_free(sqlite3_str_finish(pLine));
1237
+ qrfStrErr(p, pStats);
12231238
sqlite3_free(sqlite3_str_finish(pStats));
12241239
#endif
12251240
}
12261241
12271242
@@ -2731,10 +2746,11 @@
27312746
int nNL = 0;
27322747
int n, w;
27332748
pStr = sqlite3_str_new(p->db);
27342749
qrfEncodeText(p, pStr, z ? z : "");
27352750
n = sqlite3_str_length(pStr);
2751
+ qrfStrErr(p, pStr);
27362752
z = data.az[data.n] = sqlite3_str_finish(pStr);
27372753
if( p->spec.nTitleLimit ){
27382754
nNL = 0;
27392755
data.aiWth[data.n] = w = qrfTitleLimit(data.az[data.n],
27402756
p->spec.nTitleLimit );
@@ -2758,10 +2774,11 @@
27582774
int n, w;
27592775
int eType = sqlite3_column_type(p->pStmt,i);
27602776
pStr = sqlite3_str_new(p->db);
27612777
qrfRenderValue(p, pStr, i);
27622778
n = sqlite3_str_length(pStr);
2779
+ qrfStrErr(p, pStr);
27632780
z = data.az[data.n] = sqlite3_str_finish(pStr);
27642781
data.abNum[data.n] = eType==SQLITE_INTEGER || eType==SQLITE_FLOAT;
27652782
data.aiWth[data.n] = w = qrfDisplayWidth(z, n, &nNL);
27662783
data.n++;
27672784
if( w>data.a[i].mxW ) data.a[i].mxW = w;
@@ -2912,11 +2929,11 @@
29122929
){
29132930
bRTrim = 1;
29142931
}else{
29152932
bRTrim = 0;
29162933
}
2917
- for(i=0; i<data.n; i+=nColumn){
2934
+ for(i=0; i<data.n && sqlite3_str_errcode(p->pOut)==SQLITE_OK; i+=nColumn){
29182935
int bMore;
29192936
int nRow = 0;
29202937
29212938
/* Draw a single row of the table. This might be the title line
29222939
** (if there is a title line) or a row in the body of the table.
@@ -3099,11 +3116,11 @@
30993116
assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 0), "addr" ) );
31003117
assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 1), "opcode" ) );
31013118
assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 2), "p1" ) );
31023119
assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 3), "p2" ) );
31033120
3104
- for(iOp=0; SQLITE_ROW==sqlite3_step(p->pStmt); iOp++){
3121
+ for(iOp=0; SQLITE_ROW==sqlite3_step(p->pStmt) && !p->iErr; iOp++){
31053122
int iAddr = sqlite3_column_int(p->pStmt, 0);
31063123
const char *zOp = (const char*)sqlite3_column_text(p->pStmt, 1);
31073124
int p1 = sqlite3_column_int(p->pStmt, 2);
31083125
int p2 = sqlite3_column_int(p->pStmt, 3);
31093126
@@ -3156,11 +3173,11 @@
31563173
nWidth = sizeof(aScanExpWidth)/sizeof(int);
31573174
iIndent = 3;
31583175
}
31593176
if( nArg>nWidth ) nArg = nWidth;
31603177
3161
- for(iOp=0; sqlite3_step(p->pStmt)==SQLITE_ROW; iOp++){
3178
+ for(iOp=0; sqlite3_step(p->pStmt)==SQLITE_ROW && !p->iErr; iOp++){
31623179
/* If this is the first row seen, print out the headers */
31633180
if( iOp==0 ){
31643181
for(i=0; i<nArg; i++){
31653182
const char *zCol = sqlite3_column_name(p->pStmt, aMap[i]);
31663183
qrfWidthPrint(p,p->pOut, aWidth[i], zCol);
@@ -3412,10 +3429,11 @@
34123429
sqlite3_str_append(p->pOut, "\n", 1);
34133430
zVal += iNext;
34143431
}while( zVal[0] );
34153432
sqlite3_str_reset(pVal);
34163433
}
3434
+ qrfStrErr(p, pVal);
34173435
sqlite3_free(sqlite3_str_finish(pVal));
34183436
qrfWrite(p);
34193437
break;
34203438
}
34213439
case QRF_STYLE_Eqp: {
@@ -3475,11 +3493,11 @@
34753493
p->pOut = sqlite3_str_new(p->db);
34763494
if( p->pOut==0 ){
34773495
qrfOom(p);
34783496
return;
34793497
}
3480
- p->iErr = 0;
3498
+ p->iErr = SQLITE_OK;
34813499
p->nCol = sqlite3_column_count(p->pStmt);
34823500
p->nRow = 0;
34833501
sz = sizeof(sqlite3_qrf_spec);
34843502
memcpy(&p->spec, pSpec, sz);
34853503
if( p->spec.zNull==0 ) p->spec.zNull = "";
@@ -3653,10 +3671,11 @@
36533671
qrfEqpRender(p, 0);
36543672
qrfWrite(p);
36553673
break;
36563674
}
36573675
}
3676
+ qrfStrErr(p, p->pOut);
36583677
if( p->spec.pzOutput ){
36593678
if( p->spec.pzOutput[0] ){
36603679
sqlite3_int64 n, sz;
36613680
char *zCombined;
36623681
sz = strlen(p->spec.pzOutput[0]);
@@ -9475,11 +9494,11 @@
94759494
** (X) match X
94769495
** X|Y X or Y
94779496
** ^X X occurring at the beginning of the string
94789497
** X$ X occurring at the end of the string
94799498
** . Match any single character
9480
-** \c Character c where c is one of \{}()[]|*+?.
9499
+** \c Character c where c is one of \{}()[]|*+?-.
94819500
** \c C-language escapes for c in afnrtv. ex: \t or \n
94829501
** \uXXXX Where XXXX is exactly 4 hex digits, unicode value XXXX
94839502
** \xXX Where XX is exactly 2 hex digits, unicode value XX
94849503
** [abc] Any single character from the set abc
94859504
** [^abc] Any single character not in the set abc
@@ -9860,11 +9879,11 @@
98609879
98619880
/* A backslash character has been seen, read the next character and
98629881
** return its interpretation.
98639882
*/
98649883
static unsigned re_esc_char(ReCompiled *p){
9865
- static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]";
9884
+ static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]-";
98669885
static const char zTrans[] = "\a\f\n\r\t\v";
98679886
int i, v = 0;
98689887
char c;
98699888
if( p->sIn.i>=p->sIn.mx ) return 0;
98709889
c = p->sIn.z[p->sIn.i];
@@ -33530,17 +33549,19 @@
3353033549
|| sqlite3_strlike(zName, "sqlite_schema", '\\')==0
3353133550
|| sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
3353233551
|| sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
3353333552
if( isSchema ){
3353433553
cli_printf(p->out,
33535
- "CREATE TABLE %s (\n"
33554
+ "CREATE TABLE %ssqlite_schema (\n"
3353633555
" type text,\n"
3353733556
" name text,\n"
3353833557
" tbl_name text,\n"
3353933558
" rootpage integer,\n"
3354033559
" sql text\n"
33541
- ");\n", zName);
33560
+ ");\n",
33561
+ sqlite3_strlike("sqlite_t%",zName,0)==0 ? "temp." : ""
33562
+ );
3354233563
}
3354333564
}
3354433565
rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
3354533566
if( rc ){
3354633567
shellDatabaseError(p->db);
@@ -33596,11 +33617,11 @@
3359633617
}else{
3359733618
sqlite3_str_appendf(pSql, " LIKE %Q ESCAPE '\\' AND ", zName);
3359833619
}
3359933620
}
3360033621
if( bNoSystemTabs ){
33601
- sqlite3_str_appendf(pSql, " name NOT LIKE 'sqlite__%%' ESCALE '_' AND ");
33622
+ sqlite3_str_appendf(pSql, " name NOT LIKE 'sqlite__%%' ESCAPE '_' AND ");
3360233623
}
3360333624
sqlite3_str_appendf(pSql, "sql IS NOT NULL ORDER BY snum, rowid");
3360433625
if( bDebug ){
3360533626
cli_printf(p->out, "SQL: %s;\n", sqlite3_str_value(pSql));
3360633627
}else{
@@ -36140,11 +36161,30 @@
3614036161
3614136162
if( zVfs ){
3614236163
sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
3614336164
if( pVfs ){
3614436165
sqlite3_vfs_register(pVfs, 1);
36145
- }else{
36166
+ }
36167
+#if !defined(SQLITE_OMIT_LOAD_EXTENSION)
36168
+ else if( access(zVfs,0)==0 ){
36169
+ /* If the VFS name is not the name of an existing VFS, but it is
36170
+ ** the name of a file, then try to load that file as an extension.
36171
+ ** Presumably the extension implements the desired VFS. */
36172
+ sqlite3 *db = 0;
36173
+ char *zErr = 0;
36174
+ sqlite3_open(":memory:", &db);
36175
+ sqlite3_enable_load_extension(db, 1);
36176
+ rc = sqlite3_load_extension(db, zVfs, 0, &zErr);
36177
+ sqlite3_close(db);
36178
+ if( (rc&0xff)!=SQLITE_OK ){
36179
+ cli_printf(stderr, "could not load extension VFS \"%s\": %s\n",
36180
+ zVfs, zErr);
36181
+ exit(1);
36182
+ }
36183
+ }
36184
+#endif
36185
+ else{
3614636186
cli_printf(stderr,"no such VFS: \"%s\"\n", zVfs);
3614736187
exit(1);
3614836188
}
3614936189
}
3615036190
3615136191
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -79,10 +79,14 @@
79 ** should only be used when building the "fiddle" web application, as
80 ** the browser-mode build has much different user input requirements
81 ** and this build mode rewires the user input subsystem to account for
82 ** that.
83 */
 
 
 
 
84
85 /*
86 ** Warning pragmas copied from msvc.h in the core.
87 */
88 #if defined(_MSC_VER)
@@ -995,10 +999,19 @@
995 */
996 static void qrfOom(Qrf *p){
997 qrfError(p, SQLITE_NOMEM, "out of memory");
998 }
999
 
 
 
 
 
 
 
 
 
1000
1001
1002 /*
1003 ** Add a new entry to the EXPLAIN QUERY PLAN data
1004 */
@@ -1217,11 +1230,13 @@
1217 sqlite3_str_reset(pLine);
1218 }else{
1219 qrfEqpAppend(p, iId, iPid, zo);
1220 }
1221 }
 
1222 sqlite3_free(sqlite3_str_finish(pLine));
 
1223 sqlite3_free(sqlite3_str_finish(pStats));
1224 #endif
1225 }
1226
1227
@@ -2731,10 +2746,11 @@
2731 int nNL = 0;
2732 int n, w;
2733 pStr = sqlite3_str_new(p->db);
2734 qrfEncodeText(p, pStr, z ? z : "");
2735 n = sqlite3_str_length(pStr);
 
2736 z = data.az[data.n] = sqlite3_str_finish(pStr);
2737 if( p->spec.nTitleLimit ){
2738 nNL = 0;
2739 data.aiWth[data.n] = w = qrfTitleLimit(data.az[data.n],
2740 p->spec.nTitleLimit );
@@ -2758,10 +2774,11 @@
2758 int n, w;
2759 int eType = sqlite3_column_type(p->pStmt,i);
2760 pStr = sqlite3_str_new(p->db);
2761 qrfRenderValue(p, pStr, i);
2762 n = sqlite3_str_length(pStr);
 
2763 z = data.az[data.n] = sqlite3_str_finish(pStr);
2764 data.abNum[data.n] = eType==SQLITE_INTEGER || eType==SQLITE_FLOAT;
2765 data.aiWth[data.n] = w = qrfDisplayWidth(z, n, &nNL);
2766 data.n++;
2767 if( w>data.a[i].mxW ) data.a[i].mxW = w;
@@ -2912,11 +2929,11 @@
2912 ){
2913 bRTrim = 1;
2914 }else{
2915 bRTrim = 0;
2916 }
2917 for(i=0; i<data.n; i+=nColumn){
2918 int bMore;
2919 int nRow = 0;
2920
2921 /* Draw a single row of the table. This might be the title line
2922 ** (if there is a title line) or a row in the body of the table.
@@ -3099,11 +3116,11 @@
3099 assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 0), "addr" ) );
3100 assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 1), "opcode" ) );
3101 assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 2), "p1" ) );
3102 assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 3), "p2" ) );
3103
3104 for(iOp=0; SQLITE_ROW==sqlite3_step(p->pStmt); iOp++){
3105 int iAddr = sqlite3_column_int(p->pStmt, 0);
3106 const char *zOp = (const char*)sqlite3_column_text(p->pStmt, 1);
3107 int p1 = sqlite3_column_int(p->pStmt, 2);
3108 int p2 = sqlite3_column_int(p->pStmt, 3);
3109
@@ -3156,11 +3173,11 @@
3156 nWidth = sizeof(aScanExpWidth)/sizeof(int);
3157 iIndent = 3;
3158 }
3159 if( nArg>nWidth ) nArg = nWidth;
3160
3161 for(iOp=0; sqlite3_step(p->pStmt)==SQLITE_ROW; iOp++){
3162 /* If this is the first row seen, print out the headers */
3163 if( iOp==0 ){
3164 for(i=0; i<nArg; i++){
3165 const char *zCol = sqlite3_column_name(p->pStmt, aMap[i]);
3166 qrfWidthPrint(p,p->pOut, aWidth[i], zCol);
@@ -3412,10 +3429,11 @@
3412 sqlite3_str_append(p->pOut, "\n", 1);
3413 zVal += iNext;
3414 }while( zVal[0] );
3415 sqlite3_str_reset(pVal);
3416 }
 
3417 sqlite3_free(sqlite3_str_finish(pVal));
3418 qrfWrite(p);
3419 break;
3420 }
3421 case QRF_STYLE_Eqp: {
@@ -3475,11 +3493,11 @@
3475 p->pOut = sqlite3_str_new(p->db);
3476 if( p->pOut==0 ){
3477 qrfOom(p);
3478 return;
3479 }
3480 p->iErr = 0;
3481 p->nCol = sqlite3_column_count(p->pStmt);
3482 p->nRow = 0;
3483 sz = sizeof(sqlite3_qrf_spec);
3484 memcpy(&p->spec, pSpec, sz);
3485 if( p->spec.zNull==0 ) p->spec.zNull = "";
@@ -3653,10 +3671,11 @@
3653 qrfEqpRender(p, 0);
3654 qrfWrite(p);
3655 break;
3656 }
3657 }
 
3658 if( p->spec.pzOutput ){
3659 if( p->spec.pzOutput[0] ){
3660 sqlite3_int64 n, sz;
3661 char *zCombined;
3662 sz = strlen(p->spec.pzOutput[0]);
@@ -9475,11 +9494,11 @@
9475 ** (X) match X
9476 ** X|Y X or Y
9477 ** ^X X occurring at the beginning of the string
9478 ** X$ X occurring at the end of the string
9479 ** . Match any single character
9480 ** \c Character c where c is one of \{}()[]|*+?.
9481 ** \c C-language escapes for c in afnrtv. ex: \t or \n
9482 ** \uXXXX Where XXXX is exactly 4 hex digits, unicode value XXXX
9483 ** \xXX Where XX is exactly 2 hex digits, unicode value XX
9484 ** [abc] Any single character from the set abc
9485 ** [^abc] Any single character not in the set abc
@@ -9860,11 +9879,11 @@
9860
9861 /* A backslash character has been seen, read the next character and
9862 ** return its interpretation.
9863 */
9864 static unsigned re_esc_char(ReCompiled *p){
9865 static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]";
9866 static const char zTrans[] = "\a\f\n\r\t\v";
9867 int i, v = 0;
9868 char c;
9869 if( p->sIn.i>=p->sIn.mx ) return 0;
9870 c = p->sIn.z[p->sIn.i];
@@ -33530,17 +33549,19 @@
33530 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
33531 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
33532 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
33533 if( isSchema ){
33534 cli_printf(p->out,
33535 "CREATE TABLE %s (\n"
33536 " type text,\n"
33537 " name text,\n"
33538 " tbl_name text,\n"
33539 " rootpage integer,\n"
33540 " sql text\n"
33541 ");\n", zName);
 
 
33542 }
33543 }
33544 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
33545 if( rc ){
33546 shellDatabaseError(p->db);
@@ -33596,11 +33617,11 @@
33596 }else{
33597 sqlite3_str_appendf(pSql, " LIKE %Q ESCAPE '\\' AND ", zName);
33598 }
33599 }
33600 if( bNoSystemTabs ){
33601 sqlite3_str_appendf(pSql, " name NOT LIKE 'sqlite__%%' ESCALE '_' AND ");
33602 }
33603 sqlite3_str_appendf(pSql, "sql IS NOT NULL ORDER BY snum, rowid");
33604 if( bDebug ){
33605 cli_printf(p->out, "SQL: %s;\n", sqlite3_str_value(pSql));
33606 }else{
@@ -36140,11 +36161,30 @@
36140
36141 if( zVfs ){
36142 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
36143 if( pVfs ){
36144 sqlite3_vfs_register(pVfs, 1);
36145 }else{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36146 cli_printf(stderr,"no such VFS: \"%s\"\n", zVfs);
36147 exit(1);
36148 }
36149 }
36150
36151
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -79,10 +79,14 @@
79 ** should only be used when building the "fiddle" web application, as
80 ** the browser-mode build has much different user input requirements
81 ** and this build mode rewires the user input subsystem to account for
82 ** that.
83 */
84 #if defined(SQLITE_SHELL_FIDDLE)
85 # undef SQLITE_OMIT_LOAD_EXTENSION
86 # define SQLITE_OMIT_LOAD_EXTENSION 1
87 #endif
88
89 /*
90 ** Warning pragmas copied from msvc.h in the core.
91 */
92 #if defined(_MSC_VER)
@@ -995,10 +999,19 @@
999 */
1000 static void qrfOom(Qrf *p){
1001 qrfError(p, SQLITE_NOMEM, "out of memory");
1002 }
1003
1004 /*
1005 ** Transfer any error in pStr over into p.
1006 */
1007 static void qrfStrErr(Qrf *p, sqlite3_str *pStr){
1008 int rc = pStr ? sqlite3_str_errcode(pStr) : 0;
1009 if( rc ){
1010 qrfError(p, rc, sqlite3_errstr(rc));
1011 }
1012 }
1013
1014
1015 /*
1016 ** Add a new entry to the EXPLAIN QUERY PLAN data
1017 */
@@ -1217,11 +1230,13 @@
1230 sqlite3_str_reset(pLine);
1231 }else{
1232 qrfEqpAppend(p, iId, iPid, zo);
1233 }
1234 }
1235 qrfStrErr(p, pLine);
1236 sqlite3_free(sqlite3_str_finish(pLine));
1237 qrfStrErr(p, pStats);
1238 sqlite3_free(sqlite3_str_finish(pStats));
1239 #endif
1240 }
1241
1242
@@ -2731,10 +2746,11 @@
2746 int nNL = 0;
2747 int n, w;
2748 pStr = sqlite3_str_new(p->db);
2749 qrfEncodeText(p, pStr, z ? z : "");
2750 n = sqlite3_str_length(pStr);
2751 qrfStrErr(p, pStr);
2752 z = data.az[data.n] = sqlite3_str_finish(pStr);
2753 if( p->spec.nTitleLimit ){
2754 nNL = 0;
2755 data.aiWth[data.n] = w = qrfTitleLimit(data.az[data.n],
2756 p->spec.nTitleLimit );
@@ -2758,10 +2774,11 @@
2774 int n, w;
2775 int eType = sqlite3_column_type(p->pStmt,i);
2776 pStr = sqlite3_str_new(p->db);
2777 qrfRenderValue(p, pStr, i);
2778 n = sqlite3_str_length(pStr);
2779 qrfStrErr(p, pStr);
2780 z = data.az[data.n] = sqlite3_str_finish(pStr);
2781 data.abNum[data.n] = eType==SQLITE_INTEGER || eType==SQLITE_FLOAT;
2782 data.aiWth[data.n] = w = qrfDisplayWidth(z, n, &nNL);
2783 data.n++;
2784 if( w>data.a[i].mxW ) data.a[i].mxW = w;
@@ -2912,11 +2929,11 @@
2929 ){
2930 bRTrim = 1;
2931 }else{
2932 bRTrim = 0;
2933 }
2934 for(i=0; i<data.n && sqlite3_str_errcode(p->pOut)==SQLITE_OK; i+=nColumn){
2935 int bMore;
2936 int nRow = 0;
2937
2938 /* Draw a single row of the table. This might be the title line
2939 ** (if there is a title line) or a row in the body of the table.
@@ -3099,11 +3116,11 @@
3116 assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 0), "addr" ) );
3117 assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 1), "opcode" ) );
3118 assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 2), "p1" ) );
3119 assert( 0==sqlite3_stricmp( sqlite3_column_name(p->pStmt, 3), "p2" ) );
3120
3121 for(iOp=0; SQLITE_ROW==sqlite3_step(p->pStmt) && !p->iErr; iOp++){
3122 int iAddr = sqlite3_column_int(p->pStmt, 0);
3123 const char *zOp = (const char*)sqlite3_column_text(p->pStmt, 1);
3124 int p1 = sqlite3_column_int(p->pStmt, 2);
3125 int p2 = sqlite3_column_int(p->pStmt, 3);
3126
@@ -3156,11 +3173,11 @@
3173 nWidth = sizeof(aScanExpWidth)/sizeof(int);
3174 iIndent = 3;
3175 }
3176 if( nArg>nWidth ) nArg = nWidth;
3177
3178 for(iOp=0; sqlite3_step(p->pStmt)==SQLITE_ROW && !p->iErr; iOp++){
3179 /* If this is the first row seen, print out the headers */
3180 if( iOp==0 ){
3181 for(i=0; i<nArg; i++){
3182 const char *zCol = sqlite3_column_name(p->pStmt, aMap[i]);
3183 qrfWidthPrint(p,p->pOut, aWidth[i], zCol);
@@ -3412,10 +3429,11 @@
3429 sqlite3_str_append(p->pOut, "\n", 1);
3430 zVal += iNext;
3431 }while( zVal[0] );
3432 sqlite3_str_reset(pVal);
3433 }
3434 qrfStrErr(p, pVal);
3435 sqlite3_free(sqlite3_str_finish(pVal));
3436 qrfWrite(p);
3437 break;
3438 }
3439 case QRF_STYLE_Eqp: {
@@ -3475,11 +3493,11 @@
3493 p->pOut = sqlite3_str_new(p->db);
3494 if( p->pOut==0 ){
3495 qrfOom(p);
3496 return;
3497 }
3498 p->iErr = SQLITE_OK;
3499 p->nCol = sqlite3_column_count(p->pStmt);
3500 p->nRow = 0;
3501 sz = sizeof(sqlite3_qrf_spec);
3502 memcpy(&p->spec, pSpec, sz);
3503 if( p->spec.zNull==0 ) p->spec.zNull = "";
@@ -3653,10 +3671,11 @@
3671 qrfEqpRender(p, 0);
3672 qrfWrite(p);
3673 break;
3674 }
3675 }
3676 qrfStrErr(p, p->pOut);
3677 if( p->spec.pzOutput ){
3678 if( p->spec.pzOutput[0] ){
3679 sqlite3_int64 n, sz;
3680 char *zCombined;
3681 sz = strlen(p->spec.pzOutput[0]);
@@ -9475,11 +9494,11 @@
9494 ** (X) match X
9495 ** X|Y X or Y
9496 ** ^X X occurring at the beginning of the string
9497 ** X$ X occurring at the end of the string
9498 ** . Match any single character
9499 ** \c Character c where c is one of \{}()[]|*+?-.
9500 ** \c C-language escapes for c in afnrtv. ex: \t or \n
9501 ** \uXXXX Where XXXX is exactly 4 hex digits, unicode value XXXX
9502 ** \xXX Where XX is exactly 2 hex digits, unicode value XX
9503 ** [abc] Any single character from the set abc
9504 ** [^abc] Any single character not in the set abc
@@ -9860,11 +9879,11 @@
9879
9880 /* A backslash character has been seen, read the next character and
9881 ** return its interpretation.
9882 */
9883 static unsigned re_esc_char(ReCompiled *p){
9884 static const char zEsc[] = "afnrtv\\()*.+?[$^{|}]-";
9885 static const char zTrans[] = "\a\f\n\r\t\v";
9886 int i, v = 0;
9887 char c;
9888 if( p->sIn.i>=p->sIn.mx ) return 0;
9889 c = p->sIn.z[p->sIn.i];
@@ -33530,17 +33549,19 @@
33549 || sqlite3_strlike(zName, "sqlite_schema", '\\')==0
33550 || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0
33551 || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0;
33552 if( isSchema ){
33553 cli_printf(p->out,
33554 "CREATE TABLE %ssqlite_schema (\n"
33555 " type text,\n"
33556 " name text,\n"
33557 " tbl_name text,\n"
33558 " rootpage integer,\n"
33559 " sql text\n"
33560 ");\n",
33561 sqlite3_strlike("sqlite_t%",zName,0)==0 ? "temp." : ""
33562 );
33563 }
33564 }
33565 rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0);
33566 if( rc ){
33567 shellDatabaseError(p->db);
@@ -33596,11 +33617,11 @@
33617 }else{
33618 sqlite3_str_appendf(pSql, " LIKE %Q ESCAPE '\\' AND ", zName);
33619 }
33620 }
33621 if( bNoSystemTabs ){
33622 sqlite3_str_appendf(pSql, " name NOT LIKE 'sqlite__%%' ESCAPE '_' AND ");
33623 }
33624 sqlite3_str_appendf(pSql, "sql IS NOT NULL ORDER BY snum, rowid");
33625 if( bDebug ){
33626 cli_printf(p->out, "SQL: %s;\n", sqlite3_str_value(pSql));
33627 }else{
@@ -36140,11 +36161,30 @@
36161
36162 if( zVfs ){
36163 sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs);
36164 if( pVfs ){
36165 sqlite3_vfs_register(pVfs, 1);
36166 }
36167 #if !defined(SQLITE_OMIT_LOAD_EXTENSION)
36168 else if( access(zVfs,0)==0 ){
36169 /* If the VFS name is not the name of an existing VFS, but it is
36170 ** the name of a file, then try to load that file as an extension.
36171 ** Presumably the extension implements the desired VFS. */
36172 sqlite3 *db = 0;
36173 char *zErr = 0;
36174 sqlite3_open(":memory:", &db);
36175 sqlite3_enable_load_extension(db, 1);
36176 rc = sqlite3_load_extension(db, zVfs, 0, &zErr);
36177 sqlite3_close(db);
36178 if( (rc&0xff)!=SQLITE_OK ){
36179 cli_printf(stderr, "could not load extension VFS \"%s\": %s\n",
36180 zVfs, zErr);
36181 exit(1);
36182 }
36183 }
36184 #endif
36185 else{
36186 cli_printf(stderr,"no such VFS: \"%s\"\n", zVfs);
36187 exit(1);
36188 }
36189 }
36190
36191
+24 -10
--- 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
-** 707c0f6442e946f23de061ee2753eb5994ab with changes in files:
21
+** 9adab8b2bef4130abd358d53384cb5f4dd69 with changes in files:
2222
**
2323
**
2424
*/
2525
#ifndef SQLITE_AMALGAMATION
2626
#define SQLITE_CORE 1
@@ -467,14 +467,14 @@
467467
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
468468
** [sqlite_version()] and [sqlite_source_id()].
469469
*/
470470
#define SQLITE_VERSION "3.52.0"
471471
#define SQLITE_VERSION_NUMBER 3052000
472
-#define SQLITE_SOURCE_ID "2026-01-04 11:05:05 707c0f6442e946f23de061ee2753eb5994ab55d411c49b232799f309ba0f10cf"
472
+#define SQLITE_SOURCE_ID "2026-01-09 00:41:35 9adab8b2bef4130abd358d53384cb5f4dd691b808336bb7102793b0165b1c516"
473473
#define SQLITE_SCM_BRANCH "trunk"
474474
#define SQLITE_SCM_TAGS ""
475
-#define SQLITE_SCM_DATETIME "2026-01-04T11:05:05.639Z"
475
+#define SQLITE_SCM_DATETIME "2026-01-09T00:41:35.433Z"
476476
477477
/*
478478
** CAPI3REF: Run-Time Library Version Numbers
479479
** KEYWORDS: sqlite3_version sqlite3_sourceid
480480
**
@@ -6623,14 +6623,18 @@
66236623
** use for client data is to provide a mechanism for wrapper libraries
66246624
** to store additional information about an SQLite database connection.
66256625
**
66266626
** There is no limit (other than available memory) on the number of different
66276627
** client data pointers (with different names) that can be attached to a
6628
-** single database connection. However, the implementation is optimized
6629
-** for the case of having only one or two different client data names.
6630
-** Applications and wrapper libraries are discouraged from using more than
6631
-** one client data name each.
6628
+** single database connection. However, the current implementation stores
6629
+** the content on a linked list. Insert and retrieval performance will
6630
+** be proportional to the number of entries. The design use case, and
6631
+** the use case for which the implementation is optimized, is
6632
+** that an application will store only small number of client data names,
6633
+** typically just one or two. This interface is not intended to be a
6634
+** generalized key/value store for thousands or millions of keys. It
6635
+** will work for that, but performance might be disappointing.
66326636
**
66336637
** There is no way to enumerate the client data pointers
66346638
** associated with a database connection. The N parameter can be thought
66356639
** of as a secret key such that only code that knows the secret key is able
66366640
** to access the associated data.
@@ -160155,13 +160159,15 @@
160155160159
if( rc!=SQLITE_OK ) goto end_of_vacuum;
160156160160
assert( (db->nDb-1)==nDb );
160157160161
pDb = &db->aDb[nDb];
160158160162
assert( strcmp(pDb->zDbSName,zDbVacuum)==0 );
160159160163
pTemp = pDb->pBt;
160164
+ nRes = sqlite3BtreeGetRequestedReserve(pMain);
160160160165
if( pOut ){
160161160166
sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp));
160162160167
i64 sz = 0;
160168
+ const char *zFilename;
160163160169
if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){
160164160170
rc = SQLITE_ERROR;
160165160171
sqlite3SetString(pzErrMsg, db, "output file already exists");
160166160172
goto end_of_vacuum;
160167160173
}
@@ -160169,12 +160175,20 @@
160169160175
160170160176
/* For a VACUUM INTO, the pager-flags are set to the same values as
160171160177
** they are for the database being vacuumed, except that PAGER_CACHESPILL
160172160178
** is always set. */
160173160179
pgflags = db->aDb[iDb].safety_level | (db->flags & PAGER_FLAGS_MASK);
160180
+
160181
+ /* If the VACUUM INTO target file is a URI filename and if the
160182
+ ** "reserve=N" query parameter is present, reset the reserve to the
160183
+ ** amount specified, if the amount is within range */
160184
+ zFilename = sqlite3BtreeGetFilename(pTemp);
160185
+ if( ALWAYS(zFilename) ){
160186
+ int nNew = (int)sqlite3_uri_int64(zFilename, "reserve", nRes);
160187
+ if( nNew>=0 && nNew<=255 ) nRes = nNew;
160188
+ }
160174160189
}
160175
- nRes = sqlite3BtreeGetRequestedReserve(pMain);
160176160190
160177160191
sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size);
160178160192
sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0));
160179160193
sqlite3BtreeSetPagerFlags(pTemp, pgflags|PAGER_CACHESPILL);
160180160194
@@ -220289,11 +220303,11 @@
220289220303
tree.nBytesPerCell = 8 + 8 * tree.nDim;
220290220304
node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
220291220305
if( node.zData==0 ) return;
220292220306
nData = sqlite3_value_bytes(apArg[1]);
220293220307
if( nData<4 ) return;
220294
- if( nData<NCELL(&node)*tree.nBytesPerCell ) return;
220308
+ if( nData<4+NCELL(&node)*tree.nBytesPerCell ) return;
220295220309
220296220310
pOut = sqlite3_str_new(0);
220297220311
for(ii=0; ii<NCELL(&node); ii++){
220298220312
RtreeCell cell;
220299220313
int jj;
@@ -261166,11 +261180,11 @@
261166261180
int nArg, /* Number of args */
261167261181
sqlite3_value **apUnused /* Function arguments */
261168261182
){
261169261183
assert( nArg==0 );
261170261184
UNUSED_PARAM2(nArg, apUnused);
261171
- sqlite3_result_text(pCtx, "fts5: 2026-01-04 11:05:05 707c0f6442e946f23de061ee2753eb5994ab55d411c49b232799f309ba0f10cf", -1, SQLITE_TRANSIENT);
261185
+ sqlite3_result_text(pCtx, "fts5: 2026-01-09 00:41:35 9adab8b2bef4130abd358d53384cb5f4dd691b808336bb7102793b0165b1c516", -1, SQLITE_TRANSIENT);
261172261186
}
261173261187
261174261188
/*
261175261189
** Implementation of fts5_locale(LOCALE, TEXT) function.
261176261190
**
261177261191
--- 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 ** 707c0f6442e946f23de061ee2753eb5994ab with changes in files:
22 **
23 **
24 */
25 #ifndef SQLITE_AMALGAMATION
26 #define SQLITE_CORE 1
@@ -467,14 +467,14 @@
467 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
468 ** [sqlite_version()] and [sqlite_source_id()].
469 */
470 #define SQLITE_VERSION "3.52.0"
471 #define SQLITE_VERSION_NUMBER 3052000
472 #define SQLITE_SOURCE_ID "2026-01-04 11:05:05 707c0f6442e946f23de061ee2753eb5994ab55d411c49b232799f309ba0f10cf"
473 #define SQLITE_SCM_BRANCH "trunk"
474 #define SQLITE_SCM_TAGS ""
475 #define SQLITE_SCM_DATETIME "2026-01-04T11:05:05.639Z"
476
477 /*
478 ** CAPI3REF: Run-Time Library Version Numbers
479 ** KEYWORDS: sqlite3_version sqlite3_sourceid
480 **
@@ -6623,14 +6623,18 @@
6623 ** use for client data is to provide a mechanism for wrapper libraries
6624 ** to store additional information about an SQLite database connection.
6625 **
6626 ** There is no limit (other than available memory) on the number of different
6627 ** client data pointers (with different names) that can be attached to a
6628 ** single database connection. However, the implementation is optimized
6629 ** for the case of having only one or two different client data names.
6630 ** Applications and wrapper libraries are discouraged from using more than
6631 ** one client data name each.
 
 
 
 
6632 **
6633 ** There is no way to enumerate the client data pointers
6634 ** associated with a database connection. The N parameter can be thought
6635 ** of as a secret key such that only code that knows the secret key is able
6636 ** to access the associated data.
@@ -160155,13 +160159,15 @@
160155 if( rc!=SQLITE_OK ) goto end_of_vacuum;
160156 assert( (db->nDb-1)==nDb );
160157 pDb = &db->aDb[nDb];
160158 assert( strcmp(pDb->zDbSName,zDbVacuum)==0 );
160159 pTemp = pDb->pBt;
 
160160 if( pOut ){
160161 sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp));
160162 i64 sz = 0;
 
160163 if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){
160164 rc = SQLITE_ERROR;
160165 sqlite3SetString(pzErrMsg, db, "output file already exists");
160166 goto end_of_vacuum;
160167 }
@@ -160169,12 +160175,20 @@
160169
160170 /* For a VACUUM INTO, the pager-flags are set to the same values as
160171 ** they are for the database being vacuumed, except that PAGER_CACHESPILL
160172 ** is always set. */
160173 pgflags = db->aDb[iDb].safety_level | (db->flags & PAGER_FLAGS_MASK);
 
 
 
 
 
 
 
 
 
160174 }
160175 nRes = sqlite3BtreeGetRequestedReserve(pMain);
160176
160177 sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size);
160178 sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0));
160179 sqlite3BtreeSetPagerFlags(pTemp, pgflags|PAGER_CACHESPILL);
160180
@@ -220289,11 +220303,11 @@
220289 tree.nBytesPerCell = 8 + 8 * tree.nDim;
220290 node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
220291 if( node.zData==0 ) return;
220292 nData = sqlite3_value_bytes(apArg[1]);
220293 if( nData<4 ) return;
220294 if( nData<NCELL(&node)*tree.nBytesPerCell ) return;
220295
220296 pOut = sqlite3_str_new(0);
220297 for(ii=0; ii<NCELL(&node); ii++){
220298 RtreeCell cell;
220299 int jj;
@@ -261166,11 +261180,11 @@
261166 int nArg, /* Number of args */
261167 sqlite3_value **apUnused /* Function arguments */
261168 ){
261169 assert( nArg==0 );
261170 UNUSED_PARAM2(nArg, apUnused);
261171 sqlite3_result_text(pCtx, "fts5: 2026-01-04 11:05:05 707c0f6442e946f23de061ee2753eb5994ab55d411c49b232799f309ba0f10cf", -1, SQLITE_TRANSIENT);
261172 }
261173
261174 /*
261175 ** Implementation of fts5_locale(LOCALE, TEXT) function.
261176 **
261177
--- 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 ** 9adab8b2bef4130abd358d53384cb5f4dd69 with changes in files:
22 **
23 **
24 */
25 #ifndef SQLITE_AMALGAMATION
26 #define SQLITE_CORE 1
@@ -467,14 +467,14 @@
467 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
468 ** [sqlite_version()] and [sqlite_source_id()].
469 */
470 #define SQLITE_VERSION "3.52.0"
471 #define SQLITE_VERSION_NUMBER 3052000
472 #define SQLITE_SOURCE_ID "2026-01-09 00:41:35 9adab8b2bef4130abd358d53384cb5f4dd691b808336bb7102793b0165b1c516"
473 #define SQLITE_SCM_BRANCH "trunk"
474 #define SQLITE_SCM_TAGS ""
475 #define SQLITE_SCM_DATETIME "2026-01-09T00:41:35.433Z"
476
477 /*
478 ** CAPI3REF: Run-Time Library Version Numbers
479 ** KEYWORDS: sqlite3_version sqlite3_sourceid
480 **
@@ -6623,14 +6623,18 @@
6623 ** use for client data is to provide a mechanism for wrapper libraries
6624 ** to store additional information about an SQLite database connection.
6625 **
6626 ** There is no limit (other than available memory) on the number of different
6627 ** client data pointers (with different names) that can be attached to a
6628 ** single database connection. However, the current implementation stores
6629 ** the content on a linked list. Insert and retrieval performance will
6630 ** be proportional to the number of entries. The design use case, and
6631 ** the use case for which the implementation is optimized, is
6632 ** that an application will store only small number of client data names,
6633 ** typically just one or two. This interface is not intended to be a
6634 ** generalized key/value store for thousands or millions of keys. It
6635 ** will work for that, but performance might be disappointing.
6636 **
6637 ** There is no way to enumerate the client data pointers
6638 ** associated with a database connection. The N parameter can be thought
6639 ** of as a secret key such that only code that knows the secret key is able
6640 ** to access the associated data.
@@ -160155,13 +160159,15 @@
160159 if( rc!=SQLITE_OK ) goto end_of_vacuum;
160160 assert( (db->nDb-1)==nDb );
160161 pDb = &db->aDb[nDb];
160162 assert( strcmp(pDb->zDbSName,zDbVacuum)==0 );
160163 pTemp = pDb->pBt;
160164 nRes = sqlite3BtreeGetRequestedReserve(pMain);
160165 if( pOut ){
160166 sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp));
160167 i64 sz = 0;
160168 const char *zFilename;
160169 if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){
160170 rc = SQLITE_ERROR;
160171 sqlite3SetString(pzErrMsg, db, "output file already exists");
160172 goto end_of_vacuum;
160173 }
@@ -160169,12 +160175,20 @@
160175
160176 /* For a VACUUM INTO, the pager-flags are set to the same values as
160177 ** they are for the database being vacuumed, except that PAGER_CACHESPILL
160178 ** is always set. */
160179 pgflags = db->aDb[iDb].safety_level | (db->flags & PAGER_FLAGS_MASK);
160180
160181 /* If the VACUUM INTO target file is a URI filename and if the
160182 ** "reserve=N" query parameter is present, reset the reserve to the
160183 ** amount specified, if the amount is within range */
160184 zFilename = sqlite3BtreeGetFilename(pTemp);
160185 if( ALWAYS(zFilename) ){
160186 int nNew = (int)sqlite3_uri_int64(zFilename, "reserve", nRes);
160187 if( nNew>=0 && nNew<=255 ) nRes = nNew;
160188 }
160189 }
 
160190
160191 sqlite3BtreeSetCacheSize(pTemp, db->aDb[iDb].pSchema->cache_size);
160192 sqlite3BtreeSetSpillSize(pTemp, sqlite3BtreeSetSpillSize(pMain,0));
160193 sqlite3BtreeSetPagerFlags(pTemp, pgflags|PAGER_CACHESPILL);
160194
@@ -220289,11 +220303,11 @@
220303 tree.nBytesPerCell = 8 + 8 * tree.nDim;
220304 node.zData = (u8 *)sqlite3_value_blob(apArg[1]);
220305 if( node.zData==0 ) return;
220306 nData = sqlite3_value_bytes(apArg[1]);
220307 if( nData<4 ) return;
220308 if( nData<4+NCELL(&node)*tree.nBytesPerCell ) return;
220309
220310 pOut = sqlite3_str_new(0);
220311 for(ii=0; ii<NCELL(&node); ii++){
220312 RtreeCell cell;
220313 int jj;
@@ -261166,11 +261180,11 @@
261180 int nArg, /* Number of args */
261181 sqlite3_value **apUnused /* Function arguments */
261182 ){
261183 assert( nArg==0 );
261184 UNUSED_PARAM2(nArg, apUnused);
261185 sqlite3_result_text(pCtx, "fts5: 2026-01-09 00:41:35 9adab8b2bef4130abd358d53384cb5f4dd691b808336bb7102793b0165b1c516", -1, SQLITE_TRANSIENT);
261186 }
261187
261188 /*
261189 ** Implementation of fts5_locale(LOCALE, TEXT) function.
261190 **
261191
+10 -6
--- extsrc/sqlite3.h
+++ extsrc/sqlite3.h
@@ -146,14 +146,14 @@
146146
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
147147
** [sqlite_version()] and [sqlite_source_id()].
148148
*/
149149
#define SQLITE_VERSION "3.52.0"
150150
#define SQLITE_VERSION_NUMBER 3052000
151
-#define SQLITE_SOURCE_ID "2026-01-04 11:05:05 707c0f6442e946f23de061ee2753eb5994ab55d411c49b232799f309ba0f10cf"
151
+#define SQLITE_SOURCE_ID "2026-01-09 00:41:35 9adab8b2bef4130abd358d53384cb5f4dd691b808336bb7102793b0165b1c516"
152152
#define SQLITE_SCM_BRANCH "trunk"
153153
#define SQLITE_SCM_TAGS ""
154
-#define SQLITE_SCM_DATETIME "2026-01-04T11:05:05.639Z"
154
+#define SQLITE_SCM_DATETIME "2026-01-09T00:41:35.433Z"
155155
156156
/*
157157
** CAPI3REF: Run-Time Library Version Numbers
158158
** KEYWORDS: sqlite3_version sqlite3_sourceid
159159
**
@@ -6302,14 +6302,18 @@
63026302
** use for client data is to provide a mechanism for wrapper libraries
63036303
** to store additional information about an SQLite database connection.
63046304
**
63056305
** There is no limit (other than available memory) on the number of different
63066306
** client data pointers (with different names) that can be attached to a
6307
-** single database connection. However, the implementation is optimized
6308
-** for the case of having only one or two different client data names.
6309
-** Applications and wrapper libraries are discouraged from using more than
6310
-** one client data name each.
6307
+** single database connection. However, the current implementation stores
6308
+** the content on a linked list. Insert and retrieval performance will
6309
+** be proportional to the number of entries. The design use case, and
6310
+** the use case for which the implementation is optimized, is
6311
+** that an application will store only small number of client data names,
6312
+** typically just one or two. This interface is not intended to be a
6313
+** generalized key/value store for thousands or millions of keys. It
6314
+** will work for that, but performance might be disappointing.
63116315
**
63126316
** There is no way to enumerate the client data pointers
63136317
** associated with a database connection. The N parameter can be thought
63146318
** of as a secret key such that only code that knows the secret key is able
63156319
** to access the associated data.
63166320
--- extsrc/sqlite3.h
+++ extsrc/sqlite3.h
@@ -146,14 +146,14 @@
146 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
147 ** [sqlite_version()] and [sqlite_source_id()].
148 */
149 #define SQLITE_VERSION "3.52.0"
150 #define SQLITE_VERSION_NUMBER 3052000
151 #define SQLITE_SOURCE_ID "2026-01-04 11:05:05 707c0f6442e946f23de061ee2753eb5994ab55d411c49b232799f309ba0f10cf"
152 #define SQLITE_SCM_BRANCH "trunk"
153 #define SQLITE_SCM_TAGS ""
154 #define SQLITE_SCM_DATETIME "2026-01-04T11:05:05.639Z"
155
156 /*
157 ** CAPI3REF: Run-Time Library Version Numbers
158 ** KEYWORDS: sqlite3_version sqlite3_sourceid
159 **
@@ -6302,14 +6302,18 @@
6302 ** use for client data is to provide a mechanism for wrapper libraries
6303 ** to store additional information about an SQLite database connection.
6304 **
6305 ** There is no limit (other than available memory) on the number of different
6306 ** client data pointers (with different names) that can be attached to a
6307 ** single database connection. However, the implementation is optimized
6308 ** for the case of having only one or two different client data names.
6309 ** Applications and wrapper libraries are discouraged from using more than
6310 ** one client data name each.
 
 
 
 
6311 **
6312 ** There is no way to enumerate the client data pointers
6313 ** associated with a database connection. The N parameter can be thought
6314 ** of as a secret key such that only code that knows the secret key is able
6315 ** to access the associated data.
6316
--- extsrc/sqlite3.h
+++ extsrc/sqlite3.h
@@ -146,14 +146,14 @@
146 ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
147 ** [sqlite_version()] and [sqlite_source_id()].
148 */
149 #define SQLITE_VERSION "3.52.0"
150 #define SQLITE_VERSION_NUMBER 3052000
151 #define SQLITE_SOURCE_ID "2026-01-09 00:41:35 9adab8b2bef4130abd358d53384cb5f4dd691b808336bb7102793b0165b1c516"
152 #define SQLITE_SCM_BRANCH "trunk"
153 #define SQLITE_SCM_TAGS ""
154 #define SQLITE_SCM_DATETIME "2026-01-09T00:41:35.433Z"
155
156 /*
157 ** CAPI3REF: Run-Time Library Version Numbers
158 ** KEYWORDS: sqlite3_version sqlite3_sourceid
159 **
@@ -6302,14 +6302,18 @@
6302 ** use for client data is to provide a mechanism for wrapper libraries
6303 ** to store additional information about an SQLite database connection.
6304 **
6305 ** There is no limit (other than available memory) on the number of different
6306 ** client data pointers (with different names) that can be attached to a
6307 ** single database connection. However, the current implementation stores
6308 ** the content on a linked list. Insert and retrieval performance will
6309 ** be proportional to the number of entries. The design use case, and
6310 ** the use case for which the implementation is optimized, is
6311 ** that an application will store only small number of client data names,
6312 ** typically just one or two. This interface is not intended to be a
6313 ** generalized key/value store for thousands or millions of keys. It
6314 ** will work for that, but performance might be disappointing.
6315 **
6316 ** There is no way to enumerate the client data pointers
6317 ** associated with a database connection. The N parameter can be thought
6318 ** of as a secret key such that only code that knows the secret key is able
6319 ** to access the associated data.
6320

Keyboard Shortcuts

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