Index: third_party/sqlite/src/src/sqliteInt.h |
diff --git a/third_party/sqlite/src/src/sqliteInt.h b/third_party/sqlite/src/src/sqliteInt.h |
index c01bbc78698e35a70acbb169aaf9d6be21a88468..ee58edad775c046bef6193a8f550105a3cf968f1 100644 |
--- a/third_party/sqlite/src/src/sqliteInt.h |
+++ b/third_party/sqlite/src/src/sqliteInt.h |
@@ -12,8 +12,54 @@ |
** Internal interface definitions for SQLite. |
** |
*/ |
-#ifndef _SQLITEINT_H_ |
-#define _SQLITEINT_H_ |
+#ifndef SQLITEINT_H |
+#define SQLITEINT_H |
+ |
+/* Special Comments: |
+** |
+** Some comments have special meaning to the tools that measure test |
+** coverage: |
+** |
+** NO_TEST - The branches on this line are not |
+** measured by branch coverage. This is |
+** used on lines of code that actually |
+** implement parts of coverage testing. |
+** |
+** OPTIMIZATION-IF-TRUE - This branch is allowed to alway be false |
+** and the correct answer is still obtained, |
+** though perhaps more slowly. |
+** |
+** OPTIMIZATION-IF-FALSE - This branch is allowed to alway be true |
+** and the correct answer is still obtained, |
+** though perhaps more slowly. |
+** |
+** PREVENTS-HARMLESS-OVERREAD - This branch prevents a buffer overread |
+** that would be harmless and undetectable |
+** if it did occur. |
+** |
+** In all cases, the special comment must be enclosed in the usual |
+** slash-asterisk...asterisk-slash comment marks, with no spaces between the |
+** asterisks and the comment text. |
+*/ |
+ |
+/* |
+** Make sure the Tcl calling convention macro is defined. This macro is |
+** only used by test code and Tcl integration code. |
+*/ |
+#ifndef SQLITE_TCLAPI |
+# define SQLITE_TCLAPI |
+#endif |
+ |
+/* |
+** Make sure that rand_s() is available on Windows systems with MSVC 2005 |
+** or higher. |
+*/ |
+#if defined(_MSC_VER) && _MSC_VER>=1400 |
+/* TODO(shess): Already defined by build/config/win/BUILD.gn */ |
+#ifndef _CRT_RAND_S |
+# define _CRT_RAND_S |
+#endif |
+#endif |
/* |
** Include the header file used to customize the compiler options for MSVC. |
@@ -60,12 +106,28 @@ |
# define _LARGEFILE_SOURCE 1 |
#endif |
-/* What version of GCC is being used. 0 means GCC is not being used */ |
-#ifdef __GNUC__ |
+/* The GCC_VERSION, CLANG_VERSION, and MSVC_VERSION macros are used to |
+** conditionally include optimizations for each of these compilers. A |
+** value of 0 means that compiler is not being used. The |
+** SQLITE_DISABLE_INTRINSIC macro means do not use any compiler-specific |
+** optimizations, and hence set all compiler macros to 0 |
+*/ |
+#if defined(__GNUC__) && !defined(SQLITE_DISABLE_INTRINSIC) |
# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) |
#else |
# define GCC_VERSION 0 |
#endif |
+#if defined(__clang__) && !defined(_WIN32) && !defined(SQLITE_DISABLE_INTRINSIC) |
+# define CLANG_VERSION \ |
+ (__clang_major__*1000000+__clang_minor__*1000+__clang_patchlevel__) |
+#else |
+# define CLANG_VERSION 0 |
+#endif |
+#if defined(_MSC_VER) && !defined(SQLITE_DISABLE_INTRINSIC) |
+# define MSVC_VERSION _MSC_VER |
+#else |
+# define MSVC_VERSION 0 |
+#endif |
/* Needed for various definitions... */ |
#if defined(__GNUC__) && !defined(_GNU_SOURCE) |
@@ -149,7 +211,7 @@ |
** to the next, so we have developed the following set of #if statements |
** to generate appropriate macros for a wide range of compilers. |
** |
-** The correct "ANSI" way to do this is to use the intptr_t type. |
+** The correct "ANSI" way to do this is to use the intptr_t type. |
** Unfortunately, that typedef is not available on all compilers, or |
** if it is available, it requires an #include of specific headers |
** that vary from one machine to the next. |
@@ -174,21 +236,6 @@ |
#endif |
/* |
-** The SQLITE_WITHIN(P,S,E) macro checks to see if pointer P points to |
-** something between S (inclusive) and E (exclusive). |
-** |
-** In other words, S is a buffer and E is a pointer to the first byte after |
-** the end of buffer S. This macro returns true if P points to something |
-** contained within the buffer S. |
-*/ |
-#if defined(HAVE_STDINT_H) |
-# define SQLITE_WITHIN(P,S,E) \ |
- ((uintptr_t)(P)>=(uintptr_t)(S) && (uintptr_t)(P)<(uintptr_t)(E)) |
-#else |
-# define SQLITE_WITHIN(P,S,E) ((P)>=(S) && (P)<(E)) |
-#endif |
- |
-/* |
** A macro to hint to the compiler that a function should not be |
** inlined. |
*/ |
@@ -206,11 +253,12 @@ |
** the SQLITE_DISABLE_INTRINSIC define. |
*/ |
#if !defined(SQLITE_DISABLE_INTRINSIC) |
-# if defined(_MSC_VER) && _MSC_VER>=1300 |
+# if defined(_MSC_VER) && _MSC_VER>=1400 |
# if !defined(_WIN32_WCE) |
# include <intrin.h> |
# pragma intrinsic(_byteswap_ushort) |
# pragma intrinsic(_byteswap_ulong) |
+# pragma intrinsic(_byteswap_uint64) |
# pragma intrinsic(_ReadWriteBarrier) |
# else |
# include <cmnintrin.h> |
@@ -316,7 +364,7 @@ |
** is set. Thus NDEBUG becomes an opt-in rather than an opt-out |
** feature. |
*/ |
-#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) |
+#if !defined(NDEBUG) && !defined(SQLITE_DEBUG) |
# define NDEBUG 1 |
#endif |
#if defined(NDEBUG) && defined(SQLITE_DEBUG) |
@@ -331,7 +379,7 @@ |
#endif |
/* |
-** The testcase() macro is used to aid in coverage testing. When |
+** The testcase() macro is used to aid in coverage testing. When |
** doing coverage testing, the condition inside the argument to |
** testcase() must be evaluated both true and false in order to |
** get full branch coverage. The testcase() macro is inserted |
@@ -377,7 +425,7 @@ |
#endif |
/* |
-** The ALWAYS and NEVER macros surround boolean expressions which |
+** The ALWAYS and NEVER macros surround boolean expressions which |
** are intended to always be true or false, respectively. Such |
** expressions could be omitted from the code completely. But they |
** are included in a few cases in order to enhance the resilience |
@@ -391,7 +439,7 @@ |
** be true and false so that the unreachable code they specify will |
** not be counted as untested code. |
*/ |
-#if defined(SQLITE_COVERAGE_TEST) |
+#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_MUTATION_TEST) |
# define ALWAYS(X) (1) |
# define NEVER(X) (0) |
#elif !defined(NDEBUG) |
@@ -403,6 +451,21 @@ |
#endif |
/* |
+** Some malloc failures are only possible if SQLITE_TEST_REALLOC_STRESS is |
+** defined. We need to defend against those failures when testing with |
+** SQLITE_TEST_REALLOC_STRESS, but we don't want the unreachable branches |
+** during a normal build. The following macro can be used to disable tests |
+** that are always false except when SQLITE_TEST_REALLOC_STRESS is set. |
+*/ |
+#if defined(SQLITE_TEST_REALLOC_STRESS) |
+# define ONLY_IF_REALLOC_STRESS(X) (X) |
+#elif !defined(NDEBUG) |
+# define ONLY_IF_REALLOC_STRESS(X) ((X)?(assert(0),1):0) |
+#else |
+# define ONLY_IF_REALLOC_STRESS(X) (0) |
+#endif |
+ |
+/* |
** Declarations used for tracing the operating system interfaces. |
*/ |
#if defined(SQLITE_FORCE_OS_TRACE) || defined(SQLITE_TEST) || \ |
@@ -429,6 +492,13 @@ |
#endif |
/* |
+** SQLITE_ENABLE_EXPLAIN_COMMENTS is incompatible with SQLITE_OMIT_EXPLAIN |
+*/ |
+#ifdef SQLITE_OMIT_EXPLAIN |
+# undef SQLITE_ENABLE_EXPLAIN_COMMENTS |
+#endif |
+ |
+/* |
** Return true (non-zero) if the input is an integer that is too large |
** to fit in 32-bits. This macro is used inside of various testcase() |
** macros to verify that we have tested SQLite for large-file support. |
@@ -454,6 +524,18 @@ |
#include <stddef.h> |
/* |
+** Use a macro to replace memcpy() if compiled with SQLITE_INLINE_MEMCPY. |
+** This allows better measurements of where memcpy() is used when running |
+** cachegrind. But this macro version of memcpy() is very slow so it |
+** should not be used in production. This is a performance measurement |
+** hack only. |
+*/ |
+#ifdef SQLITE_INLINE_MEMCPY |
+# define memcpy(D,S,N) {char*xxd=(char*)(D);const char*xxs=(const char*)(S);\ |
+ int xxn=(N);while(xxn-->0)*(xxd++)=*(xxs++);} |
+#endif |
+ |
+/* |
** If compiling for a processor that lacks floating point support, |
** substitute integer for floating-point |
*/ |
@@ -475,7 +557,7 @@ |
/* |
** OMIT_TEMPDB is set to 1 if SQLITE_OMIT_TEMPDB is defined, or 0 |
-** afterward. Having this macro allows us to cause the C compiler |
+** afterward. Having this macro allows us to cause the C compiler |
** to omit code used by TEMP tables without messy #ifndef statements. |
*/ |
#ifdef SQLITE_OMIT_TEMPDB |
@@ -514,7 +596,7 @@ |
/* |
** If no value has been provided for SQLITE_MAX_WORKER_THREADS, or if |
-** SQLITE_TEMP_STORE is set to 3 (never use temporary files), set it |
+** SQLITE_TEMP_STORE is set to 3 (never use temporary files), set it |
** to zero. |
*/ |
#if SQLITE_TEMP_STORE==3 || SQLITE_THREADSAFE==0 |
@@ -537,9 +619,12 @@ |
** pagecaches for each database connection. A positive number is the |
** number of pages. A negative number N translations means that a buffer |
** of -1024*N bytes is allocated and used for as many pages as it will hold. |
+** |
+** The default value of "20" was choosen to minimize the run-time of the |
+** speedtest1 test program with options: --shrink-memory --reprepare |
*/ |
#ifndef SQLITE_DEFAULT_PCACHE_INITSZ |
-# define SQLITE_DEFAULT_PCACHE_INITSZ 100 |
+# define SQLITE_DEFAULT_PCACHE_INITSZ 20 |
#endif |
/* |
@@ -553,8 +638,12 @@ |
/* |
** Macros to compute minimum and maximum of two numbers. |
*/ |
-#define MIN(A,B) ((A)<(B)?(A):(B)) |
-#define MAX(A,B) ((A)>(B)?(A):(B)) |
+#ifndef MIN |
+# define MIN(A,B) ((A)<(B)?(A):(B)) |
+#endif |
+#ifndef MAX |
+# define MAX(A,B) ((A)>(B)?(A):(B)) |
+#endif |
/* |
** Swap two objects of type TYPE. |
@@ -662,7 +751,7 @@ typedef INT8_TYPE i8; /* 1-byte signed integer */ |
** 4 -> 20 1000 -> 99 1048576 -> 200 |
** 10 -> 33 1024 -> 100 4294967296 -> 320 |
** |
-** The LogEst can be negative to indicate fractional values. |
+** The LogEst can be negative to indicate fractional values. |
** Examples: |
** |
** 0.5 -> -10 0.1 -> -33 0.0625 -> -40 |
@@ -683,38 +772,62 @@ typedef INT16_TYPE LogEst; |
# endif |
#endif |
+/* The uptr type is an unsigned integer large enough to hold a pointer |
+*/ |
+#if defined(HAVE_STDINT_H) |
+ typedef uintptr_t uptr; |
+#elif SQLITE_PTRSIZE==4 |
+ typedef u32 uptr; |
+#else |
+ typedef u64 uptr; |
+#endif |
+ |
+/* |
+** The SQLITE_WITHIN(P,S,E) macro checks to see if pointer P points to |
+** something between S (inclusive) and E (exclusive). |
+** |
+** In other words, S is a buffer and E is a pointer to the first byte after |
+** the end of buffer S. This macro returns true if P points to something |
+** contained within the buffer S. |
+*/ |
+#define SQLITE_WITHIN(P,S,E) (((uptr)(P)>=(uptr)(S))&&((uptr)(P)<(uptr)(E))) |
+ |
+ |
/* |
** Macros to determine whether the machine is big or little endian, |
** and whether or not that determination is run-time or compile-time. |
** |
** For best performance, an attempt is made to guess at the byte-order |
** using C-preprocessor macros. If that is unsuccessful, or if |
-** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined |
+** -DSQLITE_BYTEORDER=0 is set, then byte-order is determined |
** at run-time. |
*/ |
-#if (defined(i386) || defined(__i386__) || defined(_M_IX86) || \ |
+#ifndef SQLITE_BYTEORDER |
+# if defined(i386) || defined(__i386__) || defined(_M_IX86) || \ |
defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ |
defined(_M_AMD64) || defined(_M_ARM) || defined(__x86) || \ |
- defined(__arm__)) && !defined(SQLITE_RUNTIME_BYTEORDER) |
-# define SQLITE_BYTEORDER 1234 |
-# define SQLITE_BIGENDIAN 0 |
-# define SQLITE_LITTLEENDIAN 1 |
-# define SQLITE_UTF16NATIVE SQLITE_UTF16LE |
+ defined(__arm__) |
+# define SQLITE_BYTEORDER 1234 |
+# elif defined(sparc) || defined(__ppc__) |
+# define SQLITE_BYTEORDER 4321 |
+# else |
+# define SQLITE_BYTEORDER 0 |
+# endif |
#endif |
-#if (defined(sparc) || defined(__ppc__)) \ |
- && !defined(SQLITE_RUNTIME_BYTEORDER) |
-# define SQLITE_BYTEORDER 4321 |
+#if SQLITE_BYTEORDER==4321 |
# define SQLITE_BIGENDIAN 1 |
# define SQLITE_LITTLEENDIAN 0 |
# define SQLITE_UTF16NATIVE SQLITE_UTF16BE |
-#endif |
-#if !defined(SQLITE_BYTEORDER) |
+#elif SQLITE_BYTEORDER==1234 |
+# define SQLITE_BIGENDIAN 0 |
+# define SQLITE_LITTLEENDIAN 1 |
+# define SQLITE_UTF16NATIVE SQLITE_UTF16LE |
+#else |
# ifdef SQLITE_AMALGAMATION |
const int sqlite3one = 1; |
# else |
extern const int sqlite3one; |
# endif |
-# define SQLITE_BYTEORDER 0 /* 0 means "unknown at compile-time" */ |
# define SQLITE_BIGENDIAN (*(char *)(&sqlite3one)==0) |
# define SQLITE_LITTLEENDIAN (*(char *)(&sqlite3one)==1) |
# define SQLITE_UTF16NATIVE (SQLITE_BIGENDIAN?SQLITE_UTF16BE:SQLITE_UTF16LE) |
@@ -728,7 +841,7 @@ typedef INT16_TYPE LogEst; |
#define LARGEST_INT64 (0xffffffff|(((i64)0x7fffffff)<<32)) |
#define SMALLEST_INT64 (((i64)-1) - LARGEST_INT64) |
-/* |
+/* |
** Round up a number to the next larger multiple of 8. This is used |
** to force 8-byte alignment on 64-bit architectures. |
*/ |
@@ -767,10 +880,6 @@ typedef INT16_TYPE LogEst; |
*/ |
#ifdef __APPLE__ |
# include <TargetConditionals.h> |
-# if TARGET_OS_IPHONE |
-# undef SQLITE_MAX_MMAP_SIZE |
-# define SQLITE_MAX_MMAP_SIZE 0 |
-# endif |
#endif |
#ifndef SQLITE_MAX_MMAP_SIZE |
# if defined(__linux__) \ |
@@ -826,7 +935,7 @@ typedef INT16_TYPE LogEst; |
/* |
** An instance of the following structure is used to store the busy-handler |
-** callback for a given sqlite handle. |
+** callback for a given sqlite handle. |
** |
** The sqlite.busyHandler member of the sqlite struct contains the busy |
** callback for the database handle. Each pager opened via the sqlite |
@@ -871,9 +980,9 @@ struct BusyHandler { |
/* |
** The following value as a destructor means to use sqlite3DbFree(). |
-** The sqlite3DbFree() routine requires two parameters instead of the |
-** one parameter that destructors normally want. So we have to introduce |
-** this magic value that the code knows to handle differently. Any |
+** The sqlite3DbFree() routine requires two parameters instead of the |
+** one parameter that destructors normally want. So we have to introduce |
+** this magic value that the code knows to handle differently. Any |
** pointer will work here as long as it is distinct from SQLITE_STATIC |
** and SQLITE_TRANSIENT. |
*/ |
@@ -900,16 +1009,16 @@ struct BusyHandler { |
int sqlite3_wsd_init(int N, int J); |
void *sqlite3_wsd_find(void *K, int L); |
#else |
- #define SQLITE_WSD |
+ #define SQLITE_WSD |
#define GLOBAL(t,v) v |
#define sqlite3GlobalConfig sqlite3Config |
#endif |
/* |
** The following macros are used to suppress compiler warnings and to |
-** make it clear to human readers when a function parameter is deliberately |
+** make it clear to human readers when a function parameter is deliberately |
** left unused within the body of a function. This usually happens when |
-** a function is called via a function pointer. For example the |
+** a function is called via a function pointer. For example the |
** implementation of an SQL aggregate step callback may not use the |
** parameter indicating the number of arguments passed to the aggregate, |
** if it knows that this is enforced elsewhere. |
@@ -952,6 +1061,7 @@ typedef struct LookasideSlot LookasideSlot; |
typedef struct Module Module; |
typedef struct NameContext NameContext; |
typedef struct Parse Parse; |
+typedef struct PreUpdate PreUpdate; |
typedef struct PrintfArguments PrintfArguments; |
typedef struct RowSet RowSet; |
typedef struct Savepoint Savepoint; |
@@ -974,8 +1084,16 @@ typedef struct Walker Walker; |
typedef struct WhereInfo WhereInfo; |
typedef struct With With; |
+/* A VList object records a mapping between parameters/variables/wildcards |
+** in the SQL statement (such as $abc, @pqr, or :xyz) and the integer |
+** variable number associated with that parameter. See the format description |
+** on the sqlite3VListAdd() routine for more information. A VList is really |
+** just an array of integers. |
+*/ |
+typedef int VList; |
+ |
/* |
-** Defer sourcing vdbe.h and btree.h until after the "u8" and |
+** Defer sourcing vdbe.h and btree.h until after the "u8" and |
** "BusyHandler" typedefs. vdbe.h also requires a few of the opaque |
** pointer types (i.e. FuncDef) defined above. |
*/ |
@@ -983,10 +1101,39 @@ typedef struct With With; |
#include "vdbe.h" |
#include "pager.h" |
#include "pcache.h" |
- |
#include "os.h" |
#include "mutex.h" |
+/* The SQLITE_EXTRA_DURABLE compile-time option used to set the default |
+** synchronous setting to EXTRA. It is no longer supported. |
+*/ |
+#ifdef SQLITE_EXTRA_DURABLE |
+# warning Use SQLITE_DEFAULT_SYNCHRONOUS=3 instead of SQLITE_EXTRA_DURABLE |
+# define SQLITE_DEFAULT_SYNCHRONOUS 3 |
+#endif |
+ |
+/* |
+** Default synchronous levels. |
+** |
+** Note that (for historcal reasons) the PAGER_SYNCHRONOUS_* macros differ |
+** from the SQLITE_DEFAULT_SYNCHRONOUS value by 1. |
+** |
+** PAGER_SYNCHRONOUS DEFAULT_SYNCHRONOUS |
+** OFF 1 0 |
+** NORMAL 2 1 |
+** FULL 3 2 |
+** EXTRA 4 3 |
+** |
+** The "PRAGMA synchronous" statement also uses the zero-based numbers. |
+** In other words, the zero-based numbers are used for all external interfaces |
+** and the one-based values are used internally. |
+*/ |
+#ifndef SQLITE_DEFAULT_SYNCHRONOUS |
+# define SQLITE_DEFAULT_SYNCHRONOUS (PAGER_SYNCHRONOUS_FULL-1) |
+#endif |
+#ifndef SQLITE_DEFAULT_WAL_SYNCHRONOUS |
+# define SQLITE_DEFAULT_WAL_SYNCHRONOUS SQLITE_DEFAULT_SYNCHRONOUS |
+#endif |
/* |
** Each database file to be accessed by the system is an instance |
@@ -996,9 +1143,10 @@ typedef struct With With; |
** databases may be attached. |
*/ |
struct Db { |
- char *zName; /* Name of this database */ |
+ char *zDbSName; /* Name of this database. (schema name, not filename) */ |
Btree *pBt; /* The B*Tree structure for this database file */ |
u8 safety_level; /* How aggressive at syncing data to disk */ |
+ u8 bSyncSet; /* True if "PRAGMA synchronous=N" has been run */ |
Schema *pSchema; /* Pointer to database schema (possibly shared) */ |
}; |
@@ -1009,7 +1157,7 @@ struct Db { |
** the Schema for the TEMP databaes (sqlite3.aDb[1]) which is free-standing. |
** In shared cache mode, a single Schema object can be shared by multiple |
** Btrees that refer to the same underlying BtShared object. |
-** |
+** |
** Schema objects are automatically deallocated when the last Btree that |
** references them is destroyed. The TEMP Schema is manually freed by |
** sqlite3_close(). |
@@ -1034,7 +1182,7 @@ struct Schema { |
}; |
/* |
-** These macros can be used to test, set, or clear bits in the |
+** These macros can be used to test, set, or clear bits in the |
** Db.pSchema->flags field. |
*/ |
#define DbHasProperty(D,I,P) (((D)->aDb[I].pSchema->schemaFlags&(P))==(P)) |
@@ -1083,8 +1231,8 @@ struct Schema { |
** lookaside allocations are not used to construct the schema objects. |
*/ |
struct Lookaside { |
+ u32 bDisable; /* Only operate the lookaside when zero */ |
u16 sz; /* Size of each buffer in bytes */ |
- u8 bEnabled; /* False to disable new lookaside allocations */ |
u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ |
int nOut; /* Number of buffers currently checked out */ |
int mxOut; /* Highwater mark for nOut */ |
@@ -1098,13 +1246,15 @@ struct LookasideSlot { |
}; |
/* |
-** A hash table for function definitions. |
+** A hash table for built-in function definitions. (Application-defined |
+** functions use a regular table table from hash.h.) |
** |
** Hash each FuncDef structure into one of the FuncDefHash.a[] slots. |
-** Collisions are on the FuncDef.pHash chain. |
+** Collisions are on the FuncDef.u.pHash chain. |
*/ |
+#define SQLITE_FUNC_HASH_SZ 23 |
struct FuncDefHash { |
- FuncDef *a[23]; /* Hash table for functions */ |
+ FuncDef *a[SQLITE_FUNC_HASH_SZ]; /* Hash table for functions */ |
}; |
#ifdef SQLITE_USER_AUTHENTICATION |
@@ -1145,6 +1295,15 @@ void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); |
const char*); |
#endif |
+#ifndef SQLITE_OMIT_DEPRECATED |
+/* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing |
+** in the style of sqlite3_trace() |
+*/ |
+#define SQLITE_TRACE_LEGACY 0x80 |
+#else |
+#define SQLITE_TRACE_LEGACY 0 |
+#endif /* SQLITE_OMIT_DEPRECATED */ |
+ |
/* |
** Each database connection is an instance of the following structure. |
@@ -1162,16 +1321,20 @@ struct sqlite3 { |
unsigned int openFlags; /* Flags passed to sqlite3_vfs.xOpen() */ |
int errCode; /* Most recent error code (SQLITE_*) */ |
int errMask; /* & result codes with this before returning */ |
+ int iSysErrno; /* Errno value from last system error */ |
u16 dbOptFlags; /* Flags to enable/disable optimizations */ |
u8 enc; /* Text encoding */ |
u8 autoCommit; /* The auto-commit flag. */ |
u8 temp_store; /* 1: file 2: memory 0: default */ |
u8 mallocFailed; /* True if we have seen a malloc failure */ |
+ u8 bBenignMalloc; /* Do not require OOMs if true */ |
u8 dfltLockMode; /* Default locking-mode for attached dbs */ |
signed char nextAutovac; /* Autovac setting after VACUUM if >=0 */ |
u8 suppressErr; /* Do not issue error messages if true */ |
u8 vtabOnConflict; /* Value to return for s3_vtab_on_conflict() */ |
u8 isTransactionSavepoint; /* True if the outermost savepoint is a TS */ |
+ u8 mTrace; /* zero or more SQLITE_TRACE flags */ |
+ u8 skipBtreeMutex; /* True if no shared-cache backends */ |
int nextPagesize; /* Pagesize after VACUUM if >0 */ |
u32 magic; /* Magic number for detect library misuse */ |
int nChange; /* Value returned by sqlite3_changes() */ |
@@ -1192,16 +1355,23 @@ struct sqlite3 { |
int nVDestroy; /* Number of active OP_VDestroy operations */ |
int nExtension; /* Number of loaded extensions */ |
void **aExtension; /* Array of shared library handles */ |
- void (*xTrace)(void*,const char*); /* Trace function */ |
+ int (*xTrace)(u32,void*,void*,void*); /* Trace function */ |
void *pTraceArg; /* Argument to the trace function */ |
void (*xProfile)(void*,const char*,u64); /* Profiling function */ |
void *pProfileArg; /* Argument to profile function */ |
- void *pCommitArg; /* Argument to xCommitCallback() */ |
+ void *pCommitArg; /* Argument to xCommitCallback() */ |
int (*xCommitCallback)(void*); /* Invoked at every commit. */ |
- void *pRollbackArg; /* Argument to xRollbackCallback() */ |
+ void *pRollbackArg; /* Argument to xRollbackCallback() */ |
void (*xRollbackCallback)(void*); /* Invoked at every commit. */ |
void *pUpdateArg; |
void (*xUpdateCallback)(void*,int, const char*,const char*,sqlite_int64); |
+#ifdef SQLITE_ENABLE_PREUPDATE_HOOK |
+ void *pPreUpdateArg; /* First argument to xPreUpdateCallback */ |
+ void (*xPreUpdateCallback)( /* Registered using sqlite3_preupdate_hook() */ |
+ void*,sqlite3*,int,char const*,char const*,sqlite3_int64,sqlite3_int64 |
+ ); |
+ PreUpdate *pPreUpdate; /* Context for active pre-update callback */ |
+#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */ |
#ifndef SQLITE_OMIT_WAL |
int (*xWalCallback)(void *, sqlite3 *, const char *, int); |
void *pWalArg; |
@@ -1231,7 +1401,7 @@ struct sqlite3 { |
VTable **aVTrans; /* Virtual tables with open transactions */ |
VTable *pDisconnect; /* Disconnect these in next sqlite3_prepare() */ |
#endif |
- FuncDefHash aFunc; /* Hash table of connection functions */ |
+ Hash aFunc; /* Hash table of connection functions */ |
Hash aCollSeq; /* All collating sequences */ |
BusyHandler busyHandler; /* Busy callback */ |
Db aDbStatic[2]; /* Static space for the 2 default backends */ |
@@ -1243,8 +1413,8 @@ struct sqlite3 { |
i64 nDeferredImmCons; /* Net deferred immediate constraints */ |
int *pnBytesFreed; /* If not NULL, increment this in DbFree() */ |
#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY |
- /* The following variables are all protected by the STATIC_MASTER |
- ** mutex, not by sqlite3.mutex. They are used by code in notify.c. |
+ /* The following variables are all protected by the STATIC_MASTER |
+ ** mutex, not by sqlite3.mutex. They are used by code in notify.c. |
** |
** When X.pUnlockConnection==Y, that means that X is waiting for Y to |
** unlock so that it can proceed. |
@@ -1272,13 +1442,18 @@ struct sqlite3 { |
/* |
** Possible values for the sqlite3.flags. |
+** |
+** Value constraints (enforced via assert()): |
+** SQLITE_FullFSync == PAGER_FULLFSYNC |
+** SQLITE_CkptFullFSync == PAGER_CKPT_FULLFSYNC |
+** SQLITE_CacheSpill == PAGER_CACHE_SPILL |
*/ |
#define SQLITE_VdbeTrace 0x00000001 /* True to trace VDBE execution */ |
#define SQLITE_InternChanges 0x00000002 /* Uncommitted Hash table changes */ |
-#define SQLITE_FullFSync 0x00000004 /* Use full fsync on the backend */ |
-#define SQLITE_CkptFullFSync 0x00000008 /* Use full fsync for checkpoint */ |
-#define SQLITE_CacheSpill 0x00000010 /* OK to spill pager cache */ |
-#define SQLITE_FullColNames 0x00000020 /* Show full column names on SELECT */ |
+#define SQLITE_FullColNames 0x00000004 /* Show full column names on SELECT */ |
+#define SQLITE_FullFSync 0x00000008 /* Use full fsync on the backend */ |
+#define SQLITE_CkptFullFSync 0x00000010 /* Use full fsync for checkpoint */ |
+#define SQLITE_CacheSpill 0x00000020 /* OK to spill pager cache */ |
#define SQLITE_ShortColNames 0x00000040 /* Show short columns names */ |
#define SQLITE_CountRows 0x00000080 /* Count rows changed by INSERT, */ |
/* DELETE, or UPDATE and return */ |
@@ -1299,12 +1474,15 @@ struct sqlite3 { |
#define SQLITE_AutoIndex 0x00100000 /* Enable automatic indexes */ |
#define SQLITE_PreferBuiltin 0x00200000 /* Preference to built-in funcs */ |
#define SQLITE_LoadExtension 0x00400000 /* Enable load_extension */ |
-#define SQLITE_EnableTrigger 0x00800000 /* True to enable triggers */ |
-#define SQLITE_DeferFKs 0x01000000 /* Defer all FK constraints */ |
-#define SQLITE_QueryOnly 0x02000000 /* Disable database changes */ |
-#define SQLITE_VdbeEQP 0x04000000 /* Debug EXPLAIN QUERY PLAN */ |
-#define SQLITE_Vacuum 0x08000000 /* Currently in a VACUUM */ |
-#define SQLITE_CellSizeCk 0x10000000 /* Check btree cell sizes on load */ |
+#define SQLITE_LoadExtFunc 0x00800000 /* Enable load_extension() SQL func */ |
+#define SQLITE_EnableTrigger 0x01000000 /* True to enable triggers */ |
+#define SQLITE_DeferFKs 0x02000000 /* Defer all FK constraints */ |
+#define SQLITE_QueryOnly 0x04000000 /* Disable database changes */ |
+#define SQLITE_VdbeEQP 0x08000000 /* Debug EXPLAIN QUERY PLAN */ |
+#define SQLITE_Vacuum 0x10000000 /* Currently in a VACUUM */ |
+#define SQLITE_CellSizeCk 0x20000000 /* Check btree cell sizes on load */ |
+#define SQLITE_Fts3Tokenizer 0x40000000 /* Enable fts3_tokenizer(2) */ |
+#define SQLITE_NoCkptOnClose 0x80000000 /* No checkpoint on close()/DETACH */ |
/* |
@@ -1330,13 +1508,8 @@ struct sqlite3 { |
/* |
** Macros for testing whether or not optimizations are enabled or disabled. |
*/ |
-#ifndef SQLITE_OMIT_BUILTIN_TEST |
#define OptimizationDisabled(db, mask) (((db)->dbOptFlags&(mask))!=0) |
#define OptimizationEnabled(db, mask) (((db)->dbOptFlags&(mask))==0) |
-#else |
-#define OptimizationDisabled(db, mask) 0 |
-#define OptimizationEnabled(db, mask) 1 |
-#endif |
/* |
** Return true if it OK to factor constant expressions into the initialization |
@@ -1358,28 +1531,33 @@ struct sqlite3 { |
/* |
** Each SQL function is defined by an instance of the following |
-** structure. A pointer to this structure is stored in the sqlite.aFunc |
-** hash table. When multiple functions have the same name, the hash table |
-** points to a linked list of these structures. |
+** structure. For global built-in functions (ex: substr(), max(), count()) |
+** a pointer to this structure is held in the sqlite3BuiltinFunctions object. |
+** For per-connection application-defined functions, a pointer to this |
+** structure is held in the db->aHash hash table. |
+** |
+** The u.pHash field is used by the global built-ins. The u.pDestructor |
+** field is used by per-connection app-def functions. |
*/ |
struct FuncDef { |
- i16 nArg; /* Number of arguments. -1 means unlimited */ |
+ i8 nArg; /* Number of arguments. -1 means unlimited */ |
u16 funcFlags; /* Some combination of SQLITE_FUNC_* */ |
void *pUserData; /* User data parameter */ |
FuncDef *pNext; /* Next function with same name */ |
- void (*xFunc)(sqlite3_context*,int,sqlite3_value**); /* Regular function */ |
- void (*xStep)(sqlite3_context*,int,sqlite3_value**); /* Aggregate step */ |
- void (*xFinalize)(sqlite3_context*); /* Aggregate finalizer */ |
- char *zName; /* SQL name of the function. */ |
- FuncDef *pHash; /* Next with a different name but the same hash */ |
- FuncDestructor *pDestructor; /* Reference counted destructor function */ |
+ void (*xSFunc)(sqlite3_context*,int,sqlite3_value**); /* func or agg-step */ |
+ void (*xFinalize)(sqlite3_context*); /* Agg finalizer */ |
+ const char *zName; /* SQL name of the function. */ |
+ union { |
+ FuncDef *pHash; /* Next with a different name but the same hash */ |
+ FuncDestructor *pDestructor; /* Reference counted destructor function */ |
+ } u; |
}; |
/* |
** This structure encapsulates a user-function destructor callback (as |
** configured using create_function_v2()) and a reference counter. When |
** create_function_v2() is called to create a function with a destructor, |
-** a single object of this type is allocated. FuncDestructor.nRef is set to |
+** a single object of this type is allocated. FuncDestructor.nRef is set to |
** the number of FuncDef objects created (either 1 or 3, depending on whether |
** or not the specified encoding is SQLITE_ANY). The FuncDef.pDestructor |
** member of each of the new FuncDef objects is set to point to the allocated |
@@ -1400,6 +1578,13 @@ struct FuncDestructor { |
** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. And |
** SQLITE_FUNC_CONSTANT must be the same as SQLITE_DETERMINISTIC. There |
** are assert() statements in the code to verify this. |
+** |
+** Value constraints (enforced via assert()): |
+** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg |
+** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG |
+** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG |
+** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API |
+** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API |
*/ |
#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ |
#define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */ |
@@ -1415,16 +1600,17 @@ struct FuncDestructor { |
#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ |
#define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a |
** single query - might change over time */ |
+#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ |
/* |
** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are |
** used to create the initializers for the FuncDef structures. |
** |
** FUNCTION(zName, nArg, iArg, bNC, xFunc) |
-** Used to create a scalar function definition of a function zName |
+** Used to create a scalar function definition of a function zName |
** implemented by C function xFunc that accepts nArg arguments. The |
** value passed as iArg is cast to a (void*) and made available |
-** as the user-data (sqlite3_user_data()) for the function. If |
+** as the user-data (sqlite3_user_data()) for the function. If |
** argument bNC is true, then the SQLITE_FUNC_NEEDCOLL flag is set. |
** |
** VFUNCTION(zName, nArg, iArg, bNC, xFunc) |
@@ -1443,8 +1629,8 @@ struct FuncDestructor { |
** FUNCTION(). |
** |
** LIKEFUNC(zName, nArg, pArg, flags) |
-** Used to create a scalar function definition of a function zName |
-** that accepts nArg arguments and is implemented by a call to C |
+** Used to create a scalar function definition of a function zName |
+** that accepts nArg arguments and is implemented by a call to C |
** function likeFunc. Argument pArg is cast to a (void *) and made |
** available as the function user-data (sqlite3_user_data()). The |
** FuncDef.flags variable is set to the value passed as the flags |
@@ -1452,28 +1638,28 @@ struct FuncDestructor { |
*/ |
#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \ |
{nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ |
- SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} |
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } |
#define VFUNCTION(zName, nArg, iArg, bNC, xFunc) \ |
{nArg, SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ |
- SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} |
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } |
#define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ |
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ |
- SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} |
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } |
#define FUNCTION2(zName, nArg, iArg, bNC, xFunc, extraFlags) \ |
{nArg,SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL)|extraFlags,\ |
- SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName, 0, 0} |
+ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, #zName, {0} } |
#define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \ |
{nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \ |
- pArg, 0, xFunc, 0, 0, #zName, 0, 0} |
+ pArg, 0, xFunc, 0, #zName, } |
#define LIKEFUNC(zName, nArg, arg, flags) \ |
{nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \ |
- (void *)arg, 0, likeFunc, 0, 0, #zName, 0, 0} |
+ (void *)arg, 0, likeFunc, 0, #zName, {0} } |
#define AGGREGATE(zName, nArg, arg, nc, xStep, xFinal) \ |
{nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL), \ |
- SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} |
+ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,#zName, {0}} |
#define AGGREGATE2(zName, nArg, arg, nc, xStep, xFinal, extraFlags) \ |
{nArg, SQLITE_UTF8|(nc*SQLITE_FUNC_NEEDCOLL)|extraFlags, \ |
- SQLITE_INT_TO_PTR(arg), 0, 0, xStep,xFinal,#zName,0,0} |
+ SQLITE_INT_TO_PTR(arg), 0, xStep,xFinal,#zName, {0}} |
/* |
** All current savepoints are stored in a linked list starting at |
@@ -1515,10 +1701,8 @@ struct Module { |
** of this structure. |
*/ |
struct Column { |
- char *zName; /* Name of this column */ |
+ char *zName; /* Name of this column, \000, then the type */ |
Expr *pDflt; /* Default value of this column */ |
- char *zDflt; /* Original text of the default value */ |
- char *zType; /* Data type for this column */ |
char *zColl; /* Collating sequence. If NULL, use the default */ |
u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ |
char affinity; /* One of the SQLITE_AFF_... values */ |
@@ -1530,6 +1714,7 @@ struct Column { |
*/ |
#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ |
#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ |
+#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ |
/* |
** A "Collating Sequence" is defined by an instance of the following |
@@ -1560,7 +1745,7 @@ struct CollSeq { |
** |
** These used to have mnemonic name like 'i' for SQLITE_AFF_INTEGER and |
** 't' for SQLITE_AFF_TEXT. But we can save a little space and improve |
-** the speed a little by numbering the values consecutively. |
+** the speed a little by numbering the values consecutively. |
** |
** But rather than start with 0 or 1, we begin with 'A'. That way, |
** when multiple affinity types are concatenated into a string and |
@@ -1579,7 +1764,7 @@ struct CollSeq { |
/* |
** The SQLITE_AFF_MASK values masks off the significant bits of an |
-** affinity value. |
+** affinity value. |
*/ |
#define SQLITE_AFF_MASK 0x47 |
@@ -1592,6 +1777,7 @@ struct CollSeq { |
** operator is NULL. It is added to certain comparison operators to |
** prove that the operands are always NOT NULL. |
*/ |
+#define SQLITE_KEEPNULL 0x08 /* Used by vector == or <> */ |
#define SQLITE_JUMPIFNULL 0x10 /* jumps if either operand is NULL */ |
#define SQLITE_STOREP2 0x20 /* Store result in reg[P2] rather than jump */ |
#define SQLITE_NULLEQ 0x80 /* NULL=NULL */ |
@@ -1599,20 +1785,20 @@ struct CollSeq { |
/* |
** An object of this type is created for each virtual table present in |
-** the database schema. |
+** the database schema. |
** |
** If the database schema is shared, then there is one instance of this |
** structure for each database connection (sqlite3*) that uses the shared |
** schema. This is because each database connection requires its own unique |
-** instance of the sqlite3_vtab* handle used to access the virtual table |
-** implementation. sqlite3_vtab* handles can not be shared between |
-** database connections, even when the rest of the in-memory database |
+** instance of the sqlite3_vtab* handle used to access the virtual table |
+** implementation. sqlite3_vtab* handles can not be shared between |
+** database connections, even when the rest of the in-memory database |
** schema is shared, as the implementation often stores the database |
** connection handle passed to it via the xConnect() or xCreate() method |
** during initialization internally. This database connection handle may |
-** then be used by the virtual table implementation to access real tables |
-** within the database. So that they appear as part of the callers |
-** transaction, these accesses need to be made via the same database |
+** then be used by the virtual table implementation to access real tables |
+** within the database. So that they appear as part of the callers |
+** transaction, these accesses need to be made via the same database |
** connection as that used to execute SQL operations on the virtual table. |
** |
** All VTable objects that correspond to a single table in a shared |
@@ -1624,19 +1810,19 @@ struct CollSeq { |
** sqlite3_vtab* handle in the compiled query. |
** |
** When an in-memory Table object is deleted (for example when the |
-** schema is being reloaded for some reason), the VTable objects are not |
-** deleted and the sqlite3_vtab* handles are not xDisconnect()ed |
+** schema is being reloaded for some reason), the VTable objects are not |
+** deleted and the sqlite3_vtab* handles are not xDisconnect()ed |
** immediately. Instead, they are moved from the Table.pVTable list to |
** another linked list headed by the sqlite3.pDisconnect member of the |
-** corresponding sqlite3 structure. They are then deleted/xDisconnected |
+** corresponding sqlite3 structure. They are then deleted/xDisconnected |
** next time a statement is prepared using said sqlite3*. This is done |
** to avoid deadlock issues involving multiple sqlite3.mutex mutexes. |
** Refer to comments above function sqlite3VtabUnlockList() for an |
** explanation as to why it is safe to add an entry to an sqlite3.pDisconnect |
** list without holding the corresponding sqlite3.mutex mutex. |
** |
-** The memory for objects of this type is always allocated by |
-** sqlite3DbMalloc(), using the connection handle stored in VTable.db as |
+** The memory for objects of this type is always allocated by |
+** sqlite3DbMalloc(), using the connection handle stored in VTable.db as |
** the first argument. |
*/ |
struct VTable { |
@@ -1663,9 +1849,9 @@ struct Table { |
ExprList *pCheck; /* All CHECK constraints */ |
/* ... also used as column name list in a VIEW */ |
int tnum; /* Root BTree page for this table */ |
+ u32 nTabRef; /* Number of pointers to this Table */ |
i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ |
i16 nCol; /* Number of columns in this table */ |
- u16 nRef; /* Number of pointers to this Table */ |
LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ |
LogEst szTabRow; /* Estimated size of each table row in bytes */ |
#ifdef SQLITE_ENABLE_COSTMULT |
@@ -1804,7 +1990,7 @@ struct FKey { |
** key is set to NULL. CASCADE means that a DELETE or UPDATE of the |
** referenced table row is propagated into the row that holds the |
** foreign key. |
-** |
+** |
** The following symbolic values are used to record which type |
** of action to take. |
*/ |
@@ -1825,7 +2011,7 @@ struct FKey { |
/* |
** An instance of the following structure is passed as the first |
-** argument to sqlite3VdbeKeyCompare and is used to control the |
+** argument to sqlite3VdbeKeyCompare and is used to control the |
** comparison of the two index keys. |
** |
** Note that aSortOrder[] and aColl[] have nField+1 slots. There |
@@ -1866,7 +2052,7 @@ struct KeyInfo { |
** The key comparison functions actually return default_rc when they find |
** an equals comparison. default_rc can be -1, 0, or +1. If there are |
** multiple entries in the b-tree with the same key (when only looking |
-** at the first pKeyInfo->nFields,) then default_rc can be set to -1 to |
+** at the first pKeyInfo->nFields,) then default_rc can be set to -1 to |
** cause the search to find the last match, or +1 to cause the search to |
** find the first match. |
** |
@@ -1903,7 +2089,7 @@ struct UnpackedRecord { |
** In the Table structure describing Ex1, nCol==3 because there are |
** three columns in the table. In the Index structure describing |
** Ex2, nColumn==2 since 2 of the 3 columns of Ex1 are indexed. |
-** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the |
+** The value of aiColumn is {2, 0}. aiColumn[0]==2 because the |
** first column to be indexed (c3) has an index of 2 in Ex1.aCol[]. |
** The second column to be indexed (c1) has an index of 0 in |
** Ex1.aCol[], hence Ex2.aiColumn[1]==0. |
@@ -1911,7 +2097,7 @@ struct UnpackedRecord { |
** The Index.onError field determines whether or not the indexed columns |
** must be unique and what to do if they are not. When Index.onError=OE_None, |
** it means this is not a unique index. Otherwise it is a unique index |
-** and the value of Index.onError indicate the which conflict resolution |
+** and the value of Index.onError indicate the which conflict resolution |
** algorithm to employ whenever an attempt is made to insert a non-unique |
** element. |
** |
@@ -1976,7 +2162,7 @@ struct Index { |
#define XN_EXPR (-2) /* Indexed column is an expression */ |
/* |
-** Each sample stored in the sqlite_stat3 table is represented in memory |
+** Each sample stored in the sqlite_stat3 table is represented in memory |
** using a structure of this type. See documentation at the top of the |
** analyze.c source file for additional information. |
*/ |
@@ -2071,9 +2257,9 @@ typedef int ynVar; |
** to represent the greater-than-or-equal-to operator in the expression |
** tree. |
** |
-** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, |
+** If the expression is an SQL literal (TK_INTEGER, TK_FLOAT, TK_BLOB, |
** or TK_STRING), then Expr.token contains the text of the SQL literal. If |
-** the expression is a variable (TK_VARIABLE), then Expr.token contains the |
+** the expression is a variable (TK_VARIABLE), then Expr.token contains the |
** variable name. Finally, if the expression is an SQL function (TK_FUNCTION), |
** then Expr.token contains the name of the function. |
** |
@@ -2084,7 +2270,7 @@ typedef int ynVar; |
** a CASE expression or an IN expression of the form "<lhs> IN (<y>, <z>...)". |
** Expr.x.pSelect is used if the expression is a sub-select or an expression of |
** the form "<lhs> IN (SELECT ...)". If the EP_xIsSelect bit is set in the |
-** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is |
+** Expr.flags mask, then Expr.x.pSelect is valid. Otherwise, Expr.x.pList is |
** valid. |
** |
** An expression of the form ID or ID.ID refers to a column in a table. |
@@ -2095,8 +2281,8 @@ typedef int ynVar; |
** value is also stored in the Expr.iAgg column in the aggregate so that |
** it can be accessed after all aggregates are computed. |
** |
-** If the expression is an unbound variable marker (a question mark |
-** character '?' in the original SQL) then the Expr.iTable holds the index |
+** If the expression is an unbound variable marker (a question mark |
+** character '?' in the original SQL) then the Expr.iTable holds the index |
** number for that variable. |
** |
** If the expression is a subquery then Expr.iColumn holds an integer |
@@ -2135,7 +2321,7 @@ struct Expr { |
/* If the EP_TokenOnly flag is set in the Expr.flags mask, then no |
** space is allocated for the fields below this point. An attempt to |
- ** access them will result in a segfault or malfunction. |
+ ** access them will result in a segfault or malfunction. |
*********************************************************************/ |
Expr *pLeft; /* Left subnode */ |
@@ -2156,9 +2342,11 @@ struct Expr { |
int iTable; /* TK_COLUMN: cursor number of table holding column |
** TK_REGISTER: register number |
** TK_TRIGGER: 1 -> new, 0 -> old |
- ** EP_Unlikely: 134217728 times likelihood */ |
+ ** EP_Unlikely: 134217728 times likelihood |
+ ** TK_SELECT: 1st register of result vector */ |
ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid. |
- ** TK_VARIABLE: variable number (always >= 1). */ |
+ ** TK_VARIABLE: variable number (always >= 1). |
+ ** TK_SELECT_COLUMN: column of the result vector */ |
i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ |
i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */ |
u8 op2; /* TK_REGISTER: original value of Expr.op |
@@ -2194,6 +2382,7 @@ struct Expr { |
#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ |
#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ |
#define EP_Alias 0x400000 /* Is an alias for a result set column */ |
+#define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ |
/* |
** Combinations of two or more EP_* flags |
@@ -2201,7 +2390,7 @@ struct Expr { |
#define EP_Propagate (EP_Collate|EP_Subquery) /* Propagate these bits up tree */ |
/* |
-** These macros can be used to test, set, or clear bits in the |
+** These macros can be used to test, set, or clear bits in the |
** Expr.flags field. |
*/ |
#define ExprHasProperty(E,P) (((E)->flags&(P))!=0) |
@@ -2220,8 +2409,8 @@ struct Expr { |
#endif |
/* |
-** Macros to determine the number of bytes required by a normal Expr |
-** struct, an Expr struct with the EP_Reduced flag set in Expr.flags |
+** Macros to determine the number of bytes required by a normal Expr |
+** struct, an Expr struct with the EP_Reduced flag set in Expr.flags |
** and an Expr struct with the EP_TokenOnly flag set. |
*/ |
#define EXPR_FULLSIZE sizeof(Expr) /* Full size */ |
@@ -2229,7 +2418,7 @@ struct Expr { |
#define EXPR_TOKENONLYSIZE offsetof(Expr,pLeft) /* Fewer features */ |
/* |
-** Flags passed to the sqlite3ExprDup() function. See the header comment |
+** Flags passed to the sqlite3ExprDup() function. See the header comment |
** above sqlite3ExprDup() for details. |
*/ |
#define EXPRDUP_REDUCE 0x0001 /* Used reduced-size Expr nodes */ |
@@ -2311,7 +2500,11 @@ struct IdList { |
** tables in a join to 32 instead of 64. But it also reduces the size |
** of the library by 738 bytes on ix86. |
*/ |
-typedef u64 Bitmask; |
+#ifdef SQLITE_BITMASK_TYPE |
+ typedef SQLITE_BITMASK_TYPE Bitmask; |
+#else |
+ typedef u64 Bitmask; |
+#endif |
/* |
** The number of bits in a Bitmask. "BMS" means "BitMask Size". |
@@ -2323,6 +2516,7 @@ typedef u64 Bitmask; |
*/ |
#define MASKBIT(n) (((Bitmask)1)<<(n)) |
#define MASKBIT32(n) (((unsigned int)1)<<(n)) |
+#define ALLBITS ((Bitmask)-1) |
/* |
** The following structure describes the FROM clause of a SELECT statement. |
@@ -2357,7 +2551,7 @@ struct SrcList { |
int regReturn; /* Register holding return address of addrFillSub */ |
int regResult; /* Registers holding results of a co-routine */ |
struct { |
- u8 jointype; /* Type of join between this able and the previous */ |
+ u8 jointype; /* Type of join between this table and the previous */ |
unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */ |
unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */ |
unsigned isTabFunc :1; /* True if table-valued-function syntax */ |
@@ -2395,22 +2589,28 @@ struct SrcList { |
/* |
** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin() |
** and the WhereInfo.wctrlFlags member. |
+** |
+** Value constraints (enforced via assert()): |
+** WHERE_USE_LIMIT == SF_FixedLimit |
*/ |
#define WHERE_ORDERBY_NORMAL 0x0000 /* No-op */ |
#define WHERE_ORDERBY_MIN 0x0001 /* ORDER BY processing for min() func */ |
#define WHERE_ORDERBY_MAX 0x0002 /* ORDER BY processing for max() func */ |
#define WHERE_ONEPASS_DESIRED 0x0004 /* Want to do one-pass UPDATE/DELETE */ |
-#define WHERE_DUPLICATES_OK 0x0008 /* Ok to return a row more than once */ |
-#define WHERE_OMIT_OPEN_CLOSE 0x0010 /* Table cursors are already open */ |
-#define WHERE_FORCE_TABLE 0x0020 /* Do not use an index-only search */ |
-#define WHERE_ONETABLE_ONLY 0x0040 /* Only code the 1st table in pTabList */ |
-#define WHERE_NO_AUTOINDEX 0x0080 /* Disallow automatic indexes */ |
-#define WHERE_GROUPBY 0x0100 /* pOrderBy is really a GROUP BY */ |
-#define WHERE_DISTINCTBY 0x0200 /* pOrderby is really a DISTINCT clause */ |
-#define WHERE_WANT_DISTINCT 0x0400 /* All output needs to be distinct */ |
-#define WHERE_SORTBYGROUP 0x0800 /* Support sqlite3WhereIsSorted() */ |
-#define WHERE_REOPEN_IDX 0x1000 /* Try to use OP_ReopenIdx */ |
-#define WHERE_ONEPASS_MULTIROW 0x2000 /* ONEPASS is ok with multiple rows */ |
+#define WHERE_ONEPASS_MULTIROW 0x0008 /* ONEPASS is ok with multiple rows */ |
+#define WHERE_DUPLICATES_OK 0x0010 /* Ok to return a row more than once */ |
+#define WHERE_OR_SUBCLAUSE 0x0020 /* Processing a sub-WHERE as part of |
+ ** the OR optimization */ |
+#define WHERE_GROUPBY 0x0040 /* pOrderBy is really a GROUP BY */ |
+#define WHERE_DISTINCTBY 0x0080 /* pOrderby is really a DISTINCT clause */ |
+#define WHERE_WANT_DISTINCT 0x0100 /* All output needs to be distinct */ |
+#define WHERE_SORTBYGROUP 0x0200 /* Support sqlite3WhereIsSorted() */ |
+#define WHERE_SEEK_TABLE 0x0400 /* Do not defer seeks on main table */ |
+#define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ |
+#define WHERE_SEEK_UNIQ_TABLE 0x1000 /* Do not defer seeks if unique */ |
+ /* 0x2000 not currently used */ |
+#define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ |
+ /* 0x8000 not currently used */ |
/* Allowed return values from sqlite3WhereIsDistinct() |
*/ |
@@ -2428,12 +2628,12 @@ struct SrcList { |
** pEList corresponds to the result set of a SELECT and is NULL for |
** other statements. |
** |
-** NameContexts can be nested. When resolving names, the inner-most |
+** NameContexts can be nested. When resolving names, the inner-most |
** context is searched first. If no match is found, the next outer |
** context is checked. If there is still no match, the next context |
** is checked. This process continues until either a match is found |
** or all contexts are check. When a match is found, the nRef member of |
-** the context containing the match is incremented. |
+** the context containing the match is incremented. |
** |
** Each subquery gets a new NameContext. The pNext field points to the |
** NameContext in the parent query. Thus the process of scanning the |
@@ -2454,16 +2654,18 @@ struct NameContext { |
/* |
** Allowed values for the NameContext, ncFlags field. |
** |
-** Note: NC_MinMaxAgg must have the same value as SF_MinMaxAgg and |
-** SQLITE_FUNC_MINMAX. |
-** |
+** Value constraints (all checked via assert()): |
+** NC_HasAgg == SF_HasAgg |
+** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX |
+** |
*/ |
#define NC_AllowAgg 0x0001 /* Aggregate functions are allowed here */ |
-#define NC_HasAgg 0x0002 /* One or more aggregate functions seen */ |
+#define NC_PartIdx 0x0002 /* True if resolving a partial index WHERE */ |
#define NC_IsCheck 0x0004 /* True if resolving names in a CHECK constraint */ |
#define NC_InAggFunc 0x0008 /* True if analyzing arguments to an agg func */ |
-#define NC_PartIdx 0x0010 /* True if resolving a partial index WHERE */ |
+#define NC_HasAgg 0x0010 /* One or more aggregate functions seen */ |
#define NC_IdxExpr 0x0020 /* True if resolving columns of CREATE INDEX */ |
+#define NC_VarSelect 0x0040 /* A correlated subquery has been seen */ |
#define NC_MinMaxAgg 0x1000 /* min/max aggregates seen. See note above */ |
/* |
@@ -2489,13 +2691,13 @@ struct NameContext { |
struct Select { |
ExprList *pEList; /* The fields of the result */ |
u8 op; /* One of: TK_UNION TK_ALL TK_INTERSECT TK_EXCEPT */ |
- u16 selFlags; /* Various SF_* values */ |
+ LogEst nSelectRow; /* Estimated number of result rows */ |
+ u32 selFlags; /* Various SF_* values */ |
int iLimit, iOffset; /* Memory registers holding LIMIT & OFFSET counters */ |
#if SELECTTRACE_ENABLED |
char zSelName[12]; /* Symbolic name of this SELECT use for debugging */ |
#endif |
int addrOpenEphm[2]; /* OP_OpenEphem opcodes related to this select */ |
- u64 nSelectRow; /* Estimated number of result rows */ |
SrcList *pSrc; /* The FROM clause */ |
Expr *pWhere; /* The WHERE clause */ |
ExprList *pGroupBy; /* The GROUP BY clause */ |
@@ -2511,23 +2713,30 @@ struct Select { |
/* |
** Allowed values for Select.selFlags. The "SF" prefix stands for |
** "Select Flag". |
-*/ |
-#define SF_Distinct 0x0001 /* Output should be DISTINCT */ |
-#define SF_All 0x0002 /* Includes the ALL keyword */ |
-#define SF_Resolved 0x0004 /* Identifiers have been resolved */ |
-#define SF_Aggregate 0x0008 /* Contains aggregate functions */ |
-#define SF_UsesEphemeral 0x0010 /* Uses the OpenEphemeral opcode */ |
-#define SF_Expanded 0x0020 /* sqlite3SelectExpand() called on this */ |
-#define SF_HasTypeInfo 0x0040 /* FROM subqueries have Table metadata */ |
-#define SF_Compound 0x0080 /* Part of a compound query */ |
-#define SF_Values 0x0100 /* Synthesized from VALUES clause */ |
-#define SF_MultiValue 0x0200 /* Single VALUES term with multiple rows */ |
-#define SF_NestedFrom 0x0400 /* Part of a parenthesized FROM clause */ |
-#define SF_MaybeConvert 0x0800 /* Need convertCompoundSelectToSubquery() */ |
-#define SF_MinMaxAgg 0x1000 /* Aggregate containing min() or max() */ |
-#define SF_Recursive 0x2000 /* The recursive part of a recursive CTE */ |
-#define SF_Converted 0x4000 /* By convertCompoundSelectToSubquery() */ |
-#define SF_IncludeHidden 0x8000 /* Include hidden columns in output */ |
+** |
+** Value constraints (all checked via assert()) |
+** SF_HasAgg == NC_HasAgg |
+** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX |
+** SF_FixedLimit == WHERE_USE_LIMIT |
+*/ |
+#define SF_Distinct 0x00001 /* Output should be DISTINCT */ |
+#define SF_All 0x00002 /* Includes the ALL keyword */ |
+#define SF_Resolved 0x00004 /* Identifiers have been resolved */ |
+#define SF_Aggregate 0x00008 /* Contains agg functions or a GROUP BY */ |
+#define SF_HasAgg 0x00010 /* Contains aggregate functions */ |
+#define SF_UsesEphemeral 0x00020 /* Uses the OpenEphemeral opcode */ |
+#define SF_Expanded 0x00040 /* sqlite3SelectExpand() called on this */ |
+#define SF_HasTypeInfo 0x00080 /* FROM subqueries have Table metadata */ |
+#define SF_Compound 0x00100 /* Part of a compound query */ |
+#define SF_Values 0x00200 /* Synthesized from VALUES clause */ |
+#define SF_MultiValue 0x00400 /* Single VALUES term with multiple rows */ |
+#define SF_NestedFrom 0x00800 /* Part of a parenthesized FROM clause */ |
+#define SF_MinMaxAgg 0x01000 /* Aggregate containing min() or max() */ |
+#define SF_Recursive 0x02000 /* The recursive part of a recursive CTE */ |
+#define SF_FixedLimit 0x04000 /* nSelectRow set by a constant LIMIT */ |
+#define SF_MaybeConvert 0x08000 /* Need convertCompoundSelectToSubquery() */ |
+#define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */ |
+#define SF_IncludeHidden 0x20000 /* Include hidden columns in output */ |
/* |
@@ -2535,7 +2744,7 @@ struct Select { |
** by one of the following macros. The "SRT" prefix means "SELECT Result |
** Type". |
** |
-** SRT_Union Store results as a key in a temporary index |
+** SRT_Union Store results as a key in a temporary index |
** identified by pDest->iSDParm. |
** |
** SRT_Except Remove results from the temporary index pDest->iSDParm. |
@@ -2559,7 +2768,7 @@ struct Select { |
** of the query. This destination implies "LIMIT 1". |
** |
** SRT_Set The result must be a single column. Store each |
-** row of result as the key in table pDest->iSDParm. |
+** row of result as the key in table pDest->iSDParm. |
** Apply the affinity pDest->affSdst before storing |
** results. Used to implement "IN (SELECT ...)". |
** |
@@ -2619,7 +2828,7 @@ struct Select { |
*/ |
struct SelectDest { |
u8 eDest; /* How to dispose of the results. On of SRT_* above. */ |
- char affSdst; /* Affinity used when eDest==SRT_Set */ |
+ char *zAffSdst; /* Affinity used when eDest==SRT_Set */ |
int iSDParm; /* A parameter used by the eDest disposal method */ |
int iSdst; /* Base register where results are written */ |
int nSdst; /* Number of registers allocated */ |
@@ -2627,11 +2836,11 @@ struct SelectDest { |
}; |
/* |
-** During code generation of statements that do inserts into AUTOINCREMENT |
+** During code generation of statements that do inserts into AUTOINCREMENT |
** tables, the following information is attached to the Table.u.autoInc.p |
** pointer of each autoincrement table to record some side information that |
** the code generator needs. We have to keep per-table autoincrement |
-** information in case inserts are down within triggers. Triggers do not |
+** information in case inserts are done within triggers. Triggers do not |
** normally coordinate their activities, but we do need to coordinate the |
** loading and saving of autoincrement information. |
*/ |
@@ -2650,7 +2859,7 @@ struct AutoincInfo { |
#endif |
/* |
-** At least one instance of the following structure is created for each |
+** At least one instance of the following structure is created for each |
** trigger that may be fired while parsing an INSERT, UPDATE or DELETE |
** statement. All such objects are stored in the linked list headed at |
** Parse.pTriggerPrg and deleted once statement compilation has been |
@@ -2663,7 +2872,7 @@ struct AutoincInfo { |
** values for both pTrigger and orconf. |
** |
** The TriggerPrg.aColmask[0] variable is set to a mask of old.* columns |
-** accessed (or set to 0 for triggers fired as a result of INSERT |
+** accessed (or set to 0 for triggers fired as a result of INSERT |
** statements). Similarly, the TriggerPrg.aColmask[1] variable is set to |
** a mask of new.* columns used by the program. |
*/ |
@@ -2704,7 +2913,7 @@ struct TriggerPrg { |
** is constant but the second part is reset at the beginning and end of |
** each recursion. |
** |
-** The nTableLock and aTableLock variables are only used if the shared-cache |
+** The nTableLock and aTableLock variables are only used if the shared-cache |
** feature is enabled (if sqlite3Tsd()->useSharedData is true). They are |
** used to store the set of table-locks required by the statement being |
** compiled. Function sqlite3TableLock() is used to add entries to the |
@@ -2723,36 +2932,25 @@ struct Parse { |
u8 mayAbort; /* True if statement may throw an ABORT exception */ |
u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ |
u8 okConstFactor; /* OK to factor out constants */ |
- int aTempReg[8]; /* Holding area for temporary registers */ |
+ u8 disableLookaside; /* Number of times lookaside has been disabled */ |
+ u8 nColCache; /* Number of entries in aColCache[] */ |
int nRangeReg; /* Size of the temporary register block */ |
int iRangeReg; /* First register in temporary register block */ |
int nErr; /* Number of errors seen */ |
int nTab; /* Number of previously allocated VDBE cursors */ |
int nMem; /* Number of memory cells used so far */ |
- int nSet; /* Number of sets used so far */ |
- int nOnce; /* Number of OP_Once instructions so far */ |
int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ |
int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ |
- int iFixedOp; /* Never back out opcodes iFixedOp-1 or earlier */ |
int ckBase; /* Base register of data during check constraints */ |
int iSelfTab; /* Table of an index whose exprs are being coded */ |
int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */ |
int iCacheCnt; /* Counter used to generate aColCache[].lru values */ |
int nLabel; /* Number of labels used */ |
int *aLabel; /* Space to hold the labels */ |
- struct yColCache { |
- int iTable; /* Table cursor number */ |
- i16 iColumn; /* Table column number */ |
- u8 tempReg; /* iReg is a temp register that needs to be freed */ |
- int iLevel; /* Nesting level */ |
- int iReg; /* Reg with value of this column. 0 means none. */ |
- int lru; /* Least recently used entry has the smallest value */ |
- } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */ |
ExprList *pConstExpr;/* Constant expressions */ |
Token constraintName;/* Name of the constraint currently being parsed */ |
yDbMask writeMask; /* Start a write transaction on these databases */ |
yDbMask cookieMask; /* Bitmask of schema verified databases */ |
- int cookieValue[SQLITE_MAX_ATTACHED+2]; /* Values of cookies to verify */ |
int regRowid; /* Register holding rowid of CREATE TABLE entry */ |
int regRoot; /* Register holding root page number for new objects */ |
int nMaxArg; /* Max args passed to user function by sub-program */ |
@@ -2765,8 +2963,6 @@ struct Parse { |
TableLock *aTableLock; /* Required table locks for shared-cache mode */ |
#endif |
AutoincInfo *pAinc; /* Information about AUTOINCREMENT counters */ |
- |
- /* Information used while coding trigger programs. */ |
Parse *pToplevel; /* Parse structure for main program (or NULL) */ |
Table *pTriggerTab; /* Table triggers are being coded for */ |
int addrCrTab; /* Address of OP_CreateTable opcode on CREATE TABLE */ |
@@ -2777,35 +2973,50 @@ struct Parse { |
u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ |
u8 disableTriggers; /* True to disable triggers */ |
+ /************************************************************************** |
+ ** Fields above must be initialized to zero. The fields that follow, |
+ ** down to the beginning of the recursive section, do not need to be |
+ ** initialized as they will be set before being used. The boundary is |
+ ** determined by offsetof(Parse,aColCache). |
+ **************************************************************************/ |
+ |
+ struct yColCache { |
+ int iTable; /* Table cursor number */ |
+ i16 iColumn; /* Table column number */ |
+ u8 tempReg; /* iReg is a temp register that needs to be freed */ |
+ int iLevel; /* Nesting level */ |
+ int iReg; /* Reg with value of this column. 0 means none. */ |
+ int lru; /* Least recently used entry has the smallest value */ |
+ } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */ |
+ int aTempReg[8]; /* Holding area for temporary registers */ |
+ Token sNameToken; /* Token with unqualified schema object name */ |
+ |
/************************************************************************ |
** Above is constant between recursions. Below is reset before and after |
** each recursion. The boundary between these two regions is determined |
- ** using offsetof(Parse,nVar) so the nVar field must be the first field |
- ** in the recursive region. |
+ ** using offsetof(Parse,sLastToken) so the sLastToken field must be the |
+ ** first field in the recursive region. |
************************************************************************/ |
- int nVar; /* Number of '?' variables seen in the SQL so far */ |
- int nzVar; /* Number of available slots in azVar[] */ |
+ Token sLastToken; /* The last token parsed */ |
+ ynVar nVar; /* Number of '?' variables seen in the SQL so far */ |
u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */ |
u8 explain; /* True if the EXPLAIN flag is found on the query */ |
#ifndef SQLITE_OMIT_VIRTUALTABLE |
u8 declareVtab; /* True if inside sqlite3_declare_vtab() */ |
int nVtabLock; /* Number of virtual tables to lock */ |
#endif |
- int nAlias; /* Number of aliased result set columns */ |
int nHeight; /* Expression tree height of current sub-select */ |
#ifndef SQLITE_OMIT_EXPLAIN |
int iSelectId; /* ID of current select for EXPLAIN output */ |
int iNextSelectId; /* Next available select ID for EXPLAIN output */ |
#endif |
- char **azVar; /* Pointers to names of parameters */ |
+ VList *pVList; /* Mapping between variable names and numbers */ |
Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ |
const char *zTail; /* All SQL text past the last semicolon parsed */ |
Table *pNewTable; /* A table being constructed by CREATE TABLE */ |
Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ |
const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ |
- Token sNameToken; /* Token with unqualified schema object name */ |
- Token sLastToken; /* The last token parsed */ |
#ifndef SQLITE_OMIT_VIRTUALTABLE |
Token sArg; /* Complete text of a module argument */ |
Table **apVtabLock; /* Pointer to virtual tables needing locking */ |
@@ -2817,6 +3028,14 @@ struct Parse { |
}; |
/* |
+** Sizes and pointers of various parts of the Parse object. |
+*/ |
+#define PARSE_HDR_SZ offsetof(Parse,aColCache) /* Recursive part w/o aColCache*/ |
+#define PARSE_RECURSE_SZ offsetof(Parse,sLastToken) /* Recursive part */ |
+#define PARSE_TAIL_SZ (sizeof(Parse)-PARSE_RECURSE_SZ) /* Non-recursive part */ |
+#define PARSE_TAIL(X) (((char*)(X))+PARSE_RECURSE_SZ) /* Pointer to tail */ |
+ |
+/* |
** Return true if currently inside an sqlite3_declare_vtab() call. |
*/ |
#ifdef SQLITE_OMIT_VIRTUALTABLE |
@@ -2836,27 +3055,40 @@ struct AuthContext { |
/* |
** Bitfield flags for P5 value in various opcodes. |
-*/ |
-#define OPFLAG_NCHANGE 0x01 /* Set to update db->nChange */ |
+** |
+** Value constraints (enforced via assert()): |
+** OPFLAG_LENGTHARG == SQLITE_FUNC_LENGTH |
+** OPFLAG_TYPEOFARG == SQLITE_FUNC_TYPEOF |
+** OPFLAG_BULKCSR == BTREE_BULKLOAD |
+** OPFLAG_SEEKEQ == BTREE_SEEK_EQ |
+** OPFLAG_FORDELETE == BTREE_FORDELETE |
+** OPFLAG_SAVEPOSITION == BTREE_SAVEPOSITION |
+** OPFLAG_AUXDELETE == BTREE_AUXDELETE |
+*/ |
+#define OPFLAG_NCHANGE 0x01 /* OP_Insert: Set to update db->nChange */ |
+ /* Also used in P2 (not P5) of OP_Delete */ |
#define OPFLAG_EPHEM 0x01 /* OP_Column: Ephemeral output is ok */ |
-#define OPFLAG_LASTROWID 0x02 /* Set to update db->lastRowid */ |
+#define OPFLAG_LASTROWID 0x20 /* Set to update db->lastRowid */ |
#define OPFLAG_ISUPDATE 0x04 /* This OP_Insert is an sql UPDATE */ |
#define OPFLAG_APPEND 0x08 /* This is likely to be an append */ |
#define OPFLAG_USESEEKRESULT 0x10 /* Try to avoid a seek in BtreeInsert() */ |
+#define OPFLAG_ISNOOP 0x40 /* OP_Delete does pre-update-hook only */ |
#define OPFLAG_LENGTHARG 0x40 /* OP_Column only used for length() */ |
#define OPFLAG_TYPEOFARG 0x80 /* OP_Column only used for typeof() */ |
#define OPFLAG_BULKCSR 0x01 /* OP_Open** used to open bulk cursor */ |
#define OPFLAG_SEEKEQ 0x02 /* OP_Open** cursor uses EQ seek only */ |
-#define OPFLAG_FORDELETE 0x08 /* OP_Open is opening for-delete csr */ |
+#define OPFLAG_FORDELETE 0x08 /* OP_Open should use BTREE_FORDELETE */ |
#define OPFLAG_P2ISREG 0x10 /* P2 to OP_Open** is a register number */ |
#define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */ |
+#define OPFLAG_SAVEPOSITION 0x02 /* OP_Delete/Insert: save cursor pos */ |
+#define OPFLAG_AUXDELETE 0x04 /* OP_Delete: index in a DELETE op */ |
/* |
* Each trigger present in the database schema is stored as an instance of |
- * struct Trigger. |
+ * struct Trigger. |
* |
* Pointers to instances of struct Trigger are stored in two ways. |
- * 1. In the "trigHash" hash table (part of the sqlite3* that represents the |
+ * 1. In the "trigHash" hash table (part of the sqlite3* that represents the |
* database). This allows Trigger structures to be retrieved by name. |
* 2. All triggers associated with a single table form a linked list, using the |
* pNext member of struct Trigger. A pointer to the first element of the |
@@ -2882,7 +3114,7 @@ struct Trigger { |
/* |
** A trigger is either a BEFORE or an AFTER trigger. The following constants |
-** determine which. |
+** determine which. |
** |
** If there are multiple triggers, you might of some BEFORE and some AFTER. |
** In that cases, the constants below can be ORed together. |
@@ -2892,15 +3124,15 @@ struct Trigger { |
/* |
* An instance of struct TriggerStep is used to store a single SQL statement |
- * that is a part of a trigger-program. |
+ * that is a part of a trigger-program. |
* |
* Instances of struct TriggerStep are stored in a singly linked list (linked |
- * using the "pNext" member) referenced by the "step_list" member of the |
+ * using the "pNext" member) referenced by the "step_list" member of the |
* associated struct Trigger instance. The first element of the linked list is |
* the first step of the trigger-program. |
- * |
+ * |
* The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or |
- * "SELECT" statement. The meanings of the other members is determined by the |
+ * "SELECT" statement. The meanings of the other members is determined by the |
* value of "op" as follows: |
* |
* (op == TK_INSERT) |
@@ -2910,7 +3142,7 @@ struct Trigger { |
* zTarget -> Dequoted name of the table to insert into. |
* pExprList -> If this is an INSERT INTO ... VALUES ... statement, then |
* this stores values to be inserted. Otherwise NULL. |
- * pIdList -> If this is an INSERT INTO ... (<column-names>) VALUES ... |
+ * pIdList -> If this is an INSERT INTO ... (<column-names>) VALUES ... |
* statement, then this stores the column-names to be |
* inserted into. |
* |
@@ -2918,7 +3150,7 @@ struct Trigger { |
* zTarget -> Dequoted name of the table to delete from. |
* pWhere -> The WHERE clause of the DELETE statement if one is specified. |
* Otherwise NULL. |
- * |
+ * |
* (op == TK_UPDATE) |
* zTarget -> Dequoted name of the table to update. |
* pWhere -> The WHERE clause of the UPDATE statement if one is specified. |
@@ -2926,7 +3158,7 @@ struct Trigger { |
* pExprList -> A list of the columns to update and the expressions to update |
* them to. See sqlite3Update() documentation of "pChanges" |
* argument. |
- * |
+ * |
*/ |
struct TriggerStep { |
u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */ |
@@ -2944,7 +3176,7 @@ struct TriggerStep { |
/* |
** The following structure contains information used by the sqliteFix... |
** routines as they walk the parse tree to make database references |
-** explicit. |
+** explicit. |
*/ |
typedef struct DbFixer DbFixer; |
struct DbFixer { |
@@ -2968,10 +3200,16 @@ struct StrAccum { |
u32 nAlloc; /* Amount of space allocated in zText */ |
u32 mxAlloc; /* Maximum allowed allocation. 0 for no malloc usage */ |
u8 accError; /* STRACCUM_NOMEM or STRACCUM_TOOBIG */ |
- u8 bMalloced; /* zText points to allocated space */ |
+ u8 printfFlags; /* SQLITE_PRINTF flags below */ |
}; |
#define STRACCUM_NOMEM 1 |
#define STRACCUM_TOOBIG 2 |
+#define SQLITE_PRINTF_INTERNAL 0x01 /* Internal-use-only converters allowed */ |
+#define SQLITE_PRINTF_SQLFUNC 0x02 /* SQL function arguments to VXPrintf */ |
+#define SQLITE_PRINTF_MALLOCED 0x04 /* True if xText is allocated space */ |
+ |
+#define isMalloced(X) (((X)->printfFlags & SQLITE_PRINTF_MALLOCED)!=0) |
+ |
/* |
** A pointer to this structure is used to communicate information |
@@ -2999,6 +3237,7 @@ struct Sqlite3Config { |
int neverCorrupt; /* Database is always well-formed */ |
int szLookaside; /* Default lookaside buffer size */ |
int nLookaside; /* Default lookaside buffer count */ |
+ int nStmtSpill; /* Stmt-journal spill-to-disk threshold */ |
sqlite3_mem_methods m; /* Low-level memory allocation interface */ |
sqlite3_mutex_methods mutex; /* Low-level mutex interface */ |
sqlite3_pcache_methods2 pcache2; /* Low-level page-cache interface */ |
@@ -3038,10 +3277,11 @@ struct Sqlite3Config { |
void (*xVdbeBranch)(void*,int iSrcLine,u8 eThis,u8 eMx); /* Callback */ |
void *pVdbeBranchArg; /* 1st argument */ |
#endif |
-#ifndef SQLITE_OMIT_BUILTIN_TEST |
+#ifndef SQLITE_UNTESTABLE |
int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ |
#endif |
int bLocaltimeFault; /* True to fail localtime() calls */ |
+ int iOnceResetThreshold; /* When to reset OP_Once counters */ |
}; |
/* |
@@ -3066,10 +3306,10 @@ struct Sqlite3Config { |
** Context pointer passed down through the tree-walk. |
*/ |
struct Walker { |
+ Parse *pParse; /* Parser context. */ |
int (*xExprCallback)(Walker*, Expr*); /* Callback for expressions */ |
int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */ |
void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ |
- Parse *pParse; /* Parser context. */ |
int walkerDepth; /* Number of subqueries */ |
u8 eCode; /* A small processing code */ |
union { /* Extra data for callback */ |
@@ -3079,6 +3319,8 @@ struct Walker { |
SrcList *pSrcList; /* FROM clause */ |
struct SrcCount *pSrcCount; /* Counting column references */ |
struct CCurHint *pCCurHint; /* Used by codeCursorHint() */ |
+ int *aiCol; /* array of column indexes */ |
+ struct IdxCover *pIdxCover; /* Check for index coverage */ |
} u; |
}; |
@@ -3147,7 +3389,23 @@ int sqlite3CantopenError(int); |
#define SQLITE_CORRUPT_BKPT sqlite3CorruptError(__LINE__) |
#define SQLITE_MISUSE_BKPT sqlite3MisuseError(__LINE__) |
#define SQLITE_CANTOPEN_BKPT sqlite3CantopenError(__LINE__) |
+#ifdef SQLITE_DEBUG |
+ int sqlite3NomemError(int); |
+ int sqlite3IoerrnomemError(int); |
+# define SQLITE_NOMEM_BKPT sqlite3NomemError(__LINE__) |
+# define SQLITE_IOERR_NOMEM_BKPT sqlite3IoerrnomemError(__LINE__) |
+#else |
+# define SQLITE_NOMEM_BKPT SQLITE_NOMEM |
+# define SQLITE_IOERR_NOMEM_BKPT SQLITE_IOERR_NOMEM |
+#endif |
+/* |
+** FTS3 and FTS4 both require virtual table support |
+*/ |
+#if defined(SQLITE_OMIT_VIRTUALTABLE) |
+# undef SQLITE_ENABLE_FTS3 |
+# undef SQLITE_ENABLE_FTS4 |
+#endif |
/* |
** FTS4 is really an extension for FTS3. It is enabled using the |
@@ -3180,6 +3438,7 @@ int sqlite3CantopenError(int); |
# define sqlite3Isdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x04) |
# define sqlite3Isxdigit(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x08) |
# define sqlite3Tolower(x) (sqlite3UpperToLower[(unsigned char)(x)]) |
+# define sqlite3Isquote(x) (sqlite3CtypeMap[(unsigned char)(x)]&0x80) |
#else |
# define sqlite3Toupper(x) toupper((unsigned char)(x)) |
# define sqlite3Isspace(x) isspace((unsigned char)(x)) |
@@ -3188,6 +3447,7 @@ int sqlite3CantopenError(int); |
# define sqlite3Isdigit(x) isdigit((unsigned char)(x)) |
# define sqlite3Isxdigit(x) isxdigit((unsigned char)(x)) |
# define sqlite3Tolower(x) tolower((unsigned char)(x)) |
+# define sqlite3Isquote(x) ((x)=='"'||(x)=='\''||(x)=='['||(x)=='`') |
#endif |
#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS |
int sqlite3IsIdChar(u8); |
@@ -3196,8 +3456,9 @@ int sqlite3IsIdChar(u8); |
/* |
** Internal function prototypes |
*/ |
-#define sqlite3StrICmp sqlite3_stricmp |
+int sqlite3StrICmp(const char*,const char*); |
int sqlite3Strlen30(const char*); |
+char *sqlite3ColumnType(Column*,char*); |
#define sqlite3StrNICmp sqlite3_strnicmp |
int sqlite3MallocInit(void); |
@@ -3206,6 +3467,7 @@ void *sqlite3Malloc(u64); |
void *sqlite3MallocZero(u64); |
void *sqlite3DbMallocZero(sqlite3*, u64); |
void *sqlite3DbMallocRaw(sqlite3*, u64); |
+void *sqlite3DbMallocRawNN(sqlite3*, u64); |
char *sqlite3DbStrDup(sqlite3*,const char*); |
char *sqlite3DbStrNDup(sqlite3*,const char*, u64); |
void *sqlite3Realloc(void*, u64); |
@@ -3219,7 +3481,7 @@ void sqlite3ScratchFree(void*); |
void *sqlite3PageMalloc(int); |
void sqlite3PageFree(void*); |
void sqlite3MemSetDefault(void); |
-#ifndef SQLITE_OMIT_BUILTIN_TEST |
+#ifndef SQLITE_UNTESTABLE |
void sqlite3BenignMallocHooks(void (*)(void), void (*)(void)); |
#endif |
int sqlite3HeapNearlyFull(void); |
@@ -3235,18 +3497,22 @@ int sqlite3HeapNearlyFull(void); |
#ifdef SQLITE_USE_ALLOCA |
# define sqlite3StackAllocRaw(D,N) alloca(N) |
# define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N) |
-# define sqlite3StackFree(D,P) |
+# define sqlite3StackFree(D,P) |
#else |
# define sqlite3StackAllocRaw(D,N) sqlite3DbMallocRaw(D,N) |
# define sqlite3StackAllocZero(D,N) sqlite3DbMallocZero(D,N) |
# define sqlite3StackFree(D,P) sqlite3DbFree(D,P) |
#endif |
-#ifdef SQLITE_ENABLE_MEMSYS3 |
-const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); |
-#endif |
+/* Do not allow both MEMSYS5 and MEMSYS3 to be defined together. If they |
+** are, disable MEMSYS3 |
+*/ |
#ifdef SQLITE_ENABLE_MEMSYS5 |
const sqlite3_mem_methods *sqlite3MemGetMemsys5(void); |
+#undef SQLITE_ENABLE_MEMSYS3 |
+#endif |
+#ifdef SQLITE_ENABLE_MEMSYS3 |
+const sqlite3_mem_methods *sqlite3MemGetMemsys3(void); |
#endif |
@@ -3288,10 +3554,8 @@ struct PrintfArguments { |
sqlite3_value **apArg; /* The argument values */ |
}; |
-#define SQLITE_PRINTF_INTERNAL 0x01 |
-#define SQLITE_PRINTF_SQLFUNC 0x02 |
-void sqlite3VXPrintf(StrAccum*, u32, const char*, va_list); |
-void sqlite3XPrintf(StrAccum*, u32, const char*, ...); |
+void sqlite3VXPrintf(StrAccum*, const char*, va_list); |
+void sqlite3XPrintf(StrAccum*, const char*, ...); |
char *sqlite3MPrintf(sqlite3*,const char*, ...); |
char *sqlite3VMPrintf(sqlite3*,const char*, va_list); |
#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) |
@@ -3303,6 +3567,7 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); |
#if defined(SQLITE_DEBUG) |
void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); |
+ void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); |
void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); |
void sqlite3TreeViewSelect(TreeView*, const Select*, u8); |
void sqlite3TreeViewWith(TreeView*, const With*, u8); |
@@ -3311,7 +3576,8 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); |
void sqlite3SetString(char **, sqlite3*, const char*); |
void sqlite3ErrorMsg(Parse*, const char*, ...); |
-int sqlite3Dequote(char*); |
+void sqlite3Dequote(char*); |
+void sqlite3TokenInit(Token*,char*); |
int sqlite3KeywordCode(const unsigned char*, int); |
int sqlite3RunParser(Parse*, const char*, char **); |
void sqlite3FinishCoding(Parse*); |
@@ -3320,15 +3586,20 @@ void sqlite3ReleaseTempReg(Parse*,int); |
int sqlite3GetTempRange(Parse*,int); |
void sqlite3ReleaseTempRange(Parse*,int,int); |
void sqlite3ClearTempRegCache(Parse*); |
+#ifdef SQLITE_DEBUG |
+int sqlite3NoTempsInRange(Parse*,int,int); |
+#endif |
Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); |
Expr *sqlite3Expr(sqlite3*,int,const char*); |
void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); |
-Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*, const Token*); |
+Expr *sqlite3PExpr(Parse*, int, Expr*, Expr*); |
+void sqlite3PExprAddSelect(Parse*, Expr*, Select*); |
Expr *sqlite3ExprAnd(sqlite3*,Expr*, Expr*); |
Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*); |
-void sqlite3ExprAssignVarNumber(Parse*, Expr*); |
+void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); |
void sqlite3ExprDelete(sqlite3*, Expr*); |
ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); |
+ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); |
void sqlite3ExprListSetSortOrder(ExprList*,int); |
void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); |
void sqlite3ExprListSetSpan(Parse*,ExprList*,ExprSpan*); |
@@ -3337,13 +3608,16 @@ u32 sqlite3ExprListFlags(const ExprList*); |
int sqlite3Init(sqlite3*, char**); |
int sqlite3InitCallback(void*, int, char**, char**); |
void sqlite3Pragma(Parse*,Token*,Token*,Token*,int); |
+#ifndef SQLITE_OMIT_VIRTUALTABLE |
+Module *sqlite3PragmaVtabRegister(sqlite3*,const char *zName); |
+#endif |
void sqlite3ResetAllSchemasOfConnection(sqlite3*); |
void sqlite3ResetOneSchema(sqlite3*,int); |
void sqlite3CollapseDatabaseArray(sqlite3*); |
-void sqlite3BeginParse(Parse*,int); |
void sqlite3CommitInternalChanges(sqlite3*); |
void sqlite3DeleteColumnNames(sqlite3*,Table*); |
int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); |
+void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*); |
Table *sqlite3ResultSetOfSelect(Parse*,Select*); |
void sqlite3OpenMasterTable(Parse *, int); |
Index *sqlite3PrimaryKeyIndex(Table*); |
@@ -3354,20 +3628,18 @@ void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); |
#else |
# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */ |
#endif |
-void sqlite3AddColumn(Parse*,Token*); |
+void sqlite3AddColumn(Parse*,Token*,Token*); |
void sqlite3AddNotNull(Parse*, int); |
void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); |
void sqlite3AddCheckConstraint(Parse*, Expr*); |
-void sqlite3AddColumnType(Parse*,Token*); |
void sqlite3AddDefaultValue(Parse*,ExprSpan*); |
void sqlite3AddCollateType(Parse*, Token*); |
void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); |
int sqlite3ParseUri(const char*,const char*,unsigned int*, |
sqlite3_vfs**,char**,char **); |
Btree *sqlite3DbNameToBtree(sqlite3*,const char*); |
-int sqlite3CodeOnce(Parse *); |
-#ifdef SQLITE_OMIT_BUILTIN_TEST |
+#ifdef SQLITE_UNTESTABLE |
# define sqlite3FaultSim(X) SQLITE_OK |
#else |
int sqlite3FaultSim(int); |
@@ -3380,7 +3652,7 @@ int sqlite3BitvecSet(Bitvec*, u32); |
void sqlite3BitvecClear(Bitvec*, u32, void*); |
void sqlite3BitvecDestroy(Bitvec*); |
u32 sqlite3BitvecSize(Bitvec*); |
-#ifndef SQLITE_OMIT_BUILTIN_TEST |
+#ifndef SQLITE_UNTESTABLE |
int sqlite3BitvecBuiltinTest(int,int*); |
#endif |
@@ -3427,12 +3699,12 @@ void sqlite3SrcListAssignCursors(Parse*, SrcList*); |
void sqlite3IdListDelete(sqlite3*, IdList*); |
void sqlite3SrcListDelete(sqlite3*, SrcList*); |
Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**); |
-Index *sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, |
- Expr*, int, int); |
+void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, |
+ Expr*, int, int, u8); |
void sqlite3DropIndex(Parse*, SrcList*, int); |
int sqlite3Select(Parse*, Select*, SelectDest*); |
Select *sqlite3SelectNew(Parse*,ExprList*,SrcList*,Expr*,ExprList*, |
- Expr*,ExprList*,u16,Expr*,Expr*); |
+ Expr*,ExprList*,u32,Expr*,Expr*); |
void sqlite3SelectDelete(sqlite3*, Select*); |
Table *sqlite3SrcListLookup(Parse*, SrcList*); |
int sqlite3IsReadOnly(Parse*, Table*, int); |
@@ -3444,9 +3716,10 @@ void sqlite3DeleteFrom(Parse*, SrcList*, Expr*); |
void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int); |
WhereInfo *sqlite3WhereBegin(Parse*,SrcList*,Expr*,ExprList*,ExprList*,u16,int); |
void sqlite3WhereEnd(WhereInfo*); |
-u64 sqlite3WhereOutputRowCount(WhereInfo*); |
+LogEst sqlite3WhereOutputRowCount(WhereInfo*); |
int sqlite3WhereIsDistinct(WhereInfo*); |
int sqlite3WhereIsOrdered(WhereInfo*); |
+int sqlite3WhereOrderedInnerLoop(WhereInfo*); |
int sqlite3WhereIsSorted(WhereInfo*); |
int sqlite3WhereContinueLabel(WhereInfo*); |
int sqlite3WhereBreakLabel(WhereInfo*); |
@@ -3468,7 +3741,7 @@ void sqlite3ExprCacheAffinityChange(Parse*, int, int); |
void sqlite3ExprCode(Parse*, Expr*, int); |
void sqlite3ExprCodeCopy(Parse*, Expr*, int); |
void sqlite3ExprCodeFactorable(Parse*, Expr*, int); |
-void sqlite3ExprCodeAtInit(Parse*, Expr*, int, u8); |
+int sqlite3ExprCodeAtInit(Parse*, Expr*, int); |
int sqlite3ExprCodeTemp(Parse*, Expr*, int*); |
int sqlite3ExprCodeTarget(Parse*, Expr*, int); |
void sqlite3ExprCodeAndCache(Parse*, Expr*, int); |
@@ -3476,26 +3749,30 @@ int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8); |
#define SQLITE_ECEL_DUP 0x01 /* Deep, not shallow copies */ |
#define SQLITE_ECEL_FACTOR 0x02 /* Factor out constant terms */ |
#define SQLITE_ECEL_REF 0x04 /* Use ExprList.u.x.iOrderByCol */ |
+#define SQLITE_ECEL_OMITREF 0x08 /* Omit if ExprList.u.x.iOrderByCol */ |
void sqlite3ExprIfTrue(Parse*, Expr*, int, int); |
void sqlite3ExprIfFalse(Parse*, Expr*, int, int); |
void sqlite3ExprIfFalseDup(Parse*, Expr*, int, int); |
Table *sqlite3FindTable(sqlite3*,const char*, const char*); |
-Table *sqlite3LocateTable(Parse*,int isView,const char*, const char*); |
-Table *sqlite3LocateTableItem(Parse*,int isView,struct SrcList_item *); |
+#define LOCATE_VIEW 0x01 |
+#define LOCATE_NOERR 0x02 |
+Table *sqlite3LocateTable(Parse*,u32 flags,const char*, const char*); |
+Table *sqlite3LocateTableItem(Parse*,u32 flags,struct SrcList_item *); |
Index *sqlite3FindIndex(sqlite3*,const char*, const char*); |
void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); |
void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); |
-void sqlite3Vacuum(Parse*); |
-int sqlite3RunVacuum(char**, sqlite3*); |
+void sqlite3Vacuum(Parse*,Token*); |
+int sqlite3RunVacuum(char**, sqlite3*, int); |
char *sqlite3NameFromToken(sqlite3*, Token*); |
int sqlite3ExprCompare(Expr*, Expr*, int); |
int sqlite3ExprListCompare(ExprList*, ExprList*, int); |
int sqlite3ExprImpliesExpr(Expr*, Expr*, int); |
void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); |
void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); |
+int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); |
int sqlite3FunctionUsesThisSrc(Expr*, SrcList*); |
Vdbe *sqlite3GetVdbe(Parse*); |
-#ifndef SQLITE_OMIT_BUILTIN_TEST |
+#ifndef SQLITE_UNTESTABLE |
void sqlite3PrngSaveState(void); |
void sqlite3PrngRestoreState(void); |
#endif |
@@ -3525,7 +3802,12 @@ void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); |
int sqlite3GenerateIndexKey(Parse*, Index*, int, int, int, int*,Index*,int); |
void sqlite3ResolvePartIdxLabel(Parse*,int); |
void sqlite3GenerateConstraintChecks(Parse*,Table*,int*,int,int,int,int, |
- u8,u8,int,int*); |
+ u8,u8,int,int*,int*); |
+#ifdef SQLITE_ENABLE_NULL_TRIM |
+ void sqlite3SetMakeRecordP5(Vdbe*,Table*); |
+#else |
+# define sqlite3SetMakeRecordP5(A,B) |
+#endif |
void sqlite3CompleteInsertion(Parse*,Table*,int,int,int,int*,int,int,int); |
int sqlite3OpenTableAndIndices(Parse*, Table*, int, u8, int, u8*, int*, int*); |
void sqlite3BeginWriteOperation(Parse*, int, int); |
@@ -3544,11 +3826,11 @@ void sqlite3SelectSetName(Select*,const char*); |
#else |
# define sqlite3SelectSetName(A,B) |
#endif |
-void sqlite3FuncDefInsert(FuncDefHash*, FuncDef*); |
-FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,int,u8,u8); |
-void sqlite3RegisterBuiltinFunctions(sqlite3*); |
+void sqlite3InsertBuiltinFuncs(FuncDef*,int); |
+FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); |
+void sqlite3RegisterBuiltinFunctions(void); |
void sqlite3RegisterDateTimeFunctions(void); |
-void sqlite3RegisterGlobalFunctions(void); |
+void sqlite3RegisterPerConnectionBuiltinFunctions(sqlite3*); |
int sqlite3SafetyCheckOk(sqlite3*); |
int sqlite3SafetyCheckSickOrOk(sqlite3*); |
void sqlite3ChangeCookie(Parse*, int); |
@@ -3627,7 +3909,14 @@ LogEst sqlite3LogEstAdd(LogEst,LogEst); |
#ifndef SQLITE_OMIT_VIRTUALTABLE |
LogEst sqlite3LogEstFromDouble(double); |
#endif |
+#if defined(SQLITE_ENABLE_STMT_SCANSTATUS) || \ |
+ defined(SQLITE_ENABLE_STAT3_OR_STAT4) || \ |
+ defined(SQLITE_EXPLAIN_ESTIMATED_ROWS) |
u64 sqlite3LogEstToInt(LogEst); |
+#endif |
+VList *sqlite3VListAdd(sqlite3*,VList*,const char*,int,int); |
+const char *sqlite3VListNumToName(VList*,int); |
+int sqlite3VListNameToNum(VList*,const char*,int); |
/* |
** Routines to read and write variable-length integers. These used to |
@@ -3657,11 +3946,13 @@ const char *sqlite3IndexAffinityStr(sqlite3*, Index*); |
void sqlite3TableAffinity(Vdbe*, Table*, int); |
char sqlite3CompareAffinity(Expr *pExpr, char aff2); |
int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity); |
+char sqlite3TableColumnAffinity(Table*,int); |
char sqlite3ExprAffinity(Expr *pExpr); |
int sqlite3Atoi64(const char*, i64*, int, u8); |
int sqlite3DecOrHexToI64(const char*, i64*); |
void sqlite3ErrorWithMsg(sqlite3*, int, const char*,...); |
void sqlite3Error(sqlite3*,int); |
+void sqlite3SystemError(sqlite3*,int); |
void *sqlite3HexToBlob(sqlite3*, const char *z, int n); |
u8 sqlite3HexToInt(int h); |
int sqlite3TwoPartName(Parse *, Token *, Token *, Token **); |
@@ -3694,7 +3985,7 @@ u8 sqlite3GetBoolean(const char *z,u8); |
const void *sqlite3ValueText(sqlite3_value*, u8); |
int sqlite3ValueBytes(sqlite3_value*, u8); |
-void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, |
+void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8, |
void(*)(void*)); |
void sqlite3ValueSetNull(sqlite3_value*); |
void sqlite3ValueFree(sqlite3_value*); |
@@ -3709,7 +4000,7 @@ extern const unsigned char sqlite3UpperToLower[]; |
extern const unsigned char sqlite3CtypeMap[]; |
extern const Token sqlite3IntTokens[]; |
extern SQLITE_WSD struct Sqlite3Config sqlite3Config; |
-extern SQLITE_WSD FuncDefHash sqlite3GlobalFunctions; |
+extern FuncDefHash sqlite3BuiltinFunctions; |
#ifndef SQLITE_OMIT_WSD |
extern int sqlite3PendingByte; |
#endif |
@@ -3721,7 +4012,7 @@ void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); |
int sqlite3GetToken(const unsigned char *, int *); |
void sqlite3NestedParse(Parse*, const char*, ...); |
void sqlite3ExpirePreparedStatements(sqlite3*); |
-int sqlite3CodeSubselect(Parse *, Expr *, int, int); |
+int sqlite3CodeSubselect(Parse*, Expr *, int, int); |
void sqlite3SelectPrep(Parse*, Select*, NameContext*); |
void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); |
int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); |
@@ -3744,7 +4035,6 @@ void sqlite3DeleteIndexSamples(sqlite3*,Index*); |
void sqlite3DefaultRowEst(Index*); |
void sqlite3RegisterLikeFunctions(sqlite3*, int); |
int sqlite3IsLikeFunction(sqlite3*,Expr*,int*,char*); |
-void sqlite3MinimumFileFormat(Parse*, int, int); |
void sqlite3SchemaClear(void *); |
Schema *sqlite3SchemaGet(sqlite3 *, Btree *); |
int sqlite3SchemaToIndex(sqlite3 *db, Schema *); |
@@ -3755,11 +4045,13 @@ KeyInfo *sqlite3KeyInfoOfIndex(Parse*, Index*); |
#ifdef SQLITE_DEBUG |
int sqlite3KeyInfoIsWriteable(KeyInfo*); |
#endif |
-int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, |
+int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *, |
void (*)(sqlite3_context*,int,sqlite3_value **), |
void (*)(sqlite3_context*,int,sqlite3_value **), void (*)(sqlite3_context*), |
FuncDestructor *pDestructor |
); |
+void sqlite3OomFault(sqlite3*); |
+void sqlite3OomClear(sqlite3*); |
int sqlite3ApiExit(sqlite3 *db, int); |
int sqlite3OpenTempDatabase(Parse *); |
@@ -3775,19 +4067,29 @@ Expr *sqlite3CreateColumnExpr(sqlite3 *, SrcList *, int, int); |
void sqlite3BackupRestart(sqlite3_backup *); |
void sqlite3BackupUpdate(sqlite3_backup *, Pgno, const u8 *); |
+#ifndef SQLITE_OMIT_SUBQUERY |
+int sqlite3ExprCheckIN(Parse*, Expr*); |
+#else |
+# define sqlite3ExprCheckIN(x,y) SQLITE_OK |
+#endif |
+ |
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 |
void sqlite3AnalyzeFunctions(void); |
-int sqlite3Stat4ProbeSetValue(Parse*,Index*,UnpackedRecord**,Expr*,u8,int,int*); |
+int sqlite3Stat4ProbeSetValue( |
+ Parse*,Index*,UnpackedRecord**,Expr*,int,int,int*); |
int sqlite3Stat4ValueFromExpr(Parse*, Expr*, u8, sqlite3_value**); |
void sqlite3Stat4ProbeFree(UnpackedRecord*); |
int sqlite3Stat4Column(sqlite3*, const void*, int, int, sqlite3_value**); |
+char sqlite3IndexColumnAffinity(sqlite3*, Index*, int); |
#endif |
/* |
** The interface to the LEMON-generated parser |
*/ |
-void *sqlite3ParserAlloc(void*(*)(u64)); |
-void sqlite3ParserFree(void*, void(*)(void*)); |
+#ifndef SQLITE_AMALGAMATION |
+ void *sqlite3ParserAlloc(void*(*)(u64)); |
+ void sqlite3ParserFree(void*, void(*)(void*)); |
+#endif |
void sqlite3Parser(void*, int, Token, Parse*); |
#ifdef YYTRACKMAXSTACKDEPTH |
int sqlite3ParserStackPeak(void*); |
@@ -3816,7 +4118,7 @@ void sqlite3AutoLoadExtensions(sqlite3*); |
# define sqlite3VtabRollback(X) |
# define sqlite3VtabCommit(X) |
# define sqlite3VtabInSync(db) 0 |
-# define sqlite3VtabLock(X) |
+# define sqlite3VtabLock(X) |
# define sqlite3VtabUnlock(X) |
# define sqlite3VtabUnlockList(X) |
# define sqlite3VtabSavepoint(X, Y, Z) SQLITE_OK |
@@ -3833,6 +4135,13 @@ void sqlite3AutoLoadExtensions(sqlite3*); |
int sqlite3VtabSavepoint(sqlite3 *, int, int); |
void sqlite3VtabImportErrmsg(Vdbe*, sqlite3_vtab*); |
VTable *sqlite3GetVTable(sqlite3*, Table*); |
+ Module *sqlite3VtabCreateModule( |
+ sqlite3*, |
+ const char*, |
+ const sqlite3_module*, |
+ void*, |
+ void(*)(void*) |
+ ); |
# define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0) |
#endif |
int sqlite3VtabEponymousTableInit(Parse*,Module*); |
@@ -3874,7 +4183,7 @@ const char *sqlite3JournalModename(int); |
** no-op macros if OMIT_FOREIGN_KEY is defined. In this case no foreign |
** key functionality is available. If OMIT_TRIGGER is defined but |
** OMIT_FOREIGN_KEY is not, only some of the functions are no-oped. In |
-** this case foreign keys are parsed, but no other functionality is |
+** this case foreign keys are parsed, but no other functionality is |
** provided (enforcement of FK constraints requires the triggers sub-system). |
*/ |
#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) |
@@ -3890,6 +4199,7 @@ const char *sqlite3JournalModename(int); |
#define sqlite3FkDropTable(a,b,c) |
#define sqlite3FkOldmask(a,b) 0 |
#define sqlite3FkRequired(a,b,c,d) 0 |
+ #define sqlite3FkReferences(a) 0 |
#endif |
#ifndef SQLITE_OMIT_FOREIGN_KEY |
void sqlite3FkDelete(sqlite3 *, Table*); |
@@ -3908,10 +4218,10 @@ const char *sqlite3JournalModename(int); |
/* |
** The interface to the code in fault.c used for identifying "benign" |
-** malloc failures. This is only present if SQLITE_OMIT_BUILTIN_TEST |
+** malloc failures. This is only present if SQLITE_UNTESTABLE |
** is not defined. |
*/ |
-#ifndef SQLITE_OMIT_BUILTIN_TEST |
+#ifndef SQLITE_UNTESTABLE |
void sqlite3BeginBenignMalloc(void); |
void sqlite3EndBenignMalloc(void); |
#else |
@@ -3933,21 +4243,16 @@ const char *sqlite3JournalModename(int); |
#define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ |
#define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ |
#define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ |
-int sqlite3FindInIndex(Parse *, Expr *, u32, int*); |
+int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*); |
+int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); |
+int sqlite3JournalSize(sqlite3_vfs *); |
#ifdef SQLITE_ENABLE_ATOMIC_WRITE |
- int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); |
- int sqlite3JournalSize(sqlite3_vfs *); |
int sqlite3JournalCreate(sqlite3_file *); |
- int sqlite3JournalExists(sqlite3_file *p); |
-#else |
- #define sqlite3JournalSize(pVfs) ((pVfs)->szOsFile) |
- #define sqlite3JournalExists(p) 1 |
#endif |
+int sqlite3JournalIsInMemory(sqlite3_file *p); |
void sqlite3MemJournalOpen(sqlite3_file *); |
-int sqlite3MemJournalSize(void); |
-int sqlite3IsMemJournal(sqlite3_file *); |
void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p); |
#if SQLITE_MAX_EXPR_DEPTH>0 |
@@ -3978,7 +4283,7 @@ void sqlite3Put4byte(u8*, u32); |
/* |
** If the SQLITE_ENABLE IOTRACE exists then the global variable |
** sqlite3IoTrace is a pointer to a printf-like routine used to |
-** print I/O tracing messages. |
+** print I/O tracing messages. |
*/ |
#ifdef SQLITE_ENABLE_IOTRACE |
# define IOTRACE(A) if( sqlite3IoTrace ){ sqlite3IoTrace A; } |
@@ -4012,7 +4317,7 @@ SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...); |
** that allocations that might have been satisfied by lookaside are not |
** passed back to non-lookaside free() routines. Asserts such as the |
** example above are placed on the non-lookaside free() routines to verify |
-** this constraint. |
+** this constraint. |
** |
** All of this is no-op for a production build. It only comes into |
** play when the SQLITE_MEMDEBUG compile-time option is used. |
@@ -4043,4 +4348,10 @@ int sqlite3ThreadJoin(SQLiteThread*, void**); |
int sqlite3DbstatRegister(sqlite3*); |
#endif |
-#endif /* _SQLITEINT_H_ */ |
+int sqlite3ExprVectorSize(Expr *pExpr); |
+int sqlite3ExprIsVector(Expr *pExpr); |
+Expr *sqlite3VectorFieldSubexpr(Expr*, int); |
+Expr *sqlite3ExprForVectorField(Parse*,Expr*,int); |
+void sqlite3VectorErrorMsg(Parse*, Expr*); |
+ |
+#endif /* SQLITEINT_H */ |