Index: third_party/sqlite/src/src/pragma.c |
diff --git a/third_party/sqlite/src/src/pragma.c b/third_party/sqlite/src/src/pragma.c |
index 543f265ba9ea1ae5e8e0fff897f91f76aa334450..0d48057d210818c29d6558c617e10dc93c844b8d 100644 |
--- a/third_party/sqlite/src/src/pragma.c |
+++ b/third_party/sqlite/src/src/pragma.c |
@@ -22,457 +22,13 @@ |
#endif |
/*************************************************************************** |
-** The next block of code, including the PragTyp_XXXX macro definitions and |
-** the aPragmaName[] object is composed of generated code. DO NOT EDIT. |
-** |
-** To add new pragmas, edit the code in ../tool/mkpragmatab.tcl and rerun |
-** that script. Then copy/paste the output in place of the following: |
-*/ |
-#define PragTyp_HEADER_VALUE 0 |
-#define PragTyp_AUTO_VACUUM 1 |
-#define PragTyp_FLAG 2 |
-#define PragTyp_BUSY_TIMEOUT 3 |
-#define PragTyp_CACHE_SIZE 4 |
-#define PragTyp_CASE_SENSITIVE_LIKE 5 |
-#define PragTyp_COLLATION_LIST 6 |
-#define PragTyp_COMPILE_OPTIONS 7 |
-#define PragTyp_DATA_STORE_DIRECTORY 8 |
-#define PragTyp_DATABASE_LIST 9 |
-#define PragTyp_DEFAULT_CACHE_SIZE 10 |
-#define PragTyp_ENCODING 11 |
-#define PragTyp_FOREIGN_KEY_CHECK 12 |
-#define PragTyp_FOREIGN_KEY_LIST 13 |
-#define PragTyp_INCREMENTAL_VACUUM 14 |
-#define PragTyp_INDEX_INFO 15 |
-#define PragTyp_INDEX_LIST 16 |
-#define PragTyp_INTEGRITY_CHECK 17 |
-#define PragTyp_JOURNAL_MODE 18 |
-#define PragTyp_JOURNAL_SIZE_LIMIT 19 |
-#define PragTyp_LOCK_PROXY_FILE 20 |
-#define PragTyp_LOCKING_MODE 21 |
-#define PragTyp_PAGE_COUNT 22 |
-#define PragTyp_MMAP_SIZE 23 |
-#define PragTyp_PAGE_SIZE 24 |
-#define PragTyp_SECURE_DELETE 25 |
-#define PragTyp_SHRINK_MEMORY 26 |
-#define PragTyp_SOFT_HEAP_LIMIT 27 |
-#define PragTyp_STATS 28 |
-#define PragTyp_SYNCHRONOUS 29 |
-#define PragTyp_TABLE_INFO 30 |
-#define PragTyp_TEMP_STORE 31 |
-#define PragTyp_TEMP_STORE_DIRECTORY 32 |
-#define PragTyp_THREADS 33 |
-#define PragTyp_WAL_AUTOCHECKPOINT 34 |
-#define PragTyp_WAL_CHECKPOINT 35 |
-#define PragTyp_ACTIVATE_EXTENSIONS 36 |
-#define PragTyp_HEXKEY 37 |
-#define PragTyp_KEY 38 |
-#define PragTyp_REKEY 39 |
-#define PragTyp_LOCK_STATUS 40 |
-#define PragTyp_PARSER_TRACE 41 |
-#define PragFlag_NeedSchema 0x01 |
-static const struct sPragmaNames { |
- const char *const zName; /* Name of pragma */ |
- u8 ePragTyp; /* PragTyp_XXX value */ |
- u8 mPragFlag; /* Zero or more PragFlag_XXX values */ |
- u32 iArg; /* Extra argument */ |
-} aPragmaNames[] = { |
-#if defined(SQLITE_HAS_CODEC) || defined(SQLITE_ENABLE_CEROD) |
- { /* zName: */ "activate_extensions", |
- /* ePragTyp: */ PragTyp_ACTIVATE_EXTENSIONS, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) |
- { /* zName: */ "application_id", |
- /* ePragTyp: */ PragTyp_HEADER_VALUE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_AUTOVACUUM) |
- { /* zName: */ "auto_vacuum", |
- /* ePragTyp: */ PragTyp_AUTO_VACUUM, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
-#if !defined(SQLITE_OMIT_AUTOMATIC_INDEX) |
- { /* zName: */ "automatic_index", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_AutoIndex }, |
-#endif |
-#endif |
- { /* zName: */ "busy_timeout", |
- /* ePragTyp: */ PragTyp_BUSY_TIMEOUT, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
- { /* zName: */ "cache_size", |
- /* ePragTyp: */ PragTyp_CACHE_SIZE, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "cache_spill", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_CacheSpill }, |
-#endif |
- { /* zName: */ "case_sensitive_like", |
- /* ePragTyp: */ PragTyp_CASE_SENSITIVE_LIKE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "checkpoint_fullfsync", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_CkptFullFSync }, |
-#endif |
-#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
- { /* zName: */ "collation_list", |
- /* ePragTyp: */ PragTyp_COLLATION_LIST, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_COMPILEOPTION_DIAGS) |
- { /* zName: */ "compile_options", |
- /* ePragTyp: */ PragTyp_COMPILE_OPTIONS, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "count_changes", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_CountRows }, |
-#endif |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_OS_WIN |
- { /* zName: */ "data_store_directory", |
- /* ePragTyp: */ PragTyp_DATA_STORE_DIRECTORY, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
- { /* zName: */ "database_list", |
- /* ePragTyp: */ PragTyp_DATABASE_LIST, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) |
- { /* zName: */ "default_cache_size", |
- /* ePragTyp: */ PragTyp_DEFAULT_CACHE_SIZE, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
-#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) |
- { /* zName: */ "defer_foreign_keys", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_DeferFKs }, |
-#endif |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "empty_result_callbacks", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_NullCallback }, |
-#endif |
-#if !defined(SQLITE_OMIT_UTF16) |
- { /* zName: */ "encoding", |
- /* ePragTyp: */ PragTyp_ENCODING, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) |
- { /* zName: */ "foreign_key_check", |
- /* ePragTyp: */ PragTyp_FOREIGN_KEY_CHECK, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FOREIGN_KEY) |
- { /* zName: */ "foreign_key_list", |
- /* ePragTyp: */ PragTyp_FOREIGN_KEY_LIST, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
-#if !defined(SQLITE_OMIT_FOREIGN_KEY) && !defined(SQLITE_OMIT_TRIGGER) |
- { /* zName: */ "foreign_keys", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_ForeignKeys }, |
-#endif |
-#endif |
-#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) |
- { /* zName: */ "freelist_count", |
- /* ePragTyp: */ PragTyp_HEADER_VALUE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "full_column_names", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_FullColNames }, |
- { /* zName: */ "fullfsync", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_FullFSync }, |
-#endif |
-#if defined(SQLITE_HAS_CODEC) |
- { /* zName: */ "hexkey", |
- /* ePragTyp: */ PragTyp_HEXKEY, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
- { /* zName: */ "hexrekey", |
- /* ePragTyp: */ PragTyp_HEXKEY, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
-#if !defined(SQLITE_OMIT_CHECK) |
- { /* zName: */ "ignore_check_constraints", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_IgnoreChecks }, |
-#endif |
-#endif |
-#if !defined(SQLITE_OMIT_AUTOVACUUM) |
- { /* zName: */ "incremental_vacuum", |
- /* ePragTyp: */ PragTyp_INCREMENTAL_VACUUM, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
- { /* zName: */ "index_info", |
- /* ePragTyp: */ PragTyp_INDEX_INFO, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
- { /* zName: */ "index_list", |
- /* ePragTyp: */ PragTyp_INDEX_LIST, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) |
- { /* zName: */ "integrity_check", |
- /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
- { /* zName: */ "journal_mode", |
- /* ePragTyp: */ PragTyp_JOURNAL_MODE, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
- { /* zName: */ "journal_size_limit", |
- /* ePragTyp: */ PragTyp_JOURNAL_SIZE_LIMIT, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if defined(SQLITE_HAS_CODEC) |
- { /* zName: */ "key", |
- /* ePragTyp: */ PragTyp_KEY, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "legacy_file_format", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_LegacyFileFmt }, |
-#endif |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE |
- { /* zName: */ "lock_proxy_file", |
- /* ePragTyp: */ PragTyp_LOCK_PROXY_FILE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) |
- { /* zName: */ "lock_status", |
- /* ePragTyp: */ PragTyp_LOCK_STATUS, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
- { /* zName: */ "locking_mode", |
- /* ePragTyp: */ PragTyp_LOCKING_MODE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
- { /* zName: */ "max_page_count", |
- /* ePragTyp: */ PragTyp_PAGE_COUNT, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
- { /* zName: */ "mmap_size", |
- /* ePragTyp: */ PragTyp_MMAP_SIZE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
- { /* zName: */ "page_count", |
- /* ePragTyp: */ PragTyp_PAGE_COUNT, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
- { /* zName: */ "page_size", |
- /* ePragTyp: */ PragTyp_PAGE_SIZE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if defined(SQLITE_DEBUG) |
- { /* zName: */ "parser_trace", |
- /* ePragTyp: */ PragTyp_PARSER_TRACE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "query_only", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_QueryOnly }, |
-#endif |
-#if !defined(SQLITE_OMIT_INTEGRITY_CHECK) |
- { /* zName: */ "quick_check", |
- /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "read_uncommitted", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_ReadUncommitted }, |
- { /* zName: */ "recursive_triggers", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_RecTriggers }, |
-#endif |
-#if defined(SQLITE_HAS_CODEC) |
- { /* zName: */ "rekey", |
- /* ePragTyp: */ PragTyp_REKEY, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "reverse_unordered_selects", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_ReverseOrder }, |
-#endif |
-#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) |
- { /* zName: */ "schema_version", |
- /* ePragTyp: */ PragTyp_HEADER_VALUE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
- { /* zName: */ "secure_delete", |
- /* ePragTyp: */ PragTyp_SECURE_DELETE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "short_column_names", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_ShortColNames }, |
-#endif |
- { /* zName: */ "shrink_memory", |
- /* ePragTyp: */ PragTyp_SHRINK_MEMORY, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
- { /* zName: */ "soft_heap_limit", |
- /* ePragTyp: */ PragTyp_SOFT_HEAP_LIMIT, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
-#if defined(SQLITE_DEBUG) |
- { /* zName: */ "sql_trace", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_SqlTrace }, |
-#endif |
-#endif |
-#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
- { /* zName: */ "stats", |
- /* ePragTyp: */ PragTyp_STATS, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
- { /* zName: */ "synchronous", |
- /* ePragTyp: */ PragTyp_SYNCHRONOUS, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) |
- { /* zName: */ "table_info", |
- /* ePragTyp: */ PragTyp_TABLE_INFO, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
- { /* zName: */ "temp_store", |
- /* ePragTyp: */ PragTyp_TEMP_STORE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
- { /* zName: */ "temp_store_directory", |
- /* ePragTyp: */ PragTyp_TEMP_STORE_DIRECTORY, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
- { /* zName: */ "threads", |
- /* ePragTyp: */ PragTyp_THREADS, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#if !defined(SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS) |
- { /* zName: */ "user_version", |
- /* ePragTyp: */ PragTyp_HEADER_VALUE, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
-#if defined(SQLITE_DEBUG) |
- { /* zName: */ "vdbe_addoptrace", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_VdbeAddopTrace }, |
- { /* zName: */ "vdbe_debug", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_SqlTrace|SQLITE_VdbeListing|SQLITE_VdbeTrace }, |
- { /* zName: */ "vdbe_eqp", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_VdbeEQP }, |
- { /* zName: */ "vdbe_listing", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_VdbeListing }, |
- { /* zName: */ "vdbe_trace", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_VdbeTrace }, |
-#endif |
-#endif |
-#if !defined(SQLITE_OMIT_WAL) |
- { /* zName: */ "wal_autocheckpoint", |
- /* ePragTyp: */ PragTyp_WAL_AUTOCHECKPOINT, |
- /* ePragFlag: */ 0, |
- /* iArg: */ 0 }, |
- { /* zName: */ "wal_checkpoint", |
- /* ePragTyp: */ PragTyp_WAL_CHECKPOINT, |
- /* ePragFlag: */ PragFlag_NeedSchema, |
- /* iArg: */ 0 }, |
-#endif |
-#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) |
- { /* zName: */ "writable_schema", |
- /* ePragTyp: */ PragTyp_FLAG, |
- /* ePragFlag: */ 0, |
- /* iArg: */ SQLITE_WriteSchema|SQLITE_RecoveryMode }, |
-#endif |
-}; |
-/* Number of pragmas: 57 on by default, 70 total. */ |
-/* End of the automatically generated pragma table. |
-***************************************************************************/ |
+** The "pragma.h" include file is an automatically generated file that |
+** that includes the PragType_XXXX macro definitions and the aPragmaName[] |
+** object. This ensures that the aPragmaName[] table is arranged in |
+** lexicographical order to facility a binary search of the pragma name. |
+** Do not edit pragma.h directly. Edit and rerun the script in at |
+** ../tool/mkpragmatab.tcl. */ |
+#include "pragma.h" |
/* |
** Interpret the given string as a safety level. Return 0 for OFF, |
@@ -604,19 +160,45 @@ static int changeTempStorage(Parse *pParse, const char *zStorageType){ |
#endif /* SQLITE_PAGER_PRAGMAS */ |
/* |
+** Set the names of the first N columns to the values in azCol[] |
+*/ |
+static void setAllColumnNames( |
+ Vdbe *v, /* The query under construction */ |
+ int N, /* Number of columns */ |
+ const char **azCol /* Names of columns */ |
+){ |
+ int i; |
+ sqlite3VdbeSetNumCols(v, N); |
+ for(i=0; i<N; i++){ |
+ sqlite3VdbeSetColName(v, i, COLNAME_NAME, azCol[i], SQLITE_STATIC); |
+ } |
+} |
+static void setOneColumnName(Vdbe *v, const char *z){ |
+ setAllColumnNames(v, 1, &z); |
+} |
+ |
+/* |
** Generate code to return a single integer value. |
*/ |
-static void returnSingleInt(Parse *pParse, const char *zLabel, i64 value){ |
- Vdbe *v = sqlite3GetVdbe(pParse); |
- int mem = ++pParse->nMem; |
- i64 *pI64 = sqlite3DbMallocRaw(pParse->db, sizeof(value)); |
- if( pI64 ){ |
- memcpy(pI64, &value, sizeof(value)); |
+static void returnSingleInt(Vdbe *v, const char *zLabel, i64 value){ |
+ sqlite3VdbeAddOp4Dup8(v, OP_Int64, 0, 1, 0, (const u8*)&value, P4_INT64); |
+ setOneColumnName(v, zLabel); |
+ sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
+} |
+ |
+/* |
+** Generate code to return a single text value. |
+*/ |
+static void returnSingleText( |
+ Vdbe *v, /* Prepared statement under construction */ |
+ const char *zLabel, /* Name of the result column */ |
+ const char *zValue /* Value to be returned */ |
+){ |
+ if( zValue ){ |
+ sqlite3VdbeLoadString(v, 1, (const char*)zValue); |
+ setOneColumnName(v, zLabel); |
+ sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
} |
- sqlite3VdbeAddOp4(v, OP_Int64, 0, mem, 0, (char*)pI64, P4_INT64); |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, zLabel, SQLITE_STATIC); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1); |
} |
@@ -697,7 +279,7 @@ const char *sqlite3JournalModename(int eMode){ |
** |
** Pragmas are of this form: |
** |
-** PRAGMA [database.]id [= value] |
+** PRAGMA [schema.]id [= value] |
** |
** The identifier might also be a string. The value is a string, and |
** identifier, or a number. If minusFlag is true, then the value is |
@@ -709,8 +291,8 @@ const char *sqlite3JournalModename(int eMode){ |
*/ |
void sqlite3Pragma( |
Parse *pParse, |
- Token *pId1, /* First part of [database.]id field */ |
- Token *pId2, /* Second part of [database.]id field, or NULL */ |
+ Token *pId1, /* First part of [schema.]id field */ |
+ Token *pId2, /* Second part of [schema.]id field, or NULL */ |
Token *pValue, /* Token for <value>, or NULL */ |
int minusFlag /* True if a '-' sign preceded <value> */ |
){ |
@@ -720,17 +302,18 @@ void sqlite3Pragma( |
Token *pId; /* Pointer to <id> token */ |
char *aFcntl[4]; /* Argument to SQLITE_FCNTL_PRAGMA */ |
int iDb; /* Database index for <database> */ |
- int lwr, upr, mid; /* Binary search bounds */ |
+ int lwr, upr, mid = 0; /* Binary search bounds */ |
int rc; /* return value form SQLITE_FCNTL_PRAGMA */ |
sqlite3 *db = pParse->db; /* The database connection */ |
Db *pDb; /* The specific database being pragmaed */ |
Vdbe *v = sqlite3GetVdbe(pParse); /* Prepared statement */ |
+ const struct sPragmaNames *pPragma; |
if( v==0 ) return; |
sqlite3VdbeRunOnlyOnce(v); |
pParse->nMem = 2; |
- /* Interpret the [database.] part of the pragma statement. iDb is the |
+ /* Interpret the [schema.] part of the pragma statement. iDb is the |
** index of the database this pragma is being applied to in db.aDb[]. */ |
iDb = sqlite3TwoPartName(pParse, pId1, pId2, &pId); |
if( iDb<0 ) return; |
@@ -760,6 +343,17 @@ void sqlite3Pragma( |
/* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS |
** connection. If it returns SQLITE_OK, then assume that the VFS |
** handled the pragma and generate a no-op prepared statement. |
+ ** |
+ ** IMPLEMENTATION-OF: R-12238-55120 Whenever a PRAGMA statement is parsed, |
+ ** an SQLITE_FCNTL_PRAGMA file control is sent to the open sqlite3_file |
+ ** object corresponding to the database file to which the pragma |
+ ** statement refers. |
+ ** |
+ ** IMPLEMENTATION-OF: R-29875-31678 The argument to the SQLITE_FCNTL_PRAGMA |
+ ** file control is an array of pointers to strings (char**) in which the |
+ ** second element of the array is the name of the pragma and the third |
+ ** element is the argument to the pragma or NULL if the pragma has no |
+ ** argument. |
*/ |
aFcntl[0] = 0; |
aFcntl[1] = zLeft; |
@@ -768,14 +362,8 @@ void sqlite3Pragma( |
db->busyHandler.nBusy = 0; |
rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl); |
if( rc==SQLITE_OK ){ |
- if( aFcntl[0] ){ |
- int mem = ++pParse->nMem; |
- sqlite3VdbeAddOp4(v, OP_String8, 0, mem, 0, aFcntl[0], 0); |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "result", SQLITE_STATIC); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1); |
- sqlite3_free(aFcntl[0]); |
- } |
+ returnSingleText(v, "result", aFcntl[0]); |
+ sqlite3_free(aFcntl[0]); |
goto pragma_out; |
} |
if( rc!=SQLITE_NOTFOUND ){ |
@@ -802,19 +390,20 @@ void sqlite3Pragma( |
} |
} |
if( lwr>upr ) goto pragma_out; |
+ pPragma = &aPragmaNames[mid]; |
/* Make sure the database schema is loaded if the pragma requires that */ |
- if( (aPragmaNames[mid].mPragFlag & PragFlag_NeedSchema)!=0 ){ |
+ if( (pPragma->mPragFlag & PragFlag_NeedSchema)!=0 ){ |
if( sqlite3ReadSchema(pParse) ) goto pragma_out; |
} |
/* Jump to the appropriate pragma handler */ |
- switch( aPragmaNames[mid].ePragTyp ){ |
+ switch( pPragma->ePragTyp ){ |
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) |
/* |
- ** PRAGMA [database.]default_cache_size |
- ** PRAGMA [database.]default_cache_size=N |
+ ** PRAGMA [schema.]default_cache_size |
+ ** PRAGMA [schema.]default_cache_size=N |
** |
** The first form reports the current persistent setting for the |
** page cache size. The value returned is the maximum number of |
@@ -844,8 +433,7 @@ void sqlite3Pragma( |
int addr; |
sqlite3VdbeUsesBtree(v, iDb); |
if( !zRight ){ |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cache_size", SQLITE_STATIC); |
+ setOneColumnName(v, "cache_size"); |
pParse->nMem += 2; |
addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize,iLn); |
sqlite3VdbeChangeP1(v, addr, iDb); |
@@ -866,8 +454,8 @@ void sqlite3Pragma( |
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) |
/* |
- ** PRAGMA [database.]page_size |
- ** PRAGMA [database.]page_size=N |
+ ** PRAGMA [schema.]page_size |
+ ** PRAGMA [schema.]page_size=N |
** |
** The first form reports the current setting for the |
** database page size in bytes. The second form sets the |
@@ -879,7 +467,7 @@ void sqlite3Pragma( |
assert( pBt!=0 ); |
if( !zRight ){ |
int size = ALWAYS(pBt) ? sqlite3BtreeGetPageSize(pBt) : 0; |
- returnSingleInt(pParse, "page_size", size); |
+ returnSingleInt(v, "page_size", size); |
}else{ |
/* Malloc may fail when setting the page-size, as there is an internal |
** buffer that the pager module resizes using sqlite3_realloc(). |
@@ -893,8 +481,8 @@ void sqlite3Pragma( |
} |
/* |
- ** PRAGMA [database.]secure_delete |
- ** PRAGMA [database.]secure_delete=ON/OFF |
+ ** PRAGMA [schema.]secure_delete |
+ ** PRAGMA [schema.]secure_delete=ON/OFF |
** |
** The first form reports the current setting for the |
** secure_delete flag. The second form changes the secure_delete |
@@ -914,13 +502,13 @@ void sqlite3Pragma( |
} |
} |
b = sqlite3BtreeSecureDelete(pBt, b); |
- returnSingleInt(pParse, "secure_delete", b); |
+ returnSingleInt(v, "secure_delete", b); |
break; |
} |
/* |
- ** PRAGMA [database.]max_page_count |
- ** PRAGMA [database.]max_page_count=N |
+ ** PRAGMA [schema.]max_page_count |
+ ** PRAGMA [schema.]max_page_count=N |
** |
** The first form reports the current setting for the |
** maximum number of pages in the database file. The |
@@ -931,7 +519,7 @@ void sqlite3Pragma( |
** change. The only purpose is to provide an easy way to test |
** the sqlite3AbsInt32() function. |
** |
- ** PRAGMA [database.]page_count |
+ ** PRAGMA [schema.]page_count |
** |
** Return the number of pages in the specified database. |
*/ |
@@ -952,8 +540,8 @@ void sqlite3Pragma( |
} |
/* |
- ** PRAGMA [database.]locking_mode |
- ** PRAGMA [database.]locking_mode = (normal|exclusive) |
+ ** PRAGMA [schema.]locking_mode |
+ ** PRAGMA [schema.]locking_mode = (normal|exclusive) |
*/ |
case PragTyp_LOCKING_MODE: { |
const char *zRet = "normal"; |
@@ -993,25 +581,20 @@ void sqlite3Pragma( |
if( eMode==PAGER_LOCKINGMODE_EXCLUSIVE ){ |
zRet = "exclusive"; |
} |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "locking_mode", SQLITE_STATIC); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zRet, 0); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
+ returnSingleText(v, "locking_mode", zRet); |
break; |
} |
/* |
- ** PRAGMA [database.]journal_mode |
- ** PRAGMA [database.]journal_mode = |
+ ** PRAGMA [schema.]journal_mode |
+ ** PRAGMA [schema.]journal_mode = |
** (delete|persist|off|truncate|memory|wal|off) |
*/ |
case PragTyp_JOURNAL_MODE: { |
int eMode; /* One of the PAGER_JOURNALMODE_XXX symbols */ |
int ii; /* Loop counter */ |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "journal_mode", SQLITE_STATIC); |
- |
+ setOneColumnName(v, "journal_mode"); |
if( zRight==0 ){ |
/* If there is no "=MODE" part of the pragma, do a query for the |
** current mode */ |
@@ -1044,8 +627,8 @@ void sqlite3Pragma( |
} |
/* |
- ** PRAGMA [database.]journal_size_limit |
- ** PRAGMA [database.]journal_size_limit=N |
+ ** PRAGMA [schema.]journal_size_limit |
+ ** PRAGMA [schema.]journal_size_limit=N |
** |
** Get or set the size limit on rollback journal files. |
*/ |
@@ -1057,15 +640,15 @@ void sqlite3Pragma( |
if( iLimit<-1 ) iLimit = -1; |
} |
iLimit = sqlite3PagerJournalSizeLimit(pPager, iLimit); |
- returnSingleInt(pParse, "journal_size_limit", iLimit); |
+ returnSingleInt(v, "journal_size_limit", iLimit); |
break; |
} |
#endif /* SQLITE_OMIT_PAGER_PRAGMAS */ |
/* |
- ** PRAGMA [database.]auto_vacuum |
- ** PRAGMA [database.]auto_vacuum=N |
+ ** PRAGMA [schema.]auto_vacuum |
+ ** PRAGMA [schema.]auto_vacuum=N |
** |
** Get or set the value of the database 'auto-vacuum' parameter. |
** The value is one of: 0 NONE 1 FULL 2 INCREMENTAL |
@@ -1075,7 +658,7 @@ void sqlite3Pragma( |
Btree *pBt = pDb->pBt; |
assert( pBt!=0 ); |
if( !zRight ){ |
- returnSingleInt(pParse, "auto_vacuum", sqlite3BtreeGetAutoVacuum(pBt)); |
+ returnSingleInt(v, "auto_vacuum", sqlite3BtreeGetAutoVacuum(pBt)); |
}else{ |
int eAuto = getAutoVacuum(zRight); |
assert( eAuto>=0 && eAuto<=2 ); |
@@ -1116,7 +699,7 @@ void sqlite3Pragma( |
#endif |
/* |
- ** PRAGMA [database.]incremental_vacuum(N) |
+ ** PRAGMA [schema.]incremental_vacuum(N) |
** |
** Do N steps of incremental vacuuming on a database. |
*/ |
@@ -1139,8 +722,8 @@ void sqlite3Pragma( |
#ifndef SQLITE_OMIT_PAGER_PRAGMAS |
/* |
- ** PRAGMA [database.]cache_size |
- ** PRAGMA [database.]cache_size=N |
+ ** PRAGMA [schema.]cache_size |
+ ** PRAGMA [schema.]cache_size=N |
** |
** The first form reports the current local setting for the |
** page cache size. The second form sets the local |
@@ -1152,7 +735,7 @@ void sqlite3Pragma( |
case PragTyp_CACHE_SIZE: { |
assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
if( !zRight ){ |
- returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); |
+ returnSingleInt(v, "cache_size", pDb->pSchema->cache_size); |
}else{ |
int size = sqlite3Atoi(zRight); |
pDb->pSchema->cache_size = size; |
@@ -1162,7 +745,50 @@ void sqlite3Pragma( |
} |
/* |
- ** PRAGMA [database.]mmap_size(N) |
+ ** PRAGMA [schema.]cache_spill |
+ ** PRAGMA cache_spill=BOOLEAN |
+ ** PRAGMA [schema.]cache_spill=N |
+ ** |
+ ** The first form reports the current local setting for the |
+ ** page cache spill size. The second form turns cache spill on |
+ ** or off. When turnning cache spill on, the size is set to the |
+ ** current cache_size. The third form sets a spill size that |
+ ** may be different form the cache size. |
+ ** If N is positive then that is the |
+ ** number of pages in the cache. If N is negative, then the |
+ ** number of pages is adjusted so that the cache uses -N kibibytes |
+ ** of memory. |
+ ** |
+ ** If the number of cache_spill pages is less then the number of |
+ ** cache_size pages, no spilling occurs until the page count exceeds |
+ ** the number of cache_size pages. |
+ ** |
+ ** The cache_spill=BOOLEAN setting applies to all attached schemas, |
+ ** not just the schema specified. |
+ */ |
+ case PragTyp_CACHE_SPILL: { |
+ assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); |
+ if( !zRight ){ |
+ returnSingleInt(v, "cache_spill", |
+ (db->flags & SQLITE_CacheSpill)==0 ? 0 : |
+ sqlite3BtreeSetSpillSize(pDb->pBt,0)); |
+ }else{ |
+ int size = 1; |
+ if( sqlite3GetInt32(zRight, &size) ){ |
+ sqlite3BtreeSetSpillSize(pDb->pBt, size); |
+ } |
+ if( sqlite3GetBoolean(zRight, size!=0) ){ |
+ db->flags |= SQLITE_CacheSpill; |
+ }else{ |
+ db->flags &= ~SQLITE_CacheSpill; |
+ } |
+ setAllPagerFlags(db); |
+ } |
+ break; |
+ } |
+ |
+ /* |
+ ** PRAGMA [schema.]mmap_size(N) |
** |
** Used to set mapping size limit. The mapping size limit is |
** used to limit the aggregate size of all memory mapped regions of the |
@@ -1197,7 +823,7 @@ void sqlite3Pragma( |
rc = SQLITE_OK; |
#endif |
if( rc==SQLITE_OK ){ |
- returnSingleInt(pParse, "mmap_size", sz); |
+ returnSingleInt(v, "mmap_size", sz); |
}else if( rc!=SQLITE_NOTFOUND ){ |
pParse->nErr++; |
pParse->rc = rc; |
@@ -1218,7 +844,7 @@ void sqlite3Pragma( |
*/ |
case PragTyp_TEMP_STORE: { |
if( !zRight ){ |
- returnSingleInt(pParse, "temp_store", db->temp_store); |
+ returnSingleInt(v, "temp_store", db->temp_store); |
}else{ |
changeTempStorage(pParse, zRight); |
} |
@@ -1237,13 +863,7 @@ void sqlite3Pragma( |
*/ |
case PragTyp_TEMP_STORE_DIRECTORY: { |
if( !zRight ){ |
- if( sqlite3_temp_directory ){ |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, |
- "temp_store_directory", SQLITE_STATIC); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_temp_directory, 0); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
- } |
+ returnSingleText(v, "temp_store_directory", sqlite3_temp_directory); |
}else{ |
#ifndef SQLITE_OMIT_WSD |
if( zRight[0] ){ |
@@ -1287,13 +907,7 @@ void sqlite3Pragma( |
*/ |
case PragTyp_DATA_STORE_DIRECTORY: { |
if( !zRight ){ |
- if( sqlite3_data_directory ){ |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, |
- "data_store_directory", SQLITE_STATIC); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, sqlite3_data_directory, 0); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
- } |
+ returnSingleText(v, "data_store_directory", sqlite3_data_directory); |
}else{ |
#ifndef SQLITE_OMIT_WSD |
if( zRight[0] ){ |
@@ -1318,8 +932,8 @@ void sqlite3Pragma( |
#if SQLITE_ENABLE_LOCKING_STYLE |
/* |
- ** PRAGMA [database.]lock_proxy_file |
- ** PRAGMA [database.]lock_proxy_file = ":auto:"|"lock_file_path" |
+ ** PRAGMA [schema.]lock_proxy_file |
+ ** PRAGMA [schema.]lock_proxy_file = ":auto:"|"lock_file_path" |
** |
** Return or set the value of the lock_proxy_file flag. Changing |
** the value sets a specific file to be used for database access locks. |
@@ -1332,14 +946,7 @@ void sqlite3Pragma( |
sqlite3_file *pFile = sqlite3PagerFile(pPager); |
sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, |
&proxy_file_path); |
- |
- if( proxy_file_path ){ |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, |
- "lock_proxy_file", SQLITE_STATIC); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, proxy_file_path, 0); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
- } |
+ returnSingleText(v, "lock_proxy_file", proxy_file_path); |
}else{ |
Pager *pPager = sqlite3BtreePager(pDb->pBt); |
sqlite3_file *pFile = sqlite3PagerFile(pPager); |
@@ -1361,8 +968,8 @@ void sqlite3Pragma( |
#endif /* SQLITE_ENABLE_LOCKING_STYLE */ |
/* |
- ** PRAGMA [database.]synchronous |
- ** PRAGMA [database.]synchronous=OFF|ON|NORMAL|FULL |
+ ** PRAGMA [schema.]synchronous |
+ ** PRAGMA [schema.]synchronous=OFF|ON|NORMAL|FULL |
** |
** Return or set the local value of the synchronous flag. Changing |
** the local value does not make changes to the disk file and the |
@@ -1371,13 +978,15 @@ void sqlite3Pragma( |
*/ |
case PragTyp_SYNCHRONOUS: { |
if( !zRight ){ |
- returnSingleInt(pParse, "synchronous", pDb->safety_level-1); |
+ returnSingleInt(v, "synchronous", pDb->safety_level-1); |
}else{ |
if( !db->autoCommit ){ |
sqlite3ErrorMsg(pParse, |
"Safety level may not be changed inside a transaction"); |
}else{ |
- pDb->safety_level = getSafetyLevel(zRight,0,1)+1; |
+ int iLevel = (getSafetyLevel(zRight,0,1)+1) & PAGER_SYNCHRONOUS_MASK; |
+ if( iLevel==0 ) iLevel = 1; |
+ pDb->safety_level = iLevel; |
setAllPagerFlags(db); |
} |
} |
@@ -1388,10 +997,9 @@ void sqlite3Pragma( |
#ifndef SQLITE_OMIT_FLAG_PRAGMAS |
case PragTyp_FLAG: { |
if( zRight==0 ){ |
- returnSingleInt(pParse, aPragmaNames[mid].zName, |
- (db->flags & aPragmaNames[mid].iArg)!=0 ); |
+ returnSingleInt(v, pPragma->zName, (db->flags & pPragma->iArg)!=0 ); |
}else{ |
- int mask = aPragmaNames[mid].iArg; /* Mask of bits to set or clear. */ |
+ int mask = pPragma->iArg; /* Mask of bits to set or clear. */ |
if( db->autoCommit==0 ){ |
/* Foreign key support may not be enabled or disabled while not |
** in auto-commit mode. */ |
@@ -1439,43 +1047,36 @@ void sqlite3Pragma( |
Table *pTab; |
pTab = sqlite3FindTable(db, zRight, zDb); |
if( pTab ){ |
+ static const char *azCol[] = { |
+ "cid", "name", "type", "notnull", "dflt_value", "pk" |
+ }; |
int i, k; |
int nHidden = 0; |
Column *pCol; |
Index *pPk = sqlite3PrimaryKeyIndex(pTab); |
- sqlite3VdbeSetNumCols(v, 6); |
pParse->nMem = 6; |
sqlite3CodeVerifySchema(pParse, iDb); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "cid", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "type", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "notnull", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "dflt_value", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "pk", SQLITE_STATIC); |
+ setAllColumnNames(v, 6, azCol); assert( 6==ArraySize(azCol) ); |
sqlite3ViewGetColumnNames(pParse, pTab); |
for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){ |
if( IsHiddenColumn(pCol) ){ |
nHidden++; |
continue; |
} |
- sqlite3VdbeAddOp2(v, OP_Integer, i-nHidden, 1); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pCol->zName, 0); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, |
- pCol->zType ? pCol->zType : "", 0); |
- sqlite3VdbeAddOp2(v, OP_Integer, (pCol->notNull ? 1 : 0), 4); |
- if( pCol->zDflt ){ |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 5, 0, (char*)pCol->zDflt, 0); |
- }else{ |
- sqlite3VdbeAddOp2(v, OP_Null, 0, 5); |
- } |
if( (pCol->colFlags & COLFLAG_PRIMKEY)==0 ){ |
k = 0; |
}else if( pPk==0 ){ |
k = 1; |
}else{ |
- for(k=1; ALWAYS(k<=pTab->nCol) && pPk->aiColumn[k-1]!=i; k++){} |
+ for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} |
} |
- sqlite3VdbeAddOp2(v, OP_Integer, k, 6); |
+ sqlite3VdbeMultiLoad(v, 1, "issisi", |
+ i-nHidden, |
+ pCol->zName, |
+ pCol->zType ? pCol->zType : "", |
+ pCol->notNull ? 1 : 0, |
+ pCol->zDflt, |
+ k); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 6); |
} |
} |
@@ -1483,31 +1084,26 @@ void sqlite3Pragma( |
break; |
case PragTyp_STATS: { |
+ static const char *azCol[] = { "table", "index", "width", "height" }; |
Index *pIdx; |
HashElem *i; |
v = sqlite3GetVdbe(pParse); |
- sqlite3VdbeSetNumCols(v, 4); |
pParse->nMem = 4; |
sqlite3CodeVerifySchema(pParse, iDb); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "table", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "index", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "width", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "height", SQLITE_STATIC); |
+ setAllColumnNames(v, 4, azCol); assert( 4==ArraySize(azCol) ); |
for(i=sqliteHashFirst(&pDb->pSchema->tblHash); i; i=sqliteHashNext(i)){ |
Table *pTab = sqliteHashData(i); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, pTab->zName, 0); |
- sqlite3VdbeAddOp2(v, OP_Null, 0, 2); |
- sqlite3VdbeAddOp2(v, OP_Integer, |
- (int)sqlite3LogEstToInt(pTab->szTabRow), 3); |
- sqlite3VdbeAddOp2(v, OP_Integer, |
- (int)sqlite3LogEstToInt(pTab->nRowLogEst), 4); |
+ sqlite3VdbeMultiLoad(v, 1, "ssii", |
+ pTab->zName, |
+ 0, |
+ (int)sqlite3LogEstToInt(pTab->szTabRow), |
+ (int)sqlite3LogEstToInt(pTab->nRowLogEst)); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); |
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0); |
- sqlite3VdbeAddOp2(v, OP_Integer, |
- (int)sqlite3LogEstToInt(pIdx->szIdxRow), 3); |
- sqlite3VdbeAddOp2(v, OP_Integer, |
- (int)sqlite3LogEstToInt(pIdx->aiRowLogEst[0]), 4); |
+ sqlite3VdbeMultiLoad(v, 2, "sii", |
+ pIdx->zName, |
+ (int)sqlite3LogEstToInt(pIdx->szIdxRow), |
+ (int)sqlite3LogEstToInt(pIdx->aiRowLogEst[0])); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 4); |
} |
} |
@@ -1519,21 +1115,35 @@ void sqlite3Pragma( |
Table *pTab; |
pIdx = sqlite3FindIndex(db, zRight, zDb); |
if( pIdx ){ |
+ static const char *azCol[] = { |
+ "seqno", "cid", "name", "desc", "coll", "key" |
+ }; |
int i; |
+ int mx; |
+ if( pPragma->iArg ){ |
+ /* PRAGMA index_xinfo (newer version with more rows and columns) */ |
+ mx = pIdx->nColumn; |
+ pParse->nMem = 6; |
+ }else{ |
+ /* PRAGMA index_info (legacy version) */ |
+ mx = pIdx->nKeyCol; |
+ pParse->nMem = 3; |
+ } |
pTab = pIdx->pTable; |
- sqlite3VdbeSetNumCols(v, 3); |
- pParse->nMem = 3; |
sqlite3CodeVerifySchema(pParse, iDb); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seqno", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "cid", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "name", SQLITE_STATIC); |
- for(i=0; i<pIdx->nKeyCol; i++){ |
+ assert( pParse->nMem<=ArraySize(azCol) ); |
+ setAllColumnNames(v, pParse->nMem, azCol); |
+ for(i=0; i<mx; i++){ |
i16 cnum = pIdx->aiColumn[i]; |
- sqlite3VdbeAddOp2(v, OP_Integer, i, 1); |
- sqlite3VdbeAddOp2(v, OP_Integer, cnum, 2); |
- assert( pTab->nCol>cnum ); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pTab->aCol[cnum].zName, 0); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); |
+ sqlite3VdbeMultiLoad(v, 1, "iis", i, cnum, |
+ cnum<0 ? 0 : pTab->aCol[cnum].zName); |
+ if( pPragma->iArg ){ |
+ sqlite3VdbeMultiLoad(v, 4, "isi", |
+ pIdx->aSortOrder[i], |
+ pIdx->azColl[i], |
+ i<pIdx->nKeyCol); |
+ } |
+ sqlite3VdbeAddOp2(v, OP_ResultRow, 1, pParse->nMem); |
} |
} |
} |
@@ -1545,53 +1155,53 @@ void sqlite3Pragma( |
int i; |
pTab = sqlite3FindTable(db, zRight, zDb); |
if( pTab ){ |
+ static const char *azCol[] = { |
+ "seq", "name", "unique", "origin", "partial" |
+ }; |
v = sqlite3GetVdbe(pParse); |
- sqlite3VdbeSetNumCols(v, 3); |
- pParse->nMem = 3; |
+ pParse->nMem = 5; |
sqlite3CodeVerifySchema(pParse, iDb); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "unique", SQLITE_STATIC); |
+ setAllColumnNames(v, 5, azCol); assert( 5==ArraySize(azCol) ); |
for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){ |
- sqlite3VdbeAddOp2(v, OP_Integer, i, 1); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pIdx->zName, 0); |
- sqlite3VdbeAddOp2(v, OP_Integer, IsUniqueIndex(pIdx), 3); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); |
+ const char *azOrigin[] = { "c", "u", "pk" }; |
+ sqlite3VdbeMultiLoad(v, 1, "isisi", |
+ i, |
+ pIdx->zName, |
+ IsUniqueIndex(pIdx), |
+ azOrigin[pIdx->idxType], |
+ pIdx->pPartIdxWhere!=0); |
+ sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 5); |
} |
} |
} |
break; |
case PragTyp_DATABASE_LIST: { |
+ static const char *azCol[] = { "seq", "name", "file" }; |
int i; |
- sqlite3VdbeSetNumCols(v, 3); |
pParse->nMem = 3; |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "file", SQLITE_STATIC); |
+ setAllColumnNames(v, 3, azCol); assert( 3==ArraySize(azCol) ); |
for(i=0; i<db->nDb; i++){ |
if( db->aDb[i].pBt==0 ) continue; |
assert( db->aDb[i].zName!=0 ); |
- sqlite3VdbeAddOp2(v, OP_Integer, i, 1); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, db->aDb[i].zName, 0); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, |
- sqlite3BtreeGetFilename(db->aDb[i].pBt), 0); |
+ sqlite3VdbeMultiLoad(v, 1, "iss", |
+ i, |
+ db->aDb[i].zName, |
+ sqlite3BtreeGetFilename(db->aDb[i].pBt)); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); |
} |
} |
break; |
case PragTyp_COLLATION_LIST: { |
+ static const char *azCol[] = { "seq", "name" }; |
int i = 0; |
HashElem *p; |
- sqlite3VdbeSetNumCols(v, 2); |
pParse->nMem = 2; |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "seq", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "name", SQLITE_STATIC); |
+ setAllColumnNames(v, 2, azCol); assert( 2==ArraySize(azCol) ); |
for(p=sqliteHashFirst(&db->aCollSeq); p; p=sqliteHashNext(p)){ |
CollSeq *pColl = (CollSeq *)sqliteHashData(p); |
- sqlite3VdbeAddOp2(v, OP_Integer, i++, 1); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, pColl->zName, 0); |
+ sqlite3VdbeMultiLoad(v, 1, "is", i++, pColl->zName); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); |
} |
} |
@@ -1607,33 +1217,26 @@ void sqlite3Pragma( |
v = sqlite3GetVdbe(pParse); |
pFK = pTab->pFKey; |
if( pFK ){ |
+ static const char *azCol[] = { |
+ "id", "seq", "table", "from", "to", "on_update", "on_delete", |
+ "match" |
+ }; |
int i = 0; |
- sqlite3VdbeSetNumCols(v, 8); |
pParse->nMem = 8; |
sqlite3CodeVerifySchema(pParse, iDb); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "id", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "seq", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "table", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "from", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 4, COLNAME_NAME, "to", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 5, COLNAME_NAME, "on_update", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 6, COLNAME_NAME, "on_delete", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 7, COLNAME_NAME, "match", SQLITE_STATIC); |
+ setAllColumnNames(v, 8, azCol); assert( 8==ArraySize(azCol) ); |
while(pFK){ |
int j; |
for(j=0; j<pFK->nCol; j++){ |
- char *zCol = pFK->aCol[j].zCol; |
- char *zOnDelete = (char *)actionName(pFK->aAction[0]); |
- char *zOnUpdate = (char *)actionName(pFK->aAction[1]); |
- sqlite3VdbeAddOp2(v, OP_Integer, i, 1); |
- sqlite3VdbeAddOp2(v, OP_Integer, j, 2); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pFK->zTo, 0); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, |
- pTab->aCol[pFK->aCol[j].iFrom].zName, 0); |
- sqlite3VdbeAddOp4(v, zCol ? OP_String8 : OP_Null, 0, 5, 0, zCol, 0); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 6, 0, zOnUpdate, 0); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 7, 0, zOnDelete, 0); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 8, 0, "NONE", 0); |
+ sqlite3VdbeMultiLoad(v, 1, "iissssss", |
+ i, |
+ j, |
+ pFK->zTo, |
+ pTab->aCol[pFK->aCol[j].iFrom].zName, |
+ pFK->aCol[j].zCol, |
+ actionName(pFK->aAction[1]), /* ON UPDATE */ |
+ actionName(pFK->aAction[0]), /* ON DELETE */ |
+ "NONE"); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 8); |
} |
++i; |
@@ -1662,17 +1265,14 @@ void sqlite3Pragma( |
int addrTop; /* Top of a loop checking foreign keys */ |
int addrOk; /* Jump here if the key is OK */ |
int *aiCols; /* child to parent column mapping */ |
+ static const char *azCol[] = { "table", "rowid", "parent", "fkid" }; |
regResult = pParse->nMem+1; |
pParse->nMem += 4; |
regKey = ++pParse->nMem; |
regRow = ++pParse->nMem; |
v = sqlite3GetVdbe(pParse); |
- sqlite3VdbeSetNumCols(v, 4); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "table", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "rowid", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "parent", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 3, COLNAME_NAME, "fkid", SQLITE_STATIC); |
+ setAllColumnNames(v, 4, azCol); assert( 4==ArraySize(azCol) ); |
sqlite3CodeVerifySchema(pParse, iDb); |
k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); |
while( k ){ |
@@ -1687,8 +1287,7 @@ void sqlite3Pragma( |
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName); |
if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; |
sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, regResult, 0, pTab->zName, |
- P4_TRANSIENT); |
+ sqlite3VdbeLoadString(v, regResult, pTab->zName); |
for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ |
pParent = sqlite3FindTable(db, pFK->zTo, zDb); |
if( pParent==0 ) continue; |
@@ -1733,7 +1332,7 @@ void sqlite3Pragma( |
sqlite3VdbeAddOp2(v, OP_Rowid, 0, regRow); |
} |
sqlite3VdbeAddOp3(v, OP_NotExists, i, 0, regRow); VdbeCoverage(v); |
- sqlite3VdbeAddOp2(v, OP_Goto, 0, addrOk); |
+ sqlite3VdbeGoto(v, addrOk); |
sqlite3VdbeJumpHere(v, sqlite3VdbeCurrentAddr(v)-2); |
}else{ |
for(j=0; j<pFK->nCol; j++){ |
@@ -1743,15 +1342,13 @@ void sqlite3Pragma( |
} |
if( pParent ){ |
sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey, |
- sqlite3IndexAffinityStr(v,pIdx), pFK->nCol); |
+ sqlite3IndexAffinityStr(db,pIdx), pFK->nCol); |
sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0); |
VdbeCoverage(v); |
} |
} |
sqlite3VdbeAddOp2(v, OP_Rowid, 0, regResult+1); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, regResult+2, 0, |
- pFK->zTo, P4_TRANSIENT); |
- sqlite3VdbeAddOp2(v, OP_Integer, i-1, regResult+3); |
+ sqlite3VdbeMultiLoad(v, regResult+2, "si", pFK->zTo, i-1); |
sqlite3VdbeAddOp2(v, OP_ResultRow, regResult, 4); |
sqlite3VdbeResolveLabel(v, addrOk); |
sqlite3DbFree(db, aiCols); |
@@ -1768,7 +1365,7 @@ void sqlite3Pragma( |
case PragTyp_PARSER_TRACE: { |
if( zRight ){ |
if( sqlite3GetBoolean(zRight, 0) ){ |
- sqlite3ParserTrace(stderr, "parser: "); |
+ sqlite3ParserTrace(stdout, "parser: "); |
}else{ |
sqlite3ParserTrace(0, 0); |
} |
@@ -1805,8 +1402,9 @@ void sqlite3Pragma( |
*/ |
static const int iLn = VDBE_OFFSET_LINENO(2); |
static const VdbeOpList endCode[] = { |
- { OP_IfNeg, 1, 0, 0}, /* 0 */ |
- { OP_String8, 0, 3, 0}, /* 1 */ |
+ { OP_AddImm, 1, 0, 0}, /* 0 */ |
+ { OP_If, 1, 0, 0}, /* 1 */ |
+ { OP_String8, 0, 3, 0}, /* 2 */ |
{ OP_ResultRow, 3, 1, 0}, |
}; |
@@ -1827,8 +1425,7 @@ void sqlite3Pragma( |
/* Initialize the VDBE program */ |
pParse->nMem = 6; |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "integrity_check", SQLITE_STATIC); |
+ setOneColumnName(v, "integrity_check"); |
/* Set the maximum error count */ |
mxErr = SQLITE_INTEGRITY_CHECK_ERROR_MAX; |
@@ -1909,7 +1506,7 @@ void sqlite3Pragma( |
sqlite3VdbeAddOp2(v, OP_Halt, 0, 0); |
sqlite3VdbeJumpHere(v, addr); |
sqlite3ExprCacheClear(pParse); |
- sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, |
+ sqlite3OpenTableAndIndices(pParse, pTab, OP_OpenRead, 0, |
1, 0, &iDataCur, &iIdxCur); |
sqlite3VdbeAddOp2(v, OP_Integer, 0, 7); |
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
@@ -1950,13 +1547,11 @@ void sqlite3Pragma( |
jmp2 = sqlite3VdbeAddOp4Int(v, OP_Found, iIdxCur+j, ckUniq, r1, |
pIdx->nColumn); VdbeCoverage(v); |
sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, "row ", P4_STATIC); |
+ sqlite3VdbeLoadString(v, 3, "row "); |
sqlite3VdbeAddOp3(v, OP_Concat, 7, 3, 3); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, |
- " missing from index ", P4_STATIC); |
+ sqlite3VdbeLoadString(v, 4, " missing from index "); |
sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); |
- jmp5 = sqlite3VdbeAddOp4(v, OP_String8, 0, 4, 0, |
- pIdx->zName, P4_TRANSIENT); |
+ jmp5 = sqlite3VdbeLoadString(v, 4, pIdx->zName); |
sqlite3VdbeAddOp3(v, OP_Concat, 4, 3, 3); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 3, 1); |
jmp4 = sqlite3VdbeAddOp1(v, OP_IfPos, 1); VdbeCoverage(v); |
@@ -1971,20 +1566,19 @@ void sqlite3Pragma( |
int kk; |
for(kk=0; kk<pIdx->nKeyCol; kk++){ |
int iCol = pIdx->aiColumn[kk]; |
- assert( iCol>=0 && iCol<pTab->nCol ); |
- if( pTab->aCol[iCol].notNull ) continue; |
+ assert( iCol!=XN_ROWID && iCol<pTab->nCol ); |
+ if( iCol>=0 && pTab->aCol[iCol].notNull ) continue; |
sqlite3VdbeAddOp2(v, OP_IsNull, r1+kk, uniqOk); |
VdbeCoverage(v); |
} |
jmp6 = sqlite3VdbeAddOp1(v, OP_Next, iIdxCur+j); VdbeCoverage(v); |
- sqlite3VdbeAddOp2(v, OP_Goto, 0, uniqOk); |
+ sqlite3VdbeGoto(v, uniqOk); |
sqlite3VdbeJumpHere(v, jmp6); |
sqlite3VdbeAddOp4Int(v, OP_IdxGT, iIdxCur+j, uniqOk, r1, |
pIdx->nKeyCol); VdbeCoverage(v); |
sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); /* Decrement error limit */ |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, |
- "non-unique entry in index ", P4_STATIC); |
- sqlite3VdbeAddOp2(v, OP_Goto, 0, jmp5); |
+ sqlite3VdbeLoadString(v, 3, "non-unique entry in index "); |
+ sqlite3VdbeGoto(v, jmp5); |
sqlite3VdbeResolveLabel(v, uniqOk); |
} |
sqlite3VdbeJumpHere(v, jmp4); |
@@ -1993,8 +1587,7 @@ void sqlite3Pragma( |
sqlite3VdbeAddOp2(v, OP_Next, iDataCur, loopTop); VdbeCoverage(v); |
sqlite3VdbeJumpHere(v, loopTop-1); |
#ifndef SQLITE_OMIT_BTREECOUNT |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, |
- "wrong # of entries in index ", P4_STATIC); |
+ sqlite3VdbeLoadString(v, 2, "wrong # of entries in index "); |
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ |
if( pPk==pIdx ) continue; |
addr = sqlite3VdbeCurrentAddr(v); |
@@ -2004,7 +1597,7 @@ void sqlite3Pragma( |
sqlite3VdbeAddOp3(v, OP_Eq, 8+j, addr+8, 3); VdbeCoverage(v); |
sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); |
sqlite3VdbeAddOp2(v, OP_AddImm, 1, -1); |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, pIdx->zName, P4_TRANSIENT); |
+ sqlite3VdbeLoadString(v, 3, pIdx->zName); |
sqlite3VdbeAddOp3(v, OP_Concat, 3, 2, 7); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 7, 1); |
} |
@@ -2012,9 +1605,9 @@ void sqlite3Pragma( |
} |
} |
addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); |
- sqlite3VdbeChangeP3(v, addr, -mxErr); |
- sqlite3VdbeJumpHere(v, addr); |
- sqlite3VdbeChangeP4(v, addr+1, "ok", P4_STATIC); |
+ sqlite3VdbeChangeP2(v, addr, -mxErr); |
+ sqlite3VdbeJumpHere(v, addr+1); |
+ sqlite3VdbeChangeP4(v, addr+2, "ok", P4_STATIC); |
} |
break; |
#endif /* SQLITE_OMIT_INTEGRITY_CHECK */ |
@@ -2060,14 +1653,10 @@ void sqlite3Pragma( |
const struct EncName *pEnc; |
if( !zRight ){ /* "PRAGMA encoding" */ |
if( sqlite3ReadSchema(pParse) ) goto pragma_out; |
- sqlite3VdbeSetNumCols(v, 1); |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "encoding", SQLITE_STATIC); |
- sqlite3VdbeAddOp2(v, OP_String8, 0, 1); |
assert( encnames[SQLITE_UTF8].enc==SQLITE_UTF8 ); |
assert( encnames[SQLITE_UTF16LE].enc==SQLITE_UTF16LE ); |
assert( encnames[SQLITE_UTF16BE].enc==SQLITE_UTF16BE ); |
- sqlite3VdbeChangeP4(v, -1, encnames[ENC(pParse->db)].zName, P4_STATIC); |
- sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
+ returnSingleText(v, "encoding", encnames[ENC(pParse->db)].zName); |
}else{ /* "PRAGMA encoding = XXX" */ |
/* Only change the value of sqlite.enc if the database handle is not |
** initialized. If the main database exists, the new sqlite.enc value |
@@ -2080,7 +1669,8 @@ void sqlite3Pragma( |
){ |
for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ |
if( 0==sqlite3StrICmp(zRight, pEnc->zName) ){ |
- ENC(pParse->db) = pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; |
+ SCHEMA_ENC(db) = ENC(db) = |
+ pEnc->enc ? pEnc->enc : SQLITE_UTF16NATIVE; |
break; |
} |
} |
@@ -2095,16 +1685,16 @@ void sqlite3Pragma( |
#ifndef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS |
/* |
- ** PRAGMA [database.]schema_version |
- ** PRAGMA [database.]schema_version = <integer> |
+ ** PRAGMA [schema.]schema_version |
+ ** PRAGMA [schema.]schema_version = <integer> |
** |
- ** PRAGMA [database.]user_version |
- ** PRAGMA [database.]user_version = <integer> |
+ ** PRAGMA [schema.]user_version |
+ ** PRAGMA [schema.]user_version = <integer> |
** |
- ** PRAGMA [database.]freelist_count = <integer> |
+ ** PRAGMA [schema.]freelist_count = <integer> |
** |
- ** PRAGMA [database.]application_id |
- ** PRAGMA [database.]application_id = <integer> |
+ ** PRAGMA [schema.]application_id |
+ ** PRAGMA [schema.]application_id = <integer> |
** |
** The pragma's schema_version and user_version are used to set or get |
** the value of the schema-version and user-version, respectively. Both |
@@ -2125,24 +1715,9 @@ void sqlite3Pragma( |
** applications for any purpose. |
*/ |
case PragTyp_HEADER_VALUE: { |
- int iCookie; /* Cookie index. 1 for schema-cookie, 6 for user-cookie. */ |
+ int iCookie = pPragma->iArg; /* Which cookie to read or write */ |
sqlite3VdbeUsesBtree(v, iDb); |
- switch( zLeft[0] ){ |
- case 'a': case 'A': |
- iCookie = BTREE_APPLICATION_ID; |
- break; |
- case 'f': case 'F': |
- iCookie = BTREE_FREE_PAGE_COUNT; |
- break; |
- case 's': case 'S': |
- iCookie = BTREE_SCHEMA_VERSION; |
- break; |
- default: |
- iCookie = BTREE_USER_VERSION; |
- break; |
- } |
- |
- if( zRight && iCookie!=BTREE_FREE_PAGE_COUNT ){ |
+ if( zRight && (pPragma->mPragFlag & PragFlag_ReadOnly)==0 ){ |
/* Write the specified cookie value */ |
static const VdbeOpList setCookie[] = { |
{ OP_Transaction, 0, 1, 0}, /* 0 */ |
@@ -2182,11 +1757,10 @@ void sqlite3Pragma( |
case PragTyp_COMPILE_OPTIONS: { |
int i = 0; |
const char *zOpt; |
- sqlite3VdbeSetNumCols(v, 1); |
pParse->nMem = 1; |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "compile_option", SQLITE_STATIC); |
+ setOneColumnName(v, "compile_option"); |
while( (zOpt = sqlite3_compileoption_get(i++))!=0 ){ |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, zOpt, 0); |
+ sqlite3VdbeLoadString(v, 1, zOpt); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 1); |
} |
} |
@@ -2195,11 +1769,12 @@ void sqlite3Pragma( |
#ifndef SQLITE_OMIT_WAL |
/* |
- ** PRAGMA [database.]wal_checkpoint = passive|full|restart |
+ ** PRAGMA [schema.]wal_checkpoint = passive|full|restart|truncate |
** |
** Checkpoint the database. |
*/ |
case PragTyp_WAL_CHECKPOINT: { |
+ static const char *azCol[] = { "busy", "log", "checkpointed" }; |
int iBt = (pId2->z?iDb:SQLITE_MAX_ATTACHED); |
int eMode = SQLITE_CHECKPOINT_PASSIVE; |
if( zRight ){ |
@@ -2207,14 +1782,12 @@ void sqlite3Pragma( |
eMode = SQLITE_CHECKPOINT_FULL; |
}else if( sqlite3StrICmp(zRight, "restart")==0 ){ |
eMode = SQLITE_CHECKPOINT_RESTART; |
+ }else if( sqlite3StrICmp(zRight, "truncate")==0 ){ |
+ eMode = SQLITE_CHECKPOINT_TRUNCATE; |
} |
} |
- sqlite3VdbeSetNumCols(v, 3); |
+ setAllColumnNames(v, 3, azCol); assert( 3==ArraySize(azCol) ); |
pParse->nMem = 3; |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "busy", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "log", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 2, COLNAME_NAME, "checkpointed", SQLITE_STATIC); |
- |
sqlite3VdbeAddOp3(v, OP_Checkpoint, iBt, eMode, 1); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 3); |
} |
@@ -2232,7 +1805,7 @@ void sqlite3Pragma( |
if( zRight ){ |
sqlite3_wal_autocheckpoint(db, sqlite3Atoi(zRight)); |
} |
- returnSingleInt(pParse, "wal_autocheckpoint", |
+ returnSingleInt(v, "wal_autocheckpoint", |
db->xWalCallback==sqlite3WalDefaultHook ? |
SQLITE_PTR_TO_INT(db->pWalArg) : 0); |
} |
@@ -2242,8 +1815,9 @@ void sqlite3Pragma( |
/* |
** PRAGMA shrink_memory |
** |
- ** This pragma attempts to free as much memory as possible from the |
- ** current database connection. |
+ ** IMPLEMENTATION-OF: R-23445-46109 This pragma causes the database |
+ ** connection on which it is invoked to free up as much memory as it |
+ ** can, by calling sqlite3_db_release_memory(). |
*/ |
case PragTyp_SHRINK_MEMORY: { |
sqlite3_db_release_memory(db); |
@@ -2260,11 +1834,11 @@ void sqlite3Pragma( |
** disables the timeout. |
*/ |
/*case PragTyp_BUSY_TIMEOUT*/ default: { |
- assert( aPragmaNames[mid].ePragTyp==PragTyp_BUSY_TIMEOUT ); |
+ assert( pPragma->ePragTyp==PragTyp_BUSY_TIMEOUT ); |
if( zRight ){ |
sqlite3_busy_timeout(db, sqlite3Atoi(zRight)); |
} |
- returnSingleInt(pParse, "timeout", db->busyTimeout); |
+ returnSingleInt(v, "timeout", db->busyTimeout); |
break; |
} |
@@ -2272,15 +1846,19 @@ void sqlite3Pragma( |
** PRAGMA soft_heap_limit |
** PRAGMA soft_heap_limit = N |
** |
- ** Call sqlite3_soft_heap_limit64(N). Return the result. If N is omitted, |
- ** use -1. |
+ ** IMPLEMENTATION-OF: R-26343-45930 This pragma invokes the |
+ ** sqlite3_soft_heap_limit64() interface with the argument N, if N is |
+ ** specified and is a non-negative integer. |
+ ** IMPLEMENTATION-OF: R-64451-07163 The soft_heap_limit pragma always |
+ ** returns the same integer that would be returned by the |
+ ** sqlite3_soft_heap_limit64(-1) C-language function. |
*/ |
case PragTyp_SOFT_HEAP_LIMIT: { |
sqlite3_int64 N; |
if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ |
sqlite3_soft_heap_limit64(N); |
} |
- returnSingleInt(pParse, "soft_heap_limit", sqlite3_soft_heap_limit64(-1)); |
+ returnSingleInt(v, "soft_heap_limit", sqlite3_soft_heap_limit64(-1)); |
break; |
} |
@@ -2299,7 +1877,7 @@ void sqlite3Pragma( |
){ |
sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, (int)(N&0x7fffffff)); |
} |
- returnSingleInt(pParse, "threads", |
+ returnSingleInt(v, "threads", |
sqlite3_limit(db, SQLITE_LIMIT_WORKER_THREADS, -1)); |
break; |
} |
@@ -2312,17 +1890,15 @@ void sqlite3Pragma( |
static const char *const azLockName[] = { |
"unlocked", "shared", "reserved", "pending", "exclusive" |
}; |
+ static const char *azCol[] = { "database", "status" }; |
int i; |
- sqlite3VdbeSetNumCols(v, 2); |
+ setAllColumnNames(v, 2, azCol); assert( 2==ArraySize(azCol) ); |
pParse->nMem = 2; |
- sqlite3VdbeSetColName(v, 0, COLNAME_NAME, "database", SQLITE_STATIC); |
- sqlite3VdbeSetColName(v, 1, COLNAME_NAME, "status", SQLITE_STATIC); |
for(i=0; i<db->nDb; i++){ |
Btree *pBt; |
const char *zState = "unknown"; |
int j; |
if( db->aDb[i].zName==0 ) continue; |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 1, 0, db->aDb[i].zName, P4_STATIC); |
pBt = db->aDb[i].pBt; |
if( pBt==0 || sqlite3BtreePager(pBt)==0 ){ |
zState = "closed"; |
@@ -2330,7 +1906,7 @@ void sqlite3Pragma( |
SQLITE_FCNTL_LOCKSTATE, &j)==SQLITE_OK ){ |
zState = azLockName[j]; |
} |
- sqlite3VdbeAddOp4(v, OP_String8, 0, 2, 0, zState, P4_STATIC); |
+ sqlite3VdbeMultiLoad(v, 1, "ss", db->aDb[i].zName, zState); |
sqlite3VdbeAddOp2(v, OP_ResultRow, 1, 2); |
} |
break; |