|
|
@@ -1149,7 +1149,7 @@ extern "C" {
|
|
|
*/
|
|
|
#define SQLITE_VERSION "3.23.0"
|
|
|
#define SQLITE_VERSION_NUMBER 3023000
|
|
|
-#define SQLITE_SOURCE_ID "2018-02-08 01:00:11 ad5d3bdc739a0997786f94fb5789b726b9f53ff883226093924338fe5000alt1"
|
|
|
+#define SQLITE_SOURCE_ID "2018-02-18 17:50:03 2df6bbf1b8ca881c8a465d6624de66fde4c5975ccae6b2f2dda392b137f5alt1"
|
|
|
|
|
|
/*
|
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
|
@@ -17975,6 +17975,9 @@ SQLITE_PRIVATE FuncDefHash sqlite3BuiltinFunctions;
|
|
|
SQLITE_PRIVATE int sqlite3PendingByte;
|
|
|
#endif
|
|
|
#endif
|
|
|
+#ifdef VDBE_PROFILE
|
|
|
+SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt;
|
|
|
+#endif
|
|
|
SQLITE_PRIVATE void sqlite3RootPageMoved(sqlite3*, int, int, int);
|
|
|
SQLITE_PRIVATE void sqlite3Reindex(Parse*, Token*, Token*);
|
|
|
SQLITE_PRIVATE void sqlite3AlterFunctions(void);
|
|
|
@@ -18598,6 +18601,13 @@ SQLITE_PRIVATE const Token sqlite3IntTokens[] = {
|
|
|
{ "1", 1 }
|
|
|
};
|
|
|
|
|
|
+#ifdef VDBE_PROFILE
|
|
|
+/*
|
|
|
+** The following performance counter can be used in place of
|
|
|
+** sqlite3Hwtime() for profiling. This is a no-op on standard builds.
|
|
|
+*/
|
|
|
+SQLITE_PRIVATE sqlite3_uint64 sqlite3NProfileCnt = 0;
|
|
|
+#endif
|
|
|
|
|
|
/*
|
|
|
** The value of the "pending" byte must be 0x40000000 (1 byte past the
|
|
|
@@ -24129,11 +24139,12 @@ struct sqlite3_mutex {
|
|
|
#endif
|
|
|
};
|
|
|
#if SQLITE_MUTEX_NREF
|
|
|
-#define SQLITE3_MUTEX_INITIALIZER {PTHREAD_MUTEX_INITIALIZER,0,0,(pthread_t)0,0}
|
|
|
+# define SQLITE3_MUTEX_INITIALIZER(id) \
|
|
|
+ {PTHREAD_MUTEX_INITIALIZER,id,0,(pthread_t)0,0}
|
|
|
#elif defined(SQLITE_ENABLE_API_ARMOR)
|
|
|
-#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0 }
|
|
|
+# define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER, id }
|
|
|
#else
|
|
|
-#define SQLITE3_MUTEX_INITIALIZER { PTHREAD_MUTEX_INITIALIZER }
|
|
|
+#define SQLITE3_MUTEX_INITIALIZER(id) { PTHREAD_MUTEX_INITIALIZER }
|
|
|
#endif
|
|
|
|
|
|
/*
|
|
|
@@ -24230,18 +24241,18 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; }
|
|
|
*/
|
|
|
static sqlite3_mutex *pthreadMutexAlloc(int iType){
|
|
|
static sqlite3_mutex staticMutexes[] = {
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(2),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(3),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(4),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(5),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(6),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(7),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(8),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(9),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(10),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(11),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(12),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(13)
|
|
|
};
|
|
|
sqlite3_mutex *p;
|
|
|
switch( iType ){
|
|
|
@@ -24259,6 +24270,9 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
|
|
|
pthread_mutexattr_settype(&recursiveAttr, PTHREAD_MUTEX_RECURSIVE);
|
|
|
pthread_mutex_init(&p->mutex, &recursiveAttr);
|
|
|
pthread_mutexattr_destroy(&recursiveAttr);
|
|
|
+#endif
|
|
|
+#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
|
|
|
+ p->id = SQLITE_MUTEX_RECURSIVE;
|
|
|
#endif
|
|
|
}
|
|
|
break;
|
|
|
@@ -24267,6 +24281,9 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
|
|
|
p = sqlite3MallocZero( sizeof(*p) );
|
|
|
if( p ){
|
|
|
pthread_mutex_init(&p->mutex, 0);
|
|
|
+#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
|
|
|
+ p->id = SQLITE_MUTEX_FAST;
|
|
|
+#endif
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -24282,7 +24299,7 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
|
|
|
}
|
|
|
}
|
|
|
#if SQLITE_MUTEX_NREF || defined(SQLITE_ENABLE_API_ARMOR)
|
|
|
- if( p ) p->id = iType;
|
|
|
+ assert( p==0 || p->id==iType );
|
|
|
#endif
|
|
|
return p;
|
|
|
}
|
|
|
@@ -24799,7 +24816,7 @@ struct sqlite3_mutex {
|
|
|
#ifdef SQLITE_DEBUG
|
|
|
volatile int nRef; /* Number of enterances */
|
|
|
volatile DWORD owner; /* Thread holding this mutex */
|
|
|
- volatile int trace; /* True to trace changes */
|
|
|
+ volatile LONG trace; /* True to trace changes */
|
|
|
#endif
|
|
|
};
|
|
|
|
|
|
@@ -24811,10 +24828,10 @@ struct sqlite3_mutex {
|
|
|
#define SQLITE_W32_MUTEX_INITIALIZER { 0 }
|
|
|
|
|
|
#ifdef SQLITE_DEBUG
|
|
|
-#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0, \
|
|
|
+#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id, \
|
|
|
0L, (DWORD)0, 0 }
|
|
|
#else
|
|
|
-#define SQLITE3_MUTEX_INITIALIZER { SQLITE_W32_MUTEX_INITIALIZER, 0 }
|
|
|
+#define SQLITE3_MUTEX_INITIALIZER(id) { SQLITE_W32_MUTEX_INITIALIZER, id }
|
|
|
#endif
|
|
|
|
|
|
#ifdef SQLITE_DEBUG
|
|
|
@@ -24857,18 +24874,18 @@ SQLITE_PRIVATE void sqlite3MemoryBarrier(void){
|
|
|
** Initialize and deinitialize the mutex subsystem.
|
|
|
*/
|
|
|
static sqlite3_mutex winMutex_staticMutexes[] = {
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER,
|
|
|
- SQLITE3_MUTEX_INITIALIZER
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(2),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(3),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(4),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(5),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(6),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(7),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(8),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(9),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(10),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(11),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(12),
|
|
|
+ SQLITE3_MUTEX_INITIALIZER(13)
|
|
|
};
|
|
|
|
|
|
static int winMutex_isInit = 0;
|
|
|
@@ -24998,15 +25015,15 @@ static sqlite3_mutex *winMutexAlloc(int iType){
|
|
|
}
|
|
|
#endif
|
|
|
p = &winMutex_staticMutexes[iType-2];
|
|
|
- p->id = iType;
|
|
|
#ifdef SQLITE_DEBUG
|
|
|
#ifdef SQLITE_WIN32_MUTEX_TRACE_STATIC
|
|
|
- p->trace = 1;
|
|
|
+ InterlockedCompareExchange(&p->trace, 1, 0);
|
|
|
#endif
|
|
|
#endif
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ assert( p==0 || p->id==iType );
|
|
|
return p;
|
|
|
}
|
|
|
|
|
|
@@ -80864,7 +80881,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec(
|
|
|
|
|
|
assert( pOp>=aOp && pOp<&aOp[p->nOp]);
|
|
|
#ifdef VDBE_PROFILE
|
|
|
- start = sqlite3Hwtime();
|
|
|
+ start = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
|
|
|
#endif
|
|
|
nVmStep++;
|
|
|
#ifdef SQLITE_ENABLE_STMT_SCANSTATUS
|
|
|
@@ -87450,7 +87467,7 @@ default: { /* This is really OP_Noop and OP_Explain */
|
|
|
|
|
|
#ifdef VDBE_PROFILE
|
|
|
{
|
|
|
- u64 endTime = sqlite3Hwtime();
|
|
|
+ u64 endTime = sqlite3NProfileCnt ? sqlite3NProfileCnt : sqlite3Hwtime();
|
|
|
if( endTime>start ) pOrigOp->cycles += endTime - start;
|
|
|
pOrigOp->cnt++;
|
|
|
}
|
|
|
@@ -101527,6 +101544,16 @@ SQLITE_PRIVATE int sqlite3FixSelect(
|
|
|
if( sqlite3FixExpr(pFix, pSelect->pLimit) ){
|
|
|
return 1;
|
|
|
}
|
|
|
+#if 1
|
|
|
+ if( pSelect->pWith ){
|
|
|
+ int i;
|
|
|
+ for(i=0; i<pSelect->pWith->nCte; i++){
|
|
|
+ if( sqlite3FixSelect(pFix, pSelect->pWith->a[i].pSelect) ){
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
pSelect = pSelect->pPrior;
|
|
|
}
|
|
|
return 0;
|
|
|
@@ -109037,6 +109064,8 @@ static void replaceFunc(
|
|
|
i64 nOut; /* Maximum size of zOut */
|
|
|
int loopLimit; /* Last zStr[] that might match zPattern[] */
|
|
|
int i, j; /* Loop counters */
|
|
|
+ unsigned cntExpand; /* Number zOut expansions */
|
|
|
+ sqlite3 *db = sqlite3_context_db_handle(context);
|
|
|
|
|
|
assert( argc==3 );
|
|
|
UNUSED_PARAMETER(argc);
|
|
|
@@ -109068,33 +109097,40 @@ static void replaceFunc(
|
|
|
return;
|
|
|
}
|
|
|
loopLimit = nStr - nPattern;
|
|
|
+ cntExpand = 0;
|
|
|
for(i=j=0; i<=loopLimit; i++){
|
|
|
if( zStr[i]!=zPattern[0] || memcmp(&zStr[i], zPattern, nPattern) ){
|
|
|
zOut[j++] = zStr[i];
|
|
|
}else{
|
|
|
- u8 *zOld;
|
|
|
- sqlite3 *db = sqlite3_context_db_handle(context);
|
|
|
- nOut += nRep - nPattern;
|
|
|
- testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
|
|
|
- testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
|
|
|
- if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
|
|
|
- sqlite3_result_error_toobig(context);
|
|
|
- sqlite3_free(zOut);
|
|
|
- return;
|
|
|
- }
|
|
|
- zOld = zOut;
|
|
|
- zOut = sqlite3_realloc64(zOut, (int)nOut);
|
|
|
- if( zOut==0 ){
|
|
|
- sqlite3_result_error_nomem(context);
|
|
|
- sqlite3_free(zOld);
|
|
|
- return;
|
|
|
+ if( nRep>nPattern ){
|
|
|
+ nOut += nRep - nPattern;
|
|
|
+ testcase( nOut-1==db->aLimit[SQLITE_LIMIT_LENGTH] );
|
|
|
+ testcase( nOut-2==db->aLimit[SQLITE_LIMIT_LENGTH] );
|
|
|
+ if( nOut-1>db->aLimit[SQLITE_LIMIT_LENGTH] ){
|
|
|
+ sqlite3_result_error_toobig(context);
|
|
|
+ sqlite3_free(zOut);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ cntExpand++;
|
|
|
+ if( (cntExpand&(cntExpand-1))==0 ){
|
|
|
+ /* Grow the size of the output buffer only on substitutions
|
|
|
+ ** whose index is a power of two: 1, 2, 4, 8, 16, 32, ... */
|
|
|
+ u8 *zOld;
|
|
|
+ zOld = zOut;
|
|
|
+ zOut = sqlite3_realloc64(zOut, (int)nOut + (nOut - nStr - 1));
|
|
|
+ if( zOut==0 ){
|
|
|
+ sqlite3_result_error_nomem(context);
|
|
|
+ sqlite3_free(zOld);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
memcpy(&zOut[j], zRep, nRep);
|
|
|
j += nRep;
|
|
|
i += nPattern-1;
|
|
|
}
|
|
|
}
|
|
|
- assert( j+nStr-i+1==nOut );
|
|
|
+ assert( j+nStr-i+1<=nOut );
|
|
|
memcpy(&zOut[j], &zStr[i], nStr-i);
|
|
|
j += nStr - i;
|
|
|
assert( j<=nOut );
|
|
|
@@ -127401,8 +127437,8 @@ static int execSql(sqlite3 *db, char **pzErrMsg, const char *zSql){
|
|
|
while( SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
|
|
|
const char *zSubSql = (const char*)sqlite3_column_text(pStmt,0);
|
|
|
assert( sqlite3_strnicmp(zSql,"SELECT",6)==0 );
|
|
|
- if( zSubSql ){
|
|
|
- assert( zSubSql[0]!='S' );
|
|
|
+ assert( sqlite3_strnicmp(zSubSql,"SELECT",6)!=0 || CORRUPT_DB );
|
|
|
+ if( zSubSql && zSubSql[0]!='S' ){
|
|
|
rc = execSql(db, pzErrMsg, zSubSql);
|
|
|
if( rc!=SQLITE_OK ) break;
|
|
|
}
|
|
|
@@ -130940,7 +130976,15 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|
|
if( sqlite3ExprIsVector(pX->pRight) ){
|
|
|
r1 = rTemp = sqlite3GetTempReg(pParse);
|
|
|
codeExprOrVector(pParse, pX->pRight, r1, 1);
|
|
|
- op = aMoveOp[(pX->op - TK_GT) | 0x0001];
|
|
|
+ testcase( pX->op==TK_GT );
|
|
|
+ testcase( pX->op==TK_GE );
|
|
|
+ testcase( pX->op==TK_LT );
|
|
|
+ testcase( pX->op==TK_LE );
|
|
|
+ op = aMoveOp[((pX->op - TK_GT - 1) & 0x3) | 0x1];
|
|
|
+ assert( pX->op!=TK_GT || op==OP_SeekGE );
|
|
|
+ assert( pX->op!=TK_GE || op==OP_SeekGE );
|
|
|
+ assert( pX->op!=TK_LT || op==OP_SeekLE );
|
|
|
+ assert( pX->op!=TK_LE || op==OP_SeekLE );
|
|
|
}else{
|
|
|
r1 = sqlite3ExprCodeTemp(pParse, pX->pRight, &rTemp);
|
|
|
disableTerm(pLevel, pStart);
|
|
|
@@ -133050,7 +133094,7 @@ static void exprAnalyze(
|
|
|
exprAnalyze(pSrc, pWC, idxNew);
|
|
|
}
|
|
|
pTerm = &pWC->a[idxTerm];
|
|
|
- pTerm->wtFlags = TERM_CODED|TERM_VIRTUAL; /* Disable the original */
|
|
|
+ pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */
|
|
|
pTerm->eOperator = 0;
|
|
|
}
|
|
|
|
|
|
@@ -140386,7 +140430,8 @@ static unsigned int yy_find_shift_action(
|
|
|
#endif
|
|
|
do{
|
|
|
i = yy_shift_ofst[stateno];
|
|
|
- assert( i>=0 && i+YYNTOKEN<=sizeof(yy_lookahead)/sizeof(yy_lookahead[0]) );
|
|
|
+ assert( i>=0 );
|
|
|
+ assert( i+YYNTOKEN<=(int)sizeof(yy_lookahead)/sizeof(yy_lookahead[0]) );
|
|
|
assert( iLookAhead!=YYNOCODE );
|
|
|
assert( iLookAhead < YYNTOKEN );
|
|
|
i += iLookAhead;
|
|
|
@@ -166016,7 +166061,6 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
|
|
|
){
|
|
|
Fts3Table *p = (Fts3Table *)pVtab;
|
|
|
int rc = SQLITE_OK; /* Return Code */
|
|
|
- int isRemove = 0; /* True for an UPDATE or DELETE */
|
|
|
u32 *aSzIns = 0; /* Sizes of inserted documents */
|
|
|
u32 *aSzDel = 0; /* Sizes of deleted documents */
|
|
|
int nChng = 0; /* Net change in number of documents */
|
|
|
@@ -166114,7 +166158,6 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
|
|
|
if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
|
|
|
assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER );
|
|
|
rc = fts3DeleteByRowid(p, apVal[0], &nChng, aSzDel);
|
|
|
- isRemove = 1;
|
|
|
}
|
|
|
|
|
|
/* If this is an INSERT or UPDATE operation, insert the new record. */
|
|
|
@@ -166126,7 +166169,7 @@ SQLITE_PRIVATE int sqlite3Fts3UpdateMethod(
|
|
|
rc = FTS_CORRUPT_VTAB;
|
|
|
}
|
|
|
}
|
|
|
- if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){
|
|
|
+ if( rc==SQLITE_OK ){
|
|
|
rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid);
|
|
|
}
|
|
|
if( rc==SQLITE_OK ){
|
|
|
@@ -190002,7 +190045,8 @@ static unsigned int fts5yy_find_shift_action(
|
|
|
#endif
|
|
|
do{
|
|
|
i = fts5yy_shift_ofst[stateno];
|
|
|
- assert( i>=0 && i+fts5YYNFTS5TOKEN<=sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0]) );
|
|
|
+ assert( i>=0 );
|
|
|
+ assert( i+fts5YYNFTS5TOKEN<=(int)sizeof(fts5yy_lookahead)/sizeof(fts5yy_lookahead[0]) );
|
|
|
assert( iLookAhead!=fts5YYNOCODE );
|
|
|
assert( iLookAhead < fts5YYNFTS5TOKEN );
|
|
|
i += iLookAhead;
|
|
|
@@ -205284,7 +205328,7 @@ static void fts5SourceIdFunc(
|
|
|
){
|
|
|
assert( nArg==0 );
|
|
|
UNUSED_PARAM2(nArg, apUnused);
|
|
|
- sqlite3_result_text(pCtx, "fts5: 2018-02-08 01:00:11 ad5d3bdc739a0997786f94fb5789b726b9f53ff883226093924338fe5000922b", -1, SQLITE_TRANSIENT);
|
|
|
+ sqlite3_result_text(pCtx, "fts5: 2018-02-10 02:31:30 3aed949a18a251c5795f21f0385c205a127502b7e9cf06bc7f4c763951cd7984", -1, SQLITE_TRANSIENT);
|
|
|
}
|
|
|
|
|
|
static int fts5Init(sqlite3 *db){
|
|
|
@@ -219213,9 +219257,9 @@ static void print_elem(void *e, sqlite_int64 c, void* p){
|
|
|
#endif
|
|
|
|
|
|
/************** End of extension-functions.c *********************************/
|
|
|
-#if __LINE__!=219216
|
|
|
+#if __LINE__!=219260
|
|
|
#undef SQLITE_SOURCE_ID
|
|
|
-#define SQLITE_SOURCE_ID "2018-02-08 01:00:11 ad5d3bdc739a0997786f94fb5789b726b9f53ff883226093924338fe5000alt2"
|
|
|
+#define SQLITE_SOURCE_ID "2018-02-18 17:50:03 2df6bbf1b8ca881c8a465d6624de66fde4c5975ccae6b2f2dda392b137f5alt2"
|
|
|
#endif
|
|
|
/* Return the source-id for this library */
|
|
|
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
|