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 264f4fe7a59bf6a146745f9259c1153e18b3b8e3..745b910648cb34b193932ad5994ee91d4bb8d065 100644 |
--- a/third_party/sqlite/src/src/sqliteInt.h |
+++ b/third_party/sqlite/src/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 |
/* |
@@ -3016,7 +3199,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 +3229,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 +3267,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 |
-int sqlite3StatusValue(int); |
-void sqlite3StatusAdd(int, int); |
-void sqlite3StatusSet(int, int); |
+sqlite3_int64 sqlite3StatusValue(int); |
+void sqlite3StatusUp(int, int); |
+void sqlite3StatusDown(int, int); |
+void sqlite3StatusHighwater(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 +3304,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 +3312,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 +3339,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 +3352,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 +3385,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 +3400,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 +3430,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 +3461,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 +3476,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 +3505,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 +3521,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 +3589,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 +3599,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 +3663,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 +3676,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 +3714,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 +3733,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 +3773,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 +3845,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 +3959,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 +3993,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 +4049,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_ */ |