|
@@ -1149,7 +1149,7 @@ extern "C" {
|
|
|
*/
|
|
*/
|
|
|
#define SQLITE_VERSION "3.22.0"
|
|
#define SQLITE_VERSION "3.22.0"
|
|
|
#define SQLITE_VERSION_NUMBER 3022000
|
|
#define SQLITE_VERSION_NUMBER 3022000
|
|
|
-#define SQLITE_SOURCE_ID "2018-01-13 02:07:16 bb196fcb677e962db4308c02097968615729a51fe4a1292e468aaf3e4bf5alt1"
|
|
|
|
|
|
|
+#define SQLITE_SOURCE_ID "2018-01-17 01:40:57 3e04999dabb87715de46255b1a9b08d5dfa70d140e0a09a37ea2842d71c7alt1"
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
** CAPI3REF: Run-Time Library Version Numbers
|
|
@@ -1534,7 +1534,6 @@ SQLITE_API int sqlite3_exec(
|
|
|
#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8))
|
|
#define SQLITE_CANTOPEN_ISDIR (SQLITE_CANTOPEN | (2<<8))
|
|
|
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
|
|
#define SQLITE_CANTOPEN_FULLPATH (SQLITE_CANTOPEN | (3<<8))
|
|
|
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
|
|
#define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8))
|
|
|
-#define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8))
|
|
|
|
|
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
|
|
#define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8))
|
|
|
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
|
|
#define SQLITE_READONLY_RECOVERY (SQLITE_READONLY | (1<<8))
|
|
|
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
|
|
#define SQLITE_READONLY_CANTLOCK (SQLITE_READONLY | (2<<8))
|
|
@@ -18948,7 +18947,6 @@ struct sqlite3_context {
|
|
|
int isError; /* Error code returned by the function. */
|
|
int isError; /* Error code returned by the function. */
|
|
|
u8 skipFlag; /* Skip accumulator loading if true */
|
|
u8 skipFlag; /* Skip accumulator loading if true */
|
|
|
u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */
|
|
u8 fErrorOrAux; /* isError!=0 or pVdbe->pAuxData modified */
|
|
|
- u8 bVtabNoChng; /* Fetching an unchanging column in a vtab UPDATE */
|
|
|
|
|
u8 argc; /* Number of arguments */
|
|
u8 argc; /* Number of arguments */
|
|
|
sqlite3_value *argv[1]; /* Argument set */
|
|
sqlite3_value *argv[1]; /* Argument set */
|
|
|
};
|
|
};
|
|
@@ -34799,7 +34797,7 @@ static void setDeviceCharacteristics(unixFile *pFile){
|
|
|
pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE;
|
|
pFile->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE;
|
|
|
pFile->deviceCharacteristics = 0;
|
|
pFile->deviceCharacteristics = 0;
|
|
|
if( fstatvfs(pFile->h, &fsInfo) == -1 ) {
|
|
if( fstatvfs(pFile->h, &fsInfo) == -1 ) {
|
|
|
- return pFile->sectorSize;
|
|
|
|
|
|
|
+ return;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if( !strcmp(fsInfo.f_basetype, "tmp") ) {
|
|
if( !strcmp(fsInfo.f_basetype, "tmp") ) {
|
|
@@ -42653,7 +42651,6 @@ static int winOpenSharedMemory(winFile *pDbFd){
|
|
|
struct winShm *p; /* The connection to be opened */
|
|
struct winShm *p; /* The connection to be opened */
|
|
|
winShmNode *pShmNode = 0; /* The underlying mmapped file */
|
|
winShmNode *pShmNode = 0; /* The underlying mmapped file */
|
|
|
int rc = SQLITE_OK; /* Result code */
|
|
int rc = SQLITE_OK; /* Result code */
|
|
|
- int rc2 = SQLITE_ERROR; /* winOpen result code */
|
|
|
|
|
winShmNode *pNew; /* Newly allocated winShmNode */
|
|
winShmNode *pNew; /* Newly allocated winShmNode */
|
|
|
int nName; /* Size of zName in bytes */
|
|
int nName; /* Size of zName in bytes */
|
|
|
|
|
|
|
@@ -42687,6 +42684,9 @@ static int winOpenSharedMemory(winFile *pDbFd){
|
|
|
if( pShmNode ){
|
|
if( pShmNode ){
|
|
|
sqlite3_free(pNew);
|
|
sqlite3_free(pNew);
|
|
|
}else{
|
|
}else{
|
|
|
|
|
+ int inFlags = SQLITE_OPEN_WAL;
|
|
|
|
|
+ int outFlags = 0;
|
|
|
|
|
+
|
|
|
pShmNode = pNew;
|
|
pShmNode = pNew;
|
|
|
pNew = 0;
|
|
pNew = 0;
|
|
|
((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE;
|
|
((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE;
|
|
@@ -42702,25 +42702,19 @@ static int winOpenSharedMemory(winFile *pDbFd){
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
|
|
if( 0==sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){
|
|
|
- rc2 = winOpen(pDbFd->pVfs,
|
|
|
|
|
- pShmNode->zFilename,
|
|
|
|
|
- (sqlite3_file*)&pShmNode->hFile,
|
|
|
|
|
- SQLITE_OPEN_WAL|SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE,
|
|
|
|
|
- 0);
|
|
|
|
|
|
|
+ inFlags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ inFlags |= SQLITE_OPEN_READONLY;
|
|
|
}
|
|
}
|
|
|
- if( rc2!=SQLITE_OK ){
|
|
|
|
|
- rc2 = winOpen(pDbFd->pVfs,
|
|
|
|
|
- pShmNode->zFilename,
|
|
|
|
|
- (sqlite3_file*)&pShmNode->hFile,
|
|
|
|
|
- SQLITE_OPEN_WAL|SQLITE_OPEN_READONLY,
|
|
|
|
|
- 0);
|
|
|
|
|
- if( rc2!=SQLITE_OK ){
|
|
|
|
|
- rc = winLogError(rc2, osGetLastError(), "winOpenShm",
|
|
|
|
|
- pShmNode->zFilename);
|
|
|
|
|
- goto shm_open_err;
|
|
|
|
|
- }
|
|
|
|
|
- pShmNode->isReadonly = 1;
|
|
|
|
|
|
|
+ rc = winOpen(pDbFd->pVfs, pShmNode->zFilename,
|
|
|
|
|
+ (sqlite3_file*)&pShmNode->hFile,
|
|
|
|
|
+ inFlags, &outFlags);
|
|
|
|
|
+ if( rc!=SQLITE_OK ){
|
|
|
|
|
+ rc = winLogError(rc, osGetLastError(), "winOpenShm",
|
|
|
|
|
+ pShmNode->zFilename);
|
|
|
|
|
+ goto shm_open_err;
|
|
|
}
|
|
}
|
|
|
|
|
+ if( outFlags==SQLITE_OPEN_READONLY ) pShmNode->isReadonly = 1;
|
|
|
|
|
|
|
|
rc = winLockSharedMemory(pShmNode);
|
|
rc = winLockSharedMemory(pShmNode);
|
|
|
if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err;
|
|
if( rc!=SQLITE_OK && rc!=SQLITE_READONLY_CANTINIT ) goto shm_open_err;
|
|
@@ -43906,8 +43900,10 @@ static int winOpen(
|
|
|
&extendedParameters);
|
|
&extendedParameters);
|
|
|
if( h!=INVALID_HANDLE_VALUE ) break;
|
|
if( h!=INVALID_HANDLE_VALUE ) break;
|
|
|
if( isReadWrite ){
|
|
if( isReadWrite ){
|
|
|
- int isRO = 0;
|
|
|
|
|
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
|
|
|
|
|
|
+ int rc2, isRO = 0;
|
|
|
|
|
+ sqlite3BeginBenignMalloc();
|
|
|
|
|
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
|
|
|
|
+ sqlite3EndBenignMalloc();
|
|
|
if( rc2==SQLITE_OK && isRO ) break;
|
|
if( rc2==SQLITE_OK && isRO ) break;
|
|
|
}
|
|
}
|
|
|
}while( winRetryIoerr(&cnt, &lastErrno) );
|
|
}while( winRetryIoerr(&cnt, &lastErrno) );
|
|
@@ -43921,8 +43917,10 @@ static int winOpen(
|
|
|
NULL);
|
|
NULL);
|
|
|
if( h!=INVALID_HANDLE_VALUE ) break;
|
|
if( h!=INVALID_HANDLE_VALUE ) break;
|
|
|
if( isReadWrite ){
|
|
if( isReadWrite ){
|
|
|
- int isRO = 0;
|
|
|
|
|
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
|
|
|
|
|
|
+ int rc2, isRO = 0;
|
|
|
|
|
+ sqlite3BeginBenignMalloc();
|
|
|
|
|
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
|
|
|
|
+ sqlite3EndBenignMalloc();
|
|
|
if( rc2==SQLITE_OK && isRO ) break;
|
|
if( rc2==SQLITE_OK && isRO ) break;
|
|
|
}
|
|
}
|
|
|
}while( winRetryIoerr(&cnt, &lastErrno) );
|
|
}while( winRetryIoerr(&cnt, &lastErrno) );
|
|
@@ -43939,8 +43937,10 @@ static int winOpen(
|
|
|
NULL);
|
|
NULL);
|
|
|
if( h!=INVALID_HANDLE_VALUE ) break;
|
|
if( h!=INVALID_HANDLE_VALUE ) break;
|
|
|
if( isReadWrite ){
|
|
if( isReadWrite ){
|
|
|
- int isRO = 0;
|
|
|
|
|
- int rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
|
|
|
|
|
|
+ int rc2, isRO = 0;
|
|
|
|
|
+ sqlite3BeginBenignMalloc();
|
|
|
|
|
+ rc2 = winAccess(pVfs, zName, SQLITE_ACCESS_READ, &isRO);
|
|
|
|
|
+ sqlite3EndBenignMalloc();
|
|
|
if( rc2==SQLITE_OK && isRO ) break;
|
|
if( rc2==SQLITE_OK && isRO ) break;
|
|
|
}
|
|
}
|
|
|
}while( winRetryIoerr(&cnt, &lastErrno) );
|
|
}while( winRetryIoerr(&cnt, &lastErrno) );
|
|
@@ -76523,6 +76523,8 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialGet(
|
|
|
case 10: { /* Internal use only: NULL with virtual table
|
|
case 10: { /* Internal use only: NULL with virtual table
|
|
|
** UPDATE no-change flag set */
|
|
** UPDATE no-change flag set */
|
|
|
pMem->flags = MEM_Null|MEM_Zero;
|
|
pMem->flags = MEM_Null|MEM_Zero;
|
|
|
|
|
+ pMem->n = 0;
|
|
|
|
|
+ pMem->u.nZero = 0;
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
case 11: /* Reserved for future use */
|
|
case 11: /* Reserved for future use */
|
|
@@ -95556,7 +95558,6 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(
|
|
|
pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0);
|
|
pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0);
|
|
|
}
|
|
}
|
|
|
pSel->iLimit = 0;
|
|
pSel->iLimit = 0;
|
|
|
- pSel->selFlags &= ~SF_MultiValue;
|
|
|
|
|
if( sqlite3Select(pParse, pSel, &dest) ){
|
|
if( sqlite3Select(pParse, pSel, &dest) ){
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
@@ -113749,6 +113750,7 @@ struct sqlite3_api_routines {
|
|
|
void *(*value_pointer)(sqlite3_value*,const char*);
|
|
void *(*value_pointer)(sqlite3_value*,const char*);
|
|
|
int (*vtab_nochange)(sqlite3_context*);
|
|
int (*vtab_nochange)(sqlite3_context*);
|
|
|
int (*value_nochange)(sqlite3_value*);
|
|
int (*value_nochange)(sqlite3_value*);
|
|
|
|
|
+ const char *(*vtab_collation)(sqlite3_index_info*,int);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -114019,6 +114021,7 @@ typedef int (*sqlite3_loadext_entry)(
|
|
|
/* Version 3.22.0 and later */
|
|
/* Version 3.22.0 and later */
|
|
|
#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange
|
|
#define sqlite3_vtab_nochange sqlite3_api->vtab_nochange
|
|
|
#define sqlite3_value_nochange sqltie3_api->value_nochange
|
|
#define sqlite3_value_nochange sqltie3_api->value_nochange
|
|
|
|
|
+#define sqlite3_vtab_collation sqltie3_api->vtab_collation
|
|
|
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
|
|
#endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */
|
|
|
|
|
|
|
|
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
|
#if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION)
|
|
@@ -114458,7 +114461,8 @@ static const sqlite3_api_routines sqlite3Apis = {
|
|
|
sqlite3_value_pointer,
|
|
sqlite3_value_pointer,
|
|
|
/* Version 3.22.0 and later */
|
|
/* Version 3.22.0 and later */
|
|
|
sqlite3_vtab_nochange,
|
|
sqlite3_vtab_nochange,
|
|
|
- sqlite3_value_nochange
|
|
|
|
|
|
|
+ sqlite3_value_nochange,
|
|
|
|
|
+ sqlite3_vtab_collation
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -121063,9 +121067,14 @@ static int multiSelectOrderBy(
|
|
|
** on a VALUES clause.
|
|
** on a VALUES clause.
|
|
|
**
|
|
**
|
|
|
** Because the Select object originates from a VALUES clause:
|
|
** Because the Select object originates from a VALUES clause:
|
|
|
-** (1) It has no LIMIT or OFFSET
|
|
|
|
|
|
|
+** (1) There is no LIMIT or OFFSET or else there is a LIMIT of exactly 1
|
|
|
** (2) All terms are UNION ALL
|
|
** (2) All terms are UNION ALL
|
|
|
** (3) There is no ORDER BY clause
|
|
** (3) There is no ORDER BY clause
|
|
|
|
|
+**
|
|
|
|
|
+** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES
|
|
|
|
|
+** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))").
|
|
|
|
|
+** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case.
|
|
|
|
|
+** Since the limit is exactly 1, we only need to evalutes the left-most VALUES.
|
|
|
*/
|
|
*/
|
|
|
static int multiSelectValues(
|
|
static int multiSelectValues(
|
|
|
Parse *pParse, /* Parsing context */
|
|
Parse *pParse, /* Parsing context */
|
|
@@ -121073,13 +121082,13 @@ static int multiSelectValues(
|
|
|
SelectDest *pDest /* What to do with query results */
|
|
SelectDest *pDest /* What to do with query results */
|
|
|
){
|
|
){
|
|
|
Select *pPrior;
|
|
Select *pPrior;
|
|
|
|
|
+ Select *pRightmost = p;
|
|
|
int nRow = 1;
|
|
int nRow = 1;
|
|
|
int rc = 0;
|
|
int rc = 0;
|
|
|
assert( p->selFlags & SF_MultiValue );
|
|
assert( p->selFlags & SF_MultiValue );
|
|
|
do{
|
|
do{
|
|
|
assert( p->selFlags & SF_Values );
|
|
assert( p->selFlags & SF_Values );
|
|
|
assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) );
|
|
assert( p->op==TK_ALL || (p->op==TK_SELECT && p->pPrior==0) );
|
|
|
- assert( p->pLimit==0 );
|
|
|
|
|
assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr );
|
|
assert( p->pNext==0 || p->pEList->nExpr==p->pNext->pEList->nExpr );
|
|
|
if( p->pPrior==0 ) break;
|
|
if( p->pPrior==0 ) break;
|
|
|
assert( p->pPrior->pNext==p );
|
|
assert( p->pPrior->pNext==p );
|
|
@@ -121091,7 +121100,7 @@ static int multiSelectValues(
|
|
|
p->pPrior = 0;
|
|
p->pPrior = 0;
|
|
|
rc = sqlite3Select(pParse, p, pDest);
|
|
rc = sqlite3Select(pParse, p, pDest);
|
|
|
p->pPrior = pPrior;
|
|
p->pPrior = pPrior;
|
|
|
- if( rc ) break;
|
|
|
|
|
|
|
+ if( rc || pRightmost->pLimit ) break;
|
|
|
p->nSelectRow = nRow;
|
|
p->nSelectRow = nRow;
|
|
|
p = p->pNext;
|
|
p = p->pNext;
|
|
|
}
|
|
}
|
|
@@ -137905,15 +137914,32 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
|
|
|
|
|
|
|
|
/* If the caller is an UPDATE or DELETE statement that is requesting
|
|
/* If the caller is an UPDATE or DELETE statement that is requesting
|
|
|
** to use a one-pass algorithm, determine if this is appropriate.
|
|
** to use a one-pass algorithm, determine if this is appropriate.
|
|
|
|
|
+ **
|
|
|
|
|
+ ** A one-pass approach can be used if the caller has requested one
|
|
|
|
|
+ ** and either (a) the scan visits at most one row or (b) each
|
|
|
|
|
+ ** of the following are true:
|
|
|
|
|
+ **
|
|
|
|
|
+ ** * the caller has indicated that a one-pass approach can be used
|
|
|
|
|
+ ** with multiple rows (by setting WHERE_ONEPASS_MULTIROW), and
|
|
|
|
|
+ ** * the table is not a virtual table, and
|
|
|
|
|
+ ** * either the scan does not use the OR optimization or the caller
|
|
|
|
|
+ ** is a DELETE operation (WHERE_DUPLICATES_OK is only specified
|
|
|
|
|
+ ** for DELETE).
|
|
|
|
|
+ **
|
|
|
|
|
+ ** The last qualification is because an UPDATE statement uses
|
|
|
|
|
+ ** WhereInfo.aiCurOnePass[1] to determine whether or not it really can
|
|
|
|
|
+ ** use a one-pass approach, and this is not set accurately for scans
|
|
|
|
|
+ ** that use the OR optimization.
|
|
|
*/
|
|
*/
|
|
|
assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 );
|
|
assert( (wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || pWInfo->nLevel==1 );
|
|
|
if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){
|
|
if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){
|
|
|
int wsFlags = pWInfo->a[0].pWLoop->wsFlags;
|
|
int wsFlags = pWInfo->a[0].pWLoop->wsFlags;
|
|
|
int bOnerow = (wsFlags & WHERE_ONEROW)!=0;
|
|
int bOnerow = (wsFlags & WHERE_ONEROW)!=0;
|
|
|
- if( bOnerow
|
|
|
|
|
- || ((wctrlFlags & WHERE_ONEPASS_MULTIROW)!=0
|
|
|
|
|
- && 0==(wsFlags & WHERE_VIRTUALTABLE))
|
|
|
|
|
- ){
|
|
|
|
|
|
|
+ if( bOnerow || (
|
|
|
|
|
+ 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW)
|
|
|
|
|
+ && 0==(wsFlags & WHERE_VIRTUALTABLE)
|
|
|
|
|
+ && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK))
|
|
|
|
|
+ )){
|
|
|
pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI;
|
|
pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI;
|
|
|
if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){
|
|
if( HasRowid(pTabList->a[0].pTab) && (wsFlags & WHERE_IDX_ONLY) ){
|
|
|
if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){
|
|
if( wctrlFlags & WHERE_ONEPASS_MULTIROW ){
|
|
@@ -218825,9 +218851,9 @@ static void print_elem(void *e, sqlite_int64 c, void* p){
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
/************** End of extension-functions.c *********************************/
|
|
/************** End of extension-functions.c *********************************/
|
|
|
-#if __LINE__!=218828
|
|
|
|
|
|
|
+#if __LINE__!=218854
|
|
|
#undef SQLITE_SOURCE_ID
|
|
#undef SQLITE_SOURCE_ID
|
|
|
-#define SQLITE_SOURCE_ID "2018-01-13 02:07:16 bb196fcb677e962db4308c02097968615729a51fe4a1292e468aaf3e4bf5alt2"
|
|
|
|
|
|
|
+#define SQLITE_SOURCE_ID "2018-01-17 01:40:57 3e04999dabb87715de46255b1a9b08d5dfa70d140e0a09a37ea2842d71c7alt2"
|
|
|
#endif
|
|
#endif
|
|
|
/* Return the source-id for this library */
|
|
/* Return the source-id for this library */
|
|
|
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
|
|
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
|