| Index: third_party/sqlite/sqlite-src-3100200/src/sqliteInt.h
|
| diff --git a/third_party/sqlite/src/src/sqliteInt.h b/third_party/sqlite/sqlite-src-3100200/src/sqliteInt.h
|
| similarity index 90%
|
| copy from third_party/sqlite/src/src/sqliteInt.h
|
| copy to third_party/sqlite/sqlite-src-3100200/src/sqliteInt.h
|
| index 264f4fe7a59bf6a146745f9259c1153e18b3b8e3..c01bbc78698e35a70acbb169aaf9d6be21a88468 100644
|
| --- a/third_party/sqlite/src/src/sqliteInt.h
|
| +++ b/third_party/sqlite/sqlite-src-3100200/src/sqliteInt.h
|
| @@ -16,6 +16,19 @@
|
| #define _SQLITEINT_H_
|
|
|
| /*
|
| +** Include the header file used to customize the compiler options for MSVC.
|
| +** This should be done first so that it can successfully prevent spurious
|
| +** compiler warnings due to subsequent content in this file and other files
|
| +** that are included by this file.
|
| +*/
|
| +#include "msvc.h"
|
| +
|
| +/*
|
| +** Special setup for VxWorks
|
| +*/
|
| +#include "vxworks.h"
|
| +
|
| +/*
|
| ** These #defines should enable >2GB file support on POSIX if the
|
| ** underlying operating system supports it. If the OS lacks
|
| ** large file support, or if the OS is windows, these should be no-ops.
|
| @@ -47,6 +60,13 @@
|
| # define _LARGEFILE_SOURCE 1
|
| #endif
|
|
|
| +/* What version of GCC is being used. 0 means GCC is not being used */
|
| +#ifdef __GNUC__
|
| +# define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__)
|
| +#else
|
| +# define GCC_VERSION 0
|
| +#endif
|
| +
|
| /* Needed for various definitions... */
|
| #if defined(__GNUC__) && !defined(_GNU_SOURCE)
|
| # define _GNU_SOURCE
|
| @@ -154,6 +174,21 @@
|
| #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.
|
| */
|
| @@ -166,6 +201,24 @@
|
| #endif
|
|
|
| /*
|
| +** Make sure that the compiler intrinsics we desire are enabled when
|
| +** compiling with an appropriate version of MSVC unless prevented by
|
| +** the SQLITE_DISABLE_INTRINSIC define.
|
| +*/
|
| +#if !defined(SQLITE_DISABLE_INTRINSIC)
|
| +# if defined(_MSC_VER) && _MSC_VER>=1300
|
| +# if !defined(_WIN32_WCE)
|
| +# include <intrin.h>
|
| +# pragma intrinsic(_byteswap_ushort)
|
| +# pragma intrinsic(_byteswap_ulong)
|
| +# pragma intrinsic(_ReadWriteBarrier)
|
| +# else
|
| +# include <cmnintrin.h>
|
| +# endif
|
| +# endif
|
| +#endif
|
| +
|
| +/*
|
| ** The SQLITE_THREADSAFE macro must be defined as 0, 1, or 2.
|
| ** 0 means mutexes are permanently disable and the library is never
|
| ** threadsafe. 1 means the library is serialized which is the highest
|
| @@ -193,10 +246,9 @@
|
| #endif
|
|
|
| /*
|
| -** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1.
|
| -** It determines whether or not the features related to
|
| -** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can
|
| -** be overridden at runtime using the sqlite3_config() API.
|
| +** EVIDENCE-OF: R-25715-37072 Memory allocation statistics are enabled by
|
| +** default unless SQLite is compiled with SQLITE_DEFAULT_MEMSTATUS=0 in
|
| +** which case memory allocation statistics are disabled by default.
|
| */
|
| #if !defined(SQLITE_DEFAULT_MEMSTATUS)
|
| # define SQLITE_DEFAULT_MEMSTATUS 1
|
| @@ -351,6 +403,32 @@
|
| #endif
|
|
|
| /*
|
| +** Declarations used for tracing the operating system interfaces.
|
| +*/
|
| +#if defined(SQLITE_FORCE_OS_TRACE) || defined(SQLITE_TEST) || \
|
| + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN)
|
| + extern int sqlite3OSTrace;
|
| +# define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
|
| +# define SQLITE_HAVE_OS_TRACE
|
| +#else
|
| +# define OSTRACE(X)
|
| +# undef SQLITE_HAVE_OS_TRACE
|
| +#endif
|
| +
|
| +/*
|
| +** Is the sqlite3ErrName() function needed in the build? Currently,
|
| +** it is needed by "mutex_w32.c" (when debugging), "os_win.c" (when
|
| +** OSTRACE is enabled), and by several "test*.c" files (which are
|
| +** compiled using SQLITE_TEST).
|
| +*/
|
| +#if defined(SQLITE_HAVE_OS_TRACE) || defined(SQLITE_TEST) || \
|
| + (defined(SQLITE_DEBUG) && SQLITE_OS_WIN)
|
| +# define SQLITE_NEED_ERR_NAME
|
| +#else
|
| +# undef SQLITE_NEED_ERR_NAME
|
| +#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 +532,15 @@
|
| # define SQLITE_MAX_WORKER_THREADS SQLITE_DEFAULT_WORKER_THREADS
|
| #endif
|
|
|
| +/*
|
| +** The default initial allocation for the pagecache when using separate
|
| +** 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.
|
| +*/
|
| +#ifndef SQLITE_DEFAULT_PCACHE_INITSZ
|
| +# define SQLITE_DEFAULT_PCACHE_INITSZ 100
|
| +#endif
|
|
|
| /*
|
| ** GCC does not define the offsetof() macro so we'll have to do it
|
| @@ -563,7 +650,7 @@ typedef INT8_TYPE i8; /* 1-byte signed integer */
|
| ** gives a possible range of values of approximately 1.0e986 to 1e-986.
|
| ** But the allowed values are "grainy". Not every value is representable.
|
| ** For example, quantities 16 and 17 are both represented by a LogEst
|
| -** of 40. However, since LogEst quantaties are suppose to be estimates,
|
| +** of 40. However, since LogEst quantities are suppose to be estimates,
|
| ** not exact values, this imprecision is not a problem.
|
| **
|
| ** "LogEst" is short for "Logarithmic Estimate".
|
| @@ -583,6 +670,20 @@ typedef INT8_TYPE i8; /* 1-byte signed integer */
|
| typedef INT16_TYPE LogEst;
|
|
|
| /*
|
| +** Set the SQLITE_PTRSIZE macro to the number of bytes in a pointer
|
| +*/
|
| +#ifndef SQLITE_PTRSIZE
|
| +# if defined(__SIZEOF_POINTER__)
|
| +# define SQLITE_PTRSIZE __SIZEOF_POINTER__
|
| +# elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \
|
| + defined(_M_ARM) || defined(__arm__) || defined(__x86)
|
| +# define SQLITE_PTRSIZE 4
|
| +# else
|
| +# define SQLITE_PTRSIZE 8
|
| +# endif
|
| +#endif
|
| +
|
| +/*
|
| ** Macros to determine whether the machine is big or little endian,
|
| ** and whether or not that determination is run-time or compile-time.
|
| **
|
| @@ -591,11 +692,6 @@ typedef INT16_TYPE LogEst;
|
| ** -DSQLITE_RUNTIME_BYTEORDER=1 is set, then byte-order is determined
|
| ** at run-time.
|
| */
|
| -#ifdef SQLITE_AMALGAMATION
|
| -const int sqlite3one = 1;
|
| -#else
|
| -extern const int sqlite3one;
|
| -#endif
|
| #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) || \
|
| @@ -613,6 +709,11 @@ extern const int sqlite3one;
|
| # define SQLITE_UTF16NATIVE SQLITE_UTF16BE
|
| #endif
|
| #if !defined(SQLITE_BYTEORDER)
|
| +# 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)
|
| @@ -675,7 +776,9 @@ extern const int sqlite3one;
|
| # if defined(__linux__) \
|
| || defined(_WIN32) \
|
| || (defined(__APPLE__) && defined(__MACH__)) \
|
| - || defined(__sun)
|
| + || defined(__sun) \
|
| + || defined(__FreeBSD__) \
|
| + || defined(__DragonFly__)
|
| # define SQLITE_MAX_MMAP_SIZE 0x7fff0000 /* 2147418112 */
|
| # else
|
| # define SQLITE_MAX_MMAP_SIZE 0
|
| @@ -1060,6 +1163,7 @@ struct sqlite3 {
|
| int errCode; /* Most recent error code (SQLITE_*) */
|
| int errMask; /* & result codes with this before returning */
|
| 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 */
|
| @@ -1079,11 +1183,13 @@ struct sqlite3 {
|
| u8 iDb; /* Which db file is being initialized */
|
| u8 busy; /* TRUE if currently initializing */
|
| u8 orphanTrigger; /* Last statement is orphaned TEMP trigger */
|
| + u8 imposterTable; /* Building an imposter table */
|
| } init;
|
| int nVdbeActive; /* Number of VDBEs currently running */
|
| int nVdbeRead; /* Number of active VDBEs that read or write */
|
| int nVdbeWrite; /* Number of active VDBEs that read and write */
|
| int nVdbeExec; /* Number of nested calls to VdbeExec() */
|
| + 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 */
|
| @@ -1161,7 +1267,8 @@ struct sqlite3 {
|
| /*
|
| ** A macro to discover the encoding of a database.
|
| */
|
| -#define ENC(db) ((db)->aDb[0].pSchema->enc)
|
| +#define SCHEMA_ENC(db) ((db)->aDb[0].pSchema->enc)
|
| +#define ENC(db) ((db)->enc)
|
|
|
| /*
|
| ** Possible values for the sqlite3.flags.
|
| @@ -1196,6 +1303,8 @@ struct sqlite3 {
|
| #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 */
|
|
|
|
|
| /*
|
| @@ -1214,7 +1323,8 @@ struct sqlite3 {
|
| #define SQLITE_SubqCoroutine 0x0100 /* Evaluate subqueries as coroutines */
|
| #define SQLITE_Transitive 0x0200 /* Transitive constraints */
|
| #define SQLITE_OmitNoopJoin 0x0400 /* Omit unused tables in joins */
|
| -#define SQLITE_Stat3 0x0800 /* Use the SQLITE_STAT3 table */
|
| +#define SQLITE_Stat34 0x0800 /* Use STAT3 or STAT4 data */
|
| +#define SQLITE_CursorHints 0x2000 /* Add OP_CursorHint opcodes */
|
| #define SQLITE_AllOpts 0xffff /* All optimizations */
|
|
|
| /*
|
| @@ -1287,21 +1397,24 @@ struct FuncDestructor {
|
|
|
| /*
|
| ** Possible values for FuncDef.flags. Note that the _LENGTH and _TYPEOF
|
| -** values must correspond to OPFLAG_LENGTHARG and OPFLAG_TYPEOFARG. There
|
| +** 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.
|
| */
|
| -#define SQLITE_FUNC_ENCMASK 0x003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */
|
| -#define SQLITE_FUNC_LIKE 0x004 /* Candidate for the LIKE optimization */
|
| -#define SQLITE_FUNC_CASE 0x008 /* Case-sensitive LIKE-type function */
|
| -#define SQLITE_FUNC_EPHEM 0x010 /* Ephemeral. Delete with VDBE */
|
| -#define SQLITE_FUNC_NEEDCOLL 0x020 /* sqlite3GetFuncCollSeq() might be called */
|
| -#define SQLITE_FUNC_LENGTH 0x040 /* Built-in length() function */
|
| -#define SQLITE_FUNC_TYPEOF 0x080 /* Built-in typeof() function */
|
| -#define SQLITE_FUNC_COUNT 0x100 /* Built-in count(*) aggregate */
|
| -#define SQLITE_FUNC_COALESCE 0x200 /* Built-in coalesce() or ifnull() */
|
| -#define SQLITE_FUNC_UNLIKELY 0x400 /* Built-in unlikely() function */
|
| -#define SQLITE_FUNC_CONSTANT 0x800 /* Constant inputs give a constant output */
|
| -#define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */
|
| +#define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */
|
| +#define SQLITE_FUNC_LIKE 0x0004 /* Candidate for the LIKE optimization */
|
| +#define SQLITE_FUNC_CASE 0x0008 /* Case-sensitive LIKE-type function */
|
| +#define SQLITE_FUNC_EPHEM 0x0010 /* Ephemeral. Delete with VDBE */
|
| +#define SQLITE_FUNC_NEEDCOLL 0x0020 /* sqlite3GetFuncCollSeq() might be called*/
|
| +#define SQLITE_FUNC_LENGTH 0x0040 /* Built-in length() function */
|
| +#define SQLITE_FUNC_TYPEOF 0x0080 /* Built-in typeof() function */
|
| +#define SQLITE_FUNC_COUNT 0x0100 /* Built-in count(*) aggregate */
|
| +#define SQLITE_FUNC_COALESCE 0x0200 /* Built-in coalesce() or ifnull() */
|
| +#define SQLITE_FUNC_UNLIKELY 0x0400 /* Built-in unlikely() function */
|
| +#define SQLITE_FUNC_CONSTANT 0x0800 /* Constant inputs give a constant output */
|
| +#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 */
|
|
|
| /*
|
| ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are
|
| @@ -1317,6 +1430,12 @@ struct FuncDestructor {
|
| ** VFUNCTION(zName, nArg, iArg, bNC, xFunc)
|
| ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag.
|
| **
|
| +** DFUNCTION(zName, nArg, iArg, bNC, xFunc)
|
| +** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and
|
| +** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions
|
| +** and functions like sqlite_version() that can change, but not during
|
| +** a single query.
|
| +**
|
| ** AGGREGATE(zName, nArg, iArg, bNC, xStep, xFinal)
|
| ** Used to create an aggregate function definition implemented by
|
| ** the C functions xStep and xFinal. The first four parameters
|
| @@ -1337,11 +1456,14 @@ struct FuncDestructor {
|
| #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}
|
| +#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}
|
| #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}
|
| #define STR_FUNCTION(zName, nArg, pArg, bNC, xFunc) \
|
| - {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
|
| + {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8|(bNC*SQLITE_FUNC_NEEDCOLL), \
|
| pArg, 0, xFunc, 0, 0, #zName, 0, 0}
|
| #define LIKEFUNC(zName, nArg, arg, flags) \
|
| {nArg, SQLITE_FUNC_CONSTANT|SQLITE_UTF8|flags, \
|
| @@ -1385,6 +1507,7 @@ struct Module {
|
| const char *zName; /* Name passed to create_module() */
|
| void *pAux; /* pAux passed to create_module() */
|
| void (*xDestroy)(void *); /* Module destructor function */
|
| + Table *pEpoTab; /* Eponymous table for this module */
|
| };
|
|
|
| /*
|
| @@ -1399,7 +1522,7 @@ struct 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 */
|
| - u8 szEst; /* Estimated size of this column. INT==1 */
|
| + u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */
|
| u8 colFlags; /* Boolean properties. See COLFLAG_ defines below */
|
| };
|
|
|
| @@ -1430,6 +1553,7 @@ struct CollSeq {
|
| */
|
| #define SQLITE_SO_ASC 0 /* Sort in ascending order */
|
| #define SQLITE_SO_DESC 1 /* Sort in ascending order */
|
| +#define SQLITE_SO_UNDEFINED -1 /* No sort order specified */
|
|
|
| /*
|
| ** Column affinity types.
|
| @@ -1443,9 +1567,9 @@ struct CollSeq {
|
| ** used as the P4 operand, they will be more readable.
|
| **
|
| ** Note also that the numeric types are grouped together so that testing
|
| -** for a numeric type is a single comparison. And the NONE type is first.
|
| +** for a numeric type is a single comparison. And the BLOB type is first.
|
| */
|
| -#define SQLITE_AFF_NONE 'A'
|
| +#define SQLITE_AFF_BLOB 'A'
|
| #define SQLITE_AFF_TEXT 'B'
|
| #define SQLITE_AFF_NUMERIC 'C'
|
| #define SQLITE_AFF_INTEGER 'D'
|
| @@ -1526,34 +1650,8 @@ struct VTable {
|
| };
|
|
|
| /*
|
| -** Each SQL table is represented in memory by an instance of the
|
| -** following structure.
|
| -**
|
| -** Table.zName is the name of the table. The case of the original
|
| -** CREATE TABLE statement is stored, but case is not significant for
|
| -** comparisons.
|
| -**
|
| -** Table.nCol is the number of columns in this table. Table.aCol is a
|
| -** pointer to an array of Column structures, one for each column.
|
| -**
|
| -** If the table has an INTEGER PRIMARY KEY, then Table.iPKey is the index of
|
| -** the column that is that key. Otherwise Table.iPKey is negative. Note
|
| -** that the datatype of the PRIMARY KEY must be INTEGER for this field to
|
| -** be set. An INTEGER PRIMARY KEY is used as the rowid for each row of
|
| -** the table. If a table has no INTEGER PRIMARY KEY, then a random rowid
|
| -** is generated for each row of the table. TF_HasPrimaryKey is set if
|
| -** the table has any PRIMARY KEY, INTEGER or otherwise.
|
| -**
|
| -** Table.tnum is the page number for the root BTree page of the table in the
|
| -** database file. If Table.iDb is the index of the database table backend
|
| -** in sqlite.aDb[]. 0 is for the main database and 1 is for the file that
|
| -** holds temporary tables and indices. If TF_Ephemeral is set
|
| -** then the table is stored in a file that is automatically deleted
|
| -** when the VDBE cursor to the table is closed. In this case Table.tnum
|
| -** refers VDBE cursor number that holds the table open, not to the root
|
| -** page number. Transient tables are used to hold the results of a
|
| -** sub-query that appears instead of a real table name in the FROM clause
|
| -** of a SELECT statement.
|
| +** The schema for each SQL table and view is represented in memory
|
| +** by an instance of the following structure.
|
| */
|
| struct Table {
|
| char *zName; /* Name of the table or view */
|
| @@ -1562,14 +1660,13 @@ struct Table {
|
| Select *pSelect; /* NULL for tables. Points to definition if a view. */
|
| FKey *pFKey; /* Linked list of all foreign keys in this table */
|
| char *zColAff; /* String defining the affinity of each column */
|
| -#ifndef SQLITE_OMIT_CHECK
|
| ExprList *pCheck; /* All CHECK constraints */
|
| -#endif
|
| - LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */
|
| - int tnum; /* Root BTree node for this table (see note above) */
|
| - i16 iPKey; /* If not negative, use aCol[iPKey] as the primary key */
|
| + /* ... also used as column name list in a VIEW */
|
| + int tnum; /* Root BTree page for 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
|
| LogEst costMult; /* Cost multiplier for using this table */
|
| @@ -1581,7 +1678,7 @@ struct Table {
|
| #endif
|
| #ifndef SQLITE_OMIT_VIRTUALTABLE
|
| int nModuleArg; /* Number of arguments to the module */
|
| - char **azModuleArg; /* Text of all module args. [0] is module name */
|
| + char **azModuleArg; /* 0: module 1: schema 2: vtab name 3...: args */
|
| VTable *pVTable; /* List of VTable objects. */
|
| #endif
|
| Trigger *pTrigger; /* List of triggers stored in pSchema */
|
| @@ -1591,13 +1688,21 @@ struct Table {
|
|
|
| /*
|
| ** Allowed values for Table.tabFlags.
|
| +**
|
| +** TF_OOOHidden applies to tables or view that have hidden columns that are
|
| +** followed by non-hidden columns. Example: "CREATE VIRTUAL TABLE x USING
|
| +** vtab1(a HIDDEN, b);". Since "b" is a non-hidden column but "a" is hidden,
|
| +** the TF_OOOHidden attribute would apply in this case. Such tables require
|
| +** special handling during INSERT processing.
|
| */
|
| #define TF_Readonly 0x01 /* Read-only system table */
|
| #define TF_Ephemeral 0x02 /* An ephemeral table */
|
| #define TF_HasPrimaryKey 0x04 /* Table has a primary key */
|
| #define TF_Autoincrement 0x08 /* Integer primary key is autoincrement */
|
| #define TF_Virtual 0x10 /* Is a virtual table */
|
| -#define TF_WithoutRowid 0x20 /* No rowid used. PRIMARY KEY is the key */
|
| +#define TF_WithoutRowid 0x20 /* No rowid. PRIMARY KEY is the key */
|
| +#define TF_NoVisibleRowid 0x40 /* No user-visible "rowid" column */
|
| +#define TF_OOOHidden 0x80 /* Out-of-Order hidden columns */
|
|
|
|
|
| /*
|
| @@ -1607,14 +1712,31 @@ struct Table {
|
| */
|
| #ifndef SQLITE_OMIT_VIRTUALTABLE
|
| # define IsVirtual(X) (((X)->tabFlags & TF_Virtual)!=0)
|
| -# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0)
|
| #else
|
| # define IsVirtual(X) 0
|
| -# define IsHiddenColumn(X) 0
|
| #endif
|
|
|
| +/*
|
| +** Macros to determine if a column is hidden. IsOrdinaryHiddenColumn()
|
| +** only works for non-virtual tables (ordinary tables and views) and is
|
| +** always false unless SQLITE_ENABLE_HIDDEN_COLUMNS is defined. The
|
| +** IsHiddenColumn() macro is general purpose.
|
| +*/
|
| +#if defined(SQLITE_ENABLE_HIDDEN_COLUMNS)
|
| +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0)
|
| +# define IsOrdinaryHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0)
|
| +#elif !defined(SQLITE_OMIT_VIRTUALTABLE)
|
| +# define IsHiddenColumn(X) (((X)->colFlags & COLFLAG_HIDDEN)!=0)
|
| +# define IsOrdinaryHiddenColumn(X) 0
|
| +#else
|
| +# define IsHiddenColumn(X) 0
|
| +# define IsOrdinaryHiddenColumn(X) 0
|
| +#endif
|
| +
|
| +
|
| /* Does the table have a rowid */
|
| #define HasRowid(X) (((X)->tabFlags & TF_WithoutRowid)==0)
|
| +#define VisibleRowid(X) (((X)->tabFlags & TF_NoVisibleRowid)==0)
|
|
|
| /*
|
| ** Each foreign key constraint is an instance of the following structure.
|
| @@ -1721,9 +1843,8 @@ struct KeyInfo {
|
| };
|
|
|
| /*
|
| -** An instance of the following structure holds information about a
|
| -** single index record that has already been parsed out into individual
|
| -** values.
|
| +** This object holds a record which has been parsed out into individual
|
| +** fields, for the purposes of doing a comparison.
|
| **
|
| ** A record is an object that contains one or more fields of data.
|
| ** Records are used to store the content of a table row and to store
|
| @@ -1731,20 +1852,40 @@ struct KeyInfo {
|
| ** the OP_MakeRecord opcode of the VDBE and is disassembled by the
|
| ** OP_Column opcode.
|
| **
|
| -** This structure holds a record that has already been disassembled
|
| -** into its constituent fields.
|
| -**
|
| -** The r1 and r2 member variables are only used by the optimized comparison
|
| -** functions vdbeRecordCompareInt() and vdbeRecordCompareString().
|
| +** An instance of this object serves as a "key" for doing a search on
|
| +** an index b+tree. The goal of the search is to find the entry that
|
| +** is closed to the key described by this object. This object might hold
|
| +** just a prefix of the key. The number of fields is given by
|
| +** pKeyInfo->nField.
|
| +**
|
| +** The r1 and r2 fields are the values to return if this key is less than
|
| +** or greater than a key in the btree, respectively. These are normally
|
| +** -1 and +1 respectively, but might be inverted to +1 and -1 if the b-tree
|
| +** is in DESC order.
|
| +**
|
| +** 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
|
| +** cause the search to find the last match, or +1 to cause the search to
|
| +** find the first match.
|
| +**
|
| +** The key comparison functions will set eqSeen to true if they ever
|
| +** get and equal results when comparing this structure to a b-tree record.
|
| +** When default_rc!=0, the search might end up on the record immediately
|
| +** before the first match or immediately after the last match. The
|
| +** eqSeen field will indicate whether or not an exact match exists in the
|
| +** b-tree.
|
| */
|
| struct UnpackedRecord {
|
| KeyInfo *pKeyInfo; /* Collation and sort-order information */
|
| + Mem *aMem; /* Values */
|
| u16 nField; /* Number of entries in apMem[] */
|
| i8 default_rc; /* Comparison result if keys are equal */
|
| u8 errCode; /* Error detected by xRecordCompare (CORRUPT or NOMEM) */
|
| - Mem *aMem; /* Values */
|
| - int r1; /* Value to return if (lhs > rhs) */
|
| - int r2; /* Value to return if (rhs < lhs) */
|
| + i8 r1; /* Value to return if (lhs > rhs) */
|
| + i8 r2; /* Value to return if (rhs < lhs) */
|
| + u8 eqSeen; /* True if an equality comparison has been seen */
|
| };
|
|
|
|
|
| @@ -1773,6 +1914,14 @@ struct UnpackedRecord {
|
| ** 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.
|
| +**
|
| +** While parsing a CREATE TABLE or CREATE INDEX statement in order to
|
| +** generate VDBE code (as opposed to parsing one read from an sqlite_master
|
| +** table as part of parsing an existing database schema), transient instances
|
| +** of this structure may be created. In this case the Index.tnum variable is
|
| +** used to store the address of a VDBE instruction, not a database page
|
| +** number (it cannot - the database page is not allocated until the VDBE
|
| +** program is executed). See convertToWithoutRowidTable() for details.
|
| */
|
| struct Index {
|
| char *zName; /* Name of this index */
|
| @@ -1783,9 +1932,9 @@ struct Index {
|
| Index *pNext; /* The next index associated with the same table */
|
| Schema *pSchema; /* Schema containing this index */
|
| u8 *aSortOrder; /* for each column: True==DESC, False==ASC */
|
| - char **azColl; /* Array of collation sequence names for index */
|
| + const char **azColl; /* Array of collation sequence names for index */
|
| Expr *pPartIdxWhere; /* WHERE clause for partial indices */
|
| - KeyInfo *pKeyInfo; /* A KeyInfo object suitable for this index */
|
| + ExprList *aColExpr; /* Column expressions */
|
| int tnum; /* DB Page containing root of this index */
|
| LogEst szIdxRow; /* Estimated average row size in bytes */
|
| u16 nKeyCol; /* Number of columns forming the key */
|
| @@ -1796,12 +1945,14 @@ struct Index {
|
| unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */
|
| unsigned isResized:1; /* True if resizeIndexObject() has been called */
|
| unsigned isCovering:1; /* True if this is a covering index */
|
| + unsigned noSkipScan:1; /* Do not try to use skip-scan if true */
|
| #ifdef SQLITE_ENABLE_STAT3_OR_STAT4
|
| int nSample; /* Number of elements in aSample[] */
|
| int nSampleCol; /* Size of IndexSample.anEq[] and so on */
|
| tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */
|
| IndexSample *aSample; /* Samples of the left-most key */
|
| - tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this table */
|
| + tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this index */
|
| + tRowcnt nRowEst0; /* Non-logarithmic number of rows in the index */
|
| #endif
|
| };
|
|
|
| @@ -1818,6 +1969,12 @@ struct Index {
|
| /* Return true if index X is a UNIQUE index */
|
| #define IsUniqueIndex(X) ((X)->onError!=OE_None)
|
|
|
| +/* The Index.aiColumn[] values are normally positive integer. But
|
| +** there are some negative values that have special meaning:
|
| +*/
|
| +#define XN_ROWID (-1) /* Indexed column is the rowid */
|
| +#define XN_EXPR (-2) /* Indexed column is an expression */
|
| +
|
| /*
|
| ** 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
|
| @@ -1999,7 +2156,7 @@ struct Expr {
|
| int iTable; /* TK_COLUMN: cursor number of table holding column
|
| ** TK_REGISTER: register number
|
| ** TK_TRIGGER: 1 -> new, 0 -> old
|
| - ** EP_Unlikely: 1000 times likelihood */
|
| + ** EP_Unlikely: 134217728 times likelihood */
|
| ynVar iColumn; /* TK_COLUMN: column index. -1 for rowid.
|
| ** TK_VARIABLE: variable number (always >= 1). */
|
| i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */
|
| @@ -2033,8 +2190,15 @@ struct Expr {
|
| #define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */
|
| #define EP_NoReduce 0x020000 /* Cannot EXPRDUP_REDUCE this Expr */
|
| #define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */
|
| -#define EP_Constant 0x080000 /* Node is a constant */
|
| +#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */
|
| #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 */
|
| +
|
| +/*
|
| +** Combinations of two or more EP_* flags
|
| +*/
|
| +#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
|
| @@ -2192,11 +2356,15 @@ struct SrcList {
|
| int addrFillSub; /* Address of subroutine to manifest a subquery */
|
| int regReturn; /* Register holding return address of addrFillSub */
|
| int regResult; /* Registers holding results of a co-routine */
|
| - u8 jointype; /* Type of join between this able and the previous */
|
| - unsigned notIndexed :1; /* True if there is a NOT INDEXED clause */
|
| - unsigned isCorrelated :1; /* True if sub-query is correlated */
|
| - unsigned viaCoroutine :1; /* Implemented as a co-routine */
|
| - unsigned isRecursive :1; /* True for recursive reference in WITH */
|
| + struct {
|
| + u8 jointype; /* Type of join between this able 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 */
|
| + unsigned isCorrelated :1; /* True if sub-query is correlated */
|
| + unsigned viaCoroutine :1; /* Implemented as a co-routine */
|
| + unsigned isRecursive :1; /* True for recursive reference in WITH */
|
| + } fg;
|
| #ifndef SQLITE_OMIT_EXPLAIN
|
| u8 iSelectId; /* If pSelect!=0, the id of the sub-select in EQP */
|
| #endif
|
| @@ -2204,8 +2372,11 @@ struct SrcList {
|
| Expr *pOn; /* The ON clause of a join */
|
| IdList *pUsing; /* The USING clause of a join */
|
| Bitmask colUsed; /* Bit N (1<<N) set if column N of pTab is used */
|
| - char *zIndex; /* Identifier from "INDEXED BY <zIndex>" clause */
|
| - Index *pIndex; /* Index structure corresponding to zIndex, if any */
|
| + union {
|
| + char *zIndexedBy; /* Identifier from "INDEXED BY <zIndex>" clause */
|
| + ExprList *pFuncArg; /* Arguments to table-valued-function */
|
| + } u1;
|
| + Index *pIBIndex; /* Index structure corresponding to u1.zIndexedBy */
|
| } a[1]; /* One entry for each identifier on the list */
|
| };
|
|
|
| @@ -2233,12 +2404,13 @@ struct SrcList {
|
| #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 */
|
| - /* 0x0080 // not currently used */
|
| +#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 */
|
|
|
| /* Allowed return values from sqlite3WhereIsDistinct()
|
| */
|
| @@ -2291,6 +2463,7 @@ struct NameContext {
|
| #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_IdxExpr 0x0020 /* True if resolving columns of CREATE INDEX */
|
| #define NC_MinMaxAgg 0x1000 /* min/max aggregates seen. See note above */
|
|
|
| /*
|
| @@ -2340,18 +2513,21 @@ struct Select {
|
| ** "Select Flag".
|
| */
|
| #define SF_Distinct 0x0001 /* Output should be DISTINCT */
|
| -#define SF_Resolved 0x0002 /* Identifiers have been resolved */
|
| -#define SF_Aggregate 0x0004 /* Contains aggregate functions */
|
| -#define SF_UsesEphemeral 0x0008 /* Uses the OpenEphemeral opcode */
|
| -#define SF_Expanded 0x0010 /* sqlite3SelectExpand() called on this */
|
| -#define SF_HasTypeInfo 0x0020 /* FROM subqueries have Table metadata */
|
| -#define SF_Compound 0x0040 /* Part of a compound query */
|
| -#define SF_Values 0x0080 /* Synthesized from VALUES clause */
|
| - /* 0x0100 NOT USED */
|
| -#define SF_NestedFrom 0x0200 /* Part of a parenthesized FROM clause */
|
| -#define SF_MaybeConvert 0x0400 /* Need convertCompoundSelectToSubquery() */
|
| -#define SF_Recursive 0x0800 /* The recursive part of a recursive CTE */
|
| +#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 */
|
|
|
|
|
| /*
|
| @@ -2556,9 +2732,10 @@ struct Parse {
|
| 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 iPartIdxTab; /* Table corresponding to a partial index */
|
| + 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 */
|
| @@ -2593,7 +2770,6 @@ struct Parse {
|
| 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 */
|
| - int addrSkipPK; /* Address of instruction to skip PRIMARY KEY index */
|
| u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */
|
| u32 oldmask; /* Mask of old.* columns referenced */
|
| u32 newmask; /* Mask of new.* columns referenced */
|
| @@ -2611,7 +2787,6 @@ struct Parse {
|
| int nVar; /* Number of '?' variables seen in the SQL so far */
|
| int nzVar; /* Number of available slots in azVar[] */
|
| u8 iPkSortOrder; /* ASC or DESC for INTEGER PRIMARY KEY */
|
| - u8 bFreeWith; /* True if pWith should be freed with parser */
|
| u8 explain; /* True if the EXPLAIN flag is found on the query */
|
| #ifndef SQLITE_OMIT_VIRTUALTABLE
|
| u8 declareVtab; /* True if inside sqlite3_declare_vtab() */
|
| @@ -2638,6 +2813,7 @@ struct Parse {
|
| Table *pZombieTab; /* List of Table objects to delete after code gen */
|
| TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */
|
| With *pWith; /* Current WITH clause, or NULL */
|
| + With *pWithToFree; /* Free this WITH object at the end of the parse */
|
| };
|
|
|
| /*
|
| @@ -2670,7 +2846,9 @@ struct AuthContext {
|
| #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_P2ISREG 0x02 /* P2 to OP_Open** is a register number */
|
| +#define OPFLAG_SEEKEQ 0x02 /* OP_Open** cursor uses EQ seek only */
|
| +#define OPFLAG_FORDELETE 0x08 /* OP_Open is opening for-delete csr */
|
| +#define OPFLAG_P2ISREG 0x10 /* P2 to OP_Open** is a register number */
|
| #define OPFLAG_PERMUTE 0x01 /* OP_Compare: use the permutation */
|
|
|
| /*
|
| @@ -2729,7 +2907,7 @@ struct Trigger {
|
| * orconf -> stores the ON CONFLICT algorithm
|
| * pSelect -> If this is an INSERT INTO ... SELECT ... statement, then
|
| * this stores a pointer to the SELECT statement. Otherwise NULL.
|
| - * target -> A token holding the quoted name of the table to insert into.
|
| + * 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 ...
|
| @@ -2737,12 +2915,12 @@ struct Trigger {
|
| * inserted into.
|
| *
|
| * (op == TK_DELETE)
|
| - * target -> A token holding the quoted name of the table to delete from.
|
| + * 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)
|
| - * target -> A token holding the quoted name of the table to update rows of.
|
| + * zTarget -> Dequoted name of the table to update.
|
| * pWhere -> The WHERE clause of the UPDATE statement if one is specified.
|
| * Otherwise NULL.
|
| * pExprList -> A list of the columns to update and the expressions to update
|
| @@ -2754,8 +2932,8 @@ struct TriggerStep {
|
| u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT */
|
| u8 orconf; /* OE_Rollback etc. */
|
| Trigger *pTrig; /* The trigger that this step is a part of */
|
| - Select *pSelect; /* SELECT statment or RHS of INSERT INTO .. SELECT ... */
|
| - Token target; /* Target table for DELETE, UPDATE, INSERT */
|
| + Select *pSelect; /* SELECT statement or RHS of INSERT INTO SELECT ... */
|
| + char *zTarget; /* Target table for DELETE, UPDATE, INSERT */
|
| Expr *pWhere; /* The WHERE clause for DELETE or UPDATE steps */
|
| ExprList *pExprList; /* SET clause for UPDATE. */
|
| IdList *pIdList; /* Column names for INSERT */
|
| @@ -2786,11 +2964,11 @@ struct StrAccum {
|
| sqlite3 *db; /* Optional database for lookaside. Can be NULL */
|
| char *zBase; /* A base allocation. Not from malloc. */
|
| char *zText; /* The string collected so far */
|
| - int nChar; /* Length of the string so far */
|
| - int nAlloc; /* Amount of space allocated in zText */
|
| - int mxAlloc; /* Maximum allowed string length */
|
| - u8 useMalloc; /* 0: none, 1: sqlite3DbMalloc, 2: sqlite3_malloc */
|
| + u32 nChar; /* Length of the string so far */
|
| + 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 */
|
| };
|
| #define STRACCUM_NOMEM 1
|
| #define STRACCUM_TOOBIG 2
|
| @@ -2837,6 +3015,7 @@ struct Sqlite3Config {
|
| int nPage; /* Number of pages in pPage[] */
|
| int mxParserStack; /* maximum depth of the parser stack */
|
| int sharedCacheEnabled; /* true if shared-cache mode enabled */
|
| + u32 szPma; /* Maximum Sorter PMA size */
|
| /* The above might be initialized to non-zero. The following need to always
|
| ** initially be zero, however. */
|
| int isInit; /* True after initialization has finished */
|
| @@ -2892,11 +3071,14 @@ struct Walker {
|
| 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 */
|
| NameContext *pNC; /* Naming context */
|
| - int i; /* Integer value */
|
| + int n; /* A counter */
|
| + int iCur; /* A cursor number */
|
| SrcList *pSrcList; /* FROM clause */
|
| struct SrcCount *pSrcCount; /* Counting column references */
|
| + struct CCurHint *pCCurHint; /* Used by codeCursorHint() */
|
| } u;
|
| };
|
|
|
| @@ -2906,6 +3088,7 @@ int sqlite3WalkExprList(Walker*, ExprList*);
|
| int sqlite3WalkSelect(Walker*, Select*);
|
| int sqlite3WalkSelectExpr(Walker*, Select*);
|
| int sqlite3WalkSelectFrom(Walker*, Select*);
|
| +int sqlite3ExprWalkNoop(Walker*, Expr*);
|
|
|
| /*
|
| ** Return code from the parse-tree walking primitives and their
|
| @@ -2926,7 +3109,7 @@ struct With {
|
| char *zName; /* Name of this CTE */
|
| ExprList *pCols; /* List of explicit column names, or NULL */
|
| Select *pSelect; /* The definition of this CTE */
|
| - const char *zErr; /* Error message for circular references */
|
| + const char *zCteErr; /* Error message for circular references */
|
| } a[1];
|
| };
|
|
|
| @@ -2972,7 +3155,7 @@ int sqlite3CantopenError(int);
|
| ** the SQLITE_ENABLE_FTS4 macro to serve as an alias for SQLITE_ENABLE_FTS3.
|
| */
|
| #if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3)
|
| -# define SQLITE_ENABLE_FTS3
|
| +# define SQLITE_ENABLE_FTS3 1
|
| #endif
|
|
|
| /*
|
| @@ -2985,16 +3168,6 @@ int sqlite3CantopenError(int);
|
| #endif
|
|
|
| /*
|
| -** The CoreServices.h and CoreFoundation.h headers are needed for excluding a
|
| -** -journal file from Time Machine backups when its associated database has
|
| -** previously been excluded by the client code.
|
| -*/
|
| -#if defined(__APPLE__)
|
| -#include <CoreServices/CoreServices.h>
|
| -#include <CoreFoundation/CoreFoundation.h>
|
| -#endif
|
| -
|
| -/*
|
| ** The following macros mimic the standard library functions toupper(),
|
| ** isspace(), isalnum(), isdigit() and isxdigit(), respectively. The
|
| ** sqlite versions only work for ASCII characters, regardless of locale.
|
| @@ -3016,7 +3189,9 @@ int sqlite3CantopenError(int);
|
| # define sqlite3Isxdigit(x) isxdigit((unsigned char)(x))
|
| # define sqlite3Tolower(x) tolower((unsigned char)(x))
|
| #endif
|
| +#ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS
|
| int sqlite3IsIdChar(u8);
|
| +#endif
|
|
|
| /*
|
| ** Internal function prototypes
|
| @@ -3044,7 +3219,9 @@ void sqlite3ScratchFree(void*);
|
| void *sqlite3PageMalloc(int);
|
| void sqlite3PageFree(void*);
|
| void sqlite3MemSetDefault(void);
|
| +#ifndef SQLITE_OMIT_BUILTIN_TEST
|
| void sqlite3BenignMallocHooks(void (*)(void), void (*)(void));
|
| +#endif
|
| int sqlite3HeapNearlyFull(void);
|
|
|
| /*
|
| @@ -3080,10 +3257,20 @@ const sqlite3_mem_methods *sqlite3MemGetMemsys5(void);
|
| int sqlite3MutexInit(void);
|
| int sqlite3MutexEnd(void);
|
| #endif
|
| +#if !defined(SQLITE_MUTEX_OMIT) && !defined(SQLITE_MUTEX_NOOP)
|
| + void sqlite3MemoryBarrier(void);
|
| +#else
|
| +# define sqlite3MemoryBarrier()
|
| +#endif
|
| +
|
| +sqlite3_int64 sqlite3StatusValue(int);
|
| +void sqlite3StatusUp(int, int);
|
| +void sqlite3StatusDown(int, int);
|
| +void sqlite3StatusHighwater(int, int);
|
|
|
| -int sqlite3StatusValue(int);
|
| -void sqlite3StatusAdd(int, int);
|
| -void sqlite3StatusSet(int, int);
|
| +/* Access to mutexes used by sqlite3_status() */
|
| +sqlite3_mutex *sqlite3Pcache1Mutex(void);
|
| +sqlite3_mutex *sqlite3MallocMutex(void);
|
|
|
| #ifndef SQLITE_OMIT_FLOATING_POINT
|
| int sqlite3IsNaN(double);
|
| @@ -3107,8 +3294,7 @@ void sqlite3VXPrintf(StrAccum*, u32, const char*, va_list);
|
| void sqlite3XPrintf(StrAccum*, u32, const char*, ...);
|
| char *sqlite3MPrintf(sqlite3*,const char*, ...);
|
| char *sqlite3VMPrintf(sqlite3*,const char*, va_list);
|
| -char *sqlite3MAppendf(sqlite3*,char*,const char*,...);
|
| -#if defined(SQLITE_TEST) || defined(SQLITE_DEBUG)
|
| +#if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE)
|
| void sqlite3DebugPrintf(const char*, ...);
|
| #endif
|
| #if defined(SQLITE_TEST)
|
| @@ -3116,17 +3302,14 @@ char *sqlite3MAppendf(sqlite3*,char*,const char*,...);
|
| #endif
|
|
|
| #if defined(SQLITE_DEBUG)
|
| - TreeView *sqlite3TreeViewPush(TreeView*,u8);
|
| - void sqlite3TreeViewPop(TreeView*);
|
| - void sqlite3TreeViewLine(TreeView*, const char*, ...);
|
| - void sqlite3TreeViewItem(TreeView*, const char*, u8);
|
| void sqlite3TreeViewExpr(TreeView*, const Expr*, u8);
|
| void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*);
|
| void sqlite3TreeViewSelect(TreeView*, const Select*, u8);
|
| + void sqlite3TreeViewWith(TreeView*, const With*, u8);
|
| #endif
|
|
|
|
|
| -void sqlite3SetString(char **, sqlite3*, const char*, ...);
|
| +void sqlite3SetString(char **, sqlite3*, const char*);
|
| void sqlite3ErrorMsg(Parse*, const char*, ...);
|
| int sqlite3Dequote(char*);
|
| int sqlite3KeywordCode(const unsigned char*, int);
|
| @@ -3146,9 +3329,11 @@ Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*);
|
| void sqlite3ExprAssignVarNumber(Parse*, Expr*);
|
| void sqlite3ExprDelete(sqlite3*, Expr*);
|
| ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*);
|
| +void sqlite3ExprListSetSortOrder(ExprList*,int);
|
| void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int);
|
| void sqlite3ExprListSetSpan(Parse*,ExprList*,ExprSpan*);
|
| void sqlite3ExprListDelete(sqlite3*, ExprList*);
|
| +u32 sqlite3ExprListFlags(const ExprList*);
|
| int sqlite3Init(sqlite3*, char**);
|
| int sqlite3InitCallback(void*, int, char**, char**);
|
| void sqlite3Pragma(Parse*,Token*,Token*,Token*,int);
|
| @@ -3157,11 +3342,18 @@ void sqlite3ResetOneSchema(sqlite3*,int);
|
| void sqlite3CollapseDatabaseArray(sqlite3*);
|
| void sqlite3BeginParse(Parse*,int);
|
| void sqlite3CommitInternalChanges(sqlite3*);
|
| +void sqlite3DeleteColumnNames(sqlite3*,Table*);
|
| +int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**);
|
| Table *sqlite3ResultSetOfSelect(Parse*,Select*);
|
| void sqlite3OpenMasterTable(Parse *, int);
|
| Index *sqlite3PrimaryKeyIndex(Table*);
|
| i16 sqlite3ColumnOfIndex(Index*, i16);
|
| void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int);
|
| +#if SQLITE_ENABLE_HIDDEN_COLUMNS
|
| + void sqlite3ColumnPropertiesFromName(Table*, Column*);
|
| +#else
|
| +# define sqlite3ColumnPropertiesFromName(T,C) /* no-op */
|
| +#endif
|
| void sqlite3AddColumn(Parse*,Token*);
|
| void sqlite3AddNotNull(Parse*, int);
|
| void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int);
|
| @@ -3183,11 +3375,14 @@ int sqlite3CodeOnce(Parse *);
|
|
|
| Bitvec *sqlite3BitvecCreate(u32);
|
| int sqlite3BitvecTest(Bitvec*, u32);
|
| +int sqlite3BitvecTestNotNull(Bitvec*, u32);
|
| int sqlite3BitvecSet(Bitvec*, u32);
|
| void sqlite3BitvecClear(Bitvec*, u32, void*);
|
| void sqlite3BitvecDestroy(Bitvec*);
|
| u32 sqlite3BitvecSize(Bitvec*);
|
| +#ifndef SQLITE_OMIT_BUILTIN_TEST
|
| int sqlite3BitvecBuiltinTest(int,int*);
|
| +#endif
|
|
|
| RowSet *sqlite3RowSetInit(sqlite3*, void*, unsigned int);
|
| void sqlite3RowSetClear(RowSet*);
|
| @@ -3195,7 +3390,7 @@ void sqlite3RowSetInsert(RowSet*, i64);
|
| int sqlite3RowSetTest(RowSet*, int iBatch, i64);
|
| int sqlite3RowSetNext(RowSet*, i64*);
|
|
|
| -void sqlite3CreateView(Parse*,Token*,Token*,Token*,Select*,int,int);
|
| +void sqlite3CreateView(Parse*,Token*,Token*,Token*,ExprList*,Select*,int,int);
|
|
|
| #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE)
|
| int sqlite3ViewGetColumnNames(Parse*,Table*);
|
| @@ -3225,6 +3420,7 @@ SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*);
|
| SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*,
|
| Token*, Select*, Expr*, IdList*);
|
| void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *);
|
| +void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*);
|
| int sqlite3IndexedByLookup(Parse *, struct SrcList_item *);
|
| void sqlite3SrcListShiftJoinType(SrcList*);
|
| void sqlite3SrcListAssignCursors(Parse*, SrcList*);
|
| @@ -3255,7 +3451,12 @@ int sqlite3WhereIsSorted(WhereInfo*);
|
| int sqlite3WhereContinueLabel(WhereInfo*);
|
| int sqlite3WhereBreakLabel(WhereInfo*);
|
| int sqlite3WhereOkOnePass(WhereInfo*, int*);
|
| +#define ONEPASS_OFF 0 /* Use of ONEPASS not allowed */
|
| +#define ONEPASS_SINGLE 1 /* ONEPASS valid for a single row update */
|
| +#define ONEPASS_MULTI 2 /* ONEPASS is valid for multiple rows */
|
| +void sqlite3ExprCodeLoadIndexColumn(Parse*, Index*, int, int, int);
|
| int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8);
|
| +void sqlite3ExprCodeGetColumnToReg(Parse*, Table*, int, int, int);
|
| void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int);
|
| void sqlite3ExprCodeMove(Parse*, int, int, int);
|
| void sqlite3ExprCacheStore(Parse*, int, int, int);
|
| @@ -3265,16 +3466,19 @@ void sqlite3ExprCacheRemove(Parse*, int, int);
|
| void sqlite3ExprCacheClear(Parse*);
|
| 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 sqlite3ExprCodeTemp(Parse*, Expr*, int*);
|
| int sqlite3ExprCodeTarget(Parse*, Expr*, int);
|
| void sqlite3ExprCodeAndCache(Parse*, Expr*, int);
|
| -int sqlite3ExprCodeExprList(Parse*, ExprList*, int, u8);
|
| +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 */
|
| 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 *);
|
| @@ -3291,8 +3495,10 @@ void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*);
|
| void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*);
|
| int sqlite3FunctionUsesThisSrc(Expr*, SrcList*);
|
| Vdbe *sqlite3GetVdbe(Parse*);
|
| +#ifndef SQLITE_OMIT_BUILTIN_TEST
|
| void sqlite3PrngSaveState(void);
|
| void sqlite3PrngRestoreState(void);
|
| +#endif
|
| void sqlite3RollbackAll(sqlite3*,int);
|
| void sqlite3CodeVerifySchema(Parse*, int);
|
| void sqlite3CodeVerifyNamedSchema(Parse*, const char *zDb);
|
| @@ -3305,18 +3511,23 @@ void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
|
| int sqlite3ExprIsConstant(Expr*);
|
| int sqlite3ExprIsConstantNotJoin(Expr*);
|
| int sqlite3ExprIsConstantOrFunction(Expr*, u8);
|
| +int sqlite3ExprIsTableConstant(Expr*,int);
|
| +#ifdef SQLITE_ENABLE_CURSOR_HINTS
|
| +int sqlite3ExprContainsSubquery(Expr*);
|
| +#endif
|
| int sqlite3ExprIsInteger(Expr*, int*);
|
| int sqlite3ExprCanBeNull(const Expr*);
|
| int sqlite3ExprNeedsNoAffinityChange(const Expr*, char);
|
| int sqlite3IsRowid(const char*);
|
| -void sqlite3GenerateRowDelete(Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8);
|
| -void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*);
|
| +void sqlite3GenerateRowDelete(
|
| + Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int);
|
| +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*);
|
| void sqlite3CompleteInsertion(Parse*,Table*,int,int,int,int*,int,int,int);
|
| -int sqlite3OpenTableAndIndices(Parse*, Table*, int, int, u8*, int*, int*);
|
| +int sqlite3OpenTableAndIndices(Parse*, Table*, int, u8, int, u8*, int*, int*);
|
| void sqlite3BeginWriteOperation(Parse*, int, int);
|
| void sqlite3MultiWrite(Parse*);
|
| void sqlite3MayAbort(Parse*);
|
| @@ -3368,6 +3579,7 @@ void sqlite3MaterializeView(Parse*, Table*, Expr*, int);
|
| void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*);
|
| u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int);
|
| # define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p))
|
| +# define sqlite3IsToplevel(p) ((p)->pToplevel==0)
|
| #else
|
| # define sqlite3TriggersExist(B,C,D,E,F) 0
|
| # define sqlite3DeleteTrigger(A,B)
|
| @@ -3377,6 +3589,7 @@ void sqlite3MaterializeView(Parse*, Table*, Expr*, int);
|
| # define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F)
|
| # define sqlite3TriggerList(X, Y) 0
|
| # define sqlite3ParseToplevel(p) p
|
| +# define sqlite3IsToplevel(p) 1
|
| # define sqlite3TriggerColmask(A,B,C,D,E,F,G) 0
|
| #endif
|
|
|
| @@ -3440,7 +3653,7 @@ int sqlite3VarintLen(u64 v);
|
| #define putVarint sqlite3PutVarint
|
|
|
|
|
| -const char *sqlite3IndexAffinityStr(Vdbe *, Index *);
|
| +const char *sqlite3IndexAffinityStr(sqlite3*, Index*);
|
| void sqlite3TableAffinity(Vdbe*, Table*, int);
|
| char sqlite3CompareAffinity(Expr *pExpr, char aff2);
|
| int sqlite3IndexAffinityOk(Expr *pExpr, char idx_affinity);
|
| @@ -3453,7 +3666,7 @@ void *sqlite3HexToBlob(sqlite3*, const char *z, int n);
|
| u8 sqlite3HexToInt(int h);
|
| int sqlite3TwoPartName(Parse *, Token *, Token *, Token **);
|
|
|
| -#if defined(SQLITE_TEST)
|
| +#if defined(SQLITE_NEED_ERR_NAME)
|
| const char *sqlite3ErrName(int);
|
| #endif
|
|
|
| @@ -3491,6 +3704,7 @@ int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **);
|
| void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8);
|
| #ifndef SQLITE_AMALGAMATION
|
| extern const unsigned char sqlite3OpcodeProperty[];
|
| +extern const char sqlite3StrBINARY[];
|
| extern const unsigned char sqlite3UpperToLower[];
|
| extern const unsigned char sqlite3CtypeMap[];
|
| extern const Token sqlite3IntTokens[];
|
| @@ -3509,8 +3723,10 @@ void sqlite3NestedParse(Parse*, const char*, ...);
|
| void sqlite3ExpirePreparedStatements(sqlite3*);
|
| 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*);
|
| int sqlite3ResolveExprNames(NameContext*, Expr*);
|
| +int sqlite3ResolveExprListNames(NameContext*, ExprList*);
|
| void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*);
|
| void sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*);
|
| int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*);
|
| @@ -3547,7 +3763,7 @@ int sqlite3CreateFunc(sqlite3 *, const char *, int, int, void *,
|
| int sqlite3ApiExit(sqlite3 *db, int);
|
| int sqlite3OpenTempDatabase(Parse *);
|
|
|
| -void sqlite3StrAccumInit(StrAccum*, char*, int, int);
|
| +void sqlite3StrAccumInit(StrAccum*, sqlite3*, char*, int, int);
|
| void sqlite3StrAccumAppend(StrAccum*,const char*,int);
|
| void sqlite3StrAccumAppendAll(StrAccum*,const char*);
|
| void sqlite3AppendChar(StrAccum*,int,char);
|
| @@ -3619,6 +3835,8 @@ void sqlite3AutoLoadExtensions(sqlite3*);
|
| VTable *sqlite3GetVTable(sqlite3*, Table*);
|
| # define sqlite3VtabInSync(db) ((db)->nVTrans>0 && (db)->aVTrans==0)
|
| #endif
|
| +int sqlite3VtabEponymousTableInit(Parse*,Module*);
|
| +void sqlite3VtabEponymousTableClear(sqlite3*,Module*);
|
| void sqlite3VtabMakeWritable(Parse*,Table*);
|
| void sqlite3VtabBeginParse(Parse*, Token*, Token*, Token*, int);
|
| void sqlite3VtabFinishParse(Parse*, Token*);
|
| @@ -3731,12 +3949,11 @@ void sqlite3MemJournalOpen(sqlite3_file *);
|
| int sqlite3MemJournalSize(void);
|
| int sqlite3IsMemJournal(sqlite3_file *);
|
|
|
| +void sqlite3ExprSetHeightAndFlags(Parse *pParse, Expr *p);
|
| #if SQLITE_MAX_EXPR_DEPTH>0
|
| - void sqlite3ExprSetHeight(Parse *pParse, Expr *p);
|
| int sqlite3SelectExprHeight(Select *);
|
| int sqlite3ExprCheckHeight(Parse*, int);
|
| #else
|
| - #define sqlite3ExprSetHeight(x,y)
|
| #define sqlite3SelectExprHeight(x) 0
|
| #define sqlite3ExprCheckHeight(x,y)
|
| #endif
|
| @@ -3766,7 +3983,7 @@ void sqlite3Put4byte(u8*, u32);
|
| #ifdef SQLITE_ENABLE_IOTRACE
|
| # define IOTRACE(A) if( sqlite3IoTrace ){ sqlite3IoTrace A; }
|
| void sqlite3VdbeIOTraceSql(Vdbe*);
|
| -SQLITE_EXTERN void (*sqlite3IoTrace)(const char*,...);
|
| +SQLITE_API SQLITE_EXTERN void (SQLITE_CDECL *sqlite3IoTrace)(const char*,...);
|
| #else
|
| # define IOTRACE(A)
|
| # define sqlite3VdbeIOTraceSql(X)
|
| @@ -3822,4 +4039,8 @@ int sqlite3ThreadCreate(SQLiteThread**,void*(*)(void*),void*);
|
| int sqlite3ThreadJoin(SQLiteThread*, void**);
|
| #endif
|
|
|
| +#if defined(SQLITE_ENABLE_DBSTAT_VTAB) || defined(SQLITE_TEST)
|
| +int sqlite3DbstatRegister(sqlite3*);
|
| +#endif
|
| +
|
| #endif /* _SQLITEINT_H_ */
|
|
|