@@ -1171,11 +1171,11 @@
1171 1171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
1172 1172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite_version()] and [sqlite_source_id()].
1173 1173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1174 1174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_VERSION "3.34.0"
1175 1175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_VERSION_NUMBER 3034000
1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SOURCE_ID "2020-10-12 18:09:16 7e17c2f4b7dc9b563d0b4da949bb134dc7c4fc9c86ce03891432a884ca6409d5"
1176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SOURCE_ID "2020-10-19 12:35:08 77e64647ec429c6e0d884abbd00dabebe738f89544a4984d6fd7a702b928ccfd"
1177 1177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1178 1178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1179 1179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Run-Time Library Version Numbers
1180 1180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** KEYWORDS: sqlite3_version sqlite3_sourceid
1181 1181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -10290,22 +10290,29 @@
10290 10290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10291 10291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
10292 10292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Determine If Virtual Table Column Access Is For UPDATE
10293 10293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
10294 10294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the sqlite3_vtab_nochange(X) routine is called within the [xColumn]
10295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** method of a [virtual table], then it returns true if and only if the
10295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** method of a [virtual table], then it might return true if the
10296 10296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** column is being fetched as part of an UPDATE operation during which the
10297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** column value will not change. Applications might use this to substitute
10298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** a return value that is less expensive to compute and that the corresponding
10297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** column value will not change. The virtual table implementation can use
10298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this hint as permission to substitute a return value that is less
10299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expensive to compute and that the corresponding
10299 10300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [xUpdate] method understands as a "no-change" value.
10300 10301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
10301 10302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the [xColumn] method calls sqlite3_vtab_nochange() and finds that
10302 10303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the column is not changed by the UPDATE statement, then the xColumn
10303 10304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** method can optionally return without setting a result, without calling
10304 10305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** any of the [sqlite3_result_int|sqlite3_result_xxxxx() interfaces].
10305 10306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** In that case, [sqlite3_value_nochange(X)] will return true for the
10306 10307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** same column in the [xUpdate] method.
10308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
10309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sqlite3_vtab_nochange() routine is an optimization. Virtual table
10310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** implementations should continue to give a correct answer even if the
10311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_vtab_nochange() interface were to always return false. In the
10312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current implementation, the sqlite3_vtab_nochange() interface does always
10313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returns false for the enhanced [UPDATE FROM] statement.
10307 10314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
10308 10315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*);
10309 10316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10310 10317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
10311 10318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Determine The Collation For a Virtual Table Constraint
@@ -46915,11 +46922,15 @@
46915 46922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
46916 46923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opens a file, only if it exists. */
46917 46924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dwCreationDisposition = OPEN_EXISTING;
46918 46925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
46919 46926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
46920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
46927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( 0==sqlite3_uri_boolean(zName, "exclusive", 0) ){
46928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
46929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
46930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwShareMode = 0;
46931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
46921 46932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
46922 46933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isDelete ){
46923 46934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
46924 46935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dwFlagsAndAttributes = FILE_ATTRIBUTE_HIDDEN;
46925 46936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isTemp = 1;
@@ -48068,15 +48079,18 @@
48068 48079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
48069 48080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
48070 48081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Close an memdb-file.
48071 48082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
48072 48083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The pData pointer is owned by the application, so there is nothing
48073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to free.
48084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to free. Unless the SQLITE_DESERIALIZE_FREEONCLOSE flag is set,
48085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in which case we own the pData pointer and need to free it.
48074 48086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
48075 48087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int memdbClose(sqlite3_file *pFile){
48076 48088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MemFile *p = (MemFile *)pFile;
48077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->mFlags & SQLITE_DESERIALIZE_FREEONCLOSE ) sqlite3_free(p->aData);
48089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->mFlags & SQLITE_DESERIALIZE_FREEONCLOSE ){
48090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p->aData);
48091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
48078 48092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
48079 48093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
48080 48094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
48081 48095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
48082 48096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Read data from an memdb-file.
@@ -48531,10 +48545,11 @@
48531 48545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = memdbFromDbSchema(db, zSchema);
48532 48546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p==0 ){
48533 48547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_ERROR;
48534 48548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
48535 48549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->aData = pData;
48550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pData = 0;
48536 48551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->sz = szDb;
48537 48552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->szAlloc = szBuf;
48538 48553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->szMax = szBuf;
48539 48554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->szMax<sqlite3GlobalConfig.mxMemdbSize ){
48540 48555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->szMax = sqlite3GlobalConfig.mxMemdbSize;
@@ -48543,10 +48558,13 @@
48543 48558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
48544 48559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
48545 48560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
48546 48561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end_deserialize:
48547 48562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_finalize(pStmt);
48563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pData && (mFlags & SQLITE_DESERIALIZE_FREEONCLOSE)!=0 ){
48564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pData);
48565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
48548 48566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex_leave(db->mutex);
48549 48567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
48550 48568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
48551 48569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
48552 48570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -115172,11 +115190,11 @@
115172 115190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
115173 115191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct SrcList_item *pItem;
115174 115192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert(pList || pParse->db->mallocFailed );
115175 115193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pList ){
115176 115194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0, pItem=pList->a; i<pList->nSrc; i++, pItem++){
115177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pItem->iCursor>=0 ) break;
115195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pItem->iCursor>=0 ) continue;
115178 115196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pItem->iCursor = pParse->nTab++;
115179 115197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pItem->pSelect ){
115180 115198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3SrcListAssignCursors(pParse, pItem->pSelect->pSrc);
115181 115199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115182 115200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -131978,10 +131996,11 @@
131978 131996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
131979 131997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SrcList *pSrc = p->pSrc; /* The FROM clause of the recursive query */
131980 131998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nCol = p->pEList->nExpr; /* Number of columns in the recursive table */
131981 131999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Vdbe *v = pParse->pVdbe; /* The prepared statement under construction */
131982 132000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Select *pSetup = p->pPrior; /* The setup query */
132001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Select *pFirstRec; /* Left-most recursive term */
131983 132002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int addrTop; /* Top of the loop */
131984 132003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int addrCont, addrBreak; /* CONTINUE and BREAK addresses */
131985 132004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iCurrent = 0; /* The Current table */
131986 132005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int regCurrent; /* Register holding Current table */
131987 132006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iQueue; /* The Queue table */
@@ -132052,12 +132071,30 @@
132052 132071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->selFlags |= SF_UsesEphemeral;
132053 132072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
132054 132073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132055 132074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Detach the ORDER BY clause from the compound SELECT */
132056 132075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pOrderBy = 0;
132076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
132077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Figure out how many elements of the compound SELECT are part of the
132078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** recursive query. Make sure no recursive elements use aggregate
132079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** functions. Mark the recursive elements as UNION ALL even if they
132080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are really UNION because the distinctness will be enforced by the
132081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** iDistinct table. pFirstRec is left pointing to the left-most
132082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** recursive term of the CTE.
132083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
132084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFirstRec = p;
132085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pFirstRec=p; ALWAYS(pFirstRec!=0); pFirstRec=pFirstRec->pPrior){
132086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFirstRec->selFlags & SF_Aggregate ){
132087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported");
132088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto end_of_recursive_query;
132089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
132090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFirstRec->op = TK_ALL;
132091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pFirstRec->pPrior->selFlags & SF_Recursive)==0 ) break;
132092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
132057 132093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132058 132094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Store the results of the setup-query in Queue. */
132095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSetup = pFirstRec->pPrior;
132059 132096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pSetup->pNext = 0;
132060 132097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ExplainQueryPlan((pParse, 1, "SETUP"));
132061 132098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Select(pParse, pSetup, &destQueue);
132062 132099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pSetup->pNext = p;
132063 132100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ) goto end_of_recursive_query;
@@ -132086,19 +132123,15 @@
132086 132123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeResolveLabel(v, addrCont);
132087 132124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132088 132125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Execute the recursive SELECT taking the single row in Current as
132089 132126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the value for the recursive-table. Store the results in the Queue.
132090 132127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
132091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->selFlags & SF_Aggregate ){
132092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ErrorMsg(pParse, "recursive aggregate queries not supported");
132093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
132094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPrior = 0;
132095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ExplainQueryPlan((pParse, 1, "RECURSIVE STEP"));
132096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3Select(pParse, p, &destQueue);
132097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( p->pPrior==0 );
132098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPrior = pSetup;
132099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
132128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFirstRec->pPrior = 0;
132129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExplainQueryPlan((pParse, 1, "RECURSIVE STEP"));
132130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Select(pParse, p, &destQueue);
132131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pFirstRec->pPrior==0 );
132132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFirstRec->pPrior = pSetup;
132100 132133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132101 132134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Keep running the loop until the Queue is empty */
132102 132135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeGoto(v, addrTop);
132103 132136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeResolveLabel(v, addrBreak);
132104 132137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -132162,10 +132195,20 @@
132162 132195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nSelectRow = nRow;
132163 132196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = p->pNext;
132164 132197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
132165 132198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
132166 132199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
132200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
132201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
132202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return true if the SELECT statement which is known to be the recursive
132203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** part of a recursive CTE still has its anchor terms attached. If the
132204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** anchor terms have already been removed, then return false.
132205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
132206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int hasAnchor(Select *p){
132207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p && (p->selFlags & SF_Recursive)!=0 ){ p = p->pPrior; }
132208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p!=0;
132209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
132167 132210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132168 132211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
132169 132212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine is called to process a compound query form from
132170 132213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** two or more separate queries using UNION, UNION ALL, EXCEPT, or
132171 132214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** INTERSECT
@@ -132248,11 +132291,11 @@
132248 132291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
132249 132292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->pEList && pPrior->pEList );
132250 132293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->pEList->nExpr==pPrior->pEList->nExpr );
132251 132294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132252 132295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_CTE
132253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->selFlags & SF_Recursive ){
132296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (p->selFlags & SF_Recursive)!=0 && hasAnchor(p) ){
132254 132297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
generateWithRecursiveQuery(pParse, p, &dest);
132255 132298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
132256 132299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
132257 132300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132258 132301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Compound SELECTs that have an ORDER BY clause are handled separately.
@@ -132339,10 +132382,11 @@
132339 132382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->addrOpenEphm[0] == -1 );
132340 132383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->addrOpenEphm[0] = addr;
132341 132384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
findRightmost(p)->selFlags |= SF_UsesEphemeral;
132342 132385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->pEList );
132343 132386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
132387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
132344 132388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
132345 132389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Code the SELECT statements to our left
132346 132390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
132347 132391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !pPrior->pOrderBy );
132348 132392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3SelectDestInit(&uniondest, priorOp, unionTab);
@@ -134432,12 +134476,14 @@
134432 134476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCte ){
134433 134477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table *pTab;
134434 134478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ExprList *pEList;
134435 134479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Select *pSel;
134436 134480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Select *pLeft; /* Left-most SELECT statement */
134481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Select *pRecTerm; /* Left-most recursive term */
134437 134482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int bMayRecursive; /* True if compound joined by UNION [ALL] */
134438 134483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
With *pSavedWith; /* Initial value of pParse->pWith */
134484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iRecTab = -1; /* Cursor for recursive table */
134439 134485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
134440 134486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If pCte->zCteErr is non-NULL at this point, then this is an illegal
134441 134487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** recursive reference to CTE pCte. Leave an error in pParse and return
134442 134488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** early. If pCte->zCteErr is NULL, then this is not a recursive reference.
134443 134489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** In this case, proceed. */
@@ -134458,48 +134504,52 @@
134458 134504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFrom->pSelect = sqlite3SelectDup(db, pCte->pSelect, 0);
134459 134505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->mallocFailed ) return SQLITE_NOMEM_BKPT;
134460 134506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFrom->pSelect );
134461 134507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
134462 134508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if this is a recursive CTE. */
134463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSel = pFrom->pSelect;
134509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRecTerm = pSel = pFrom->pSelect;
134464 134510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bMayRecursive = ( pSel->op==TK_ALL || pSel->op==TK_UNION );
134465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( bMayRecursive ){
134511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( bMayRecursive && pRecTerm->op==pSel->op ){
134466 134512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
134467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SrcList *pSrc = pFrom->pSelect->pSrc;
134513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SrcList *pSrc = pRecTerm->pSrc;
134514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pRecTerm->pPrior!=0 );
134468 134515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<pSrc->nSrc; i++){
134469 134516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct SrcList_item *pItem = &pSrc->a[i];
134470 134517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pItem->zDatabase==0
134471 134518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& pItem->zName!=0
134472 134519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& 0==sqlite3StrICmp(pItem->zName, pCte->zName)
134473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
134520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
134474 134521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pItem->pTab = pTab;
134475 134522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pItem->fg.isRecursive = 1;
134523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pRecTerm->selFlags & SF_Recursive ){
134524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ErrorMsg(pParse,
134525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "multiple references to recursive table: %s", pCte->zName
134526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
134527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_ERROR;
134528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
134476 134529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTab->nTabRef++;
134477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSel->selFlags |= SF_Recursive;
134530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRecTerm->selFlags |= SF_Recursive;
134531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iRecTab<0 ) iRecTab = pParse->nTab++;
134532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pItem->iCursor = iRecTab;
134478 134533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
134479 134534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
134480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
134481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
134482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Only one recursive reference is permitted. */
134483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pTab->nTabRef>2 ){
134484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ErrorMsg(
134485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pParse, "multiple references to recursive table: %s", pCte->zName
134486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
134487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_ERROR;
134488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
134489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pTab->nTabRef==1 ||
134490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ((pSel->selFlags&SF_Recursive) && pTab->nTabRef==2 ));
134535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pRecTerm->selFlags & SF_Recursive)==0 ) break;
134536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRecTerm = pRecTerm->pPrior;
134537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
134491 134538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
134492 134539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCte->zCteErr = "circular reference: %s";
134493 134540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pSavedWith = pParse->pWith;
134494 134541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParse->pWith = pWith;
134495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( bMayRecursive ){
134496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Select *pPrior = pSel->pPrior;
134497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pPrior->pWith==0 );
134498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPrior->pWith = pSel->pWith;
134499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3WalkSelect(pWalker, pPrior);
134500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPrior->pWith = 0;
134542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSel->selFlags & SF_Recursive ){
134543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pRecTerm!=0 );
134544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (pRecTerm->selFlags & SF_Recursive)==0 );
134545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pRecTerm->pNext!=0 );
134546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (pRecTerm->pNext->selFlags & SF_Recursive)!=0 );
134547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pRecTerm->pWith==0 );
134548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRecTerm->pWith = pSel->pWith;
134549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3WalkSelect(pWalker, pRecTerm);
134550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRecTerm->pWith = 0;
134501 134551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
134502 134552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3WalkSelect(pWalker, pSel);
134503 134553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
134504 134554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParse->pWith = pWith;
134505 134555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -147740,11 +147790,11 @@
147740 147790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C';
147741 147791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTerm->eOperator & WO_SINGLE ){
147742 147792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_snprintf(sizeof(zLeft),zLeft,"left={%d:%d}",
147743 147793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTerm->leftCursor, pTerm->u.x.leftColumn);
147744 147794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( (pTerm->eOperator & WO_OR)!=0 && pTerm->u.pOrInfo!=0 ){
147745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%lld",
147795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(sizeof(zLeft),zLeft,"indexable=0x%llx",
147746 147796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTerm->u.pOrInfo->indexable);
147747 147797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
147748 147798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_snprintf(sizeof(zLeft),zLeft,"left=%d", pTerm->leftCursor);
147749 147799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
147750 147800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DebugPrintf(
@@ -231510,12 +231560,12 @@
231510 231560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
231511 231561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_CORE */
231512 231562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
231513 231563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
231514 231564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** End of stmt.c ************************************************/
231515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if __LINE__!=231515
231565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if __LINE__!=231565
231516 231566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#undef SQLITE_SOURCE_ID
231517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SOURCE_ID "2020-10-12 18:09:16 7e17c2f4b7dc9b563d0b4da949bb134dc7c4fc9c86ce03891432a884ca64alt2"
231567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SOURCE_ID "2020-10-19 12:35:08 77e64647ec429c6e0d884abbd00dabebe738f89544a4984d6fd7a702b928alt2"
231518 231568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
231519 231569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Return the source-id for this library */
231520 231570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
231521 231571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************************** End of sqlite3.c ******************************/
231522 231572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!