@@ -1186,11 +1186,11 @@
1186 1186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
1187 1187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite_version()] and [sqlite_source_id()].
1188 1188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1189 1189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_VERSION "3.35.0"
1190 1190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_VERSION_NUMBER 3035000
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SOURCE_ID "2021-01-09 19:10:04 49dfce469e6a17111b349e53578479daf783064200bf0eec5bf8a91d3553b19f"
1191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SOURCE_ID "2021-01-18 12:35:16 c1862abb44873f06ec0d772469d8a2d128ae4670b1e98c2d97b0e2da18df9a04"
1192 1192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1193 1193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1194 1194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Run-Time Library Version Numbers
1195 1195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** KEYWORDS: sqlite3_version sqlite3_sourceid
1196 1196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -14775,10 +14775,11 @@
14775 14775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Lookaside Lookaside;
14776 14776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct LookasideSlot LookasideSlot;
14777 14777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Module Module;
14778 14778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct NameContext NameContext;
14779 14779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Parse Parse;
14780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct ParseCleanup ParseCleanup;
14780 14781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct PreUpdate PreUpdate;
14781 14782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct PrintfArguments PrintfArguments;
14782 14783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct RenameToken RenameToken;
14783 14784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct RowSet RowSet;
14784 14785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Savepoint Savepoint;
@@ -16947,11 +16948,11 @@
16947 16948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u32 nSchemaLock; /* Do not reset the schema when non-zero */
16948 16949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */
16949 16950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int errCode; /* Most recent error code (SQLITE_*) */
16950 16951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int errMask; /* & result codes with this before returning */
16951 16952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iSysErrno; /* Errno value from last system error */
16952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u16 dbOptFlags; /* Flags to enable/disable optimizations */
16953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 dbOptFlags; /* Flags to enable/disable optimizations */
16953 16954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 enc; /* Text encoding */
16954 16955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 autoCommit; /* The auto-commit flag. */
16955 16956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 temp_store; /* 1: file 2: memory 0: default */
16956 16957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 mallocFailed; /* True if we have seen a malloc failure */
16957 16958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 bBenignMalloc; /* Do not require OOMs if true */
@@ -17154,28 +17155,30 @@
17154 17155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
17155 17156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Bits of the sqlite3.dbOptFlags field that are used by the
17156 17157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS,...) interface to
17157 17158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** selectively disable various optimizations.
17158 17159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
17159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_QueryFlattener 0x0001 /* Query flattening */
17160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_WindowFunc 0x0002 /* Use xInverse for window functions */
17161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_GroupByOrder 0x0004 /* GROUPBY cover of ORDERBY */
17162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_FactorOutConst 0x0008 /* Constant factoring */
17163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_DistinctOpt 0x0010 /* DISTINCT using indexes */
17164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_CoverIdxScan 0x0020 /* Covering index scans */
17165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_OrderByIdxJoin 0x0040 /* ORDER BY of joins via index */
17166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_Transitive 0x0080 /* Transitive constraints */
17167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_OmitNoopJoin 0x0100 /* Omit unused tables in joins */
17168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_CountOfView 0x0200 /* The count-of-view optimization */
17169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_CursorHints 0x0400 /* Add OP_CursorHint opcodes */
17170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_Stat4 0x0800 /* Use STAT4 data */
17171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* TH3 expects the Stat4 ^^^^^^ value to be 0x0800. Don't change it */
17172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_PushDown 0x1000 /* The push-down optimization */
17173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SimplifyJoin 0x2000 /* Convert LEFT JOIN to JOIN */
17174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SkipScan 0x4000 /* Skip-scans */
17175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_PropagateConst 0x8000 /* The constant propagation opt */
17176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_AllOpts 0xffff /* All optimizations */
17160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_QueryFlattener 0x00000001 /* Query flattening */
17161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_WindowFunc 0x00000002 /* Use xInverse for window functions */
17162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_GroupByOrder 0x00000004 /* GROUPBY cover of ORDERBY */
17163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_FactorOutConst 0x00000008 /* Constant factoring */
17164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_DistinctOpt 0x00000010 /* DISTINCT using indexes */
17165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_CoverIdxScan 0x00000020 /* Covering index scans */
17166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_OrderByIdxJoin 0x00000040 /* ORDER BY of joins via index */
17167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_Transitive 0x00000080 /* Transitive constraints */
17168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_OmitNoopJoin 0x00000100 /* Omit unused tables in joins */
17169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_CountOfView 0x00000200 /* The count-of-view optimization */
17170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_CursorHints 0x00000400 /* Add OP_CursorHint opcodes */
17171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_Stat4 0x00000800 /* Use STAT4 data */
17172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* TH3 expects this value ^^^^^^^^^^ to be 0x0000800. Don't change it */
17173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_PushDown 0x00001000 /* The push-down optimization */
17174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SimplifyJoin 0x00002000 /* Convert LEFT JOIN to JOIN */
17175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SkipScan 0x00004000 /* Skip-scans */
17176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_PropagateConst 0x00008000 /* The constant propagation opt */
17177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_MinMaxOpt 0x00010000 /* The min/max optimization */
17178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_ExistsToIN 0x00020000 /* The EXISTS-to-IN optimization */
17179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_AllOpts 0xffffffff /* All optimizations */
17177 17180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
17178 17181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
17179 17182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Macros for testing whether or not optimizations are enabled or disabled.
17180 17183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
17181 17184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0)
@@ -17638,11 +17641,10 @@
17638 17641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **azModuleArg; /* 0: module 1: schema 2: vtab name 3...: args */
17639 17642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VTable *pVTable; /* List of VTable objects. */
17640 17643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
17641 17644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Trigger *pTrigger; /* List of triggers stored in pSchema */
17642 17645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Schema *pSchema; /* Schema that contains this table */
17643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Table *pNextZombie; /* Next on the Parse.pZombieTab list */
17644 17646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
17645 17647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
17646 17648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
17647 17649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Allowed values for Table.tabFlags.
17648 17650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -18800,10 +18802,21 @@
18800 18802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define DbMaskSet(M,I) (M)|=(((yDbMask)1)<<(I))
18801 18803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define DbMaskAllZero(M) (M)==0
18802 18804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define DbMaskNonZero(M) (M)!=0
18803 18805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
18804 18806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
18807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
18808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An instance of the ParseCleanup object specifies an operation that
18809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** should be performed after parsing to deallocation resources obtained
18810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** during the parse and which are no longer needed.
18811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
18812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct ParseCleanup {
18813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ParseCleanup *pNext; /* Next cleanup task */
18814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pPtr; /* Pointer to object to deallocate */
18815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xCleanup)(sqlite3*,void*); /* Deallocation routine */
18816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
18817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
18805 18818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
18806 18819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** An SQL parser context. A copy of this structure is passed through
18807 18820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the parser and down into all the parser action routine in order to
18808 18821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** carry around information that is global to the entire parse.
18809 18822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -18831,10 +18844,13 @@
18831 18844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 mayAbort; /* True if statement may throw an ABORT exception */
18832 18845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */
18833 18846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 okConstFactor; /* OK to factor out constants */
18834 18847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 disableLookaside; /* Number of times lookaside has been disabled */
18835 18848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 disableVtab; /* Disable all virtual tables for this parse */
18849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
18850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */
18851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
18836 18852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRangeReg; /* Size of the temporary register block */
18837 18853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iRangeReg; /* First register in temporary register block */
18838 18854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nErr; /* Number of errors seen */
18839 18855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTab; /* Number of previously allocated VDBE cursors */
18840 18856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nMem; /* Number of memory cells used so far */
@@ -18909,14 +18925,13 @@
18909 18925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */
18910 18926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_VIRTUALTABLE
18911 18927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Token sArg; /* Complete text of a module argument */
18912 18928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table **apVtabLock; /* Pointer to virtual tables needing locking */
18913 18929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
18914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Table *pZombieTab; /* List of Table objects to delete after code gen */
18915 18930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */
18916 18931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
With *pWith; /* Current WITH clause, or NULL */
18917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- With *pWithToFree; /* Free this WITH object at the end of the parse */
18932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ParseCleanup *pCleanup; /* List of cleanup operations to run after parse */
18918 18933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_ALTERTABLE
18919 18934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
RenameToken *pRename; /* Tokens subject to renaming by ALTER TABLE */
18920 18935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
18921 18936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
18922 18937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -19780,10 +19795,11 @@
19780 19795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*);
19781 19796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE LogEst sqlite3WhereOutputRowCount(WhereInfo*);
19782 19797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo*);
19783 19798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo*);
19784 19799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo*);
19800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3WhereMinMaxOptEarlyOut(Vdbe*,WhereInfo*);
19785 19801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo*);
19786 19802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3WhereContinueLabel(WhereInfo*);
19787 19803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3WhereBreakLabel(WhereInfo*);
19788 19804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3WhereOkOnePass(WhereInfo*, int*);
19789 19805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define ONEPASS_OFF 0 /* Use of ONEPASS not allowed */
@@ -20279,10 +20295,11 @@
20279 20295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
20280 20296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
20281 20297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
20282 20298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
20283 20299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ParserReset(Parse*);
20300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3ParserAddCleanup(Parse*,void(*)(sqlite3*,void*),void*);
20284 20301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_ENABLE_NORMALIZE
20285 20302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE char *sqlite3Normalize(Vdbe*, const char*);
20286 20303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
20287 20304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Reprepare(Vdbe*);
20288 20305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*);
@@ -100513,11 +100530,22 @@
100513 100530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse, /* Parsing context */
100514 100531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pExpr, /* Add the "COLLATE" clause to this expression */
100515 100532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const Token *pCollName, /* Name of collating sequence */
100516 100533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int dequote /* True to dequote pCollName */
100517 100534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
100518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCollName->n>0 ){
100535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pExpr!=0 || pParse->db->mallocFailed );
100536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr==0 ) return 0;
100537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->op==TK_VECTOR ){
100538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExprList *pList = pExpr->x.pList;
100539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ALWAYS(pList!=0) ){
100540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
100541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pList->nExpr; i++){
100542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pList->a[i].pExpr = sqlite3ExprAddCollateToken(pParse,pList->a[i].pExpr,
100543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCollName, dequote);
100544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pCollName->n>0 ){
100519 100547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLLATE, pCollName, dequote);
100520 100548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pNew ){
100521 100549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->pLeft = pExpr;
100522 100550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->flags |= EP_Collate|EP_Skip;
100523 100551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pExpr = pNew;
@@ -121907,11 +121935,13 @@
121907 121935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121908 121936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInfo = pToplevel->pAinc;
121909 121937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( pInfo && pInfo->pTab!=pTab ){ pInfo = pInfo->pNext; }
121910 121938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pInfo==0 ){
121911 121939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInfo = sqlite3DbMallocRawNN(pParse->db, sizeof(*pInfo));
121912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pInfo==0 ) return 0;
121940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ParserAddCleanup(pToplevel, sqlite3DbFree, pInfo);
121941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testcase( pParse->earlyCleanup );
121942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pParse->db->mallocFailed ) return 0;
121913 121943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInfo->pNext = pToplevel->pAinc;
121914 121944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pToplevel->pAinc = pInfo;
121915 121945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInfo->pTab = pTab;
121916 121946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInfo->iDb = iDb;
121917 121947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pToplevel->nMem++; /* Register to hold name of table */
@@ -130048,19 +130078,66 @@
130048 130078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( pThis ){
130049 130079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
AggInfo *pNext = pThis->pNext;
130050 130080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
agginfoFree(db, pThis);
130051 130081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pThis = pNext;
130052 130082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
130083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pParse->pCleanup ){
130084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ParseCleanup *pCleanup = pParse->pCleanup;
130085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse->pCleanup = pCleanup->pNext;
130086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCleanup->xCleanup(db, pCleanup->pPtr);
130087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DbFree(db, pCleanup);
130088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
130053 130089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, pParse->aLabel);
130054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ExprListDelete(db, pParse->pConstExpr);
130090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pParse->pConstExpr ){
130091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprListDelete(db, pParse->pConstExpr);
130092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
130055 130093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db ){
130056 130094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( db->lookaside.bDisable >= pParse->disableLookaside );
130057 130095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->lookaside.bDisable -= pParse->disableLookaside;
130058 130096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue;
130059 130097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
130060 130098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParse->disableLookaside = 0;
130061 130099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
130100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
130101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
130102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Add a new cleanup operation to a Parser. The cleanup should happen when
130103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the parser object is destroyed. But, beware: the cleanup might happen
130104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** immediately.
130105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
130106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use this mechanism for uncommon cleanups. There is a higher setup
130107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cost for this mechansim (an extra malloc), so it should not be used
130108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for common cleanups that happen on most calls. But for less
130109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** common cleanups, we save a single NULL-pointer comparison in
130110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3ParserReset(), which reduces the total CPU cycle count.
130111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
130112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If a memory allocation error occurs, then the cleanup happens immediately.
130113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When eithr SQLITE_DEBUG or SQLITE_COVERAGE_TEST are defined, the
130114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pParse->earlyCleanup flag is set in that case. Calling code show verify
130115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that test cases exist for which this happens, to guard against possible
130116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use-after-free errors following an OOM. The preferred way to do this is
130117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to immediately follow the call to this routine with:
130118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
130119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** testcase( pParse->earlyCleanup );
130120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
130121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3ParserAddCleanup(
130122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Parse *pParse, /* Destroy when this Parser finishes */
130123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void (*xCleanup)(sqlite3*,void*), /* The cleanup routine */
130124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pPtr /* Pointer to object to be cleaned up */
130125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
130126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ParseCleanup *pCleanup = sqlite3DbMallocRaw(pParse->db, sizeof(*pCleanup));
130127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pCleanup ){
130128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCleanup->pNext = pParse->pCleanup;
130129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse->pCleanup = pCleanup;
130130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCleanup->pPtr = pPtr;
130131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCleanup->xCleanup = xCleanup;
130132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
130133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xCleanup(pParse->db, pPtr);
130134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST)
130135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse->earlyCleanup = 1;
130136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
130137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
130138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
130062 130139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
130063 130140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
130064 130141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Compile the UTF-8 encoded SQL statement zSql into a statement handle.
130065 130142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
130066 130143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int sqlite3Prepare(
@@ -134588,12 +134665,14 @@
134588 134665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
134589 134666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( ALWAYS(pSubitem->pTab!=0) ){
134590 134667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table *pTabToDel = pSubitem->pTab;
134591 134668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTabToDel->nTabRef==1 ){
134592 134669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pToplevel = sqlite3ParseToplevel(pParse);
134593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTabToDel->pNextZombie = pToplevel->pZombieTab;
134594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pToplevel->pZombieTab = pTabToDel;
134670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ParserAddCleanup(pToplevel,
134671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (void(*)(sqlite3*,void*))sqlite3DeleteTable,
134672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTabToDel);
134673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testcase( pToplevel->earlyCleanup );
134595 134674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
134596 134675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTabToDel->nTabRef--;
134597 134676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
134598 134677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pSubitem->pTab = 0;
134599 134678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -135086,11 +135165,15 @@
135086 135165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 sortFlags = 0;
135087 135166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
135088 135167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( *ppMinMax==0 );
135089 135168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFunc->op==TK_AGG_FUNCTION );
135090 135169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !IsWindowFunc(pFunc) );
135091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pEList==0 || pEList->nExpr!=1 || ExprHasProperty(pFunc, EP_WinFunc) ){
135170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pEList==0
135171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || pEList->nExpr!=1
135172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || ExprHasProperty(pFunc, EP_WinFunc)
135173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || OptimizationDisabled(db, SQLITE_MinMaxOpt)
135174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
135092 135175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return eRet;
135093 135176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
135094 135177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zFunc = pFunc->u.zToken;
135095 135178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3StrICmp(zFunc, "min")==0 ){
135096 135179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eRet = WHERE_ORDERBY_MIN;
@@ -135304,16 +135387,20 @@
135304 135387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** should be freed along with the Parse object. In other cases, when
135305 135388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** bFree==0, the With object will be freed along with the SELECT
135306 135389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** statement with which it is associated.
135307 135390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
135308 135391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3WithPush(Parse *pParse, With *pWith, u8 bFree){
135309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( bFree==0 || (pParse->pWith==0 && pParse->pWithToFree==0) );
135310 135392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWith ){
135311 135393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pParse->pWith!=pWith );
135312 135394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pWith->pOuter = pParse->pWith;
135313 135395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParse->pWith = pWith;
135314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( bFree ) pParse->pWithToFree = pWith;
135396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bFree ){
135397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ParserAddCleanup(pParse,
135398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (void(*)(sqlite3*,void*))sqlite3WithDelete,
135399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWith);
135400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testcase( pParse->earlyCleanup );
135401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
135315 135402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
135316 135403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
135317 135404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
135318 135405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
135319 135406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function checks if argument pFrom refers to a CTE declared by
@@ -137022,10 +137109,14 @@
137022 137109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SELECTTRACE_ENABLED
137023 137110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3SelectTrace & 0x400 ){
137024 137111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ii;
137025 137112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo));
137026 137113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3TreeViewSelect(0, p, 0);
137114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( minMaxFlag ){
137115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DebugPrintf("MIN/MAX Optimization (0x%02x) adds:\n", minMaxFlag);
137116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3TreeViewExprList(0, pMinMaxOrderBy, 0, "ORDERBY");
137117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
137027 137118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; ii<pAggInfo->nColumn; ii++){
137028 137119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DebugPrintf("agg-column[%d] iMem=%d\n",
137029 137120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ii, pAggInfo->aCol[ii].iMem);
137030 137121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pCExpr, 0);
137031 137122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -137211,11 +137302,11 @@
137211 137302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeComment((v, "indicate data in accumulator"));
137212 137303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
137213 137304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* End of the loop
137214 137305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
137215 137306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( groupBySort ){
137216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx, addrTopOfLoop);
137307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx,addrTopOfLoop);
137217 137308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeCoverage(v);
137218 137309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
137219 137310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3WhereEnd(pWInfo);
137220 137311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeToNoop(v, addrSortingIdx);
137221 137312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -137323,11 +137414,10 @@
137323 137414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Count, iCsr, pAggInfo->aFunc[0].iMem);
137324 137415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp1(v, OP_Close, iCsr);
137325 137416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
explainSimpleCount(pParse, pTab, pBest);
137326 137417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
137327 137418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int regAcc = 0; /* "populate accumulators" flag */
137328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int addrSkip;
137329 137419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
137330 137420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there are accumulator registers but no min() or max() functions
137331 137421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** without FILTER clauses, allocate register regAcc. Register regAcc
137332 137422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will contain 0 the first time the inner loop runs, and 1 thereafter.
137333 137423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The code generated by updateAccumulator() uses this to ensure
@@ -137372,13 +137462,12 @@
137372 137462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWInfo==0 ){
137373 137463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto select_end;
137374 137464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
137375 137465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
updateAccumulator(pParse, regAcc, pAggInfo);
137376 137466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc);
137377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- addrSkip = sqlite3WhereOrderByLimitOptLabel(pWInfo);
137378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( addrSkip!=sqlite3WhereContinueLabel(pWInfo) ){
137379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeGoto(v, addrSkip);
137467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( minMaxFlag ){
137468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3WhereMinMaxOptEarlyOut(v, pWInfo);
137380 137469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
137381 137470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3WhereEnd(pWInfo);
137382 137471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
finalizeAggFunctions(pParse, pAggInfo);
137383 137472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
137384 137473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -138648,11 +138737,10 @@
138648 138737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPrg->aColmask[0] = pSubParse->oldmask;
138649 138738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPrg->aColmask[1] = pSubParse->newmask;
138650 138739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeDelete(v);
138651 138740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
138652 138741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
138653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( !pSubParse->pAinc && !pSubParse->pZombieTab );
138654 138742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !pSubParse->pTriggerPrg && !pSubParse->nMaxArg );
138655 138743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ParserReset(pSubParse);
138656 138744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3StackFree(db, pSubParse);
138657 138745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
138658 138746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return pPrg;
@@ -146346,10 +146434,275 @@
146346 146434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
146347 146435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( mPrereq==0 ) return 0; /* No table references */
146348 146436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (mPrereq&(mPrereq-1))!=0 ) return 0; /* Refs more than one table */
146349 146437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return exprMightBeIndexed2(pFrom,mPrereq,aiCurCol,pExpr);
146350 146438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
146439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
146441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Expression callback for exprUsesSrclist().
146442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
146443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int exprUsesSrclistCb(Walker *p, Expr *pExpr){
146444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->op==TK_COLUMN ){
146445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SrcList *pSrc = p->u.pSrcList;
146446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCsr = pExpr->iTable;
146447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ii;
146448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=0; ii<pSrc->nSrc; ii++){
146449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSrc->a[ii].iCursor==iCsr ){
146450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p->eCode ? WRC_Abort : WRC_Continue;
146451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p->eCode ? WRC_Continue : WRC_Abort;
146454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return WRC_Continue;
146456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
146459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Select callback for exprUsesSrclist().
146460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
146461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int exprUsesSrclistSelectCb(Walker *p, Select *pSelect){
146462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return WRC_Abort;
146463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
146466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function always returns true if expression pExpr contains
146467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a sub-select.
146468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If there is no sub-select in pExpr, then return true if pExpr
146470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contains a TK_COLUMN node for a table that is (bUses==1)
146471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or is not (bUses==0) in pSrc.
146472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Said another way:
146474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bUses Return Meaning
146476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** -------- ------ ------------------------------------------------
146477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bUses==1 true pExpr contains either a sub-select or a
146479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** TK_COLUMN referencing pSrc.
146480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bUses==1 false pExpr contains no sub-selects and all TK_COLUMN
146482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nodes reference tables not found in pSrc
146483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bUses==0 true pExpr contains either a sub-select or a TK_COLUMN
146485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that references a table not in pSrc.
146486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bUses==0 false pExpr contains no sub-selects and all TK_COLUMN
146488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nodes reference pSrc
146489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
146490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int exprUsesSrclist(SrcList *pSrc, Expr *pExpr, int bUses){
146491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Walker sWalker;
146492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&sWalker, 0, sizeof(Walker));
146493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sWalker.eCode = bUses;
146494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sWalker.u.pSrcList = pSrc;
146495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sWalker.xExprCallback = exprUsesSrclistCb;
146496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sWalker.xSelectCallback = exprUsesSrclistSelectCb;
146497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (sqlite3WalkExpr(&sWalker, pExpr)==WRC_Abort);
146498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
146501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Context object used by exprExistsToInIter() as it iterates through an
146502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression tree.
146503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
146504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct ExistsToInCtx {
146505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SrcList *pSrc; /* The tables in an EXISTS(SELECT ... FROM <here> ...) */
146506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pInLhs; /* OUT: Use this as the LHS of the IN operator */
146507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pEq; /* OUT: The == term that include pInLhs */
146508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr **ppAnd; /* OUT: The AND operator that includes pEq as a child */
146509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr **ppParent; /* The AND operator currently being examined */
146510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
146511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
146513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Iterate through all AND connected nodes in the expression tree
146514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** headed by (*ppExpr), populating the structure passed as the first
146515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** argument with the values required by exprAnalyzeExistsFindEq().
146516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function returns non-zero if the expression tree does not meet
146518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the two conditions described by the header comment for
146519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exprAnalyzeExistsFindEq(), or zero if it does.
146520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
146521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int exprExistsToInIter(struct ExistsToInCtx *p, Expr **ppExpr){
146522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pExpr = *ppExpr;
146523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( pExpr->op ){
146524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case TK_AND:
146525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->ppParent = ppExpr;
146526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( exprExistsToInIter(p, &pExpr->pLeft) ) return 1;
146527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->ppParent = ppExpr;
146528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( exprExistsToInIter(p, &pExpr->pRight) ) return 1;
146529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
146530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case TK_EQ: {
146531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bLeft = exprUsesSrclist(p->pSrc, pExpr->pLeft, 0);
146532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bRight = exprUsesSrclist(p->pSrc, pExpr->pRight, 0);
146533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bLeft || bRight ){
146534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (bLeft && bRight) || p->pInLhs ) return 1;
146535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pInLhs = bLeft ? pExpr->pLeft : pExpr->pRight;
146536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( exprUsesSrclist(p->pSrc, p->pInLhs, 1) ) return 1;
146537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pEq = pExpr;
146538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->ppAnd = p->ppParent;
146539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
146541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default:
146543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( exprUsesSrclist(p->pSrc, pExpr, 0) ){
146544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
146545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
146547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
146550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
146553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is used by exprAnalyzeExists() when creating virtual IN(...)
146554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** terms equivalent to user-supplied EXIST(...) clauses. It splits the WHERE
146555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** clause of the Select object passed as the first argument into one or more
146556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expressions joined by AND operators, and then tests if the following are
146557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** true:
146558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. Exactly one of the AND separated terms refers to the outer
146560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** query, and it is an == (TK_EQ) expression.
146561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. Only one side of the == expression refers to the outer query, and
146563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it does not refer to any columns from the inner query.
146564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If both these conditions are true, then a pointer to the side of the ==
146566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression that refers to the outer query is returned. The caller will
146567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use this expression as the LHS of the IN(...) virtual term. Or, if one
146568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or both of the above conditions are not true, NULL is returned.
146569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If non-NULL is returned and ppEq is non-NULL, *ppEq is set to point
146571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the == expression node before returning. If pppAnd is non-NULL and
146572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the == node is not the root of the WHERE clause, then *pppAnd is set
146573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to point to the pointer to the AND node that is the parent of the ==
146574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** node within the WHERE expression tree.
146575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
146576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static Expr *exprAnalyzeExistsFindEq(
146577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Select *pSel, /* The SELECT of the EXISTS */
146578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr **ppEq, /* OUT: == node from WHERE clause */
146579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr ***pppAnd /* OUT: Pointer to parent of ==, if any */
146580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
146581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct ExistsToInCtx ctx;
146582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&ctx, 0, sizeof(ctx));
146583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ctx.pSrc = pSel->pSrc;
146584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( exprExistsToInIter(&ctx, &pSel->pWhere) ){
146585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
146586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ppEq ) *ppEq = ctx.pEq;
146588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pppAnd ) *pppAnd = ctx.ppAnd;
146589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return ctx.pInLhs;
146590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
146593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Term idxTerm of the WHERE clause passed as the second argument is an
146594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** EXISTS expression with a correlated SELECT statement on the RHS.
146595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function analyzes the SELECT statement, and if possible adds an
146596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** equivalent "? IN(SELECT...)" virtual term to the WHERE clause.
146597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For an EXISTS term such as the following:
146599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** EXISTS (SELECT ... FROM <srclist> WHERE <e1> = <e2> AND <e3>)
146601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The virtual IN() term added is:
146603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** <e1> IN (SELECT <e2> FROM <srclist> WHERE <e3>)
146605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The virtual term is only added if the following conditions are met:
146607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. The sub-select must not be an aggregate or use window functions,
146609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. The sub-select must not be a compound SELECT,
146611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3. Expression <e1> must refer to at least one column from the outer
146613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** query, and must not refer to any column from the inner query
146614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (i.e. from <srclist>).
146615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 4. <e2> and <e3> must not refer to any values from the outer query.
146617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** In other words, once <e1> has been removed, the inner query
146618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** must not be correlated.
146619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
146620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
146621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void exprAnalyzeExists(
146622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SrcList *pSrc, /* the FROM clause */
146623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WhereClause *pWC, /* the WHERE clause */
146624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int idxTerm /* Index of the term to be analyzed */
146625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
146626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Parse *pParse = pWC->pWInfo->pParse;
146627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WhereTerm *pTerm = &pWC->a[idxTerm];
146628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pExpr = pTerm->pExpr;
146629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Select *pSel = pExpr->x.pSelect;
146630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pDup = 0;
146631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pEq = 0;
146632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pRet = 0;
146633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pInLhs = 0;
146634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr **ppAnd = 0;
146635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int idxNew;
146636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3 *db = pParse->db;
146637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pExpr->op==TK_EXISTS );
146639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (pExpr->flags & EP_VarSelect) && (pExpr->flags & EP_xIsSelect) );
146640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pSel->selFlags & SF_Aggregate) || pSel->pWin ) return;
146642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSel->pPrior ) return;
146643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSel->pWhere==0 ) return;
146644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( 0==exprAnalyzeExistsFindEq(pSel, 0, 0) ) return;
146645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDup = sqlite3ExprDup(db, pExpr, 0);
146647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db->mallocFailed ){
146648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprDelete(db, pDup);
146649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
146650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSel = pDup->x.pSelect;
146652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprListDelete(db, pSel->pEList);
146653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSel->pEList = 0;
146654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInLhs = exprAnalyzeExistsFindEq(pSel, &pEq, &ppAnd);
146656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pInLhs && pEq );
146657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pEq==pSel->pWhere || ppAnd );
146658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pInLhs==pEq->pLeft ){
146659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet = pEq->pRight;
146660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
146661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CollSeq *p = sqlite3ExprCompareCollSeq(pParse, pEq);
146662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInLhs = sqlite3ExprAddCollateString(pParse, pInLhs, p?p->zName:"BINARY");
146663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet = pEq->pLeft;
146664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pDup->pLeft==0 );
146667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDup->op = TK_IN;
146668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDup->pLeft = pInLhs;
146669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDup->flags &= ~EP_VarSelect;
146670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pRet->op==TK_VECTOR ){
146671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSel->pEList = pRet->x.pList;
146672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet->x.pList = 0;
146673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprDelete(db, pRet);
146674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
146675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSel->pEList = sqlite3ExprListAppend(pParse, 0, pRet);
146676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pEq->pLeft = 0;
146678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pEq->pRight = 0;
146679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ppAnd ){
146680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pAnd = *ppAnd;
146681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pOther = (pAnd->pLeft==pEq) ? pAnd->pRight : pAnd->pLeft;
146682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pAnd->pLeft = pAnd->pRight = 0;
146683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprDelete(db, pAnd);
146684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppAnd = pOther;
146685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
146686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pSel->pWhere==pEq );
146687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSel->pWhere = 0;
146688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprDelete(db, pEq);
146690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef WHERETRACE_ENABLED /* 0x20 */
146692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3WhereTrace & 0x20 ){
146693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DebugPrintf("Convert EXISTS:\n");
146694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3TreeViewExpr(0, pExpr, 0);
146695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DebugPrintf("into IN:\n");
146696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3TreeViewExpr(0, pDup, 0);
146697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
146699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ idxNew = whereClauseInsert(pWC, pDup, TERM_VIRTUAL|TERM_DYNAMIC);
146700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exprAnalyze(pSrc, pWC, idxNew);
146701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ markTermAsChild(pWC, idxNew, idxTerm);
146702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWC->a[idxTerm].wtFlags |= TERM_COPIED;
146703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146351 146704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
146352 146705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
146353 146706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The input to this routine is an WhereTerm structure with only the
146354 146707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** "pExpr" field filled in. The job of this routine is to analyze the
146355 146708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** subexpression and populate all the other fields of the WhereTerm
@@ -146531,10 +146884,20 @@
146531 146884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pWC->op==TK_AND );
146532 146885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
exprAnalyzeOrTerm(pSrc, pWC, idxTerm);
146533 146886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTerm = &pWC->a[idxTerm];
146534 146887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
146535 146888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_OR_OPTIMIZATION */
146889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( pExpr->op==TK_EXISTS ){
146891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Perhaps treat an EXISTS operator as an IN operator */
146892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pExpr->flags & EP_VarSelect)!=0
146893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && OptimizationEnabled(db, SQLITE_ExistsToIN)
146894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
146895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ exprAnalyzeExists(pSrc, pWC, idxTerm);
146896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
146536 146899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
146537 146900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_LIKE_OPTIMIZATION
146538 146901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Add constraints to reduce the search space on a LIKE or GLOB
146539 146902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** operator.
146540 146903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -147054,10 +147417,36 @@
147054 147417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
147055 147418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInner = &pWInfo->a[pWInfo->nLevel-1];
147056 147419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pInner->addrNxt!=0 );
147057 147420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return pInner->addrNxt;
147058 147421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
147422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
147423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
147424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** While generating code for the min/max optimization, after handling
147425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the aggregate-step call to min() or max(), check to see if any
147426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** additional looping is required. If the output order is such that
147427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** we are certain that the correct answer has already been found, then
147428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** code an OP_Goto to by pass subsequent processing.
147429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
147430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Any extra OP_Goto that is coded here is an optimization. The
147431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** correct answer should be obtained regardless. This OP_Goto just
147432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** makes the answer appear faster.
147433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
147434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3WhereMinMaxOptEarlyOut(Vdbe *v, WhereInfo *pWInfo){
147435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WhereLevel *pInner;
147436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
147437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pWInfo->bOrderedInnerLoop ) return;
147438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWInfo->nOBSat==0 ) return;
147439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=pWInfo->nLevel-1; i>=0; i--){
147440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInner = &pWInfo->a[i];
147441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pInner->pWLoop->wsFlags & WHERE_COLUMN_IN)!=0 ){
147442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeGoto(v, pInner->addrNxt);
147443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
147444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
147445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
147446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeGoto(v, pWInfo->iBreak);
147447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
147059 147448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
147060 147449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
147061 147450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the VDBE address or label to jump to in order to continue
147062 147451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** immediately with the next row of a WHERE clause.
147063 147452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -162028,23 +162417,11 @@
162028 162417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DeleteTable(db, pParse->pNewTable);
162029 162418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
162030 162419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !IN_RENAME_OBJECT ){
162031 162420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DeleteTrigger(db, pParse->pNewTrigger);
162032 162421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
162033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
162034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pParse->pWithToFree ) sqlite3WithDelete(db, pParse->pWithToFree);
162035 162422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, pParse->pVList);
162036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pParse->pAinc ){
162037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- AutoincInfo *p = pParse->pAinc;
162038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pParse->pAinc = p->pNext;
162039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DbFreeNN(db, p);
162040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
162041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pParse->pZombieTab ){
162042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Table *p = pParse->pZombieTab;
162043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pParse->pZombieTab = p->pNextZombie;
162044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DeleteTable(db, p);
162045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
162046 162423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->pParse = pParse->pParentParse;
162047 162424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParse->pParentParse = 0;
162048 162425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( nErr==0 || pParse->rc!=SQLITE_OK );
162049 162426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return nErr;
162050 162427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -166653,11 +167030,11 @@
166653 167030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** with various optimizations disabled to verify that the same answer
166654 167031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is obtained in every case.
166655 167032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
166656 167033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_TESTCTRL_OPTIMIZATIONS: {
166657 167034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db = va_arg(ap, sqlite3*);
166658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->dbOptFlags = (u16)(va_arg(ap, int) & 0xffff);
167035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->dbOptFlags = va_arg(ap, u32);
166659 167036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
166660 167037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
166661 167038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
166662 167039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff);
166663 167040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -227709,11 +228086,11 @@
227709 228086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nArg, /* Number of args */
227710 228087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value **apUnused /* Function arguments */
227711 228088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
227712 228089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( nArg==0 );
227713 228090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAM2(nArg, apUnused);
227714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_result_text(pCtx, "fts5: 2021-01-09 19:10:04 49dfce469e6a17111b349e53578479daf783064200bf0eec5bf8a91d3553b19f", -1, SQLITE_TRANSIENT);
228091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_text(pCtx, "fts5: 2021-01-18 12:35:16 c1862abb44873f06ec0d772469d8a2d128ae4670b1e98c2d97b0e2da18df9a04", -1, SQLITE_TRANSIENT);
227715 228092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
227716 228093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
227717 228094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
227718 228095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return true if zName is the extension on one of the shadow tables used
227719 228096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by this module.
@@ -232635,12 +233012,12 @@
232635 233012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
232636 233013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_CORE */
232637 233014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_STMTVTAB) */
232638 233015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
232639 233016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** End of stmt.c ************************************************/
232640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if __LINE__!=232640
233017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if __LINE__!=233017
232641 233018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#undef SQLITE_SOURCE_ID
232642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SOURCE_ID "2021-01-09 19:10:04 49dfce469e6a17111b349e53578479daf783064200bf0eec5bf8a91d3553alt2"
233019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SOURCE_ID "2021-01-18 12:35:16 c1862abb44873f06ec0d772469d8a2d128ae4670b1e98c2d97b0e2da18dfalt2"
232643 233020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
232644 233021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Return the source-id for this library */
232645 233022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
232646 233023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************************** End of sqlite3.c ******************************/
232647 233024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!