Fossil SCM

Update the built-in SQLite to the first 3.44.0 beta, for testing.

drh 2023-10-24 12:04 trunk
Commit 39bcd310e889538d4a50038165d1230f8e0608aa41522c86a717e6f4026b9d9f
+102 -2
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -11058,11 +11058,11 @@
1105811058
# define NEVER(X) (X)
1105911059
#endif
1106011060
#endif /* !defined(SQLITE_AMALGAMATION) */
1106111061
1106211062
11063
-#ifndef SQLITE_OMIT_VIRTUALTABLE
11063
+#ifndef SQLITE_OMIT_VIRTUALTABLE
1106411064
1106511065
/* typedef sqlite3_int64 i64; */
1106611066
/* typedef sqlite3_uint64 u64; */
1106711067
1106811068
typedef struct IdxColumn IdxColumn;
@@ -12845,10 +12845,92 @@
1284512845
1284612846
sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
1284712847
return rc;
1284812848
}
1284912849
12850
+/*
12851
+** Define and possibly pretend to use a useless collation sequence.
12852
+** This pretense allows expert to accept SQL using custom collations.
12853
+*/
12854
+int dummyCompare(void *up1, int up2, const void *up3, int up4, const void *up5){
12855
+ (void)up1;
12856
+ (void)up2;
12857
+ (void)up3;
12858
+ (void)up4;
12859
+ (void)up5;
12860
+ assert(0); /* VDBE should never be run. */
12861
+ return 0;
12862
+}
12863
+/* And a callback to register above upon actual need */
12864
+void useDummyCS(void *up1, sqlite3 *db, int etr, const char *zName){
12865
+ (void)up1;
12866
+ sqlite3_create_collation_v2(db, zName, etr, 0, dummyCompare, 0);
12867
+}
12868
+
12869
+#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
12870
+ && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
12871
+/*
12872
+** dummy functions for no-op implementation of UDFs during expert's work
12873
+*/
12874
+void dummyUDF(sqlite3_context *up1, int up2, sqlite3_value **up3){
12875
+ (void)up1;
12876
+ (void)up2;
12877
+ (void)up3;
12878
+ assert(0); /* VDBE should never be run. */
12879
+}
12880
+void dummyUDFvalue(sqlite3_context *up1){
12881
+ (void)up1;
12882
+ assert(0); /* VDBE should never be run. */
12883
+}
12884
+
12885
+/*
12886
+** Register UDFs from user database with another.
12887
+*/
12888
+int registerUDFs(sqlite3 *dbSrc, sqlite3 *dbDst){
12889
+ sqlite3_stmt *pStmt;
12890
+ int rc = sqlite3_prepare_v2(dbSrc,
12891
+ "SELECT name,type,enc,narg,flags "
12892
+ "FROM pragma_function_list() "
12893
+ "WHERE builtin==0", -1, &pStmt, 0);
12894
+ if( rc==SQLITE_OK ){
12895
+ while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
12896
+ int nargs = sqlite3_column_int(pStmt,3);
12897
+ int flags = sqlite3_column_int(pStmt,4);
12898
+ const char *name = (char*)sqlite3_column_text(pStmt,0);
12899
+ const char *type = (char*)sqlite3_column_text(pStmt,1);
12900
+ const char *enc = (char*)sqlite3_column_text(pStmt,2);
12901
+ if( name==0 || type==0 || enc==0 ){
12902
+ /* no-op. Only happens on OOM */
12903
+ }else{
12904
+ int ienc = SQLITE_UTF8;
12905
+ int rcf = SQLITE_ERROR;
12906
+ if( strcmp(enc,"utf16le")==0 ) ienc = SQLITE_UTF16LE;
12907
+ else if( strcmp(enc,"utf16be")==0 ) ienc = SQLITE_UTF16BE;
12908
+ ienc |= (flags & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY));
12909
+ if( strcmp(type,"w")==0 ){
12910
+ rcf = sqlite3_create_window_function(dbDst,name,nargs,ienc,0,
12911
+ dummyUDF,dummyUDFvalue,0,0,0);
12912
+ }else if( strcmp(type,"a")==0 ){
12913
+ rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
12914
+ 0,dummyUDF,dummyUDFvalue);
12915
+ }else if( strcmp(type,"s")==0 ){
12916
+ rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
12917
+ dummyUDF,0,0);
12918
+ }
12919
+ if( rcf!=SQLITE_OK ){
12920
+ rc = rcf;
12921
+ break;
12922
+ }
12923
+ }
12924
+ }
12925
+ sqlite3_finalize(pStmt);
12926
+ if( rc==SQLITE_DONE ) rc = SQLITE_OK;
12927
+ }
12928
+ return rc;
12929
+}
12930
+#endif
12931
+
1285012932
/*
1285112933
** Allocate a new sqlite3expert object.
1285212934
*/
1285312935
sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
1285412936
int rc = SQLITE_OK;
@@ -12871,11 +12953,25 @@
1287112953
rc = sqlite3_open(":memory:", &pNew->dbm);
1287212954
if( rc==SQLITE_OK ){
1287312955
sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
1287412956
}
1287512957
}
12876
-
12958
+
12959
+ /* Allow custom collations to be dealt with through prepare. */
12960
+ if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbm,0,useDummyCS);
12961
+ if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbv,0,useDummyCS);
12962
+
12963
+#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
12964
+ && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
12965
+ /* Register UDFs from database [db] with [dbm] and [dbv]. */
12966
+ if( rc==SQLITE_OK ){
12967
+ rc = registerUDFs(pNew->db, pNew->dbm);
12968
+ }
12969
+ if( rc==SQLITE_OK ){
12970
+ rc = registerUDFs(pNew->db, pNew->dbv);
12971
+ }
12972
+#endif
1287712973
1287812974
/* Copy the entire schema of database [db] into [dbm]. */
1287912975
if( rc==SQLITE_OK ){
1288012976
sqlite3_stmt *pSql = 0;
1288112977
rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
@@ -12947,10 +13043,14 @@
1294713043
1294813044
if( p->bRun ) return SQLITE_MISUSE;
1294913045
1295013046
while( rc==SQLITE_OK && zStmt && zStmt[0] ){
1295113047
sqlite3_stmt *pStmt = 0;
13048
+ /* Ensure that the provided statement compiles against user's DB. */
13049
+ rc = idxPrepareStmt(p->db, &pStmt, pzErr, zStmt);
13050
+ if( rc!=SQLITE_OK ) break;
13051
+ sqlite3_finalize(pStmt);
1295213052
rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
1295313053
if( rc==SQLITE_OK ){
1295413054
if( pStmt ){
1295513055
IdxStatement *pNew;
1295613056
const char *z = sqlite3_sql(pStmt);
1295713057
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -11058,11 +11058,11 @@
11058 # define NEVER(X) (X)
11059 #endif
11060 #endif /* !defined(SQLITE_AMALGAMATION) */
11061
11062
11063 #ifndef SQLITE_OMIT_VIRTUALTABLE
11064
11065 /* typedef sqlite3_int64 i64; */
11066 /* typedef sqlite3_uint64 u64; */
11067
11068 typedef struct IdxColumn IdxColumn;
@@ -12845,10 +12845,92 @@
12845
12846 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
12847 return rc;
12848 }
12849
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12850 /*
12851 ** Allocate a new sqlite3expert object.
12852 */
12853 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
12854 int rc = SQLITE_OK;
@@ -12871,11 +12953,25 @@
12871 rc = sqlite3_open(":memory:", &pNew->dbm);
12872 if( rc==SQLITE_OK ){
12873 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
12874 }
12875 }
12876
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12877
12878 /* Copy the entire schema of database [db] into [dbm]. */
12879 if( rc==SQLITE_OK ){
12880 sqlite3_stmt *pSql = 0;
12881 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
@@ -12947,10 +13043,14 @@
12947
12948 if( p->bRun ) return SQLITE_MISUSE;
12949
12950 while( rc==SQLITE_OK && zStmt && zStmt[0] ){
12951 sqlite3_stmt *pStmt = 0;
 
 
 
 
12952 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
12953 if( rc==SQLITE_OK ){
12954 if( pStmt ){
12955 IdxStatement *pNew;
12956 const char *z = sqlite3_sql(pStmt);
12957
--- extsrc/shell.c
+++ extsrc/shell.c
@@ -11058,11 +11058,11 @@
11058 # define NEVER(X) (X)
11059 #endif
11060 #endif /* !defined(SQLITE_AMALGAMATION) */
11061
11062
11063 #ifndef SQLITE_OMIT_VIRTUALTABLE
11064
11065 /* typedef sqlite3_int64 i64; */
11066 /* typedef sqlite3_uint64 u64; */
11067
11068 typedef struct IdxColumn IdxColumn;
@@ -12845,10 +12845,92 @@
12845
12846 sqlite3_exec(p->db, "DROP TABLE IF EXISTS temp."UNIQUE_TABLE_NAME,0,0,0);
12847 return rc;
12848 }
12849
12850 /*
12851 ** Define and possibly pretend to use a useless collation sequence.
12852 ** This pretense allows expert to accept SQL using custom collations.
12853 */
12854 int dummyCompare(void *up1, int up2, const void *up3, int up4, const void *up5){
12855 (void)up1;
12856 (void)up2;
12857 (void)up3;
12858 (void)up4;
12859 (void)up5;
12860 assert(0); /* VDBE should never be run. */
12861 return 0;
12862 }
12863 /* And a callback to register above upon actual need */
12864 void useDummyCS(void *up1, sqlite3 *db, int etr, const char *zName){
12865 (void)up1;
12866 sqlite3_create_collation_v2(db, zName, etr, 0, dummyCompare, 0);
12867 }
12868
12869 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
12870 && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
12871 /*
12872 ** dummy functions for no-op implementation of UDFs during expert's work
12873 */
12874 void dummyUDF(sqlite3_context *up1, int up2, sqlite3_value **up3){
12875 (void)up1;
12876 (void)up2;
12877 (void)up3;
12878 assert(0); /* VDBE should never be run. */
12879 }
12880 void dummyUDFvalue(sqlite3_context *up1){
12881 (void)up1;
12882 assert(0); /* VDBE should never be run. */
12883 }
12884
12885 /*
12886 ** Register UDFs from user database with another.
12887 */
12888 int registerUDFs(sqlite3 *dbSrc, sqlite3 *dbDst){
12889 sqlite3_stmt *pStmt;
12890 int rc = sqlite3_prepare_v2(dbSrc,
12891 "SELECT name,type,enc,narg,flags "
12892 "FROM pragma_function_list() "
12893 "WHERE builtin==0", -1, &pStmt, 0);
12894 if( rc==SQLITE_OK ){
12895 while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
12896 int nargs = sqlite3_column_int(pStmt,3);
12897 int flags = sqlite3_column_int(pStmt,4);
12898 const char *name = (char*)sqlite3_column_text(pStmt,0);
12899 const char *type = (char*)sqlite3_column_text(pStmt,1);
12900 const char *enc = (char*)sqlite3_column_text(pStmt,2);
12901 if( name==0 || type==0 || enc==0 ){
12902 /* no-op. Only happens on OOM */
12903 }else{
12904 int ienc = SQLITE_UTF8;
12905 int rcf = SQLITE_ERROR;
12906 if( strcmp(enc,"utf16le")==0 ) ienc = SQLITE_UTF16LE;
12907 else if( strcmp(enc,"utf16be")==0 ) ienc = SQLITE_UTF16BE;
12908 ienc |= (flags & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY));
12909 if( strcmp(type,"w")==0 ){
12910 rcf = sqlite3_create_window_function(dbDst,name,nargs,ienc,0,
12911 dummyUDF,dummyUDFvalue,0,0,0);
12912 }else if( strcmp(type,"a")==0 ){
12913 rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
12914 0,dummyUDF,dummyUDFvalue);
12915 }else if( strcmp(type,"s")==0 ){
12916 rcf = sqlite3_create_function(dbDst,name,nargs,ienc,0,
12917 dummyUDF,0,0);
12918 }
12919 if( rcf!=SQLITE_OK ){
12920 rc = rcf;
12921 break;
12922 }
12923 }
12924 }
12925 sqlite3_finalize(pStmt);
12926 if( rc==SQLITE_DONE ) rc = SQLITE_OK;
12927 }
12928 return rc;
12929 }
12930 #endif
12931
12932 /*
12933 ** Allocate a new sqlite3expert object.
12934 */
12935 sqlite3expert *sqlite3_expert_new(sqlite3 *db, char **pzErrmsg){
12936 int rc = SQLITE_OK;
@@ -12871,11 +12953,25 @@
12953 rc = sqlite3_open(":memory:", &pNew->dbm);
12954 if( rc==SQLITE_OK ){
12955 sqlite3_db_config(pNew->dbm, SQLITE_DBCONFIG_TRIGGER_EQP, 1, (int*)0);
12956 }
12957 }
12958
12959 /* Allow custom collations to be dealt with through prepare. */
12960 if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbm,0,useDummyCS);
12961 if( rc==SQLITE_OK ) rc = sqlite3_collation_needed(pNew->dbv,0,useDummyCS);
12962
12963 #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) \
12964 && !defined(SQLITE_OMIT_INTROSPECTION_PRAGMAS)
12965 /* Register UDFs from database [db] with [dbm] and [dbv]. */
12966 if( rc==SQLITE_OK ){
12967 rc = registerUDFs(pNew->db, pNew->dbm);
12968 }
12969 if( rc==SQLITE_OK ){
12970 rc = registerUDFs(pNew->db, pNew->dbv);
12971 }
12972 #endif
12973
12974 /* Copy the entire schema of database [db] into [dbm]. */
12975 if( rc==SQLITE_OK ){
12976 sqlite3_stmt *pSql = 0;
12977 rc = idxPrintfPrepareStmt(pNew->db, &pSql, pzErrmsg,
@@ -12947,10 +13043,14 @@
13043
13044 if( p->bRun ) return SQLITE_MISUSE;
13045
13046 while( rc==SQLITE_OK && zStmt && zStmt[0] ){
13047 sqlite3_stmt *pStmt = 0;
13048 /* Ensure that the provided statement compiles against user's DB. */
13049 rc = idxPrepareStmt(p->db, &pStmt, pzErr, zStmt);
13050 if( rc!=SQLITE_OK ) break;
13051 sqlite3_finalize(pStmt);
13052 rc = sqlite3_prepare_v2(p->dbv, zStmt, -1, &pStmt, &zStmt);
13053 if( rc==SQLITE_OK ){
13054 if( pStmt ){
13055 IdxStatement *pNew;
13056 const char *z = sqlite3_sql(pStmt);
13057
+36 -14
--- 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
-** db82b4281a0e0d5e365553df11e0347f60c.
21
+** 4be9af4469d7e31ee852f67e5aa32996557.
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.44.0"
463463
#define SQLITE_VERSION_NUMBER 3044000
464
-#define SQLITE_SOURCE_ID "2023-10-23 02:01:14 0db82b4281a0e0d5e365553df11e0347f60c00c861c0fb96227059edff3a0ef6"
464
+#define SQLITE_SOURCE_ID "2023-10-24 11:06:44 54be9af4469d7e31ee852f67e5aa32996557c10de654a60103fd165d2fedf311"
465465
466466
/*
467467
** CAPI3REF: Run-Time Library Version Numbers
468468
** KEYWORDS: sqlite3_version sqlite3_sourceid
469469
**
@@ -80195,18 +80195,20 @@
8019580195
/*
8019680196
** Return non-zero if the bit in the IntegrityCk.aPgRef[] array that
8019780197
** corresponds to page iPg is already set.
8019880198
*/
8019980199
static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){
80200
+ assert( pCheck->aPgRef!=0 );
8020080201
assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 );
8020180202
return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07)));
8020280203
}
8020380204
8020480205
/*
8020580206
** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg.
8020680207
*/
8020780208
static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
80209
+ assert( pCheck->aPgRef!=0 );
8020880210
assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 );
8020980211
pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07));
8021080212
}
8021180213
8021280214
@@ -109460,14 +109462,14 @@
109460109462
int nAlloc;
109461109463
if( dupFlags ){
109462109464
nAlloc = dupedExprSize(p);
109463109465
}else if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
109464109466
nToken = sqlite3Strlen30NN(p->u.zToken)+1;
109465
- nAlloc = EXPR_FULLSIZE + ROUND8(nToken);
109467
+ nAlloc = ROUND8(EXPR_FULLSIZE + nToken);
109466109468
}else{
109467109469
nToken = 0;
109468
- nAlloc = EXPR_FULLSIZE;
109470
+ nAlloc = ROUND8(EXPR_FULLSIZE);
109469109471
}
109470109472
assert( nAlloc==ROUND8(nAlloc) );
109471109473
sEdupBuf.zAlloc = sqlite3DbMallocRawNN(db, nAlloc);
109472109474
#ifdef SQLITE_DEBUG
109473109475
sEdupBuf.zEnd = sEdupBuf.zAlloc ? sEdupBuf.zAlloc+nAlloc : 0;
@@ -138956,10 +138958,11 @@
138956138958
int r2; /* Previous key for WITHOUT ROWID tables */
138957138959
int mxCol; /* Maximum non-virtual column number */
138958138960
138959138961
if( pObjTab && pObjTab!=pTab ) continue;
138960138962
if( !IsOrdinaryTable(pTab) ){
138963
+#ifndef SQLITE_OMIT_VIRTUALTABLE
138961138964
sqlite3_vtab *pVTab;
138962138965
int a1;
138963138966
if( !IsVirtual(pTab) ) continue;
138964138967
if( pTab->nCol<=0 ){
138965138968
const char *zMod = pTab->u.vtab.azArg[0];
@@ -138975,10 +138978,11 @@
138975138978
sqlite3VdbeAddOp2(v, OP_VCheck, 0, 3);
138976138979
sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
138977138980
a1 = sqlite3VdbeAddOp1(v, OP_IsNull, 3); VdbeCoverage(v);
138978138981
integrityCheckResultRow(v);
138979138982
sqlite3VdbeJumpHere(v, a1);
138983
+#endif
138980138984
continue;
138981138985
}
138982138986
if( isQuick || HasRowid(pTab) ){
138983138987
pPk = 0;
138984138988
r2 = 0;
@@ -179837,11 +179841,11 @@
179837179841
void *pArg /* First callback argument */
179838179842
){
179839179843
void *pRet;
179840179844
179841179845
#ifdef SQLITE_ENABLE_API_ARMOR
179842
- if( db==0 || xCallback==0 ){
179846
+ if( db==0 ){
179843179847
return 0;
179844179848
}
179845179849
#endif
179846179850
sqlite3_mutex_enter(db->mutex);
179847179851
pRet = db->pPreUpdateArg;
@@ -187833,22 +187837,30 @@
187833187837
*/
187834187838
static int fts3Integrity(sqlite3_vtab *pVtab, char **pzErr){
187835187839
Fts3Table *p = (Fts3Table*)pVtab;
187836187840
char *zSql;
187837187841
int rc;
187842
+ char *zErr = 0;
187838187843
187839187844
zSql = sqlite3_mprintf(
187840187845
"INSERT INTO \"%w\".\"%w\"(\"%w\") VALUES('integrity-check');",
187841187846
p->zDb, p->zName, p->zName);
187842
- rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
187847
+ if( zSql==0 ){
187848
+ return SQLITE_NOMEM;
187849
+ }
187850
+ rc = sqlite3_exec(p->db, zSql, 0, 0, &zErr);
187843187851
sqlite3_free(zSql);
187844187852
if( (rc&0xff)==SQLITE_CORRUPT ){
187845187853
*pzErr = sqlite3_mprintf("malformed inverted index for FTS%d table %s.%s",
187846187854
p->bFts4 ? 4 : 3, p->zDb, p->zName);
187847
- rc = SQLITE_OK;
187855
+ }else if( rc!=SQLITE_OK ){
187856
+ *pzErr = sqlite3_mprintf("unable to validate the inverted index for"
187857
+ " FTS%d table %s.%s: %s",
187858
+ p->bFts4 ? 4 : 3, p->zDb, p->zName, zErr);
187848187859
}
187849
- return rc;
187860
+ sqlite3_free(zErr);
187861
+ return SQLITE_OK;
187850187862
}
187851187863
187852187864
187853187865
187854187866
static const sqlite3_module fts3Module = {
@@ -198115,10 +198127,12 @@
198115198127
assert( pNode->n>0 );
198116198128
assert_fts3_nc( (pNode->a[0]=='\0')==(aDoclist!=0) );
198117198129
198118198130
blobGrowBuffer(pPrev, nTerm, &rc);
198119198131
if( rc!=SQLITE_OK ) return rc;
198132
+ assert( pPrev!=0 );
198133
+ assert( pPrev->a!=0 );
198120198134
198121198135
nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm);
198122198136
nSuffix = nTerm - nPrefix;
198123198137
if( nSuffix<=0 ) return FTS_CORRUPT_VTAB;
198124198138
memcpy(pPrev->a, zTerm, nTerm);
@@ -221489,12 +221503,14 @@
221489221503
** The buffer that the argument points to contains a serialized SQL value.
221490221504
** Return the number of bytes of space occupied by the value (including
221491221505
** the type byte).
221492221506
*/
221493221507
static int sessionSerialLen(const u8 *a){
221494
- int e = *a;
221508
+ int e;
221495221509
int n;
221510
+ assert( a!=0 );
221511
+ e = *a;
221496221512
if( e==0 || e==0xFF ) return 1;
221497221513
if( e==SQLITE_NULL ) return 1;
221498221514
if( e==SQLITE_INTEGER || e==SQLITE_FLOAT ) return 9;
221499221515
return sessionVarintGet(&a[1], &n) + 1 + n;
221500221516
}
@@ -226336,10 +226352,11 @@
226336226352
int nRec, /* Number of bytes in aRec */
226337226353
SessionChange **ppNew /* OUT: Merged change */
226338226354
){
226339226355
SessionChange *pNew = 0;
226340226356
int rc = SQLITE_OK;
226357
+ assert( aRec!=0 );
226341226358
226342226359
if( !pExist ){
226343226360
pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec);
226344226361
if( !pNew ){
226345226362
return SQLITE_NOMEM;
@@ -247420,11 +247437,11 @@
247420247437
int nArg, /* Number of args */
247421247438
sqlite3_value **apUnused /* Function arguments */
247422247439
){
247423247440
assert( nArg==0 );
247424247441
UNUSED_PARAM2(nArg, apUnused);
247425
- sqlite3_result_text(pCtx, "fts5: 2023-10-22 23:44:32 678a9728dc6b88d8ef924c86603056df18204bc9a9c4776b9baffd7c5b10c5f2", -1, SQLITE_TRANSIENT);
247442
+ sqlite3_result_text(pCtx, "fts5: 2023-10-23 23:34:53 9d388267e4e6724e2df333fe09d509e87defcfe984c5c2ebe031152d320812d0", -1, SQLITE_TRANSIENT);
247426247443
}
247427247444
247428247445
/*
247429247446
** Return true if zName is the extension on one of the shadow tables used
247430247447
** by this module.
@@ -247447,23 +247464,28 @@
247447247464
*/
247448247465
static int fts5Integrity(sqlite3_vtab *pVtab, char **pzErr){
247449247466
Fts5FullTable *pTab = (Fts5FullTable*)pVtab;
247450247467
Fts5Config *pConfig = pTab->p.pConfig;
247451247468
char *zSql;
247469
+ char *zErr = 0;
247452247470
int rc;
247453247471
zSql = sqlite3_mprintf(
247454247472
"INSERT INTO \"%w\".\"%w\"(\"%w\") VALUES('integrity-check');",
247455247473
pConfig->zDb, pConfig->zName, pConfig->zName);
247456
- rc = sqlite3_exec(pConfig->db, zSql, 0, 0, 0);
247474
+ if( zSql==0 ) return SQLITE_NOMEM;
247475
+ rc = sqlite3_exec(pConfig->db, zSql, 0, 0, &zErr);
247457247476
sqlite3_free(zSql);
247458247477
if( (rc&0xff)==SQLITE_CORRUPT ){
247459247478
*pzErr = sqlite3_mprintf("malformed inverted index for FTS5 table %s.%s",
247460247479
pConfig->zDb, pConfig->zName);
247461
- rc = SQLITE_OK;
247480
+ }else if( rc!=SQLITE_OK ){
247481
+ *pzErr = sqlite3_mprintf("unable to validate the inverted index for"
247482
+ " FTS5 table %s.%s: %s",
247483
+ pConfig->zDb, pConfig->zName, zErr);
247462247484
}
247463
- return rc;
247464
-
247485
+ sqlite3_free(zErr);
247486
+ return SQLITE_OK;
247465247487
}
247466247488
247467247489
static int fts5Init(sqlite3 *db){
247468247490
static const sqlite3_module fts5Mod = {
247469247491
/* iVersion */ 4,
247470247492
--- 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 ** db82b4281a0e0d5e365553df11e0347f60c.
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.44.0"
463 #define SQLITE_VERSION_NUMBER 3044000
464 #define SQLITE_SOURCE_ID "2023-10-23 02:01:14 0db82b4281a0e0d5e365553df11e0347f60c00c861c0fb96227059edff3a0ef6"
465
466 /*
467 ** CAPI3REF: Run-Time Library Version Numbers
468 ** KEYWORDS: sqlite3_version sqlite3_sourceid
469 **
@@ -80195,18 +80195,20 @@
80195 /*
80196 ** Return non-zero if the bit in the IntegrityCk.aPgRef[] array that
80197 ** corresponds to page iPg is already set.
80198 */
80199 static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){
 
80200 assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 );
80201 return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07)));
80202 }
80203
80204 /*
80205 ** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg.
80206 */
80207 static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
 
80208 assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 );
80209 pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07));
80210 }
80211
80212
@@ -109460,14 +109462,14 @@
109460 int nAlloc;
109461 if( dupFlags ){
109462 nAlloc = dupedExprSize(p);
109463 }else if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
109464 nToken = sqlite3Strlen30NN(p->u.zToken)+1;
109465 nAlloc = EXPR_FULLSIZE + ROUND8(nToken);
109466 }else{
109467 nToken = 0;
109468 nAlloc = EXPR_FULLSIZE;
109469 }
109470 assert( nAlloc==ROUND8(nAlloc) );
109471 sEdupBuf.zAlloc = sqlite3DbMallocRawNN(db, nAlloc);
109472 #ifdef SQLITE_DEBUG
109473 sEdupBuf.zEnd = sEdupBuf.zAlloc ? sEdupBuf.zAlloc+nAlloc : 0;
@@ -138956,10 +138958,11 @@
138956 int r2; /* Previous key for WITHOUT ROWID tables */
138957 int mxCol; /* Maximum non-virtual column number */
138958
138959 if( pObjTab && pObjTab!=pTab ) continue;
138960 if( !IsOrdinaryTable(pTab) ){
 
138961 sqlite3_vtab *pVTab;
138962 int a1;
138963 if( !IsVirtual(pTab) ) continue;
138964 if( pTab->nCol<=0 ){
138965 const char *zMod = pTab->u.vtab.azArg[0];
@@ -138975,10 +138978,11 @@
138975 sqlite3VdbeAddOp2(v, OP_VCheck, 0, 3);
138976 sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
138977 a1 = sqlite3VdbeAddOp1(v, OP_IsNull, 3); VdbeCoverage(v);
138978 integrityCheckResultRow(v);
138979 sqlite3VdbeJumpHere(v, a1);
 
138980 continue;
138981 }
138982 if( isQuick || HasRowid(pTab) ){
138983 pPk = 0;
138984 r2 = 0;
@@ -179837,11 +179841,11 @@
179837 void *pArg /* First callback argument */
179838 ){
179839 void *pRet;
179840
179841 #ifdef SQLITE_ENABLE_API_ARMOR
179842 if( db==0 || xCallback==0 ){
179843 return 0;
179844 }
179845 #endif
179846 sqlite3_mutex_enter(db->mutex);
179847 pRet = db->pPreUpdateArg;
@@ -187833,22 +187837,30 @@
187833 */
187834 static int fts3Integrity(sqlite3_vtab *pVtab, char **pzErr){
187835 Fts3Table *p = (Fts3Table*)pVtab;
187836 char *zSql;
187837 int rc;
 
187838
187839 zSql = sqlite3_mprintf(
187840 "INSERT INTO \"%w\".\"%w\"(\"%w\") VALUES('integrity-check');",
187841 p->zDb, p->zName, p->zName);
187842 rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
 
 
 
187843 sqlite3_free(zSql);
187844 if( (rc&0xff)==SQLITE_CORRUPT ){
187845 *pzErr = sqlite3_mprintf("malformed inverted index for FTS%d table %s.%s",
187846 p->bFts4 ? 4 : 3, p->zDb, p->zName);
187847 rc = SQLITE_OK;
 
 
 
187848 }
187849 return rc;
 
187850 }
187851
187852
187853
187854 static const sqlite3_module fts3Module = {
@@ -198115,10 +198127,12 @@
198115 assert( pNode->n>0 );
198116 assert_fts3_nc( (pNode->a[0]=='\0')==(aDoclist!=0) );
198117
198118 blobGrowBuffer(pPrev, nTerm, &rc);
198119 if( rc!=SQLITE_OK ) return rc;
 
 
198120
198121 nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm);
198122 nSuffix = nTerm - nPrefix;
198123 if( nSuffix<=0 ) return FTS_CORRUPT_VTAB;
198124 memcpy(pPrev->a, zTerm, nTerm);
@@ -221489,12 +221503,14 @@
221489 ** The buffer that the argument points to contains a serialized SQL value.
221490 ** Return the number of bytes of space occupied by the value (including
221491 ** the type byte).
221492 */
221493 static int sessionSerialLen(const u8 *a){
221494 int e = *a;
221495 int n;
 
 
221496 if( e==0 || e==0xFF ) return 1;
221497 if( e==SQLITE_NULL ) return 1;
221498 if( e==SQLITE_INTEGER || e==SQLITE_FLOAT ) return 9;
221499 return sessionVarintGet(&a[1], &n) + 1 + n;
221500 }
@@ -226336,10 +226352,11 @@
226336 int nRec, /* Number of bytes in aRec */
226337 SessionChange **ppNew /* OUT: Merged change */
226338 ){
226339 SessionChange *pNew = 0;
226340 int rc = SQLITE_OK;
 
226341
226342 if( !pExist ){
226343 pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec);
226344 if( !pNew ){
226345 return SQLITE_NOMEM;
@@ -247420,11 +247437,11 @@
247420 int nArg, /* Number of args */
247421 sqlite3_value **apUnused /* Function arguments */
247422 ){
247423 assert( nArg==0 );
247424 UNUSED_PARAM2(nArg, apUnused);
247425 sqlite3_result_text(pCtx, "fts5: 2023-10-22 23:44:32 678a9728dc6b88d8ef924c86603056df18204bc9a9c4776b9baffd7c5b10c5f2", -1, SQLITE_TRANSIENT);
247426 }
247427
247428 /*
247429 ** Return true if zName is the extension on one of the shadow tables used
247430 ** by this module.
@@ -247447,23 +247464,28 @@
247447 */
247448 static int fts5Integrity(sqlite3_vtab *pVtab, char **pzErr){
247449 Fts5FullTable *pTab = (Fts5FullTable*)pVtab;
247450 Fts5Config *pConfig = pTab->p.pConfig;
247451 char *zSql;
 
247452 int rc;
247453 zSql = sqlite3_mprintf(
247454 "INSERT INTO \"%w\".\"%w\"(\"%w\") VALUES('integrity-check');",
247455 pConfig->zDb, pConfig->zName, pConfig->zName);
247456 rc = sqlite3_exec(pConfig->db, zSql, 0, 0, 0);
 
247457 sqlite3_free(zSql);
247458 if( (rc&0xff)==SQLITE_CORRUPT ){
247459 *pzErr = sqlite3_mprintf("malformed inverted index for FTS5 table %s.%s",
247460 pConfig->zDb, pConfig->zName);
247461 rc = SQLITE_OK;
 
 
 
247462 }
247463 return rc;
247464
247465 }
247466
247467 static int fts5Init(sqlite3 *db){
247468 static const sqlite3_module fts5Mod = {
247469 /* iVersion */ 4,
247470
--- 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 ** 4be9af4469d7e31ee852f67e5aa32996557.
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.44.0"
463 #define SQLITE_VERSION_NUMBER 3044000
464 #define SQLITE_SOURCE_ID "2023-10-24 11:06:44 54be9af4469d7e31ee852f67e5aa32996557c10de654a60103fd165d2fedf311"
465
466 /*
467 ** CAPI3REF: Run-Time Library Version Numbers
468 ** KEYWORDS: sqlite3_version sqlite3_sourceid
469 **
@@ -80195,18 +80195,20 @@
80195 /*
80196 ** Return non-zero if the bit in the IntegrityCk.aPgRef[] array that
80197 ** corresponds to page iPg is already set.
80198 */
80199 static int getPageReferenced(IntegrityCk *pCheck, Pgno iPg){
80200 assert( pCheck->aPgRef!=0 );
80201 assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 );
80202 return (pCheck->aPgRef[iPg/8] & (1 << (iPg & 0x07)));
80203 }
80204
80205 /*
80206 ** Set the bit in the IntegrityCk.aPgRef[] array that corresponds to page iPg.
80207 */
80208 static void setPageReferenced(IntegrityCk *pCheck, Pgno iPg){
80209 assert( pCheck->aPgRef!=0 );
80210 assert( iPg<=pCheck->nCkPage && sizeof(pCheck->aPgRef[0])==1 );
80211 pCheck->aPgRef[iPg/8] |= (1 << (iPg & 0x07));
80212 }
80213
80214
@@ -109460,14 +109462,14 @@
109462 int nAlloc;
109463 if( dupFlags ){
109464 nAlloc = dupedExprSize(p);
109465 }else if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){
109466 nToken = sqlite3Strlen30NN(p->u.zToken)+1;
109467 nAlloc = ROUND8(EXPR_FULLSIZE + nToken);
109468 }else{
109469 nToken = 0;
109470 nAlloc = ROUND8(EXPR_FULLSIZE);
109471 }
109472 assert( nAlloc==ROUND8(nAlloc) );
109473 sEdupBuf.zAlloc = sqlite3DbMallocRawNN(db, nAlloc);
109474 #ifdef SQLITE_DEBUG
109475 sEdupBuf.zEnd = sEdupBuf.zAlloc ? sEdupBuf.zAlloc+nAlloc : 0;
@@ -138956,10 +138958,11 @@
138958 int r2; /* Previous key for WITHOUT ROWID tables */
138959 int mxCol; /* Maximum non-virtual column number */
138960
138961 if( pObjTab && pObjTab!=pTab ) continue;
138962 if( !IsOrdinaryTable(pTab) ){
138963 #ifndef SQLITE_OMIT_VIRTUALTABLE
138964 sqlite3_vtab *pVTab;
138965 int a1;
138966 if( !IsVirtual(pTab) ) continue;
138967 if( pTab->nCol<=0 ){
138968 const char *zMod = pTab->u.vtab.azArg[0];
@@ -138975,10 +138978,11 @@
138978 sqlite3VdbeAddOp2(v, OP_VCheck, 0, 3);
138979 sqlite3VdbeAppendP4(v, pTab, P4_TABLE);
138980 a1 = sqlite3VdbeAddOp1(v, OP_IsNull, 3); VdbeCoverage(v);
138981 integrityCheckResultRow(v);
138982 sqlite3VdbeJumpHere(v, a1);
138983 #endif
138984 continue;
138985 }
138986 if( isQuick || HasRowid(pTab) ){
138987 pPk = 0;
138988 r2 = 0;
@@ -179837,11 +179841,11 @@
179841 void *pArg /* First callback argument */
179842 ){
179843 void *pRet;
179844
179845 #ifdef SQLITE_ENABLE_API_ARMOR
179846 if( db==0 ){
179847 return 0;
179848 }
179849 #endif
179850 sqlite3_mutex_enter(db->mutex);
179851 pRet = db->pPreUpdateArg;
@@ -187833,22 +187837,30 @@
187837 */
187838 static int fts3Integrity(sqlite3_vtab *pVtab, char **pzErr){
187839 Fts3Table *p = (Fts3Table*)pVtab;
187840 char *zSql;
187841 int rc;
187842 char *zErr = 0;
187843
187844 zSql = sqlite3_mprintf(
187845 "INSERT INTO \"%w\".\"%w\"(\"%w\") VALUES('integrity-check');",
187846 p->zDb, p->zName, p->zName);
187847 if( zSql==0 ){
187848 return SQLITE_NOMEM;
187849 }
187850 rc = sqlite3_exec(p->db, zSql, 0, 0, &zErr);
187851 sqlite3_free(zSql);
187852 if( (rc&0xff)==SQLITE_CORRUPT ){
187853 *pzErr = sqlite3_mprintf("malformed inverted index for FTS%d table %s.%s",
187854 p->bFts4 ? 4 : 3, p->zDb, p->zName);
187855 }else if( rc!=SQLITE_OK ){
187856 *pzErr = sqlite3_mprintf("unable to validate the inverted index for"
187857 " FTS%d table %s.%s: %s",
187858 p->bFts4 ? 4 : 3, p->zDb, p->zName, zErr);
187859 }
187860 sqlite3_free(zErr);
187861 return SQLITE_OK;
187862 }
187863
187864
187865
187866 static const sqlite3_module fts3Module = {
@@ -198115,10 +198127,12 @@
198127 assert( pNode->n>0 );
198128 assert_fts3_nc( (pNode->a[0]=='\0')==(aDoclist!=0) );
198129
198130 blobGrowBuffer(pPrev, nTerm, &rc);
198131 if( rc!=SQLITE_OK ) return rc;
198132 assert( pPrev!=0 );
198133 assert( pPrev->a!=0 );
198134
198135 nPrefix = fts3PrefixCompress(pPrev->a, pPrev->n, zTerm, nTerm);
198136 nSuffix = nTerm - nPrefix;
198137 if( nSuffix<=0 ) return FTS_CORRUPT_VTAB;
198138 memcpy(pPrev->a, zTerm, nTerm);
@@ -221489,12 +221503,14 @@
221503 ** The buffer that the argument points to contains a serialized SQL value.
221504 ** Return the number of bytes of space occupied by the value (including
221505 ** the type byte).
221506 */
221507 static int sessionSerialLen(const u8 *a){
221508 int e;
221509 int n;
221510 assert( a!=0 );
221511 e = *a;
221512 if( e==0 || e==0xFF ) return 1;
221513 if( e==SQLITE_NULL ) return 1;
221514 if( e==SQLITE_INTEGER || e==SQLITE_FLOAT ) return 9;
221515 return sessionVarintGet(&a[1], &n) + 1 + n;
221516 }
@@ -226336,10 +226352,11 @@
226352 int nRec, /* Number of bytes in aRec */
226353 SessionChange **ppNew /* OUT: Merged change */
226354 ){
226355 SessionChange *pNew = 0;
226356 int rc = SQLITE_OK;
226357 assert( aRec!=0 );
226358
226359 if( !pExist ){
226360 pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec);
226361 if( !pNew ){
226362 return SQLITE_NOMEM;
@@ -247420,11 +247437,11 @@
247437 int nArg, /* Number of args */
247438 sqlite3_value **apUnused /* Function arguments */
247439 ){
247440 assert( nArg==0 );
247441 UNUSED_PARAM2(nArg, apUnused);
247442 sqlite3_result_text(pCtx, "fts5: 2023-10-23 23:34:53 9d388267e4e6724e2df333fe09d509e87defcfe984c5c2ebe031152d320812d0", -1, SQLITE_TRANSIENT);
247443 }
247444
247445 /*
247446 ** Return true if zName is the extension on one of the shadow tables used
247447 ** by this module.
@@ -247447,23 +247464,28 @@
247464 */
247465 static int fts5Integrity(sqlite3_vtab *pVtab, char **pzErr){
247466 Fts5FullTable *pTab = (Fts5FullTable*)pVtab;
247467 Fts5Config *pConfig = pTab->p.pConfig;
247468 char *zSql;
247469 char *zErr = 0;
247470 int rc;
247471 zSql = sqlite3_mprintf(
247472 "INSERT INTO \"%w\".\"%w\"(\"%w\") VALUES('integrity-check');",
247473 pConfig->zDb, pConfig->zName, pConfig->zName);
247474 if( zSql==0 ) return SQLITE_NOMEM;
247475 rc = sqlite3_exec(pConfig->db, zSql, 0, 0, &zErr);
247476 sqlite3_free(zSql);
247477 if( (rc&0xff)==SQLITE_CORRUPT ){
247478 *pzErr = sqlite3_mprintf("malformed inverted index for FTS5 table %s.%s",
247479 pConfig->zDb, pConfig->zName);
247480 }else if( rc!=SQLITE_OK ){
247481 *pzErr = sqlite3_mprintf("unable to validate the inverted index for"
247482 " FTS5 table %s.%s: %s",
247483 pConfig->zDb, pConfig->zName, zErr);
247484 }
247485 sqlite3_free(zErr);
247486 return SQLITE_OK;
247487 }
247488
247489 static int fts5Init(sqlite3 *db){
247490 static const sqlite3_module fts5Mod = {
247491 /* iVersion */ 4,
247492
--- 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.44.0"
150150
#define SQLITE_VERSION_NUMBER 3044000
151
-#define SQLITE_SOURCE_ID "2023-10-23 02:01:14 0db82b4281a0e0d5e365553df11e0347f60c00c861c0fb96227059edff3a0ef6"
151
+#define SQLITE_SOURCE_ID "2023-10-24 11:06:44 54be9af4469d7e31ee852f67e5aa32996557c10de654a60103fd165d2fedf311"
152152
153153
/*
154154
** CAPI3REF: Run-Time Library Version Numbers
155155
** KEYWORDS: sqlite3_version sqlite3_sourceid
156156
**
157157
--- 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.44.0"
150 #define SQLITE_VERSION_NUMBER 3044000
151 #define SQLITE_SOURCE_ID "2023-10-23 02:01:14 0db82b4281a0e0d5e365553df11e0347f60c00c861c0fb96227059edff3a0ef6"
152
153 /*
154 ** CAPI3REF: Run-Time Library Version Numbers
155 ** KEYWORDS: sqlite3_version sqlite3_sourceid
156 **
157
--- 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.44.0"
150 #define SQLITE_VERSION_NUMBER 3044000
151 #define SQLITE_SOURCE_ID "2023-10-24 11:06:44 54be9af4469d7e31ee852f67e5aa32996557c10de654a60103fd165d2fedf311"
152
153 /*
154 ** CAPI3REF: Run-Time Library Version Numbers
155 ** KEYWORDS: sqlite3_version sqlite3_sourceid
156 **
157

Keyboard Shortcuts

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