From 10c0e7115b2ed28a2af6f3b59a9c2862b1b25f9d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 25 Apr 2019 18:15:38 +0000 Subject: [PATCH 001/476] Add the sqlite3_hard_heap_limit64() interface and the corresponding "PRAGMA hard_heap_limit=N" command. FossilOrigin-Name: b0ccef61a7f92d20228becbf4f997bf0f4e46dad2deaf0896dc63b976ad1dd11 --- manifest | 31 +++++++++++---------- manifest.uuid | 2 +- src/loadext.c | 4 ++- src/malloc.c | 53 +++++++++++++++++++++++++++++++++-- src/pragma.c | 21 ++++++++++++++ src/pragma.h | 66 ++++++++++++++++++++++++-------------------- src/sqlite.h.in | 54 ++++++++++++++++++++++-------------- src/sqlite3ext.h | 4 +++ src/test1.c | 29 +++++++++++++++++++ src/treeview.c | 2 +- tool/mkpragmatab.tcl | 3 ++ 11 files changed, 200 insertions(+), 69 deletions(-) diff --git a/manifest b/manifest index 261ca06463..db88510e70 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sin\stest/fuzzdata8.db. -D 2019-04-24T17:04:02.548 +C Add\sthe\ssqlite3_hard_heap_limit64()\sinterface\sand\sthe\scorresponding\n"PRAGMA\shard_heap_limit=N"\scommand. +D 2019-04-25T18:15:38.825 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -481,9 +481,9 @@ F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c fc3cf5c371f9a400144e8c2f148ab29cd3f67f7da7eaf47e6a6959f8255fd92c F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 22afc33c3a61b4fd80a60a54f1882688371e6bc64685df2696b008fce65a999c +F src/loadext.c 4b9eecde583534775c178eb42a83cff530c99c20745ca57ec940b60b79824382 F src/main.c 16eea1ab004331312da0538dafb497cc0ed82fd9bb2e67f7684b40bf2797b666 -F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 +F src/malloc.c 224052e6747deb46e4daf47b9aea4af612715c2907722e44483119fef8d2a0c1 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -511,8 +511,8 @@ F src/parse.y 22f64d8a8910acd17580450513b58d64187b0962848380c7f0a39376b8a48cee F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c be64b2f3908a7f97c56c963676eb12f0d6254c95b28cdc1d73a186eff213219d -F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 -F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 +F src/pragma.c f3efbe2f567b8ac73dd3c09ca7055c590a6ee3a3b7263d654bf26f338286b11a +F src/pragma.h 9af5ddde96902a3f318e0100feea3a455a6f87cd9930c9183773f1e362055070 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 @@ -520,15 +520,15 @@ F src/resolve.c 567888ee3faec14dae06519b4306201771058364a37560186a3e0e755ebc4cb8 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c b7304d2f491c11a03a7fbdf34bc218282ac54052377809d4dc3b4b1e7f4bfc93 F src/shell.c.in bcfa17eb257bf8dc2359e99ba7e6bdfab7901705db013bc47a5be6d7fa7a037e -F src/sqlite.h.in 38390767acc1914d58930e03149595ee4710afa4e3c43ab6c3a8aea3f1a6b8cd +F src/sqlite.h.in 7593b6df09ca8f4b9f22005a2164413704e5a4e7cb82697efae4315c8e12e0a3 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 9ecc93b8493bd20c0c07d52e2ac0ed8bab9b549c7f7955b59869597b650dd8b5 +F src/sqlite3ext.h aa8c3f601d8a6e8efdc485e4bbfd6cdbb18ac4e53b1a71329a07f2d6ded6b1c5 F src/sqliteInt.h 866311ac436c0c2039fccc7ea976fbc79d40c1c2ea687161fa4ba64379b53ae6 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c cfe7f93daf9d8787f65e099efb67d7cdfc2c35236dec5d3f6758520bd3519424 -F src/test1.c c02d8bc27bb61d987b6f696ef62ce583272dbdd03042a241bc5ac767d3558709 +F src/test1.c 983ad8bf1c36b4620ae038d22a12bffefad98d9ea5a327e96de03f3b82d3d997 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -583,7 +583,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e -F src/treeview.c 56724725c62a0d0f408f7c257475dc33309198afee36a1d18be1bc268b09055e +F src/treeview.c 47762086f3cfd2e973bd1a852b154202d1cc32380cc073f49789b2bdf461785d F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 @@ -1751,7 +1751,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl 49039adedafbc430d2959400da2e0e8f20ef8dcf6898e447c946e7d50ef5906b +F tool/mkpragmatab.tcl 0b0d2500ca37ae0f21abe19440ecc1abcde64e8ccc955f670ac69098beaf0b0d F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae4202626f5 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1818,7 +1818,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e1724f1d618cfbcfd1e495d8965a395656cfc1114e1bffd4bc3be0bd5cdb6550 -R 3e1175ca2cd3d699a0989ce182ed2c32 +P 7be6222c9ec44596e4eddd906c831eb1272b90fbdf68641d791f216264feb7cf +R 5060ced5c6b6fe418072d1c42b893584 +T *branch * hard-heap-limit +T *sym-hard-heap-limit * +T -sym-trunk * U drh -Z b7a4bb53a6677ebeb4f1be668326c373 +Z b301fb8fbe07a4e2955f0dbf52997652 diff --git a/manifest.uuid b/manifest.uuid index 7b9871a25b..130e7c1c67 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7be6222c9ec44596e4eddd906c831eb1272b90fbdf68641d791f216264feb7cf \ No newline at end of file +b0ccef61a7f92d20228becbf4f997bf0f4e46dad2deaf0896dc63b976ad1dd11 \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index 9ca139c8dc..47c21d4e95 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -461,7 +461,9 @@ static const sqlite3_api_routines sqlite3Apis = { #endif /* Version 3.28.0 and later */ sqlite3_stmt_isexplain, - sqlite3_value_frombind + sqlite3_value_frombind, + /* Version 3.29.0 and later */ + sqlite3_hard_heap_limit64 }; /* diff --git a/src/malloc.c b/src/malloc.c index 559e7259ce..2027a4c8c3 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -38,6 +38,7 @@ int sqlite3_release_memory(int n){ static SQLITE_WSD struct Mem0Global { sqlite3_mutex *mutex; /* Mutex to serialize access */ sqlite3_int64 alarmThreshold; /* The soft heap limit */ + sqlite3_int64 hardLimit; /* The hard upper bound on memory */ /* ** True if heap is nearly "full" where "full" is defined by the @@ -74,8 +75,15 @@ int sqlite3_memory_alarm( #endif /* -** Set the soft heap-size limit for the library. Passing a zero or -** negative value indicates no limit. +** Set the soft heap-size limit for the library. An argument of +** zero disables the limit. A negative argument is a no-op used to +** obtain the return value. +** +** The return value is the value of the heap limit just before this +** interface was called. +** +** If the hard heap limit is enabled, then the soft heap limit cannot +** be disabled nor raised above the hard heap limit. */ sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ sqlite3_int64 priorLimit; @@ -91,6 +99,9 @@ sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 n){ sqlite3_mutex_leave(mem0.mutex); return priorLimit; } + if( mem0.hardLimit>0 && (n>mem0.hardLimit || n==0) ){ + n = mem0.hardLimit; + } mem0.alarmThreshold = n; nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); mem0.nearlyFull = (n>0 && n<=nUsed); @@ -104,6 +115,37 @@ void sqlite3_soft_heap_limit(int n){ sqlite3_soft_heap_limit64(n); } +/* +** Set the hard heap-size limit for the library. An argument of zero +** disables the hard heap limit. A negative argument is a no-op used +** to obtain the return value without affecting the hard heap limit. +** +** The return value is the value of the hard heap limit just prior to +** calling this interface. +** +** Setting the hard heap limit will also activate the soft heap limit +** and constrain the soft heap limit to be no more than the hard heap +** limit. +*/ +sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 n){ + sqlite3_int64 priorLimit; +#ifndef SQLITE_OMIT_AUTOINIT + int rc = sqlite3_initialize(); + if( rc ) return -1; +#endif + sqlite3_mutex_enter(mem0.mutex); + priorLimit = mem0.hardLimit; + if( n>=0 ){ + mem0.hardLimit = n; + if( n= mem0.alarmThreshold - nFull ){ mem0.nearlyFull = 1; sqlite3MallocAlarm(nFull); + if( mem0.hardLimit ){ + nUsed = sqlite3StatusValue(SQLITE_STATUS_MEMORY_USED); + if( nUsed >= mem0.hardLimit - nFull ){ + *pp = 0; + return; + } + } }else{ mem0.nearlyFull = 0; } diff --git a/src/pragma.c b/src/pragma.c index 1dcd21400c..30be87544e 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -2064,6 +2064,27 @@ void sqlite3Pragma( break; } + /* + ** PRAGMA hard_heap_limit + ** PRAGMA hard_heap_limit = N + ** + ** Invoke sqlite3_hard_heap_limit64() to query or set the hard heap + ** limit. The hard heap limit can be activated or lowered by this + ** pragma, but not raised or deactivated. Only the + ** sqlite3_hard_heap_limit64() C-language API can raise or deactivate + ** the hard heap limit. This allows an application to set a heap limit + ** constraint that cannot be relaxed by an untrusted SQL script. + */ + case PragTyp_HARD_HEAP_LIMIT: { + sqlite3_int64 N; + if( zRight && sqlite3DecOrHexToI64(zRight, &N)==SQLITE_OK ){ + sqlite3_int64 iPrior = sqlite3_hard_heap_limit64(-1); + if( N>0 && (iPrior==0 || iPrior>N) ) sqlite3_hard_heap_limit64(N); + } + returnSingleInt(v, sqlite3_soft_heap_limit64(-1)); + break; + } + /* ** PRAGMA threads ** PRAGMA threads = N diff --git a/src/pragma.h b/src/pragma.h index c156e3a4fb..4e03fee65d 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -21,35 +21,36 @@ #define PragTyp_FOREIGN_KEY_CHECK 13 #define PragTyp_FOREIGN_KEY_LIST 14 #define PragTyp_FUNCTION_LIST 15 -#define PragTyp_INCREMENTAL_VACUUM 16 -#define PragTyp_INDEX_INFO 17 -#define PragTyp_INDEX_LIST 18 -#define PragTyp_INTEGRITY_CHECK 19 -#define PragTyp_JOURNAL_MODE 20 -#define PragTyp_JOURNAL_SIZE_LIMIT 21 -#define PragTyp_LOCK_PROXY_FILE 22 -#define PragTyp_LOCKING_MODE 23 -#define PragTyp_PAGE_COUNT 24 -#define PragTyp_MMAP_SIZE 25 -#define PragTyp_MODULE_LIST 26 -#define PragTyp_OPTIMIZE 27 -#define PragTyp_PAGE_SIZE 28 -#define PragTyp_PRAGMA_LIST 29 -#define PragTyp_SECURE_DELETE 30 -#define PragTyp_SHRINK_MEMORY 31 -#define PragTyp_SOFT_HEAP_LIMIT 32 -#define PragTyp_SYNCHRONOUS 33 -#define PragTyp_TABLE_INFO 34 -#define PragTyp_TEMP_STORE 35 -#define PragTyp_TEMP_STORE_DIRECTORY 36 -#define PragTyp_THREADS 37 -#define PragTyp_WAL_AUTOCHECKPOINT 38 -#define PragTyp_WAL_CHECKPOINT 39 -#define PragTyp_ACTIVATE_EXTENSIONS 40 -#define PragTyp_HEXKEY 41 -#define PragTyp_KEY 42 -#define PragTyp_LOCK_STATUS 43 -#define PragTyp_STATS 44 +#define PragTyp_HARD_HEAP_LIMIT 16 +#define PragTyp_INCREMENTAL_VACUUM 17 +#define PragTyp_INDEX_INFO 18 +#define PragTyp_INDEX_LIST 19 +#define PragTyp_INTEGRITY_CHECK 20 +#define PragTyp_JOURNAL_MODE 21 +#define PragTyp_JOURNAL_SIZE_LIMIT 22 +#define PragTyp_LOCK_PROXY_FILE 23 +#define PragTyp_LOCKING_MODE 24 +#define PragTyp_PAGE_COUNT 25 +#define PragTyp_MMAP_SIZE 26 +#define PragTyp_MODULE_LIST 27 +#define PragTyp_OPTIMIZE 28 +#define PragTyp_PAGE_SIZE 29 +#define PragTyp_PRAGMA_LIST 30 +#define PragTyp_SECURE_DELETE 31 +#define PragTyp_SHRINK_MEMORY 32 +#define PragTyp_SOFT_HEAP_LIMIT 33 +#define PragTyp_SYNCHRONOUS 34 +#define PragTyp_TABLE_INFO 35 +#define PragTyp_TEMP_STORE 36 +#define PragTyp_TEMP_STORE_DIRECTORY 37 +#define PragTyp_THREADS 38 +#define PragTyp_WAL_AUTOCHECKPOINT 39 +#define PragTyp_WAL_CHECKPOINT 40 +#define PragTyp_ACTIVATE_EXTENSIONS 41 +#define PragTyp_HEXKEY 42 +#define PragTyp_KEY 43 +#define PragTyp_LOCK_STATUS 44 +#define PragTyp_STATS 45 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -318,6 +319,11 @@ static const PragmaName aPragmaName[] = { /* iArg: */ 0 }, #endif #endif + {/* zName: */ "hard_heap_limit", + /* ePragTyp: */ PragTyp_HARD_HEAP_LIMIT, + /* ePragFlg: */ PragFlg_Result0, + /* ColNames: */ 0, 0, + /* iArg: */ 0 }, #if defined(SQLITE_HAS_CODEC) {/* zName: */ "hexkey", /* ePragTyp: */ PragTyp_HEXKEY, @@ -667,4 +673,4 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; -/* Number of pragmas: 62 on by default, 81 total. */ +/* Number of pragmas: 63 on by default, 82 total. */ diff --git a/src/sqlite.h.in b/src/sqlite.h.in index cf390ac372..8f89c5c097 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -6038,6 +6038,9 @@ int sqlite3_db_release_memory(sqlite3*); /* ** CAPI3REF: Impose A Limit On Heap Size ** +** These interfaces impose limits on the amount of heap memory that will be +** by all database connections within a single process. +** ** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the ** soft limit on the amount of heap memory that may be allocated by SQLite. ** ^SQLite strives to keep heap memory utilization below the soft heap @@ -6048,20 +6051,41 @@ int sqlite3_db_release_memory(sqlite3*); ** an [SQLITE_NOMEM] error. In other words, the soft heap limit ** is advisory only. ** -** ^The return value from sqlite3_soft_heap_limit64() is the size of -** the soft heap limit prior to the call, or negative in the case of an +** ^The sqlite3_hard_heap_limit64(N) interface sets a hard upper bound of +** N bytes on the amount of memory that will be allocated. ^The +** sqlite3_hard_heap_limit64(N) interface is similar to +** sqlite3_soft_heap_limit64(N) except that memory allocations will fail +** when the hard heap limit is reached. +** +** ^The return value from both sqlite3_soft_heap_limit64() and +** sqlite3_hard_heap_limit64() is the size of +** the heap limit prior to the call, or negative in the case of an ** error. ^If the argument N is negative -** then no change is made to the soft heap limit. Hence, the current -** size of the soft heap limit can be determined by invoking -** sqlite3_soft_heap_limit64() with a negative argument. +** then no change is made to the heap limit. Hence, the current +** size of heap limits can be determined by invoking +** sqlite3_soft_heap_limit64(-1) or sqlite3_hard_heap_limit(-1). ** -** ^If the argument N is zero then the soft heap limit is disabled. +** ^Setting the heap limits to zero disables the heap limiter mechanism. ** -** ^(The soft heap limit is not enforced in the current implementation +** ^The soft heap limit may not be greater than the hard heap limit. +** ^If the hard heap limit is enabled and if sqlite3_soft_heap_limit(N) +** is invoked with a value of N that is greater than the hard heap limit, +** the the soft heap limit is set to the value of the hard heap limit. +** ^The soft heap limit is automatically enabled whenever the hard heap +** limit is enabled. ^When sqlite3_hard_heap_limit64(N) is invoked and +** the soft heap limit is outside the range of 1..N, then the soft heap +** limit is set to N. ^Invoking sqlite3_soft_heap_limit64(0) when the +** hard heap limit is enabled makes the soft heap limit equal to the +** hard heap limit. +** +** The soft heap limits can also be adjusted using +** [PRAGMA soft_heap_limit] and [PRAGMA hard_heap_limit]. +** +** ^(The heap limits are not enforced in the current implementation ** if one or more of following conditions are true: ** ** )^ ** -** Beginning with SQLite [version 3.7.3] ([dateof:3.7.3]), -** the soft heap limit is enforced -** regardless of whether or not the [SQLITE_ENABLE_MEMORY_MANAGEMENT] -** compile-time option is invoked. With [SQLITE_ENABLE_MEMORY_MANAGEMENT], -** the soft heap limit is enforced on every memory allocation. Without -** [SQLITE_ENABLE_MEMORY_MANAGEMENT], the soft heap limit is only enforced -** when memory is allocated by the page cache. Testing suggests that because -** the page cache is the predominate memory user in SQLite, most -** applications will achieve adequate soft heap limit enforcement without -** the use of [SQLITE_ENABLE_MEMORY_MANAGEMENT]. -** -** The circumstances under which SQLite will enforce the soft heap limit may +** The circumstances under which SQLite will enforce the heap limits may ** changes in future releases of SQLite. */ sqlite3_int64 sqlite3_soft_heap_limit64(sqlite3_int64 N); +sqlite3_int64 sqlite3_hard_heap_limit64(sqlite3_int64 N); /* ** CAPI3REF: Deprecated Soft Heap Limit Interface diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index 088148b936..e750b90e23 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -322,6 +322,8 @@ struct sqlite3_api_routines { /* Version 3.28.0 and later */ int (*stmt_isexplain)(sqlite3_stmt*); int (*value_frombind)(sqlite3_value*); + /* Version 3.29.0 and later */ + sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); }; /* @@ -614,6 +616,8 @@ typedef int (*sqlite3_loadext_entry)( /* Version 3.28.0 and later */ #define sqlite3_stmt_isexplain sqlite3_api->isexplain #define sqlite3_value_frombind sqlite3_api->frombind +/* Version 3.29.0 and later */ +#define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) diff --git a/src/test1.c b/src/test1.c index dcbc9e613a..13b6d60150 100644 --- a/src/test1.c +++ b/src/test1.c @@ -5477,6 +5477,33 @@ static int SQLITE_TCLAPI test_soft_heap_limit( return TCL_OK; } +/* +** Usage: sqlite3_hard_heap_limit ?N? +** +** Query or set the hard heap limit for the current thread. The +** limit is only changed if the N is present. The previous limit +** is returned. +*/ +static int SQLITE_TCLAPI test_hard_heap_limit( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3_int64 amt; + Tcl_WideInt N = -1; + if( objc!=1 && objc!=2 ){ + Tcl_WrongNumArgs(interp, 1, objv, "?N?"); + return TCL_ERROR; + } + if( objc==2 ){ + if( Tcl_GetWideIntFromObj(interp, objv[1], &N) ) return TCL_ERROR; + } + amt = sqlite3_hard_heap_limit64(N); + Tcl_SetObjResult(interp, Tcl_NewWideIntObj(amt)); + return TCL_OK; +} + /* ** Usage: sqlite3_thread_cleanup ** @@ -7880,6 +7907,8 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "sqlite3_db_filename", test_db_filename, 0}, { "sqlite3_db_readonly", test_db_readonly, 0}, { "sqlite3_soft_heap_limit", test_soft_heap_limit, 0}, + { "sqlite3_soft_heap_limit64", test_soft_heap_limit, 0}, + { "sqlite3_hard_heap_limit64", test_hard_heap_limit, 0}, { "sqlite3_thread_cleanup", test_thread_cleanup, 0}, { "sqlite3_pager_refcounts", test_pager_refcounts, 0}, diff --git a/src/treeview.c b/src/treeview.c index 981ae2f692..a448e4c9fa 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -66,7 +66,7 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ va_start(ap, zFormat); sqlite3_str_vappendf(&acc, zFormat, ap); va_end(ap); - assert( acc.nChar>0 ); + assert( acc.nChar>0 || acc.accError ); sqlite3_str_append(&acc, "\n", 1); } sqlite3StrAccumFinish(&acc); diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index b236bdd5d5..8502572d03 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -405,6 +405,9 @@ set pragma_def { NAME: soft_heap_limit FLAG: Result0 + NAME: hard_heap_limit + FLAG: Result0 + NAME: threads FLAG: Result0 From 31f69626df74d7f5d011cee54da6a05acd32970c Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 5 Oct 2019 14:39:36 +0000 Subject: [PATCH 002/476] Performance optimization to the lookaside-memory disabling mechanism. FossilOrigin-Name: 17ce1c49cb0ed6fdd8c7c33431bc2afa217f1092c99b8dd608890a8e7aec7fb1 --- manifest | 29 +++++++++++++---------------- manifest.uuid | 2 +- src/analyze.c | 4 ++-- src/build.c | 4 ++-- src/fkey.c | 4 ++-- src/main.c | 3 +++ src/malloc.c | 42 ++++++++++++++++++++---------------------- src/parse.y | 3 ++- src/prepare.c | 3 ++- src/sqliteInt.h | 11 +++++++++++ 10 files changed, 58 insertions(+), 47 deletions(-) diff --git a/manifest b/manifest index 44f902f667..92ec8da7d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.30.0 -D 2019-10-04T15:03:17.190 +C Performance\soptimization\sto\sthe\slookaside-memory\sdisabling\smechanism. +D 2019-10-05T14:39:36.293 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -460,7 +460,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 5c3031e45e80f79d7d54c2d32dd3c44926544d4f6a478858bfe4ee3191570190 -F src/analyze.c a3f4ea45cdb4e9df78d4ea7beb87ec8a7a46f494173b641cd28512a40a97bff2 +F src/analyze.c 481d9cf34a3c70631ef5c416be70033e8d4cd85eb5ad1b37286aed8b0e29e889 F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c fdc4389b271bca30138db27dc2dfb9f52c2a7baaa44845aaf31a3c54663d837f F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 4814d55abb5553ac82763f6df9e185503d913f912cc0abea00965bb02912cc2d +F src/build.c 13de2fdabbabcf2e2aaf6443a049fb851d9d3170136c08345468e158ceea3dc6 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -479,7 +479,7 @@ F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c 1e9a6da29e3e13c14783891e867e19a54e2731c6a9b58d011cc4f3b4742a59e4 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 6b79f4c2447691aa9ac86e2a6a774b65f3b3dd053d4220a4893051a0de20f82e +F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -489,8 +489,8 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 40557ebd69f4115e7a273f9304a8ab637a47ce44f3c6923396928f023967b5e8 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d -F src/main.c 3851950717170ade4f6d718c18c6c7400ef5994c2a654679af2cff2ffd0fb2b9 -F src/malloc.c 0f9da2a66b230a5785af94b9672126845099b57b70a32c987d04ac28c69da990 +F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 +F src/malloc.c b7640bcf8992cf2e98447da0d27e372abdc4621a6760418bad6d1470f041ada9 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -514,13 +514,13 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 50bfcb34be7320dd0cb875021a93ae6451c8f0b083f21b71934a1a3a9108015a +F src/parse.y 19c8b65c87a5bec5efcb7eaf44e3178d860bc77baab4b03d7b53b08369ac83bf F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 F src/pragma.c b47bc7db02ab13d04c680aee424466b4e34f4ef5aa7b2e464876ec005806f98f F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 -F src/prepare.c 132484635a30f873ee7eccd47f93ed1932503863b93b28423b42332d81adffaf +F src/prepare.c c89734335c2bcd13c93afd08dd2961a92eda04fc1499f5505d7c730330bf5c20 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 @@ -530,7 +530,7 @@ F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e27 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 246740eab76d3ac87f856f8d979567089e8749104c12932143a6ba570e38e415 +F src/sqliteInt.h b70ac8e3e7e74838bc45dca1a3b2c3ef4b4e04a49036448bf462cfd657cc663f F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1846,10 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7f9a4b6015ac332a04d3e394a6b3210fc95253d8786a261178a5639cb8d9d987 -R f116075cb1c47b7928f41444f3803579 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.30.0 * +P c20a35336432025445f9f7e289d0cc3e4003fb17f45a4ce74c6269c407c6e09f +R 1bde973211db92f48ce6a8a5d375ada3 U drh -Z edadfb0c72633ac9bcd13396063b6815 +Z 45fc3168d771f200d11e6dc1ea8e3734 diff --git a/manifest.uuid b/manifest.uuid index 59c1946757..36442efac4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c20a35336432025445f9f7e289d0cc3e4003fb17f45a4ce74c6269c407c6e09f \ No newline at end of file +17ce1c49cb0ed6fdd8c7c33431bc2afa217f1092c99b8dd608890a8e7aec7fb1 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 1904b9be02..8f73853c85 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1854,9 +1854,9 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){ /* Load the statistics from the sqlite_stat4 table. */ #ifdef SQLITE_ENABLE_STAT4 if( rc==SQLITE_OK ){ - db->lookaside.bDisable++; + DisableLookaside; rc = loadStat4(db, sInfo.zDatabase); - db->lookaside.bDisable--; + EnableLookaside; } for(i=sqliteHashFirst(&pSchema->idxHash); i; i=sqliteHashNext(i)){ Index *pIdx = sqliteHashData(i); diff --git a/src/build.c b/src/build.c index a3d1abf042..e4f8d5e3c6 100644 --- a/src/build.c +++ b/src/build.c @@ -2447,7 +2447,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ n = pParse->nTab; sqlite3SrcListAssignCursors(pParse, pSel->pSrc); pTable->nCol = -1; - db->lookaside.bDisable++; + DisableLookaside; #ifndef SQLITE_OMIT_AUTHORIZATION xAuth = db->xAuth; db->xAuth = 0; @@ -2489,7 +2489,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ } sqlite3DeleteTable(db, pSelTab); sqlite3SelectDelete(db, pSel); - db->lookaside.bDisable--; + EnableLookaside; #ifndef SQLITE_OMIT_ALTERTABLE pParse->eParseMode = eParseMode; #endif diff --git a/src/fkey.c b/src/fkey.c index fc75023669..1b86692da7 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -1299,7 +1299,7 @@ static Trigger *fkActionTrigger( } /* Disable lookaside memory allocation */ - db->lookaside.bDisable++; + DisableLookaside; pTrigger = (Trigger *)sqlite3DbMallocZero(db, sizeof(Trigger) + /* struct Trigger */ @@ -1321,7 +1321,7 @@ static Trigger *fkActionTrigger( } /* Re-enable the lookaside buffer, if it was disabled earlier. */ - db->lookaside.bDisable--; + EnableLookaside; sqlite3ExprDelete(db, pWhere); sqlite3ExprDelete(db, pWhen); diff --git a/src/main.c b/src/main.c index 3ef3a3d9fb..39ab4a8fee 100644 --- a/src/main.c +++ b/src/main.c @@ -715,6 +715,7 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.pInit = 0; db->lookaside.pFree = 0; db->lookaside.sz = (u16)sz; + db->lookaside.szTrue = (u16)sz; if( pStart ){ int i; LookasideSlot *p; @@ -733,6 +734,7 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.pStart = db; db->lookaside.pEnd = db; db->lookaside.bDisable = 1; + db->lookaside.sz = 0; db->lookaside.bMalloced = 0; db->lookaside.nSlot = 0; } @@ -3064,6 +3066,7 @@ static int openDatabase( db->magic = SQLITE_MAGIC_BUSY; db->aDb = db->aDbStatic; db->lookaside.bDisable = 1; + db->lookaside.sz = 0; assert( sizeof(db->aLimit)==sizeof(aHardLimit) ); memcpy(db->aLimit, aHardLimit, sizeof(db->aLimit)); diff --git a/src/malloc.c b/src/malloc.c index 559e7259ce..8a2b234853 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -298,7 +298,7 @@ int sqlite3DbMallocSize(sqlite3 *db, void *p){ return sqlite3GlobalConfig.m.xSize(p); }else{ assert( sqlite3_mutex_held(db->mutex) ); - return db->lookaside.sz; + return db->lookaside.szTrue; } } sqlite3_uint64 sqlite3_msize(void *p){ @@ -350,7 +350,7 @@ void sqlite3DbFreeNN(sqlite3 *db, void *p){ LookasideSlot *pBuf = (LookasideSlot*)p; #ifdef SQLITE_DEBUG /* Trash all content in the buffer being freed */ - memset(p, 0xaa, db->lookaside.sz); + memset(p, 0xaa, db->lookaside.szTrue); #endif pBuf->pNext = db->lookaside.pFree; db->lookaside.pFree = pBuf; @@ -510,23 +510,21 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ assert( db!=0 ); assert( sqlite3_mutex_held(db->mutex) ); assert( db->pnBytesFreed==0 ); - if( db->lookaside.bDisable==0 ){ - assert( db->mallocFailed==0 ); - if( n>db->lookaside.sz ){ - db->lookaside.anStat[1]++; - }else if( (pBuf = db->lookaside.pFree)!=0 ){ - db->lookaside.pFree = pBuf->pNext; - db->lookaside.anStat[0]++; - return (void*)pBuf; - }else if( (pBuf = db->lookaside.pInit)!=0 ){ - db->lookaside.pInit = pBuf->pNext; - db->lookaside.anStat[0]++; - return (void*)pBuf; - }else{ - db->lookaside.anStat[2]++; + if( n>db->lookaside.sz ){ + if( db->lookaside.bDisable ){ + return db->mallocFailed ? 0 : dbMallocRawFinish(db, n); } - }else if( db->mallocFailed ){ - return 0; + db->lookaside.anStat[1]++; + }else if( (pBuf = db->lookaside.pFree)!=0 ){ + db->lookaside.pFree = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else if( (pBuf = db->lookaside.pInit)!=0 ){ + db->lookaside.pInit = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else{ + db->lookaside.anStat[2]++; } #else assert( db!=0 ); @@ -550,7 +548,7 @@ void *sqlite3DbRealloc(sqlite3 *db, void *p, u64 n){ assert( db!=0 ); if( p==0 ) return sqlite3DbMallocRawNN(db, n); assert( sqlite3_mutex_held(db->mutex) ); - if( isLookaside(db,p) && n<=db->lookaside.sz ) return p; + if( isLookaside(db,p) && n<=db->lookaside.szTrue ) return p; return dbReallocFinish(db, p, n); } static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ @@ -561,7 +559,7 @@ static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ if( isLookaside(db, p) ){ pNew = sqlite3DbMallocRawNN(db, n); if( pNew ){ - memcpy(pNew, p, db->lookaside.sz); + memcpy(pNew, p, db->lookaside.szTrue); sqlite3DbFree(db, p); } }else{ @@ -660,7 +658,7 @@ void sqlite3OomFault(sqlite3 *db){ if( db->nVdbeExec>0 ){ db->u1.isInterrupted = 1; } - db->lookaside.bDisable++; + DisableLookaside; if( db->pParse ){ db->pParse->rc = SQLITE_NOMEM_BKPT; } @@ -679,7 +677,7 @@ void sqlite3OomClear(sqlite3 *db){ db->mallocFailed = 0; db->u1.isInterrupted = 0; assert( db->lookaside.bDisable>0 ); - db->lookaside.bDisable--; + EnableLookaside; } } diff --git a/src/parse.y b/src/parse.y index 2b69dd596d..7d31dda405 100644 --- a/src/parse.y +++ b/src/parse.y @@ -106,8 +106,9 @@ struct FrameBound { int eType; Expr *pExpr; }; ** shared across database connections. */ static void disableLookaside(Parse *pParse){ + sqlite3 *db = pParse->db; pParse->disableLookaside++; - pParse->db->lookaside.bDisable++; + DisableLookaside; } } // end %include diff --git a/src/prepare.c b/src/prepare.c index 70c162658a..8fdc1ff450 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -527,6 +527,7 @@ void sqlite3ParserReset(Parse *pParse){ if( db ){ assert( db->lookaside.bDisable >= pParse->disableLookaside ); db->lookaside.bDisable -= pParse->disableLookaside; + db->lookaside.sz = db->lookaside.bDisable ? 0 : db->lookaside.szTrue; } pParse->disableLookaside = 0; } @@ -560,7 +561,7 @@ static int sqlite3Prepare( */ if( prepFlags & SQLITE_PREPARE_PERSISTENT ){ sParse.disableLookaside++; - db->lookaside.bDisable++; + DisableLookaside; } sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 9e8c864c62..9b8578ba5d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1271,10 +1271,17 @@ struct Schema { ** is shared by multiple database connections. Therefore, while parsing ** schema information, the Lookaside.bEnabled flag is cleared so that ** lookaside allocations are not used to construct the schema objects. +** +** New lookaside allocations are only allowed if bDisable==0. When +** bDisable is greater than zero, sz is set to zero which effectively +** disables lookaside without adding a new test for the bDisable flag +** in a performance-critical path. sz should be set by to szTrue whenever +** bDisable changes back to zero. */ struct Lookaside { u32 bDisable; /* Only operate the lookaside when zero */ u16 sz; /* Size of each buffer in bytes */ + u16 szTrue; /* True value of sz, even if disabled */ u8 bMalloced; /* True if pStart obtained from sqlite3_malloc() */ u32 nSlot; /* Number of lookaside slots allocated */ u32 anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ @@ -1287,6 +1294,10 @@ struct LookasideSlot { LookasideSlot *pNext; /* Next buffer in the list of free buffers */ }; +#define DisableLookaside db->lookaside.bDisable++;db->lookaside.sz=0 +#define EnableLookaside db->lookaside.bDisable--;\ + db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue + /* ** A hash table for built-in function definitions. (Application-defined ** functions use a regular table table from hash.h.) From 4d29448114c5d99e1e187bf3adcdce7d6479d6f8 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 5 Oct 2019 15:28:24 +0000 Subject: [PATCH 003/476] Reorder two comparisons for a small performance gain in OP_Transaction. FossilOrigin-Name: d7667f6560318272c8b35b478e29b0ed134105dfd119a2fd53ef0490442c60cc --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 92ec8da7d2..d93a19aca2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sto\sthe\slookaside-memory\sdisabling\smechanism. -D 2019-10-05T14:39:36.293 +C Reorder\stwo\scomparisons\sfor\sa\ssmall\sperformance\sgain\sin\sOP_Transaction. +D 2019-10-05T15:28:24.829 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -597,7 +597,7 @@ F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 7f43ed8e055a4290535d2e4520d33f0ac6cc00ef76a0c099e4c6bd85be74a6b9 +F src/vdbe.c c988e4e237697232804c4e59408ebe8112c24620b5504bea3942c9280a9de588 F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c20a35336432025445f9f7e289d0cc3e4003fb17f45a4ce74c6269c407c6e09f -R 1bde973211db92f48ce6a8a5d375ada3 +P 17ce1c49cb0ed6fdd8c7c33431bc2afa217f1092c99b8dd608890a8e7aec7fb1 +R 96153477592d856a7ee9ca0882de8465 U drh -Z 45fc3168d771f200d11e6dc1ea8e3734 +Z 581c59c422f280ccd739f302a8c2cc14 diff --git a/manifest.uuid b/manifest.uuid index 36442efac4..5710ac9086 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -17ce1c49cb0ed6fdd8c7c33431bc2afa217f1092c99b8dd608890a8e7aec7fb1 \ No newline at end of file +d7667f6560318272c8b35b478e29b0ed134105dfd119a2fd53ef0490442c60cc \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 40d83265e5..c11e101ec0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3456,7 +3456,8 @@ case OP_Transaction: { goto abort_due_to_error; } - if( pOp->p2 && p->usesStmtJournal + if( p->usesStmtJournal + && pOp->p2 && (db->autoCommit==0 || db->nVdbeRead>1) ){ assert( sqlite3BtreeIsInTrans(pBt) ); From a22d2fca3315822f16c20cdb3738ac637f31b44a Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 5 Oct 2019 18:33:25 +0000 Subject: [PATCH 004/476] Call sqlite3Prepare() directly, rather than going through sqlite3_prepare(), when processing the sqlite_master.sql column for a schema. FossilOrigin-Name: cc49380ea76a4a05843d3a0bdfb925464dc9d72c33cf5ab5243dd07d161ad038 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/prepare.c | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d93a19aca2..8a81119ef3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reorder\stwo\scomparisons\sfor\sa\ssmall\sperformance\sgain\sin\sOP_Transaction. -D 2019-10-05T15:28:24.829 +C Call\ssqlite3Prepare()\sdirectly,\srather\sthan\sgoing\sthrough\ssqlite3_prepare(),\nwhen\sprocessing\sthe\ssqlite_master.sql\scolumn\sfor\sa\sschema. +D 2019-10-05T18:33:25.104 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 F src/pragma.c b47bc7db02ab13d04c680aee424466b4e34f4ef5aa7b2e464876ec005806f98f F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 -F src/prepare.c c89734335c2bcd13c93afd08dd2961a92eda04fc1499f5505d7c730330bf5c20 +F src/prepare.c 53af23e89f42d3e5a489fc8af4449dee90fe81a1185bbb9c08567a0c814176d7 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 17ce1c49cb0ed6fdd8c7c33431bc2afa217f1092c99b8dd608890a8e7aec7fb1 -R 96153477592d856a7ee9ca0882de8465 +P d7667f6560318272c8b35b478e29b0ed134105dfd119a2fd53ef0490442c60cc +R 565d97aaa1d7e5deedf7835271150a85 U drh -Z 581c59c422f280ccd739f302a8c2cc14 +Z 0cd9235f242c7ffa50a8c935c0c588ef diff --git a/manifest.uuid b/manifest.uuid index 5710ac9086..e15ed0afe6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7667f6560318272c8b35b478e29b0ed134105dfd119a2fd53ef0490442c60cc \ No newline at end of file +cc49380ea76a4a05843d3a0bdfb925464dc9d72c33cf5ab5243dd07d161ad038 \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index 8fdc1ff450..c9544fe06e 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -57,6 +57,18 @@ int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ return 0; } +/* forward declaration */ +static int sqlite3Prepare( + sqlite3 *db, /* Database handle. */ + const char *zSql, /* UTF-8 encoded SQL statement. */ + int nBytes, /* Length of zSql in bytes. */ + u32 prepFlags, /* Zero or more SQLITE_PREPARE_* flags */ + Vdbe *pReprepare, /* VM being reprepared */ + sqlite3_stmt **ppStmt, /* OUT: A pointer to the prepared statement */ + const char **pzTail /* OUT: End of parsed string */ +); + + /* ** This is the callback routine for the code that initializes the ** database. See sqlite3Init() below for additional information. @@ -106,7 +118,8 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ db->init.newTnum = sqlite3Atoi(argv[3]); db->init.orphanTrigger = 0; db->init.azInit = argv; - TESTONLY(rcp = ) sqlite3_prepare(db, argv[4], -1, &pStmt, 0); + pStmt = 0; + TESTONLY(rcp = ) sqlite3Prepare(db, argv[4], -1, 0, 0, &pStmt, 0); rc = db->errCode; assert( (rc&0xFF)==(rcp&0xFF) ); db->init.iDb = saved_iDb; From 1de92a64cd0413f4f8faae20f8af118eb5cb6f53 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 5 Oct 2019 19:24:52 +0000 Subject: [PATCH 005/476] Optimization to sqlite3VtabUnlockList() for the common case when there is no work to do. FossilOrigin-Name: fc8d45086dc2bcb9bce756088e99e63cbeedf9129139fb0e6a48b43c4f502180 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vtab.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8a81119ef3..360a16ff08 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Call\ssqlite3Prepare()\sdirectly,\srather\sthan\sgoing\sthrough\ssqlite3_prepare(),\nwhen\sprocessing\sthe\ssqlite_master.sql\scolumn\sfor\sa\sschema. -D 2019-10-05T18:33:25.104 +C Optimization\sto\ssqlite3VtabUnlockList()\sfor\sthe\scommon\scase\swhen\sthere\nis\sno\swork\sto\sdo. +D 2019-10-05T19:24:52.240 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -606,7 +606,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c da75f505aba230060ce6472605a4aa6494f73eeb1071e1cc2643c3d4035e671b F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vtab.c 5a0b7193d586991b3db30e343d6b59959906bfe8658a6a0a85709b20ca50bb49 +F src/vtab.c 27998d5d738069f2cee981620a1f224558494ce06799d14dcb5e6f34b4cdcdd1 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d7667f6560318272c8b35b478e29b0ed134105dfd119a2fd53ef0490442c60cc -R 565d97aaa1d7e5deedf7835271150a85 +P cc49380ea76a4a05843d3a0bdfb925464dc9d72c33cf5ab5243dd07d161ad038 +R 90d33cb7052902d978e92e7d394d1d19 U drh -Z 0cd9235f242c7ffa50a8c935c0c588ef +Z f4e7052da6ef9e8655bcdb452b6237f4 diff --git a/manifest.uuid b/manifest.uuid index e15ed0afe6..0074b1651d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc49380ea76a4a05843d3a0bdfb925464dc9d72c33cf5ab5243dd07d161ad038 \ No newline at end of file +fc8d45086dc2bcb9bce756088e99e63cbeedf9129139fb0e6a48b43c4f502180 \ No newline at end of file diff --git a/src/vtab.c b/src/vtab.c index 085290914b..33a38021f5 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -305,12 +305,12 @@ void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ */ void sqlite3VtabUnlockList(sqlite3 *db){ VTable *p = db->pDisconnect; - db->pDisconnect = 0; assert( sqlite3BtreeHoldsAllMutexes(db) ); assert( sqlite3_mutex_held(db->mutex) ); if( p ){ + db->pDisconnect = 0; sqlite3ExpirePreparedStatements(db, 0); do { VTable *pNext = p->pNext; From 705e73344ed81ea306ea6df8b94fc6b623319def Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 5 Oct 2019 19:53:21 +0000 Subject: [PATCH 006/476] Omit the check for conflicting shared-cache locks in sqlite3Prepare() if the database connection uses no shared cache. We might be able to go back and remove this code completely, due to the newer Schema.iGeneration logic, but that will take more analysis. This check-in gives the speed benefit but not the reduction in code size. FossilOrigin-Name: 0b73a09270dfafb27f8d1762b547ef8178c9da66f45e7153ff0b76272dfa92f5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/prepare.c | 22 ++++++++++++---------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 360a16ff08..f14c46fbba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Optimization\sto\ssqlite3VtabUnlockList()\sfor\sthe\scommon\scase\swhen\sthere\nis\sno\swork\sto\sdo. -D 2019-10-05T19:24:52.240 +C Omit\sthe\scheck\sfor\sconflicting\sshared-cache\slocks\sin\ssqlite3Prepare()\sif\sthe\ndatabase\sconnection\suses\sno\sshared\scache.\s\sWe\smight\sbe\sable\sto\sgo\sback\sand\nremove\sthis\scode\scompletely,\sdue\sto\sthe\snewer\sSchema.iGeneration\slogic,\sbut\nthat\swill\stake\smore\sanalysis.\s\sThis\scheck-in\sgives\sthe\sspeed\sbenefit\sbut\snot\nthe\sreduction\sin\scode\ssize. +D 2019-10-05T19:53:21.900 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 F src/pragma.c b47bc7db02ab13d04c680aee424466b4e34f4ef5aa7b2e464876ec005806f98f F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 -F src/prepare.c 53af23e89f42d3e5a489fc8af4449dee90fe81a1185bbb9c08567a0c814176d7 +F src/prepare.c fc245d2049e5e9e76738cd403e63c9832ff61c706d19607d2b62a51f1747609c F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cc49380ea76a4a05843d3a0bdfb925464dc9d72c33cf5ab5243dd07d161ad038 -R 90d33cb7052902d978e92e7d394d1d19 +P fc8d45086dc2bcb9bce756088e99e63cbeedf9129139fb0e6a48b43c4f502180 +R 4347c46389181ab98e1ca993ae5d2560 U drh -Z f4e7052da6ef9e8655bcdb452b6237f4 +Z 36eb308ab97c3a3dee1bd800aab329c1 diff --git a/manifest.uuid b/manifest.uuid index 0074b1651d..fbdd95bddc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fc8d45086dc2bcb9bce756088e99e63cbeedf9129139fb0e6a48b43c4f502180 \ No newline at end of file +0b73a09270dfafb27f8d1762b547ef8178c9da66f45e7153ff0b76272dfa92f5 \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index c9544fe06e..c6709a3d3d 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -601,16 +601,18 @@ static int sqlite3Prepare( ** but it does *not* override schema lock detection, so this all still ** works even if READ_UNCOMMITTED is set. */ - for(i=0; inDb; i++) { - Btree *pBt = db->aDb[i].pBt; - if( pBt ){ - assert( sqlite3BtreeHoldsMutex(pBt) ); - rc = sqlite3BtreeSchemaLocked(pBt); - if( rc ){ - const char *zDb = db->aDb[i].zDbSName; - sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); - testcase( db->flags & SQLITE_ReadUncommit ); - goto end_prepare; + if( !db->noSharedCache ){ + for(i=0; inDb; i++) { + Btree *pBt = db->aDb[i].pBt; + if( pBt ){ + assert( sqlite3BtreeHoldsMutex(pBt) ); + rc = sqlite3BtreeSchemaLocked(pBt); + if( rc ){ + const char *zDb = db->aDb[i].zDbSName; + sqlite3ErrorWithMsg(db, rc, "database schema is locked: %s", zDb); + testcase( db->flags & SQLITE_ReadUncommit ); + goto end_prepare; + } } } } From b29ef5ef032e6da71785b49709a967737be352c4 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 7 Oct 2019 01:05:57 +0000 Subject: [PATCH 007/476] Fix the OP_SeekRowid opcode so that it works correctly with a Real argument without damaging the value in the register that is the argument. Ticket [b2d4edaffdc156cc]. Test cases in TH3. FossilOrigin-Name: 3cde82c86b963fa75192907d548febd3882c7d8fc7daf1903fadd5ca46623be1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 25 ++++++++++++++----------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index f14c46fbba..7e39e5d086 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\scheck\sfor\sconflicting\sshared-cache\slocks\sin\ssqlite3Prepare()\sif\sthe\ndatabase\sconnection\suses\sno\sshared\scache.\s\sWe\smight\sbe\sable\sto\sgo\sback\sand\nremove\sthis\scode\scompletely,\sdue\sto\sthe\snewer\sSchema.iGeneration\slogic,\sbut\nthat\swill\stake\smore\sanalysis.\s\sThis\scheck-in\sgives\sthe\sspeed\sbenefit\sbut\snot\nthe\sreduction\sin\scode\ssize. -D 2019-10-05T19:53:21.900 +C Fix\sthe\sOP_SeekRowid\sopcode\sso\sthat\sit\sworks\scorrectly\swith\sa\sReal\sargument\nwithout\sdamaging\sthe\svalue\sin\sthe\sregister\sthat\sis\sthe\sargument.\nTicket\s[b2d4edaffdc156cc].\s\sTest\scases\sin\sTH3. +D 2019-10-07T01:05:57.547 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -597,7 +597,7 @@ F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c c988e4e237697232804c4e59408ebe8112c24620b5504bea3942c9280a9de588 +F src/vdbe.c 6df0a99dfbdd9dec542a94f06dd9a8a575acc87047937b2b801ac9d68eb3c96f F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fc8d45086dc2bcb9bce756088e99e63cbeedf9129139fb0e6a48b43c4f502180 -R 4347c46389181ab98e1ca993ae5d2560 +P 0b73a09270dfafb27f8d1762b547ef8178c9da66f45e7153ff0b76272dfa92f5 +R e6de42fa154e4ab1e333f543b12bcf01 U drh -Z 36eb308ab97c3a3dee1bd800aab329c1 +Z cb13c52744b53be5d17143f1f2ff1518 diff --git a/manifest.uuid b/manifest.uuid index fbdd95bddc..d23bab475e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b73a09270dfafb27f8d1762b547ef8178c9da66f45e7153ff0b76272dfa92f5 \ No newline at end of file +3cde82c86b963fa75192907d548febd3882c7d8fc7daf1903fadd5ca46623be1 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index c11e101ec0..eeef24b49f 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4539,23 +4539,27 @@ case OP_SeekRowid: { /* jump, in3 */ pIn3 = &aMem[pOp->p3]; testcase( pIn3->flags & MEM_Int ); testcase( pIn3->flags & MEM_IntReal ); + testcase( pIn3->flags & MEM_Real ); + testcase( (pIn3->flags & (MEM_Str|MEM_Int))==MEM_Str ); if( (pIn3->flags & (MEM_Int|MEM_IntReal))==0 ){ - /* Make sure pIn3->u.i contains a valid integer representation of - ** the key value, but do not change the datatype of the register, as - ** other parts of the perpared statement might be depending on the - ** current datatype. */ - u16 origFlags = pIn3->flags; - int isNotInt; - applyAffinity(pIn3, SQLITE_AFF_NUMERIC, encoding); - isNotInt = (pIn3->flags & MEM_Int)==0; - pIn3->flags = origFlags; - if( isNotInt ) goto jump_to_p2; + /* If pIn3->u.i does not contain an integer, compute iKey as the + ** integer value of pIn3. Jump to P2 if pIn3 cannot be converted + ** into an integer without loss of information. Take care to avoid + ** changing the datatype of pIn3, however, as it is used by other + ** parts of the prepared statement. */ + Mem x = pIn3[0]; + applyAffinity(&x, SQLITE_AFF_NUMERIC, encoding); + if( (x.flags & MEM_Int)==0 ) goto jump_to_p2; + iKey = x.u.i; + goto notExistsWithKey; } /* Fall through into OP_NotExists */ case OP_NotExists: /* jump, in3 */ pIn3 = &aMem[pOp->p3]; assert( (pIn3->flags & MEM_Int)!=0 || pOp->opcode==OP_SeekRowid ); assert( pOp->p1>=0 && pOp->p1nCursor ); + iKey = pIn3->u.i; +notExistsWithKey: pC = p->apCsr[pOp->p1]; assert( pC!=0 ); #ifdef SQLITE_DEBUG @@ -4566,7 +4570,6 @@ case OP_NotExists: /* jump, in3 */ pCrsr = pC->uc.pCursor; assert( pCrsr!=0 ); res = 0; - iKey = pIn3->u.i; rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res); assert( rc==SQLITE_OK || res==0 ); pC->movetoTarget = iKey; /* Used by OP_Delete */ From 093589de5e339d6ad39e06b79eb9305fa2112127 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 7 Oct 2019 13:26:58 +0000 Subject: [PATCH 008/476] Fix a faulty assert() statement in the sqlite3VdbeMemExpandBlob() routine. FossilOrigin-Name: 69a26eade2f92029e722a5a654214b1e2a3fc7ed497ce9aa5a7dce944f90e502 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeInt.h | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7e39e5d086..43bb0be000 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_SeekRowid\sopcode\sso\sthat\sit\sworks\scorrectly\swith\sa\sReal\sargument\nwithout\sdamaging\sthe\svalue\sin\sthe\sregister\sthat\sis\sthe\sargument.\nTicket\s[b2d4edaffdc156cc].\s\sTest\scases\sin\sTH3. -D 2019-10-07T01:05:57.547 +C Fix\sa\sfaulty\sassert()\sstatement\sin\sthe\ssqlite3VdbeMemExpandBlob()\sroutine. +D 2019-10-07T13:26:58.759 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 6df0a99dfbdd9dec542a94f06dd9a8a575acc87047937b2b801ac9d68eb3c96f F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf -F src/vdbeInt.h e95de5129124d77f01439e6635012adfaf23c0017bff47296126143cf18bd0c6 +F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e F src/vdbeaux.c 7ccf418141df1c7f87b0d69510523ae522abbe47c769d1b2c15120e88fac3eb9 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0b73a09270dfafb27f8d1762b547ef8178c9da66f45e7153ff0b76272dfa92f5 -R e6de42fa154e4ab1e333f543b12bcf01 +P 3cde82c86b963fa75192907d548febd3882c7d8fc7daf1903fadd5ca46623be1 +R 73df9511ada20723ed01dfaf44dc9280 U drh -Z cb13c52744b53be5d17143f1f2ff1518 +Z 8b3be29b1e469069a86d0b588261ad50 diff --git a/manifest.uuid b/manifest.uuid index d23bab475e..c676d3fa32 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3cde82c86b963fa75192907d548febd3882c7d8fc7daf1903fadd5ca46623be1 \ No newline at end of file +69a26eade2f92029e722a5a654214b1e2a3fc7ed497ce9aa5a7dce944f90e502 \ No newline at end of file diff --git a/src/vdbeInt.h b/src/vdbeInt.h index bd035535ab..4775f406c2 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -286,7 +286,8 @@ struct sqlite3_value { ** True if Mem X is a NULL-nochng type. */ #define MemNullNochng(X) \ - ((X)->flags==(MEM_Null|MEM_Zero) && (X)->n==0 && (X)->u.nZero==0) + (((X)->flags&MEM_TypeMask)==(MEM_Null|MEM_Zero) \ + && (X)->n==0 && (X)->u.nZero==0) /* ** Return true if a memory cell is not marked as invalid. This macro From 8451e1fa27815a1f63ad90aca751469db120973f Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 7 Oct 2019 13:46:43 +0000 Subject: [PATCH 009/476] Add a test case for the assert() fix in the previous commit. FossilOrigin-Name: 32fba11ab72f6300391267eaad64e92fa767c289029e668e4bd6c9165acf1487 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/corruptL.test | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 43bb0be000..60da30f028 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfaulty\sassert()\sstatement\sin\sthe\ssqlite3VdbeMemExpandBlob()\sroutine. -D 2019-10-07T13:26:58.759 +C Add\sa\stest\scase\sfor\sthe\sassert()\sfix\sin\sthe\sprevious\scommit. +D 2019-10-07T13:46:43.787 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -769,7 +769,7 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test dfad96373bf9264d73039315ea6013994b90bf6776847adc7ec06b6fad3c04b2 +F test/corruptL.test a22a7bbf8da7603960f0bfcc62a68d1c3c41963786bd832ff804ba5e2458fb9c F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3cde82c86b963fa75192907d548febd3882c7d8fc7daf1903fadd5ca46623be1 -R 73df9511ada20723ed01dfaf44dc9280 -U drh -Z 8b3be29b1e469069a86d0b588261ad50 +P 69a26eade2f92029e722a5a654214b1e2a3fc7ed497ce9aa5a7dce944f90e502 +R fc0a42027c5e123c7e9c334ffeb0817d +U dan +Z 3aa98325281de1e7b28033dd15b881b8 diff --git a/manifest.uuid b/manifest.uuid index c676d3fa32..87a31bf44a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -69a26eade2f92029e722a5a654214b1e2a3fc7ed497ce9aa5a7dce944f90e502 \ No newline at end of file +32fba11ab72f6300391267eaad64e92fa767c289029e668e4bd6c9165acf1487 \ No newline at end of file diff --git a/test/corruptL.test b/test/corruptL.test index b0ad66db44..58fa7bc4eb 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -1071,4 +1071,43 @@ do_catchsql_test 11.1 { DELETE FROM t3 WHERE x IN (SELECT x FROM t4); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 12.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 12288 pagesize 4096 filename crash-e6d070858a3a85.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 00 .....@ ........ +| 96: 00 00 00 00 0d 00 00 00 02 0f 8f 00 0f bf 0f 8f ................ +| 3968: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2e ................ +| 3984: 02 06 17 15 11 01 45 69 6e 64 65 78 74 31 63 62 ......Eindext1cb +| 4000: 74 31 03 43 52 45 41 54 45 20 49 4e 44 45 58 20 t1.CREATE INDEX +| 4016: 74 31 63 62 20 4f 4e 20 74 31 28 63 2c 62 29 3f t1cb ON t1(c,b)? +| 4032: 01 06 17 11 11 01 6b 74 61 62 6c 65 74 31 74 31 ......ktablet1t1 +| 4048: 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 .CREATE TABLE t1 +| 4064: 28 61 20 49 4e 54 2c 20 62 20 49 4e 54 2c 20 43 (a INT, b INT, C +| 4080: 20 49 4e 54 20 44 45 46 41 55 4c 54 20 31 36 29 INT DEFAULT 16) +| page 2 offset 4096 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4000: 00 00 00 00 00 00 00 00 07 0b 04 01 01 01 63 63 ..............cc +| 4016: 11 05 0a 04 00 00 01 11 05 09 04 08 08 01 0f 05 ................ +| 4032: 08 04 00 00 01 01 56 07 04 01 08 01 07 10 07 06 ......V......... +| 4048: 14 01 01 01 06 08 10 06 05 04 f5 00 01 05 10 07 ................ +| 4064: 04 04 01 01 01 04 03 10 06 03 04 01 09 01 03 10 ................ +| 4080: 06 02 04 01 00 01 02 10 06 01 04 09 01 01 02 10 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 0b 0f b0 00 0f f9 0f f2 0f eb 0f e4 ................ +| 16: 0f dd 0f d6 0f 9f 0f c7 0f be 00 00 00 00 00 00 ................ +| 4016: 07 04 01 01 01 11 e2 0b 06 04 91 00 01 11 0a 07 ................ +| 4032: 04 01 01 01 10 08 06 07 04 01 01 01 10 04 04 06 ................ +| 4048: 04 01 01 09 10 02 06 04 01 0a 01 10 00 00 00 00 ................ +| end crash-e6d070858a3a85.db +}]} {} + +do_catchsql_test 12.1 { + SELECT CAST((SELECT b FROM t1 WHERE 16=c) AS int) FROM t1 WHERE 16=c; +} {1 {database disk image is malformed}} + finish_test From 03e025e21716751fb69ec6f5b93735bce3612e37 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 7 Oct 2019 18:43:21 +0000 Subject: [PATCH 010/476] Fix a problem with running ALTER TABLE ADD COLUMN statements within a transaction that writes to one or more virtual tables. FossilOrigin-Name: 31e85fbbc4cfd09a98b4a6dc6624f863816f376c6a4eef1fafc657c8e1abbc36 --- ext/fts5/test/fts5misc.test | 48 +++++++++++++++++++++++++++++++++++++ manifest | 16 ++++++------- manifest.uuid | 2 +- src/alter.c | 1 + src/vdbeaux.c | 2 +- 5 files changed, 59 insertions(+), 10 deletions(-) diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index 009f578dce..8d3742417a 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -59,5 +59,53 @@ do_catchsql_test 1.3.3 { WHERE rank = (SELECT highlight(t1, 4, '', '') FROM t1('*reads')); } {1 {no such cursor: 1}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 2.0 { + CREATE TABLE t0(c0); + CREATE VIRTUAL TABLE vt0 USING fts5(c0); +} +do_execsql_test 2.1.1 { + BEGIN TRANSACTION; + INSERT INTO vt0(c0) VALUES ('xyz'); +} +do_execsql_test 2.1.2 { + ALTER TABLE t0 ADD COLUMN c5; +} +do_execsql_test 2.1.3 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} +do_execsql_test 2.1.4 { + INSERT INTO vt0(c0) VALUES ('abc'); + COMMIT +} +do_execsql_test 2.1.5 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + +reset_db +do_execsql_test 2.2.1 { + CREATE TABLE t0(c0); + CREATE VIRTUAL TABLE vt0 USING fts5(c0); + BEGIN TRANSACTION; + INSERT INTO vt0(c0) VALUES ('xyz'); +} + +breakpoint +do_execsql_test 2.2.2 { + ALTER TABLE t0 RENAME TO t1; +} +do_execsql_test 2.2.3 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} +do_execsql_test 2.2.4 { + INSERT INTO vt0(c0) VALUES ('abc'); + COMMIT; +} +do_execsql_test 2.2.5 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + + finish_test diff --git a/manifest b/manifest index 60da30f028..dc9672710a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\stest\scase\sfor\sthe\sassert()\sfix\sin\sthe\sprevious\scommit. -D 2019-10-07T13:46:43.787 +C Fix\sa\sproblem\swith\srunning\sALTER\sTABLE\sADD\sCOLUMN\sstatements\swithin\sa\stransaction\sthat\swrites\sto\sone\sor\smore\svirtual\stables. +D 2019-10-07T18:43:21.695 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 5becd134b66f7370042968a2b127b92ea7748e249f16cb6a996f450812e89eec +F ext/fts5/test/fts5misc.test 9a7263add42d55b8e22fc6ebbee2904390e923f4aa11d05fffaf617032f95db5 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -459,7 +459,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 5c3031e45e80f79d7d54c2d32dd3c44926544d4f6a478858bfe4ee3191570190 +F src/alter.c 5773b28684a001dcab45adcefa3cbf5e846335c0c8fee0da8a3770cb0123bba8 F src/analyze.c 481d9cf34a3c70631ef5c416be70033e8d4cd85eb5ad1b37286aed8b0e29e889 F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -601,7 +601,7 @@ F src/vdbe.c 6df0a99dfbdd9dec542a94f06dd9a8a575acc87047937b2b801ac9d68eb3c96f F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e -F src/vdbeaux.c 7ccf418141df1c7f87b0d69510523ae522abbe47c769d1b2c15120e88fac3eb9 +F src/vdbeaux.c d17dfbf1e03ef706cad9e2076c7f2354882c191a84e73e00c69c50bb7823e5ce F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c da75f505aba230060ce6472605a4aa6494f73eeb1071e1cc2643c3d4035e671b @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 69a26eade2f92029e722a5a654214b1e2a3fc7ed497ce9aa5a7dce944f90e502 -R fc0a42027c5e123c7e9c334ffeb0817d +P 32fba11ab72f6300391267eaad64e92fa767c289029e668e4bd6c9165acf1487 +R db964bd8afa744d576868ce0a446ba2a U dan -Z 3aa98325281de1e7b28033dd15b881b8 +Z 5a81872aeea20d6403e12d21521ec57b diff --git a/manifest.uuid b/manifest.uuid index 87a31bf44a..425c54f1e3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32fba11ab72f6300391267eaad64e92fa767c289029e668e4bd6c9165acf1487 \ No newline at end of file +31e85fbbc4cfd09a98b4a6dc6624f863816f376c6a4eef1fafc657c8e1abbc36 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 8c3fefd1bf..9d02d3835a 100644 --- a/src/alter.c +++ b/src/alter.c @@ -435,6 +435,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ goto exit_begin_add_column; } + sqlite3MayAbort(pParse); assert( pTab->addColOffset>0 ); iDb = sqlite3SchemaToIndex(db, pTab->pSchema); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index fb2dd9039a..039812c55e 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -640,7 +640,7 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ int opcode = pOp->opcode; if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename || opcode==OP_VDestroy - || (opcode==OP_Function0 && pOp->p4.pFunc->funcFlags&SQLITE_FUNC_INTERNAL) + || (opcode==OP_ParseSchema && pOp->p4.z==0) || ((opcode==OP_Halt || opcode==OP_HaltIfNull) && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ From 38587159ddabc116c5b85acf05d1aebbfb777845 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 7 Oct 2019 20:33:26 +0000 Subject: [PATCH 011/476] Omit a pointless memory allocation in vdbeSorterSort(). FossilOrigin-Name: 5d76dbc5b0584c15d7d59e5c079868f2077f32b865f406b40ec837b8ab6ef2e1 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbesort.c | 11 +++-------- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index dc9672710a..34f5731cce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srunning\sALTER\sTABLE\sADD\sCOLUMN\sstatements\swithin\sa\stransaction\sthat\swrites\sto\sone\sor\smore\svirtual\stables. -D 2019-10-07T18:43:21.695 +C Omit\sa\spointless\smemory\sallocation\sin\svdbeSorterSort(). +D 2019-10-07T20:33:26.477 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -604,7 +604,7 @@ F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e F src/vdbeaux.c d17dfbf1e03ef706cad9e2076c7f2354882c191a84e73e00c69c50bb7823e5ce F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 -F src/vdbesort.c da75f505aba230060ce6472605a4aa6494f73eeb1071e1cc2643c3d4035e671b +F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 27998d5d738069f2cee981620a1f224558494ce06799d14dcb5e6f34b4cdcdd1 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 32fba11ab72f6300391267eaad64e92fa767c289029e668e4bd6c9165acf1487 -R db964bd8afa744d576868ce0a446ba2a -U dan -Z 5a81872aeea20d6403e12d21521ec57b +P 31e85fbbc4cfd09a98b4a6dc6624f863816f376c6a4eef1fafc657c8e1abbc36 +R b2acbbb32ce768006e1935135c4701f9 +U drh +Z cb273b07f15ada61a167d906a6c04b2b diff --git a/manifest.uuid b/manifest.uuid index 425c54f1e3..dcbcbd5d21 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -31e85fbbc4cfd09a98b4a6dc6624f863816f376c6a4eef1fafc657c8e1abbc36 \ No newline at end of file +5d76dbc5b0584c15d7d59e5c079868f2077f32b865f406b40ec837b8ab6ef2e1 \ No newline at end of file diff --git a/src/vdbesort.c b/src/vdbesort.c index 7d60ee5116..ad93489c90 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -1396,20 +1396,16 @@ static SorterCompare vdbeSorterGetCompare(VdbeSorter *p){ */ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ int i; - SorterRecord **aSlot; SorterRecord *p; int rc; + SorterRecord *aSlot[64]; rc = vdbeSortAllocUnpacked(pTask); if( rc!=SQLITE_OK ) return rc; p = pList->pList; pTask->xCompare = vdbeSorterGetCompare(pTask->pSorter); - - aSlot = (SorterRecord **)sqlite3MallocZero(64 * sizeof(SorterRecord *)); - if( !aSlot ){ - return SQLITE_NOMEM_BKPT; - } + memset(aSlot, 0, sizeof(aSlot)); while( p ){ SorterRecord *pNext; @@ -1434,13 +1430,12 @@ static int vdbeSorterSort(SortSubtask *pTask, SorterList *pList){ } p = 0; - for(i=0; i<64; i++){ + for(i=0; ipList = p; - sqlite3_free(aSlot); assert( pTask->pUnpacked->errCode==SQLITE_OK || pTask->pUnpacked->errCode==SQLITE_NOMEM ); From b186a622ee3650dae46ab52f24e23fb91ef4e6c0 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 7 Oct 2019 20:36:18 +0000 Subject: [PATCH 012/476] Disallow page-sizes smaller than 32 bytes in fts5. Also ensure the fts5 integrity-check works even when "PRAGMA reverse_unordered_selects" is true. Fix for [265e935b26]. FossilOrigin-Name: 8ab0aebdb3c2d6fb3160b2c58ce6cc0495a6ddd960878a6395958c837f3d1b71 --- ext/fts5/fts5_config.c | 2 +- ext/fts5/fts5_index.c | 3 ++- ext/fts5/test/fts5corrupt3.test | 2 +- ext/fts5/test/fts5misc.test | 15 +++++++++++++++ manifest | 20 ++++++++++---------- manifest.uuid | 2 +- 6 files changed, 30 insertions(+), 14 deletions(-) diff --git a/ext/fts5/fts5_config.c b/ext/fts5/fts5_config.c index 4e1707b3f4..119eb5d262 100644 --- a/ext/fts5/fts5_config.c +++ b/ext/fts5/fts5_config.c @@ -828,7 +828,7 @@ int sqlite3Fts5ConfigSetValue( if( SQLITE_INTEGER==sqlite3_value_numeric_type(pVal) ){ pgsz = sqlite3_value_int(pVal); } - if( pgsz<=0 || pgsz>FTS5_MAX_PAGE_SIZE ){ + if( pgsz<32 || pgsz>FTS5_MAX_PAGE_SIZE ){ *pbBadkey = 1; }else{ pConfig->pgsz = pgsz; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 7d504a49f2..329e0605a6 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5890,7 +5890,8 @@ static void fts5IndexIntegrityCheckSegment( if( pSeg->pgnoFirst==0 ) return; fts5IndexPrepareStmt(p, &pStmt, sqlite3_mprintf( - "SELECT segid, term, (pgno>>1), (pgno&1) FROM %Q.'%q_idx' WHERE segid=%d", + "SELECT segid, term, (pgno>>1), (pgno&1) FROM %Q.'%q_idx' WHERE segid=%d " + "ORDER BY 1, 2", pConfig->zDb, pConfig->zName, pSeg->iSegid )); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index bab61e80c8..3b32e0481a 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -4484,7 +4484,7 @@ do_test 36.0 { do_catchsql_test 36.1 { INSERT INTO t1(b) VALUES( x'78de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bfef346e6a'); -} {1 {database disk image is malformed}} +} {0 {}} #------------------------------------------------------------------------- reset_db diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index 8d3742417a..174abc008e 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -106,6 +106,21 @@ do_execsql_test 2.2.5 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE vt0 USING fts5(a); + PRAGMA reverse_unordered_selects = true; + INSERT INTO vt0 VALUES('365062398'), (0), (0); + INSERT INTO vt0(vt0, rank) VALUES('pgsz', '38'); +} +do_execsql_test 3.1 { + UPDATE vt0 SET a = 399905135; -- unexpected: database disk image is malformed +} +do_execsql_test 3.2 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test diff --git a/manifest b/manifest index 34f5731cce..d35a05dbd3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sa\spointless\smemory\sallocation\sin\svdbeSorterSort(). -D 2019-10-07T20:33:26.477 +C Disallow\spage-sizes\ssmaller\sthan\s32\sbytes\sin\sfts5.\sAlso\sensure\sthe\sfts5\sintegrity-check\sworks\seven\swhen\s"PRAGMA\sreverse_unordered_selects"\sis\strue.\sFix\sfor\s[265e935b26]. +D 2019-10-07T20:36:18.095 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -113,10 +113,10 @@ F ext/fts5/fts5.h 7c9da96f2b9dcfa4dd94081fb2d87ec418d8cdb35b25df56756c334b6b558f F ext/fts5/fts5Int.h 0ec19a906a54c0e53f8a380c0ff70f11a866aa259490bc13aa39f8d2491800fd F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 -F ext/fts5/fts5_config.c 606a29f2962a8f4508923e6ad833974b32a3ab4093f63fd6de0fb33a87eed54c +F ext/fts5/fts5_config.c 2a5a00516d708ea3ac2642ba0388329d43843d3d884df80a571387927913784a F ext/fts5/fts5_expr.c 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c 6601d085d8e8cf4750ee49e2e1d18907582cc0aab78233d3b21bc240ba76a199 +F ext/fts5/fts5_index.c e35f72fb9aaa9a1ba30775500b4364971b6fbccb0aa6e0df727bb918ea7f0d90 F ext/fts5/fts5_main.c bf637030722badf06667d28f7159e4c209dbafd7aa76c33f387104b78ad147e1 F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -157,7 +157,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 9517cc527a8e8a33949652d5c7b5e251f8c3d5ae3f23f01d4320e30f29a0336b F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test e188a43cecb3ff53b6236f862f82b2ec36962b9e39f20cb620dfa07aed70afa4 +F ext/fts5/test/fts5corrupt3.test 4100ac398eefbf033ebdf5a5a9399b37b4f8e1285fa35ab9d0119d4c7f21dc0c F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 9a7263add42d55b8e22fc6ebbee2904390e923f4aa11d05fffaf617032f95db5 +F ext/fts5/test/fts5misc.test 0c8c162608b9ff05bcd70bafd37a5d91a1283f1ce0bda2425d9c3df94b982dbd F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 31e85fbbc4cfd09a98b4a6dc6624f863816f376c6a4eef1fafc657c8e1abbc36 -R b2acbbb32ce768006e1935135c4701f9 -U drh -Z cb273b07f15ada61a167d906a6c04b2b +P 5d76dbc5b0584c15d7d59e5c079868f2077f32b865f406b40ec837b8ab6ef2e1 +R 185bb41bc16e5e00842566e242140840 +U dan +Z d9b7a4014276acac9c0f17606ab677c1 diff --git a/manifest.uuid b/manifest.uuid index dcbcbd5d21..6543c994fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d76dbc5b0584c15d7d59e5c079868f2077f32b865f406b40ec837b8ab6ef2e1 \ No newline at end of file +8ab0aebdb3c2d6fb3160b2c58ce6cc0495a6ddd960878a6395958c837f3d1b71 \ No newline at end of file From fbd79cc585d62868ccf2e08d44f3f65db744287a Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 8 Oct 2019 13:34:24 +0000 Subject: [PATCH 013/476] Fix problems with using the fts5 'rebuild' command inside a transaction that contains other updates of the same table. Fix for [e258f008]. FossilOrigin-Name: 238e0835714696aba0631f288fcc30ec5fddb43893d469c6bf017f386b3cddee --- ext/fts5/fts5_index.c | 1 + ext/fts5/fts5_storage.c | 2 ++ ext/fts5/test/fts5misc.test | 29 +++++++++++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 329e0605a6..9b2cf0a528 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5235,6 +5235,7 @@ int sqlite3Fts5IndexRollback(Fts5Index *p){ int sqlite3Fts5IndexReinit(Fts5Index *p){ Fts5Structure s; fts5StructureInvalidate(p); + fts5IndexDiscardData(p); memset(&s, 0, sizeof(Fts5Structure)); fts5DataWrite(p, FTS5_AVERAGES_ROWID, (const u8*)"", 0); fts5StructureWrite(p, &s); diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 960c1805c3..c5bf8024db 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -560,6 +560,8 @@ int sqlite3Fts5StorageDeleteAll(Fts5Storage *p){ Fts5Config *pConfig = p->pConfig; int rc; + p->bTotalsValid = 0; + /* Delete the contents of the %_data and %_docsize tables. */ rc = fts5ExecPrintf(pConfig->db, 0, "DELETE FROM %Q.'%q_data';" diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index 174abc008e..4ce46d38df 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -121,6 +121,35 @@ do_execsql_test 3.2 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE vt0 USING fts5(c0); + INSERT INTO vt0(c0) VALUES ('xyz'); +} + +do_execsql_test 4.1 { + BEGIN; + INSERT INTO vt0(c0) VALUES ('abc'); + INSERT INTO vt0(vt0) VALUES('rebuild'); + COMMIT; +} + +do_execsql_test 4.2 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + +do_execsql_test 4.3 { + BEGIN; + INSERT INTO vt0(vt0) VALUES('rebuild'); + INSERT INTO vt0(vt0) VALUES('rebuild'); + COMMIT; +} + +do_execsql_test 4.4 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test diff --git a/manifest b/manifest index d35a05dbd3..d1101db0c5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disallow\spage-sizes\ssmaller\sthan\s32\sbytes\sin\sfts5.\sAlso\sensure\sthe\sfts5\sintegrity-check\sworks\seven\swhen\s"PRAGMA\sreverse_unordered_selects"\sis\strue.\sFix\sfor\s[265e935b26]. -D 2019-10-07T20:36:18.095 +C Fix\sproblems\swith\susing\sthe\sfts5\s'rebuild'\scommand\sinside\sa\stransaction\sthat\scontains\sother\supdates\sof\sthe\ssame\stable.\sFix\sfor\s[e258f008]. +D 2019-10-08T13:34:24.536 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,9 +116,9 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c 2a5a00516d708ea3ac2642ba0388329d43843d3d884df80a571387927913784a F ext/fts5/fts5_expr.c 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c e35f72fb9aaa9a1ba30775500b4364971b6fbccb0aa6e0df727bb918ea7f0d90 +F ext/fts5/fts5_index.c 7fca0f89a93083d0e51513b990f9630ab13f94ed4131840a522f29768c230436 F ext/fts5/fts5_main.c bf637030722badf06667d28f7159e4c209dbafd7aa76c33f387104b78ad147e1 -F ext/fts5/fts5_storage.c 801b4e3cd33786a60a07b6b01f86d0fbdf7e68325054e08d17176293a8081e99 +F ext/fts5/fts5_storage.c 167e3d8f8052a71032d498e32a2f2ed5ffe489e5d4d47e298adfa02ed55c7882 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 0c8c162608b9ff05bcd70bafd37a5d91a1283f1ce0bda2425d9c3df94b982dbd +F ext/fts5/test/fts5misc.test 1e6fc5cf8101bcc8e61c2b50e646dc009fd6b8f31ec9f4fa3e0861109e22de61 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5d76dbc5b0584c15d7d59e5c079868f2077f32b865f406b40ec837b8ab6ef2e1 -R 185bb41bc16e5e00842566e242140840 +P 8ab0aebdb3c2d6fb3160b2c58ce6cc0495a6ddd960878a6395958c837f3d1b71 +R 74814f3b82ccc57c689e36d5b9ae7e28 U dan -Z d9b7a4014276acac9c0f17606ab677c1 +Z 1ced3dbc55f7a754d800609f44681fb4 diff --git a/manifest.uuid b/manifest.uuid index 6543c994fd..0913b6b215 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8ab0aebdb3c2d6fb3160b2c58ce6cc0495a6ddd960878a6395958c837f3d1b71 \ No newline at end of file +238e0835714696aba0631f288fcc30ec5fddb43893d469c6bf017f386b3cddee \ No newline at end of file From f3ce2483f52a31b5d63dcf292f7f766f21178839 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Oct 2019 01:19:07 +0000 Subject: [PATCH 014/476] Save CPU cycles in sqlite3Prepare() by, among other things, shifting the EXPLAIN column label logic over to sqlite3VdbeMakeReady(). FossilOrigin-Name: 1ca5ef84506aac3e2f08baa36095b3befdeedf2a3443fcd9154a277b55cbf64b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/prepare.c | 40 ++++++++-------------------------------- src/vdbeaux.c | 22 ++++++++++++++++++++-- 4 files changed, 37 insertions(+), 43 deletions(-) diff --git a/manifest b/manifest index d1101db0c5..9b2472f294 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\swith\susing\sthe\sfts5\s'rebuild'\scommand\sinside\sa\stransaction\sthat\scontains\sother\supdates\sof\sthe\ssame\stable.\sFix\sfor\s[e258f008]. -D 2019-10-08T13:34:24.536 +C Save\sCPU\scycles\sin\ssqlite3Prepare()\sby,\samong\sother\sthings,\sshifting\sthe\nEXPLAIN\scolumn\slabel\slogic\sover\sto\ssqlite3VdbeMakeReady(). +D 2019-10-09T01:19:07.523 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -520,7 +520,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 F src/pragma.c b47bc7db02ab13d04c680aee424466b4e34f4ef5aa7b2e464876ec005806f98f F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 -F src/prepare.c fc245d2049e5e9e76738cd403e63c9832ff61c706d19607d2b62a51f1747609c +F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 @@ -601,7 +601,7 @@ F src/vdbe.c 6df0a99dfbdd9dec542a94f06dd9a8a575acc87047937b2b801ac9d68eb3c96f F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e -F src/vdbeaux.c d17dfbf1e03ef706cad9e2076c7f2354882c191a84e73e00c69c50bb7823e5ce +F src/vdbeaux.c a35a1785f980c44838b636a6d55a46b25ad80f2a2065851f165ab143aa46f99c F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8ab0aebdb3c2d6fb3160b2c58ce6cc0495a6ddd960878a6395958c837f3d1b71 -R 74814f3b82ccc57c689e36d5b9ae7e28 -U dan -Z 1ced3dbc55f7a754d800609f44681fb4 +P 238e0835714696aba0631f288fcc30ec5fddb43893d469c6bf017f386b3cddee +R 9457b091a708e50c9171b591a3bb15db +U drh +Z 38eb7b49a4f6e211f706f20347aaa37c diff --git a/manifest.uuid b/manifest.uuid index 0913b6b215..d12b9b7a81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -238e0835714696aba0631f288fcc30ec5fddb43893d469c6bf017f386b3cddee \ No newline at end of file +1ca5ef84506aac3e2f08baa36095b3befdeedf2a3443fcd9154a277b55cbf64b \ No newline at end of file diff --git a/src/prepare.c b/src/prepare.c index c6709a3d3d..2d928f16e7 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -643,48 +643,24 @@ static int sqlite3Prepare( } assert( 0==sParse.nQueryLoop ); - if( sParse.rc==SQLITE_DONE ) sParse.rc = SQLITE_OK; + if( sParse.rc==SQLITE_DONE ){ + sParse.rc = SQLITE_OK; + } if( sParse.checkSchema ){ schemaIsValid(&sParse); } - if( db->mallocFailed ){ - sParse.rc = SQLITE_NOMEM_BKPT; - } if( pzTail ){ *pzTail = sParse.zTail; } - rc = sParse.rc; - -#ifndef SQLITE_OMIT_EXPLAIN - /* Justification for the ALWAYS(): The only way for rc to be SQLITE_OK and - ** sParse.pVdbe to be NULL is if the input SQL is an empty string, but in - ** that case, sParse.explain will be false. */ - if( sParse.explain && rc==SQLITE_OK && ALWAYS(sParse.pVdbe) ){ - static const char * const azColName[] = { - "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", - "id", "parent", "notused", "detail" - }; - int iFirst, mx; - if( sParse.explain==2 ){ - sqlite3VdbeSetNumCols(sParse.pVdbe, 4); - iFirst = 8; - mx = 12; - }else{ - sqlite3VdbeSetNumCols(sParse.pVdbe, 8); - iFirst = 0; - mx = 8; - } - for(i=iFirst; iinit.busy==0 ){ sqlite3VdbeSetSql(sParse.pVdbe, zSql, (int)(sParse.zTail-zSql), prepFlags); } - if( rc!=SQLITE_OK || db->mallocFailed ){ + if( db->mallocFailed ){ + sParse.rc = SQLITE_NOMEM_BKPT; + } + rc = sParse.rc; + if( rc!=SQLITE_OK ){ if( sParse.pVdbe ) sqlite3VdbeFinalize(sParse.pVdbe); assert(!(*ppStmt)); }else{ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 039812c55e..c89b7d4197 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2223,8 +2223,26 @@ void sqlite3VdbeMakeReady( resolveP2Values(p, &nArg); p->usesStmtJournal = (u8)(pParse->isMultiWrite && pParse->mayAbort); - if( pParse->explain && nMem<10 ){ - nMem = 10; + if( pParse->explain ){ + static const char * const azColName[] = { + "addr", "opcode", "p1", "p2", "p3", "p4", "p5", "comment", + "id", "parent", "notused", "detail" + }; + int iFirst, mx, i; + if( nMem<10 ) nMem = 10; + if( pParse->explain==2 ){ + sqlite3VdbeSetNumCols(p, 4); + iFirst = 8; + mx = 12; + }else{ + sqlite3VdbeSetNumCols(p, 8); + iFirst = 0; + mx = 8; + } + for(i=iFirst; iexpired = 0; From 07eb7f89a048bc368a7d9df764f05f8e101d7aa6 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Oct 2019 13:12:55 +0000 Subject: [PATCH 015/476] Remove the obsolete "fastfuzztest" target from the makefiles. FossilOrigin-Name: 3d44f1ee0f606409bc9c091dae2c9d2e78ada318a0de08437f4f4835a1a5d203 --- Makefile.in | 4 ---- Makefile.msc | 3 --- main.mk | 4 ---- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 9 insertions(+), 20 deletions(-) diff --git a/Makefile.in b/Makefile.in index cadc2eda99..767f1a9ea8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1242,10 +1242,6 @@ fuzztest: fuzzcheck$(TEXE) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuz ./fuzzcheck$(TEXE) $(FUZZDATA) ./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db -fastfuzztest: fuzzcheck$(TEXE) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db - ./fuzzcheck$(TEXE) --limit-mem 100M $(FUZZDATA) - ./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db - valgrindfuzz: fuzzcheck$(TEXT) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db valgrind ./fuzzcheck$(TEXE) --cell-size-check --limit-mem 10M --timeout 600 $(FUZZDATA) valgrind ./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db diff --git a/Makefile.msc b/Makefile.msc index 01d20d2d65..d191698567 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2404,9 +2404,6 @@ queryplantest: testfixture.exe shell fuzztest: fuzzcheck.exe .\fuzzcheck.exe $(FUZZDATA) -fastfuzztest: fuzzcheck.exe - .\fuzzcheck.exe --limit-mem 100M $(FUZZDATA) - # Minimal testing that runs in less than 3 minutes (on a fast machine) # quicktest: testfixture.exe sourcetest diff --git a/main.mk b/main.mk index 5462292023..32a162b0d2 100644 --- a/main.mk +++ b/main.mk @@ -934,10 +934,6 @@ fuzztest: fuzzcheck$(EXE) $(FUZZDATA) sessionfuzz$(EXE) $(TOP)/test/sessionfuzz- ./fuzzcheck$(EXE) $(FUZZDATA) ./sessionfuzz run $(TOP)/test/sessionfuzz-data1.db -fastfuzztest: fuzzcheck$(EXE) $(FUZZDATA) sessionfuzz$(EXE) $(TOP)/test/sessionfuzz-data1.db - ./fuzzcheck$(EXE) --limit-mem 100M $(FUZZDATA) - ./sessionfuzz run $(TOP)/test/sessionfuzz-data1.db - valgrindfuzz: fuzzcheck$(EXE) $(FUZZDATA) sessionfuzz$(EXE) $(TOP)/test/sessionfuzz-data1.db valgrind ./fuzzcheck$(EXE) --cell-size-check --limit-mem 10M --timeout 600 $(FUZZDATA) valgrind ./sessionfuzz run $(TOP)/test/sessionfuzz-data1.db diff --git a/manifest b/manifest index 9b2472f294..2f5905265a 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Save\sCPU\scycles\sin\ssqlite3Prepare()\sby,\samong\sother\sthings,\sshifting\sthe\nEXPLAIN\scolumn\slabel\slogic\sover\sto\ssqlite3VdbeMakeReady(). -D 2019-10-09T01:19:07.523 +C Remove\sthe\sobsolete\s"fastfuzztest"\starget\sfrom\sthe\smakefiles. +D 2019-10-09T13:12:55.565 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 578f123620087ea459aa08fa872810a25ca7c0aaf16331de985bfcddb5f1e747 +F Makefile.in b330374f1262e4c0c9734b54c37dad346bb5e1b4f3ce883f5e66a49987a80673 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc a463dca3c50d8a36094fe5c8c39077907f530b54edfc5388c66c85e2cfc8dc04 +F Makefile.msc 094d52b9b7e82c81f8a031403859506f3ed93a8029035ebd28282f592dee129b F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -447,7 +447,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 09716d345766a55b25ed157b14786526cf67c761c61d99c53e117196fb3b391a +F main.mk d16348e7d36f540ce0a48c102fc352a6a4131de91ffe84d17945f90652cd5f0a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 238e0835714696aba0631f288fcc30ec5fddb43893d469c6bf017f386b3cddee -R 9457b091a708e50c9171b591a3bb15db +P 1ca5ef84506aac3e2f08baa36095b3befdeedf2a3443fcd9154a277b55cbf64b +R 6e09aa916f3a6af6e11c94ff89f130b8 U drh -Z 38eb7b49a4f6e211f706f20347aaa37c +Z 6f2c05400f709269d89d5d70991f8925 diff --git a/manifest.uuid b/manifest.uuid index d12b9b7a81..2df53cafae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ca5ef84506aac3e2f08baa36095b3befdeedf2a3443fcd9154a277b55cbf64b \ No newline at end of file +3d44f1ee0f606409bc9c091dae2c9d2e78ada318a0de08437f4f4835a1a5d203 \ No newline at end of file From c0efa4d3095f2ce07c084b00594497e17ca523fc Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Oct 2019 13:52:31 +0000 Subject: [PATCH 016/476] Use the "fuzztest" target in place of "fastfuzztest". FossilOrigin-Name: 7129e468fd182c1820cdfa2c66a81d1697e5d1580680b77c0df9bb0ae0049e0d --- Makefile.in | 2 +- Makefile.msc | 2 +- main.mk | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Makefile.in b/Makefile.in index 767f1a9ea8..5c5f808962 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1259,7 +1259,7 @@ quicktest: ./testfixture$(TEXE) # This is the common case. Run many tests that do not take too long, # including fuzzcheck, sqlite3_analyzer, and sqldiff tests. # -test: fastfuzztest sourcetest $(TESTPROGS) tcltest +test: fuzztest sourcetest $(TESTPROGS) tcltest # Run a test using valgrind. This can take a really long time # because valgrind is so much slower than a native machine. diff --git a/Makefile.msc b/Makefile.msc index d191698567..931d8ea1f5 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2413,7 +2413,7 @@ quicktest: testfixture.exe sourcetest # This is the common case. Run many tests that do not take too long, # including fuzzcheck, sqlite3_analyzer, and sqldiff tests. # -test: $(TESTPROGS) sourcetest fastfuzztest +test: $(TESTPROGS) sourcetest fuzztest @set PATH=$(LIBTCLPATH);$(PATH) .\testfixture.exe $(TOP)\test\veryquick.test $(TESTOPTS) diff --git a/main.mk b/main.mk index 32a162b0d2..cbf14f065c 100644 --- a/main.mk +++ b/main.mk @@ -951,7 +951,7 @@ quicktest: ./testfixture$(EXE) # The default test case. Runs most of the faster standard TCL tests, # and fuzz tests, and sqlite3_analyzer and sqldiff tests. -test: fastfuzztest sourcetest $(TESTPROGS) tcltest +test: fuzztest sourcetest $(TESTPROGS) tcltest # Run a test using valgrind. This can take a really long time # because valgrind is so much slower than a native machine. diff --git a/manifest b/manifest index 2f5905265a..c624caee24 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Remove\sthe\sobsolete\s"fastfuzztest"\starget\sfrom\sthe\smakefiles. -D 2019-10-09T13:12:55.565 +C Use\sthe\s"fuzztest"\starget\sin\splace\sof\s"fastfuzztest". +D 2019-10-09T13:52:31.405 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in b330374f1262e4c0c9734b54c37dad346bb5e1b4f3ce883f5e66a49987a80673 +F Makefile.in bf24a9abbb277afa2fbe6bac80a181f22be6c48de771cd260c9851ecf6165dc1 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 094d52b9b7e82c81f8a031403859506f3ed93a8029035ebd28282f592dee129b +F Makefile.msc c7e3548d5c9dc12bedf47366ca3f1438196f635d81f08fda44c6c1f290c4bcf8 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -447,7 +447,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk d16348e7d36f540ce0a48c102fc352a6a4131de91ffe84d17945f90652cd5f0a +F main.mk 7ce055f3df31a4f7d21e38f493f907c21db1f673863a573e231f55e2ab005023 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1ca5ef84506aac3e2f08baa36095b3befdeedf2a3443fcd9154a277b55cbf64b -R 6e09aa916f3a6af6e11c94ff89f130b8 +P 3d44f1ee0f606409bc9c091dae2c9d2e78ada318a0de08437f4f4835a1a5d203 +R ea883c862b7be0f72d9659954371881f U drh -Z 6f2c05400f709269d89d5d70991f8925 +Z ea03127c2d7ce3ac98c8b010b95543de diff --git a/manifest.uuid b/manifest.uuid index 2df53cafae..3e1f5c7704 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3d44f1ee0f606409bc9c091dae2c9d2e78ada318a0de08437f4f4835a1a5d203 \ No newline at end of file +7129e468fd182c1820cdfa2c66a81d1697e5d1580680b77c0df9bb0ae0049e0d \ No newline at end of file From efb02281a4266251292590b5e77ad56be22d1af9 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Oct 2019 15:00:37 +0000 Subject: [PATCH 017/476] Change sqlite3SelectDup() to always return NULL if an OOM has occurred. FossilOrigin-Name: 01ba4641ab436c6065c8725908fc0913f2abded4ea62e004b7534e0116b9451a --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/alter.c | 3 +-- src/build.c | 3 +-- src/expr.c | 4 ++++ 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 9b2472f294..ce672e6067 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Save\sCPU\scycles\sin\ssqlite3Prepare()\sby,\samong\sother\sthings,\sshifting\sthe\nEXPLAIN\scolumn\slabel\slogic\sover\sto\ssqlite3VdbeMakeReady(). -D 2019-10-09T01:19:07.523 +C Change\ssqlite3SelectDup()\sto\salways\sreturn\sNULL\sif\san\sOOM\shas\soccurred. +D 2019-10-09T15:00:37.770 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -459,7 +459,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 5773b28684a001dcab45adcefa3cbf5e846335c0c8fee0da8a3770cb0123bba8 +F src/alter.c 83cf597342f78ebcbb72b7503760a05bdb4334dca0d55e088d8a2ff9403b31dc F src/analyze.c 481d9cf34a3c70631ef5c416be70033e8d4cd85eb5ad1b37286aed8b0e29e889 F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c fdc4389b271bca30138db27dc2dfb9f52c2a7baaa44845aaf31a3c54663d837f F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 13de2fdabbabcf2e2aaf6443a049fb851d9d3170136c08345468e158ceea3dc6 +F src/build.c 41d421602ad52535e5156e36ce3e2f42418cc63ae9c6b20d113db1a73ae95c06 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 1e9a6da29e3e13c14783891e867e19a54e2731c6a9b58d011cc4f3b4742a59e4 +F src/expr.c 5e4d9823fc2923478903a4971d3fcf38506d9ce6b44659212bf066f874776fc3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 238e0835714696aba0631f288fcc30ec5fddb43893d469c6bf017f386b3cddee -R 9457b091a708e50c9171b591a3bb15db +P 1ca5ef84506aac3e2f08baa36095b3befdeedf2a3443fcd9154a277b55cbf64b +R fe27e0c870114c891c3ae0e47860d60b U drh -Z 38eb7b49a4f6e211f706f20347aaa37c +Z f1a49373828661924f244cc19ce55da2 diff --git a/manifest.uuid b/manifest.uuid index d12b9b7a81..537841dc15 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ca5ef84506aac3e2f08baa36095b3befdeedf2a3443fcd9154a277b55cbf64b \ No newline at end of file +01ba4641ab436c6065c8725908fc0913f2abded4ea62e004b7534e0116b9451a \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 9d02d3835a..fc4628a959 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1416,8 +1416,7 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ int i; RenameCtx *p = pWalker->u.pRename; SrcList *pSrc = pSelect->pSrc; - if( pSrc==0 ){ - assert( pWalker->pParse->db->mallocFailed ); + if( NEVER(pSrc==0) ){ return WRC_Abort; } for(i=0; inSrc; i++){ diff --git a/src/build.c b/src/build.c index e4f8d5e3c6..6227ce7b67 100644 --- a/src/build.c +++ b/src/build.c @@ -4143,8 +4143,7 @@ SrcList *sqlite3SrcListAppend( void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ int i; struct SrcList_item *pItem; - assert(pList || pParse->db->mallocFailed ); - if( pList ){ + if( ALWAYS(pList) ){ for(i=0, pItem=pList->a; inSrc; i++, pItem++){ if( pItem->iCursor>=0 ) break; pItem->iCursor = pParse->nTab++; diff --git a/src/expr.c b/src/expr.c index 3b625a2de6..3e73c9208d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1530,6 +1530,10 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ pNext = pNew; } + if( db->mallocFailed ){ + sqlite3SelectDelete(db, pRet); + pRet = 0; + } return pRet; } #else From 9fd04bfd29b9df1c30f2f573c8f339b2d00f4bca Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 9 Oct 2019 15:03:45 +0000 Subject: [PATCH 018/476] New test cases added to test/fuzzdata8.db. FossilOrigin-Name: b68d21e93a0839b42f49845918df7738ee7fa2a05c7f4ae2f89fdbb5e47ad8eb --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1357824 -> 1359872 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ce672e6067..0d5440afad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\ssqlite3SelectDup()\sto\salways\sreturn\sNULL\sif\san\sOOM\shas\soccurred. -D 2019-10-09T15:00:37.770 +C New\stest\scases\sadded\sto\stest/fuzzdata8.db. +D 2019-10-09T15:03:45.629 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1015,7 +1015,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db c75b0fd1d28c262f9c3a9428393ff9c420ea5bdbe0b33c557a971915a94bab71 +F test/fuzzdata8.db 57e6d5017998c7b96a1662e6437e25fdd9a38da7fdb1393213f929f8871b4c43 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1ca5ef84506aac3e2f08baa36095b3befdeedf2a3443fcd9154a277b55cbf64b -R fe27e0c870114c891c3ae0e47860d60b +P 01ba4641ab436c6065c8725908fc0913f2abded4ea62e004b7534e0116b9451a +R c3a19548fe0e1039731a2bf52b802dbd U drh -Z f1a49373828661924f244cc19ce55da2 +Z 4ec1e6610a0d29b150eaeb9beffc2499 diff --git a/manifest.uuid b/manifest.uuid index 537841dc15..f63d2741a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -01ba4641ab436c6065c8725908fc0913f2abded4ea62e004b7534e0116b9451a \ No newline at end of file +b68d21e93a0839b42f49845918df7738ee7fa2a05c7f4ae2f89fdbb5e47ad8eb \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 80c1ad007919e3b04f7753ad29c6f551539178a0..0c0178eb7b325bafada782f19835c9e8577c9fd9 100644 GIT binary patch delta 27123 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 delta 25300 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 From a6bd1871d1c0c63df9a0482b07477380eb55200d Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 9 Oct 2019 15:26:45 +0000 Subject: [PATCH 019/476] Disallow fts5 page sizes greater than 65536 bytes - as there are 16-bit offsets used in the page header. FossilOrigin-Name: 75775c5ab44e497cb19be10397229637f1374f05c3244e8f92d6c54fcea94f5f --- ext/fts5/fts5_config.c | 2 +- ext/fts5/test/fts5misc.test | 24 ++++++++++++++++++++++++ manifest | 17 ++++++++--------- manifest.uuid | 2 +- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_config.c b/ext/fts5/fts5_config.c index 119eb5d262..20da37913b 100644 --- a/ext/fts5/fts5_config.c +++ b/ext/fts5/fts5_config.c @@ -23,7 +23,7 @@ #define FTS5_DEFAULT_HASHSIZE (1024*1024) /* Maximum allowed page size */ -#define FTS5_MAX_PAGE_SIZE (128*1024) +#define FTS5_MAX_PAGE_SIZE (64*1024) static int fts5_iswhitespace(char x){ return (x==' '); diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index 4ce46d38df..f8d5be584e 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -150,6 +150,30 @@ do_execsql_test 4.4 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# Ticket [81a7f7b9]. +# +reset_db +do_execsql_test 5.0 { + CREATE VIRTUAL TABLE vt0 USING fts5(c0, c1); + INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65536'); + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1236 + ) + INSERT INTO vt0(c0) SELECT '0' FROM s; +} {} + +do_execsql_test 5.1 { + UPDATE vt0 SET c1 = 'T,D&p^y/7#3*v Date: Wed, 9 Oct 2019 15:37:58 +0000 Subject: [PATCH 020/476] An improved fix for the dbsqlfuzz-discovered ALWAYS() failure following OOM in sqlite3ExprCollSeq(). This time with a test case (engineered by Dan). FossilOrigin-Name: 907f7965b335d8d5441f2e386bb190d1f93ffcd45ca98d2d1c621dede491fc5e --- manifest | 21 +++++++++++---------- manifest.uuid | 2 +- src/alter.c | 3 ++- src/build.c | 3 ++- src/expr.c | 9 ++++----- test/collate1.test | 19 +++++++++++++++++++ 6 files changed, 39 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 5ecd208ae3..9503bdb239 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disallow\sfts5\spage\ssizes\sgreater\sthan\s65536\sbytes\s-\sas\sthere\sare\s16-bit\soffsets\sused\sin\sthe\spage\sheader. -D 2019-10-09T15:26:45.073 +C An\simproved\sfix\sfor\sthe\sdbsqlfuzz-discovered\sALWAYS()\sfailure\sfollowing\sOOM\sin\nsqlite3ExprCollSeq().\s\sThis\stime\swith\sa\stest\scase\s(engineered\sby\sDan). +D 2019-10-09T15:37:58.973 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -459,7 +459,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 83cf597342f78ebcbb72b7503760a05bdb4334dca0d55e088d8a2ff9403b31dc +F src/alter.c 5773b28684a001dcab45adcefa3cbf5e846335c0c8fee0da8a3770cb0123bba8 F src/analyze.c 481d9cf34a3c70631ef5c416be70033e8d4cd85eb5ad1b37286aed8b0e29e889 F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c fdc4389b271bca30138db27dc2dfb9f52c2a7baaa44845aaf31a3c54663d837f F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f -F src/build.c 41d421602ad52535e5156e36ce3e2f42418cc63ae9c6b20d113db1a73ae95c06 +F src/build.c 13de2fdabbabcf2e2aaf6443a049fb851d9d3170136c08345468e158ceea3dc6 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 5e4d9823fc2923478903a4971d3fcf38506d9ce6b44659212bf066f874776fc3 +F src/expr.c 3f4dcbe7cb6644652c2d12b7fa5c9087965229c515e65070cbe99f100c2f2e5f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -732,7 +732,7 @@ F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b13 F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 -F test/collate1.test f9b653f515ef3324a0c4e3c6adbf136bb1903622af678d482a60c11c9c054e6c +F test/collate1.test 4178fda6f4cd757b7a278e6b83805868fb1eb46edafb6e3d4bcc2419f8d93202 F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621 F test/collate3.test 89defc49983ddfbf0a0555aca8c0521a676f56a5 F test/collate4.test c953715fb498b87163e3e73dd94356bff1f317bd @@ -1846,7 +1846,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e17571c789db31123642d0ed1f3d8764e070019e0deb8b88cce58d2183551cdf -R 511020e306da2802c47a6fba50c2d206 -U dan -Z 5e334f935ba06a2ba50d680e73993c56 +P 75775c5ab44e497cb19be10397229637f1374f05c3244e8f92d6c54fcea94f5f +Q -01ba4641ab436c6065c8725908fc0913f2abded4ea62e004b7534e0116b9451a +R 46052c64c579bf3fda5dd04a558500b4 +U drh +Z cca2984ae5fcf8dec44abaa439367b12 diff --git a/manifest.uuid b/manifest.uuid index af6838fe37..7854b4d5cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -75775c5ab44e497cb19be10397229637f1374f05c3244e8f92d6c54fcea94f5f \ No newline at end of file +907f7965b335d8d5441f2e386bb190d1f93ffcd45ca98d2d1c621dede491fc5e \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index fc4628a959..9d02d3835a 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1416,7 +1416,8 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ int i; RenameCtx *p = pWalker->u.pRename; SrcList *pSrc = pSelect->pSrc; - if( NEVER(pSrc==0) ){ + if( pSrc==0 ){ + assert( pWalker->pParse->db->mallocFailed ); return WRC_Abort; } for(i=0; inSrc; i++){ diff --git a/src/build.c b/src/build.c index 6227ce7b67..e4f8d5e3c6 100644 --- a/src/build.c +++ b/src/build.c @@ -4143,7 +4143,8 @@ SrcList *sqlite3SrcListAppend( void sqlite3SrcListAssignCursors(Parse *pParse, SrcList *pList){ int i; struct SrcList_item *pItem; - if( ALWAYS(pList) ){ + assert(pList || pParse->db->mallocFailed ); + if( pList ){ for(i=0, pItem=pList->a; inSrc; i++, pItem++){ if( pItem->iCursor>=0 ) break; pItem->iCursor = pParse->nTab++; diff --git a/src/expr.c b/src/expr.c index 3e73c9208d..fd6b571286 100644 --- a/src/expr.c +++ b/src/expr.c @@ -186,7 +186,10 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ /* p->flags holds EP_Collate and p->pLeft->flags does not. And ** p->x.pSelect cannot. So if p->x.pLeft exists, it must hold at ** least one EP_Collate. Thus the following two ALWAYS. */ - if( p->x.pList!=0 && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) ){ + if( p->x.pList!=0 + && !db->mallocFailed + && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) + ){ int i; for(i=0; ALWAYS(ix.pList->nExpr); i++){ if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ @@ -1530,10 +1533,6 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ pNext = pNew; } - if( db->mallocFailed ){ - sqlite3SelectDelete(db, pRet); - pRet = 0; - } return pRet; } #else diff --git a/test/collate1.test b/test/collate1.test index a1623f07e6..f21d367b9f 100644 --- a/test/collate1.test +++ b/test/collate1.test @@ -417,4 +417,23 @@ do_execsql_test 8.2 { SELECT * FROM t0 WHERE c1 = 1; } {{ } 1} +# 2019-10-09 +# ALWAYS() macro fails following OOM +# Problem detected by dbsqlfuzz. +# +do_execsql_test 9.0 { + CREATE TABLE t1(a, b); + CREATE TABLE t2(c, d); +} + +do_faultsim_test 9.1 -faults oom* -body { + execsql { + SELECT * FROM ( + SELECT b COLLATE nocase IN (SELECT c FROM t2) FROM t1 + ); + } +} -test { + faultsim_test_result {0 {}} +} + finish_test From ae55737fbf98963accbb1b9a26250cd6f08a4ce5 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 9 Oct 2019 18:36:32 +0000 Subject: [PATCH 021/476] Do not allow users to effectively disable fts5 crisismerge operations by setting the crisismerge threshold to higher than the maximum allowable segment b-trees on a single level. Fix for [d392017c]. FossilOrigin-Name: 86e497209217abb7bcb491a023cd353f3c7c9c103ebd9f58dd8661b12cf3694c --- ext/fts5/fts5Int.h | 5 +++++ ext/fts5/fts5_config.c | 1 + ext/fts5/fts5_index.c | 5 ----- ext/fts5/test/fts5full.test | 2 +- ext/fts5/test/fts5misc.test | 18 ++++++++++++++++++ manifest | 23 +++++++++++------------ manifest.uuid | 2 +- 7 files changed, 37 insertions(+), 19 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index c29b42b7ad..8bc339de3b 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -61,6 +61,11 @@ typedef sqlite3_uint64 u64; */ #define FTS5_MAX_PREFIX_INDEXES 31 +/* +** Maximum segments permitted in a single index +*/ +#define FTS5_MAX_SEGMENT 2000 + #define FTS5_DEFAULT_NEARDIST 10 #define FTS5_DEFAULT_RANK "bm25" diff --git a/ext/fts5/fts5_config.c b/ext/fts5/fts5_config.c index 20da37913b..c02d67e7cb 100644 --- a/ext/fts5/fts5_config.c +++ b/ext/fts5/fts5_config.c @@ -881,6 +881,7 @@ int sqlite3Fts5ConfigSetValue( *pbBadkey = 1; }else{ if( nCrisisMerge<=1 ) nCrisisMerge = FTS5_DEFAULT_CRISISMERGE; + if( nCrisisMerge>=FTS5_MAX_SEGMENT ) nCrisisMerge = FTS5_MAX_SEGMENT-1; pConfig->nCrisisMerge = nCrisisMerge; } } diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 9b2cf0a528..5c1365a51e 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -239,11 +239,6 @@ #define FTS5_SEGMENT_ROWID(segid, pgno) fts5_dri(segid, 0, 0, pgno) #define FTS5_DLIDX_ROWID(segid, height, pgno) fts5_dri(segid, 1, height, pgno) -/* -** Maximum segments permitted in a single index -*/ -#define FTS5_MAX_SEGMENT 2000 - #ifdef SQLITE_DEBUG int sqlite3Fts5Corrupt() { return SQLITE_CORRUPT_VTAB; } #endif diff --git a/ext/fts5/test/fts5full.test b/ext/fts5/test/fts5full.test index 91ded37d8f..751e874c3b 100644 --- a/ext/fts5/test/fts5full.test +++ b/ext/fts5/test/fts5full.test @@ -36,7 +36,7 @@ do_test 1.1 { execsql { INSERT INTO x8 VALUES( rnddoc(5) ); } } } msg] $msg -} {1 {database or disk is full}} +} {0 {}} finish_test diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index f8d5be584e..d4e55f0974 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -175,5 +175,23 @@ do_catchsql_test 5.3 { INSERT INTO vt0(vt0, rank) VALUES('pgsz', '65537'); } {1 {SQL logic error}} +#------------------------------------------------------------------------- +# Ticket [d392017c]. +# +reset_db +do_execsql_test 6.0 { + CREATE VIRTUAL TABLE vt0 USING fts5(c0); + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10000 + ) + INSERT INTO vt0(c0) SELECT '0' FROM s; + INSERT INTO vt0(vt0, rank) VALUES('crisismerge', 2000); + INSERT INTO vt0(vt0, rank) VALUES('automerge', 0); +} {} + +do_execsql_test 6.1 { + INSERT INTO vt0(vt0) VALUES('rebuild'); +} + finish_test diff --git a/manifest b/manifest index 9503bdb239..df2f0dca94 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C An\simproved\sfix\sfor\sthe\sdbsqlfuzz-discovered\sALWAYS()\sfailure\sfollowing\sOOM\sin\nsqlite3ExprCollSeq().\s\sThis\stime\swith\sa\stest\scase\s(engineered\sby\sDan). -D 2019-10-09T15:37:58.973 +C Do\snot\sallow\susers\sto\seffectively\sdisable\sfts5\scrisismerge\soperations\sby\ssetting\sthe\scrisismerge\sthreshold\sto\shigher\sthan\sthe\smaximum\sallowable\ssegment\sb-trees\son\sa\ssingle\slevel.\sFix\sfor\s[d392017c]. +D 2019-10-09T18:36:32.820 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -110,13 +110,13 @@ F ext/fts3/unicode/mkunicode.tcl bf7fcaa6d68e6d38223467983785d054f1cff4d9e3905dd F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 7c9da96f2b9dcfa4dd94081fb2d87ec418d8cdb35b25df56756c334b6b558fd7 -F ext/fts5/fts5Int.h 0ec19a906a54c0e53f8a380c0ff70f11a866aa259490bc13aa39f8d2491800fd +F ext/fts5/fts5Int.h 3966afab063063ea9fcbf84ac386f3f094c99ade4452e529c0a0d56375d984c1 F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 -F ext/fts5/fts5_config.c e26c5e2dcb8f8244847e45cd68fa134764930a521823ba791004d9637a08ed7b +F ext/fts5/fts5_config.c aab6117f8f85933e051c66f227414fdcaf7f2313688e16276b895f9d42d28e5c F ext/fts5/fts5_expr.c 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c 7fca0f89a93083d0e51513b990f9630ab13f94ed4131840a522f29768c230436 +F ext/fts5/fts5_index.c ce199410b2cd7d625c1da5b684a5c1fbcfe90f7a10bae18e2fbb051b9a2acbe5 F ext/fts5/fts5_main.c bf637030722badf06667d28f7159e4c209dbafd7aa76c33f387104b78ad147e1 F ext/fts5/fts5_storage.c 167e3d8f8052a71032d498e32a2f2ed5ffe489e5d4d47e298adfa02ed55c7882 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -179,7 +179,7 @@ F ext/fts5/test/fts5faultA.test be4487576bff8c22cee6597d1893b312f306504a8c6ccd3c F ext/fts5/test/fts5faultB.test d606bdb8e81aaeb6f41de3fc9fc7ae315733f0903fbff05cf54f5b045b729ab5 F ext/fts5/test/fts5faultD.test cc5d1225556e356615e719c612e845d41bff7d5a F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079 -F ext/fts5/test/fts5full.test 49b565da02918c06e58f51f0b953b0302b96f155aa68baba24782b81570685e2 +F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b F ext/fts5/test/fts5integrity.test 4317561cd25eca7df16aa1f7d1a700ee958059fa639785f94aba0a84df9ab17b @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test c00a1318bbb1bf28269592907925c1cd1be4252980749e9c552a71c91cf29e9c +F ext/fts5/test/fts5misc.test f3edb5e6a370d6045f1b28979ee581a44e81d5f15d4e1779db3d3069914171fd F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -1846,8 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 75775c5ab44e497cb19be10397229637f1374f05c3244e8f92d6c54fcea94f5f -Q -01ba4641ab436c6065c8725908fc0913f2abded4ea62e004b7534e0116b9451a -R 46052c64c579bf3fda5dd04a558500b4 -U drh -Z cca2984ae5fcf8dec44abaa439367b12 +P 907f7965b335d8d5441f2e386bb190d1f93ffcd45ca98d2d1c621dede491fc5e +R ff04baeec67f3b016fe79aecb67c0a3c +U dan +Z 317dae3e1b55b9ea127da4807cd56a16 diff --git a/manifest.uuid b/manifest.uuid index 7854b4d5cf..52e5001b71 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -907f7965b335d8d5441f2e386bb190d1f93ffcd45ca98d2d1c621dede491fc5e \ No newline at end of file +86e497209217abb7bcb491a023cd353f3c7c9c103ebd9f58dd8661b12cf3694c \ No newline at end of file From da03c1e65e449ee4f0f685b63c6906ad3d7ac2a9 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 9 Oct 2019 21:14:00 +0000 Subject: [PATCH 022/476] Avoid assuming that an expression that contains the sub-expression (? IS FALSE) or (? IS TRUE) may only be true if ? is non-null. Fix for [a976c487]. FossilOrigin-Name: eb7ed90b8a65748f0721aaf7bdddd2207f552be5015603fbfb7044d815ae2f36 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 ++ test/join.test | 22 ++++++++++++++++++++++ 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index df2f0dca94..65c9109640 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\susers\sto\seffectively\sdisable\sfts5\scrisismerge\soperations\sby\ssetting\sthe\scrisismerge\sthreshold\sto\shigher\sthan\sthe\smaximum\sallowable\ssegment\sb-trees\son\sa\ssingle\slevel.\sFix\sfor\s[d392017c]. -D 2019-10-09T18:36:32.820 +C Avoid\sassuming\sthat\san\sexpression\sthat\scontains\sthe\ssub-expression\s(?\sIS\sFALSE)\sor\s(?\sIS\sTRUE)\smay\sonly\sbe\strue\sif\s?\sis\snon-null.\sFix\sfor\s[a976c487]. +D 2019-10-09T21:14:00.049 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 3f4dcbe7cb6644652c2d12b7fa5c9087965229c515e65070cbe99f100c2f2e5f +F src/expr.c bf8f259596d5d326fd0e64c001670794e473a115b4855d02112e93de171f68a1 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1081,7 +1081,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test 6ce8296a08e78632c322cde0add78a7ce05466c3d9ec7d5130b38b5b489e7c27 +F test/join.test 7610c1818f8921618279ab633fc03c93d54f6c8fb9e9e7e96b252319ece346d4 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 907f7965b335d8d5441f2e386bb190d1f93ffcd45ca98d2d1c621dede491fc5e -R ff04baeec67f3b016fe79aecb67c0a3c +P 86e497209217abb7bcb491a023cd353f3c7c9c103ebd9f58dd8661b12cf3694c +R 3aa92836bd3d4a197ed3b39d59e252c3 U dan -Z 317dae3e1b55b9ea127da4807cd56a16 +Z 535c0917a90b77d5a689b508b3363400 diff --git a/manifest.uuid b/manifest.uuid index 52e5001b71..0a4f4430c2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -86e497209217abb7bcb491a023cd353f3c7c9c103ebd9f58dd8661b12cf3694c \ No newline at end of file +eb7ed90b8a65748f0721aaf7bdddd2207f552be5015603fbfb7044d815ae2f36 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index fd6b571286..ba19a331dd 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5149,6 +5149,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ case TK_CASE: case TK_IN: case TK_FUNCTION: + case TK_TRUTH: testcase( pExpr->op==TK_ISNOT ); testcase( pExpr->op==TK_ISNULL ); testcase( pExpr->op==TK_NOTNULL ); @@ -5157,6 +5158,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_CASE ); testcase( pExpr->op==TK_IN ); testcase( pExpr->op==TK_FUNCTION ); + testcase( pExpr->op==TK_TRUTH ); return WRC_Prune; case TK_COLUMN: if( pWalker->u.iCur==pExpr->iTable ){ diff --git a/test/join.test b/test/join.test index f53a90c84a..682186200b 100644 --- a/test/join.test +++ b/test/join.test @@ -884,4 +884,26 @@ do_execsql_test join-17.110 { WHERE NOT(y='a'); } {1 3 1 3} +#------------------------------------------------------------------------- +reset_db +do_execsql_test join-18.1 { + CREATE TABLE t0(a); + CREATE TABLE t1(b); + CREATE VIEW v0 AS SELECT a FROM t1 LEFT JOIN t0; + INSERT INTO t1 VALUES (1); +} {} + +do_execsql_test join-18.2 { + SELECT * FROM v0 WHERE NOT(v0.a IS FALSE); +} {{}} + +do_execsql_test join-18.3 { + SELECT * FROM t1 LEFT JOIN t0 WHERE NOT(a IS FALSE); +} {1 {}} + +do_execsql_test join-18.4 { + SELECT NOT(v0.a IS FALSE) FROM v0 +} {1} + finish_test + From 3703edf1108096c9cb570d02fd21d7d7185f65d3 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 10 Oct 2019 15:17:09 +0000 Subject: [PATCH 023/476] Be sure to rewrite column references inside FILTER clauses and window frame definitions when flattening queries. Fix for [1079ad19]. FossilOrigin-Name: ccba7202b69d239724c3b589439c9c3b0e1bba237accfeb11c39d492522b8719 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/select.c | 10 +++++++++- src/sqliteInt.h | 8 ++++++-- test/filter1.test | 20 ++++++++++++++++++++ test/window1.test | 44 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 65c9109640..188ebe5404 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sassuming\sthat\san\sexpression\sthat\scontains\sthe\ssub-expression\s(?\sIS\sFALSE)\sor\s(?\sIS\sTRUE)\smay\sonly\sbe\strue\sif\s?\sis\snon-null.\sFix\sfor\s[a976c487]. -D 2019-10-09T21:14:00.049 +C Be\ssure\sto\srewrite\scolumn\sreferences\sinside\sFILTER\sclauses\sand\swindow\sframe\sdefinitions\swhen\sflattening\squeries.\sFix\sfor\s[1079ad19]. +D 2019-10-10T15:17:09.172 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -525,12 +525,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c f509982c96bb24ccf57a0155fbe1e6184e0b8fb8866a04397dc41baa400e5240 +F src/select.c b3d64a7a3342471ce078251c5ba132f8ec66f994534f1070dda025b354a09a62 F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e274 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h b70ac8e3e7e74838bc45dca1a3b2c3ef4b4e04a49036448bf462cfd657cc663f +F src/sqliteInt.h 40f81bb57b0723403d5da77314d459f536ddd0f07d57434a94df35e790b6b268 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -859,7 +859,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test c2f34e58ee82a60c3ee9b5b4c4f2004ec2f529dff2f473706eeffa684cbb6719 +F test/filter1.test edd797ab2ef38de16064c9e3945efd941cba72d27e8f070c349501ff95d2727d F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b @@ -1707,7 +1707,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 376a7c9c5b9df9868d92a6d9d455262e1b769f4410b19006f5f8c5507c2a7ed7 +F test/window1.test 453bb9dcb1b447eddbb4777c97620f02543a4375359723b7372ff09dcf847045 F test/window2.tcl 66db96fd9fd202bc31ee7f8ce7904cb469564864cff3f74e009bfef8102333f4 F test/window2.test af2a001ded703bb8f2474fb0edfef170d5aba00f5c1f2aa9f65935b5da13df90 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 86e497209217abb7bcb491a023cd353f3c7c9c103ebd9f58dd8661b12cf3694c -R 3aa92836bd3d4a197ed3b39d59e252c3 +P eb7ed90b8a65748f0721aaf7bdddd2207f552be5015603fbfb7044d815ae2f36 +R 40eaddfd54f6a56f3794dc71e7459af4 U dan -Z 535c0917a90b77d5a689b508b3363400 +Z 229a8fb1a95c7006485c43a0a23396d6 diff --git a/manifest.uuid b/manifest.uuid index 0a4f4430c2..bf70ea366c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eb7ed90b8a65748f0721aaf7bdddd2207f552be5015603fbfb7044d815ae2f36 \ No newline at end of file +ccba7202b69d239724c3b589439c9c3b0e1bba237accfeb11c39d492522b8719 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 6d18f75245..7cc5cde0ec 100644 --- a/src/select.c +++ b/src/select.c @@ -100,9 +100,9 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){ if( OK_IF_ALWAYS_TRUE(p->pWinDefn) ){ sqlite3WindowListDelete(db, p->pWinDefn); } + assert( p->pWin==0 ); #endif if( OK_IF_ALWAYS_TRUE(p->pWith) ) sqlite3WithDelete(db, p->pWith); - assert( p->pWin==0 ); if( bFree ) sqlite3DbFreeNN(db, p); p = pPrior; bFree = 1; @@ -3503,6 +3503,14 @@ static Expr *substExpr( }else{ substExprList(pSubst, pExpr->x.pList); } +#ifndef SQLITE_OMIT_WINDOWFUNC + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window *pWin = pExpr->y.pWin; + pWin->pFilter = substExpr(pSubst, pWin->pFilter); + substExprList(pSubst, pWin->pPartition); + substExprList(pSubst, pWin->pOrderBy); + } +#endif } return pExpr; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 9b8578ba5d..44a82223e6 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2596,9 +2596,13 @@ struct Expr { ** True if the expression passed as an argument was a function with ** an OVER() clause (a window function). */ -#define IsWindowFunc(p) ( \ +#ifdef SQLITE_OMIT_WINDOWFUNC +# define IsWindowFunc(p) 0 +#else +# define IsWindowFunc(p) ( \ ExprHasProperty((p), EP_WinFunc) && p->y.pWin->eFrmType!=TK_FILTER \ -) + ) +#endif /* ** A list of expressions. Each expression may optionally have a diff --git a/test/filter1.test b/test/filter1.test index 85e43a68bb..9309b744b1 100644 --- a/test/filter1.test +++ b/test/filter1.test @@ -164,5 +164,25 @@ do_execsql_test 4.4 { SELECT a, avg(c) FILTER (WHERE b!=1) FROM t1 GROUP BY a ORDER BY 2 } {c 2.0 b 5.0 a 10.0} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 5.0 { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); + INSERT INTO t1 VALUES(1, 3); +} + +do_execsql_test 5.1 { + SELECT count(*) FILTER (WHERE b>2) FROM (SELECT * FROM t1) +} {1} + +do_execsql_test 5.2 { + SELECT count(*) FILTER (WHERE b>2) OVER () FROM (SELECT * FROM t1) +} {1 1} + +do_execsql_test 5.3 { + SELECT count(*) FILTER (WHERE b>2) OVER (ORDER BY b) FROM (SELECT * FROM t1) +} {0 1} + finish_test diff --git a/test/window1.test b/test/window1.test index 778bd861ba..7a41e7268d 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1190,4 +1190,48 @@ do_execsql_test 30.0 { win3 AS (win2 RANGE BETWEEN 5.2 PRECEDING AND true PRECEDING ); } {1 1} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 31.1 { + CREATE TABLE t1(a, b); + CREATE TABLE t2(c, d); + CREATE TABLE t3(e, f); + + INSERT INTO t1 VALUES(1, 1); + INSERT INTO t2 VALUES(1, 1); + INSERT INTO t3 VALUES(1, 1); +} + +do_execsql_test 31.2 { + SELECT d IN (SELECT sum(c) OVER (ORDER BY e+c) FROM t3) FROM ( + SELECT * FROM t2 + ); +} {1} + +do_execsql_test 31.3 { + SELECT d IN (SELECT sum(c) OVER (PARTITION BY d ORDER BY e+c) FROM t3) FROM ( + SELECT * FROM t2 + ); +} {1} + +do_catchsql_test 31.3 { + SELECT d IN ( + SELECT sum(c) OVER ( ROWS BETWEEN d FOLLOWING AND UNBOUNDED FOLLOWING) + FROM t3 + ) + FROM ( + SELECT * FROM t2 + ); +} {1 {frame starting offset must be a non-negative integer}} + +do_catchsql_test 31.3 { + SELECT d IN ( + SELECT sum(c) OVER ( ROWS BETWEEN CURRENT ROW AND c FOLLOWING) + FROM t3 + ) + FROM ( + SELECT * FROM t2 + ); +} {1 {frame ending offset must be a non-negative integer}} + finish_test From cd79010964231114a6e370852c28aae8adcb5dfd Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 10 Oct 2019 16:41:44 +0000 Subject: [PATCH 024/476] Fix a problem in the fts3 integrity-check routine causing it to report as corrupt tables that contain values with embedded 0x00 bytes. FossilOrigin-Name: 629e20c9880acc2cb9e2fa6da39a15a90483e9a8f433df29d285c23bdfb03b0b --- ext/fts3/fts3_write.c | 3 +-- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3misc.test | 11 +++++++++++ 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 6960c31bd1..f0e935ca8e 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -5244,10 +5244,9 @@ static int fts3IntegrityCheck(Fts3Table *p, int *pbOk){ for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ if( p->abNotindexed[iCol]==0 ){ const char *zText = (const char *)sqlite3_column_text(pStmt, iCol+1); - int nText = sqlite3_column_bytes(pStmt, iCol+1); sqlite3_tokenizer_cursor *pT = 0; - rc = sqlite3Fts3OpenTokenizer(p->pTokenizer, iLang, zText, nText,&pT); + rc = sqlite3Fts3OpenTokenizer(p->pTokenizer, iLang, zText, -1, &pT); while( rc==SQLITE_OK ){ char const *zToken; /* Buffer containing token */ int nToken = 0; /* Number of bytes in token */ diff --git a/manifest b/manifest index 188ebe5404..985bb78fc1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Be\ssure\sto\srewrite\scolumn\sreferences\sinside\sFILTER\sclauses\sand\swindow\sframe\sdefinitions\swhen\sflattening\squeries.\sFix\sfor\s[1079ad19]. -D 2019-10-10T15:17:09.172 +C Fix\sa\sproblem\sin\sthe\sfts3\sintegrity-check\sroutine\scausing\sit\sto\sreport\sas\scorrupt\stables\sthat\scontain\svalues\swith\sembedded\s0x00\sbytes. +D 2019-10-10T16:41:44.388 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 13582783abedf905e6946ce95edff7103c07810fb03a9c3b40212d21a3efa09c +F ext/fts3/fts3_write.c 9b5ae495b3bf287aab3d92268b6fdc4eb68dd6d8c0342a0b316cf3157953a3f7 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -958,7 +958,7 @@ F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11e F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3misc.test 0b20083efab36a42804bf8017a003f72f963c46163403dae7256493367d2f9d3 +F test/fts3misc.test 889f51b669e083b96a79a2045ff9baa212071ac1a5eb0e06979c63af3f3451f2 F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eb7ed90b8a65748f0721aaf7bdddd2207f552be5015603fbfb7044d815ae2f36 -R 40eaddfd54f6a56f3794dc71e7459af4 +P ccba7202b69d239724c3b589439c9c3b0e1bba237accfeb11c39d492522b8719 +R 3b21f3f96c636a23fe2aaa621a05215e U dan -Z 229a8fb1a95c7006485c43a0a23396d6 +Z 47c295f4dc64bba24bcf234a09efc732 diff --git a/manifest.uuid b/manifest.uuid index bf70ea366c..b3afe0279d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ccba7202b69d239724c3b589439c9c3b0e1bba237accfeb11c39d492522b8719 \ No newline at end of file +629e20c9880acc2cb9e2fa6da39a15a90483e9a8f433df29d285c23bdfb03b0b \ No newline at end of file diff --git a/test/fts3misc.test b/test/fts3misc.test index 60126dd6b4..7f679d23f4 100644 --- a/test/fts3misc.test +++ b/test/fts3misc.test @@ -226,5 +226,16 @@ do_execsql_test 6.1 { SELECT rowid FROM t6 WHERE t6 MATCH 'b OR "x a"' } {50001 50002 50003 50004} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 7.0 { + CREATE VIRTUAL TABLE vt0 USING fts3(c0); + INSERT INTO vt0 VALUES (x'00'); +} +do_execsql_test 7.1 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test From 0287c951655bc543a7d0dcdb4fcb8cc1718325ef Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 10 Oct 2019 17:09:44 +0000 Subject: [PATCH 025/476] Prevent SQLite from assuming that if ((? IS NOT NULL) IS NOT NULL) is true, ? may not be NULL. Fix for [d51a8696]. FossilOrigin-Name: 7833feecfe745e237f239ee4c38a9e4bf7ad66a32919150208da87c00a826473 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 20 +++++++------------- test/join.test | 30 ++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 985bb78fc1..2ecb08a69b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sthe\sfts3\sintegrity-check\sroutine\scausing\sit\sto\sreport\sas\scorrupt\stables\sthat\scontain\svalues\swith\sembedded\s0x00\sbytes. -D 2019-10-10T16:41:44.388 +C Prevent\sSQLite\sfrom\sassuming\sthat\sif\s((?\sIS\sNOT\sNULL)\sIS\sNOT\sNULL)\sis\strue,\s?\smay\snot\sbe\sNULL.\sFix\sfor\s[d51a8696]. +D 2019-10-10T17:09:44.963 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c bf8f259596d5d326fd0e64c001670794e473a115b4855d02112e93de171f68a1 +F src/expr.c 88de5e67b378731da9a45c592122c754693c2a095db61dcd1a0cc64bb72b6145 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1081,7 +1081,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test 7610c1818f8921618279ab633fc03c93d54f6c8fb9e9e7e96b252319ece346d4 +F test/join.test b515753842b739f8310e718ff5a1581d0f80fd7c731c7e642c5af4310d8db94d F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ccba7202b69d239724c3b589439c9c3b0e1bba237accfeb11c39d492522b8719 -R 3b21f3f96c636a23fe2aaa621a05215e +P 629e20c9880acc2cb9e2fa6da39a15a90483e9a8f433df29d285c23bdfb03b0b +R c986e09ece8f3de56032bcbf04625250 U dan -Z 47c295f4dc64bba24bcf234a09efc732 +Z 0b8951352c5f65b37b4ebe46a258877d diff --git a/manifest.uuid b/manifest.uuid index b3afe0279d..d1c1d85e2f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -629e20c9880acc2cb9e2fa6da39a15a90483e9a8f433df29d285c23bdfb03b0b \ No newline at end of file +7833feecfe745e237f239ee4c38a9e4bf7ad66a32919150208da87c00a826473 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index ba19a331dd..b1f405cdc9 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5168,10 +5168,11 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ return WRC_Prune; case TK_AND: - if( sqlite3ExprImpliesNonNullRow(pExpr->pLeft, pWalker->u.iCur) - && sqlite3ExprImpliesNonNullRow(pExpr->pRight, pWalker->u.iCur) - ){ - pWalker->eCode = 1; + assert( pWalker->eCode==0 ); + sqlite3WalkExpr(pWalker, pExpr->pLeft); + if( pWalker->eCode ){ + pWalker->eCode = 0; + sqlite3WalkExpr(pWalker, pExpr->pRight); } return WRC_Prune; @@ -5230,15 +5231,8 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ Walker w; p = sqlite3ExprSkipCollateAndLikely(p); - while( p ){ - if( p->op==TK_NOTNULL ){ - p = p->pLeft; - }else if( p->op==TK_AND ){ - if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; - p = p->pRight; - }else{ - break; - } + if( p && p->op==TK_NOTNULL ){ + p = p->pLeft; } w.xExprCallback = impliesNotNullRow; w.xSelectCallback = 0; diff --git a/test/join.test b/test/join.test index 682186200b..1689a85e3f 100644 --- a/test/join.test +++ b/test/join.test @@ -905,5 +905,35 @@ do_execsql_test join-18.4 { SELECT NOT(v0.a IS FALSE) FROM v0 } {1} +#------------------------------------------------------------------------- +reset_db +do_execsql_test join-19.0 { + CREATE TABLE t1(a); + CREATE TABLE t2(b); + INSERT INTO t1(a) VALUES(0); + CREATE VIEW v0(c) AS SELECT t2.b FROM t1 LEFT JOIN t2; +} + +do_execsql_test join-19.1 { + SELECT * FROM v0 WHERE v0.c NOTNULL NOTNULL; +} {{}} + +do_execsql_test join-19.2 { + SELECT * FROM t1 LEFT JOIN t2 +} {0 {}} + +do_execsql_test join-19.3 { + SELECT * FROM t1 LEFT JOIN t2 WHERE (b IS NOT NULL) IS NOT NULL; +} {0 {}} + +do_execsql_test join-19.4 { + SELECT (b IS NOT NULL) IS NOT NULL FROM t1 LEFT JOIN t2 +} {1} + +do_execsql_test join-19.5 { + SELECT * FROM t1 LEFT JOIN t2 WHERE + (b IS NOT NULL AND b IS NOT NULL) IS NOT NULL; +} {0 {}} + finish_test From 6dcf9a451e6e4ed1ae343c4813958540ac836306 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Thu, 10 Oct 2019 23:58:16 +0000 Subject: [PATCH 026/476] Fix harmless compiler warning seen with MSVC. FossilOrigin-Name: 73a82114733af2a316f20eb8578badef307d14286c6ec03197744a6793425161 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/util.c | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2ecb08a69b..a5c9cbf72e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Prevent\sSQLite\sfrom\sassuming\sthat\sif\s((?\sIS\sNOT\sNULL)\sIS\sNOT\sNULL)\sis\strue,\s?\smay\snot\sbe\sNULL.\sFix\sfor\s[d51a8696]. -D 2019-10-10T17:09:44.963 +C Fix\sharmless\scompiler\swarning\sseen\swith\sMSVC. +D 2019-10-10T23:58:16.392 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -595,7 +595,7 @@ F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e F src/update.c 7f05fad5e145248a00048aeb0bac78b8fdb4ed17216e14a6eb24c55596e87ee7 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c fffdfa627be74d69ef425f92db124e7148af449bb8a3286e79577c42bca84061 +F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 6df0a99dfbdd9dec542a94f06dd9a8a575acc87047937b2b801ac9d68eb3c96f F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 629e20c9880acc2cb9e2fa6da39a15a90483e9a8f433df29d285c23bdfb03b0b -R c986e09ece8f3de56032bcbf04625250 -U dan -Z 0b8951352c5f65b37b4ebe46a258877d +P 7833feecfe745e237f239ee4c38a9e4bf7ad66a32919150208da87c00a826473 +R f00378c448d9bb1d9bbacc01afc3ba1a +U mistachkin +Z 1126cf0ca18de2bf402e76e92ac78399 diff --git a/manifest.uuid b/manifest.uuid index d1c1d85e2f..763c305159 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7833feecfe745e237f239ee4c38a9e4bf7ad66a32919150208da87c00a826473 \ No newline at end of file +73a82114733af2a316f20eb8578badef307d14286c6ec03197744a6793425161 \ No newline at end of file diff --git a/src/util.c b/src/util.c index 7adce4ef03..d28950d266 100644 --- a/src/util.c +++ b/src/util.c @@ -382,6 +382,9 @@ static LONGDOUBLE_TYPE sqlite3Pow10(int E){ ** returns FALSE but it still converts the prefix and writes the result ** into *pResult. */ +#if defined(_MSC_VER) +#pragma warning(disable : 4756) +#endif int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ #ifndef SQLITE_OMIT_FLOATING_POINT int incr; @@ -569,6 +572,9 @@ do_atof_calc: return !sqlite3Atoi64(z, pResult, length, enc); #endif /* SQLITE_OMIT_FLOATING_POINT */ } +#if defined(_MSC_VER) +#pragma warning(default : 4756) +#endif /* ** Compare the 19-character string zNum against the text representation From af94adf049218f9d3675fd796663aa3e021f7d88 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Thu, 10 Oct 2019 23:58:28 +0000 Subject: [PATCH 027/476] Update the autoconf makefile for MSVC. FossilOrigin-Name: 9455643eecb74c8ac93ad3b3566f30e380dd912cdce3de993da5af42973ac59c --- autoconf/Makefile.msc | 1 - manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/autoconf/Makefile.msc b/autoconf/Makefile.msc index 2a7042efb0..52c14c6976 100644 --- a/autoconf/Makefile.msc +++ b/autoconf/Makefile.msc @@ -282,7 +282,6 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_JSON1=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBSTAT_VTAB=1 -OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_INTROSPECTION_PRAGMAS=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 !ENDIF OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 diff --git a/manifest b/manifest index a5c9cbf72e..4a72049d3b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarning\sseen\swith\sMSVC. -D 2019-10-10T23:58:16.392 +C Update\sthe\sautoconf\smakefile\sfor\sMSVC. +D 2019-10-10T23:58:28.834 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -15,7 +15,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc 3804b004efb6abd2d2e0f5f887dfc6ade3d1661f39335c0531df96e1ab61a062 +F autoconf/Makefile.msc 492ea431c411378094593a5225b9a02645455a5d87a26d018b5461b723e52125 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 F autoconf/configure.ac 308de24343e76ecfbe9a67f8fcd4c5216b790d230c5d9ce10210b7d5965d6192 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7833feecfe745e237f239ee4c38a9e4bf7ad66a32919150208da87c00a826473 -R f00378c448d9bb1d9bbacc01afc3ba1a +P 73a82114733af2a316f20eb8578badef307d14286c6ec03197744a6793425161 +R d5f45c5108b762b7c8e91fd0a2d79c41 U mistachkin -Z 1126cf0ca18de2bf402e76e92ac78399 +Z 28bfee33eb1bb153475a60f52f7783a4 diff --git a/manifest.uuid b/manifest.uuid index 763c305159..c22ce12b66 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -73a82114733af2a316f20eb8578badef307d14286c6ec03197744a6793425161 \ No newline at end of file +9455643eecb74c8ac93ad3b3566f30e380dd912cdce3de993da5af42973ac59c \ No newline at end of file From 21f6daa2cd32c5773a606981320c3a5e956a7726 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Oct 2019 14:21:48 +0000 Subject: [PATCH 028/476] Faster response to sqlite3_interrupt() in the OP_IntegrityCk and OP_Count opcodes. FossilOrigin-Name: bf875dc59909f9c22f7c1fc843bc4d9e5d97af5cb4ef43c4fa1d566ddfdeaacb --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/btree.c | 7 +++++-- src/btree.h | 4 ++-- src/btreeInt.h | 1 + src/vdbe.c | 8 ++++---- 6 files changed, 23 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 4a72049d3b..c49266bd6b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sautoconf\smakefile\sfor\sMSVC. -D 2019-10-10T23:58:28.834 +C Faster\sresponse\sto\ssqlite3_interrupt()\sin\sthe\sOP_IntegrityCk\sand\sOP_Count\nopcodes. +D 2019-10-11T14:21:48.162 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,9 +466,9 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c fdc4389b271bca30138db27dc2dfb9f52c2a7baaa44845aaf31a3c54663d837f -F src/btree.h c11446f07ec0e9dc85af8041cb0855c52f5359c8b2a43e47e02a685282504d89 -F src/btreeInt.h 6111c15868b90669f79081039d19e7ea8674013f907710baa3c814dc3f8bfd3f +F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 +F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 +F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 F src/build.c 13de2fdabbabcf2e2aaf6443a049fb851d9d3170136c08345468e158ceea3dc6 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -597,7 +597,7 @@ F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 6df0a99dfbdd9dec542a94f06dd9a8a575acc87047937b2b801ac9d68eb3c96f +F src/vdbe.c 9a3f4c2ec6c45e4bd5db465e77e79dfdf5bdc5cf3a8c0bfe9549da209b9c18bc F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 73a82114733af2a316f20eb8578badef307d14286c6ec03197744a6793425161 -R d5f45c5108b762b7c8e91fd0a2d79c41 -U mistachkin -Z 28bfee33eb1bb153475a60f52f7783a4 +P 9455643eecb74c8ac93ad3b3566f30e380dd912cdce3de993da5af42973ac59c +R 759aab4dd938f90c626730cf08eddaf4 +U drh +Z d295b5fa8949d20e3db539be4431a463 diff --git a/manifest.uuid b/manifest.uuid index c22ce12b66..b608d30fbb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9455643eecb74c8ac93ad3b3566f30e380dd912cdce3de993da5af42973ac59c \ No newline at end of file +bf875dc59909f9c22f7c1fc843bc4d9e5d97af5cb4ef43c4fa1d566ddfdeaacb \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 7ff91e667b..2150638aee 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9459,7 +9459,7 @@ int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){ ** Otherwise, if an error is encountered (i.e. an IO error or database ** corruption) an SQLite error code is returned. */ -int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ +int sqlite3BtreeCount(sqlite3 *db, BtCursor *pCur, i64 *pnEntry){ i64 nEntry = 0; /* Value to return in *pnEntry */ int rc; /* Return code */ @@ -9472,7 +9472,7 @@ int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){ /* Unless an error occurs, the following loop runs one iteration for each ** page in the B-Tree structure (not including overflow pages). */ - while( rc==SQLITE_OK ){ + while( rc==SQLITE_OK && !db->u1.isInterrupted ){ int iIdx; /* Index of child node in parent */ MemPage *pPage; /* Current page of the b-tree */ @@ -9598,6 +9598,7 @@ static int checkRef(IntegrityCk *pCheck, Pgno iPage){ checkAppendMsg(pCheck, "2nd reference to page %d", iPage); return 1; } + if( pCheck->db->u1.isInterrupted ) return 1; setPageReferenced(pCheck, iPage); return 0; } @@ -10041,6 +10042,7 @@ end_of_check: ** returned. If a memory allocation error occurs, NULL is returned. */ char *sqlite3BtreeIntegrityCheck( + sqlite3 *db, /* Database connection that is running the check */ Btree *p, /* The btree to be checked */ int *aRoot, /* An array of root pages numbers for individual trees */ int nRoot, /* Number of entries in aRoot[] */ @@ -10058,6 +10060,7 @@ char *sqlite3BtreeIntegrityCheck( assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE ); VVA_ONLY( nRef = sqlite3PagerRefcount(pBt->pPager) ); assert( nRef>=0 ); + sCheck.db = db; sCheck.pBt = pBt; sCheck.pPager = pBt->pPager; sCheck.nPage = btreePagecount(sCheck.pBt); diff --git a/src/btree.h b/src/btree.h index ed228c22eb..4fd281dec1 100644 --- a/src/btree.h +++ b/src/btree.h @@ -314,7 +314,7 @@ const void *sqlite3BtreePayloadFetch(BtCursor*, u32 *pAmt); u32 sqlite3BtreePayloadSize(BtCursor*); sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor*); -char *sqlite3BtreeIntegrityCheck(Btree*, int *aRoot, int nRoot, int, int*); +char *sqlite3BtreeIntegrityCheck(sqlite3*,Btree*,int*aRoot,int nRoot,int,int*); struct Pager *sqlite3BtreePager(Btree*); i64 sqlite3BtreeRowCountEst(BtCursor*); @@ -335,7 +335,7 @@ int sqlite3BtreeCursorIsValid(BtCursor*); int sqlite3BtreeCursorIsValidNN(BtCursor*); #ifndef SQLITE_OMIT_BTREECOUNT -int sqlite3BtreeCount(BtCursor *, i64 *); +int sqlite3BtreeCount(sqlite3*, BtCursor*, i64*); #endif #ifdef SQLITE_TEST diff --git a/src/btreeInt.h b/src/btreeInt.h index ddd374efc9..72d877f331 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -685,6 +685,7 @@ struct IntegrityCk { int v1, v2; /* Values for up to two %d fields in zPfx */ StrAccum errMsg; /* Accumulate the error message text here */ u32 *heap; /* Min-heap used for analyzing cell coverage */ + sqlite3 *db; /* Database connection running the check */ }; /* diff --git a/src/vdbe.c b/src/vdbe.c index eeef24b49f..1082b13d14 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3143,11 +3143,11 @@ case OP_Count: { /* out2 */ pCrsr = p->apCsr[pOp->p1]->uc.pCursor; assert( pCrsr ); nEntry = 0; /* Not needed. Only used to silence a warning. */ - rc = sqlite3BtreeCount(pCrsr, &nEntry); + rc = sqlite3BtreeCount(db, pCrsr, &nEntry); if( rc ) goto abort_due_to_error; pOut = out2Prerelease(p, pOp); pOut->u.i = nEntry; - break; + goto check_for_interrupt; } #endif @@ -6104,7 +6104,7 @@ case OP_IntegrityCk: { pIn1 = &aMem[pOp->p1]; assert( pOp->p5nDb ); assert( DbMaskTest(p->btreeMask, pOp->p5) ); - z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, &aRoot[1], nRoot, + z = sqlite3BtreeIntegrityCheck(db, db->aDb[pOp->p5].pBt, &aRoot[1], nRoot, (int)pnErr->u.i+1, &nErr); sqlite3VdbeMemSetNull(pIn1); if( nErr==0 ){ @@ -6117,7 +6117,7 @@ case OP_IntegrityCk: { } UPDATE_MAX_BLOBSIZE(pIn1); sqlite3VdbeChangeEncoding(pIn1, encoding); - break; + goto check_for_interrupt; } #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ From 656d535ae6cdb6a4857dcb0cd7e8a71c2ddb7ab8 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Oct 2019 14:25:00 +0000 Subject: [PATCH 029/476] Increase the version number to 3.31.0 for the next release cycle. FossilOrigin-Name: ffd4c30620abe6ba38d82f3db934d18cc8468aaac4cd50a4e01be8910854d3f0 --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/VERSION b/VERSION index 1cfe511a3e..d9351e5882 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.30.0 +3.31.0 diff --git a/configure b/configure index d2806c20c4..299cffa608 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.30.0. +# Generated by GNU Autoconf 2.69 for sqlite 3.31.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.30.0' -PACKAGE_STRING='sqlite 3.30.0' +PACKAGE_VERSION='3.31.0' +PACKAGE_STRING='sqlite 3.31.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1466,7 +1466,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.30.0 to adapt to many kinds of systems. +\`configure' configures sqlite 3.31.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1531,7 +1531,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.30.0:";; + short | recursive ) echo "Configuration of sqlite 3.31.0:";; esac cat <<\_ACEOF @@ -1657,7 +1657,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.30.0 +sqlite configure 3.31.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2076,7 +2076,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.30.0, which was +It was created by sqlite $as_me 3.31.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12232,7 +12232,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.30.0, which was +This file was extended by sqlite $as_me 3.31.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12298,7 +12298,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.30.0 +sqlite config.status 3.31.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index c49266bd6b..c451a635c2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Faster\sresponse\sto\ssqlite3_interrupt()\sin\sthe\sOP_IntegrityCk\sand\sOP_Count\nopcodes. -D 2019-10-11T14:21:48.162 +C Increase\sthe\sversion\snumber\sto\s3.31.0\sfor\sthe\snext\srelease\scycle. +D 2019-10-11T14:25:00.543 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -7,7 +7,7 @@ F Makefile.in bf24a9abbb277afa2fbe6bac80a181f22be6c48de771cd260c9851ecf6165dc1 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc c7e3548d5c9dc12bedf47366ca3f1438196f635d81f08fda44c6c1f290c4bcf8 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION 4c516d84c2a5f26c477ed34c09ac4136630f71c68139631f2eb591b22eea7cf1 +F VERSION 081500f0aeaadc989d85aafbc717af45512018aebc73d89e5c2368fe62a600ff F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -34,7 +34,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 6f5136d2574d7aa08370021ab63be3ef8a8bf32af60594de08393b01feeb4bab x +F configure fdc9f8d53360170679349d8f72fb2e5c79f511424891b7bb8a2f48de41c7a6ef x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9455643eecb74c8ac93ad3b3566f30e380dd912cdce3de993da5af42973ac59c -R 759aab4dd938f90c626730cf08eddaf4 +P bf875dc59909f9c22f7c1fc843bc4d9e5d97af5cb4ef43c4fa1d566ddfdeaacb +R a5c987ad61c2393e0885d5bb61727fe1 U drh -Z d295b5fa8949d20e3db539be4431a463 +Z cfe6e6f280cfd169c3139ebab07a317c diff --git a/manifest.uuid b/manifest.uuid index b608d30fbb..8c6a71967d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bf875dc59909f9c22f7c1fc843bc4d9e5d97af5cb4ef43c4fa1d566ddfdeaacb \ No newline at end of file +ffd4c30620abe6ba38d82f3db934d18cc8468aaac4cd50a4e01be8910854d3f0 \ No newline at end of file From 9613c9f4a614e9e6c3144f8242c868aba8c32c06 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Oct 2019 14:27:17 +0000 Subject: [PATCH 030/476] Fix the fts3/4 integrity-check command so that it works with "ORDER=DESC" tables. Fix for [8a6fa2bb]. FossilOrigin-Name: 5863546df99abd1ad4ebcaba18dec647be4368e2c13ce0b28e48c8608d3e87ef --- ext/fts3/fts3_write.c | 6 +++++- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts3misc.test | 30 ++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index f0e935ca8e..058677774d 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -5171,7 +5171,11 @@ static u64 fts3ChecksumIndex( pCsr += sqlite3Fts3GetVarint(pCsr, &iCol); }else{ pCsr += sqlite3Fts3GetVarint(pCsr, &iVal); - iDocid += iVal; + if( p->bDescIdx ){ + iDocid -= iVal; + }else{ + iDocid += iVal; + } } }else{ iPos += (iVal - 2); diff --git a/manifest b/manifest index c451a635c2..5d40462300 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Increase\sthe\sversion\snumber\sto\s3.31.0\sfor\sthe\snext\srelease\scycle. -D 2019-10-11T14:25:00.543 +C Fix\sthe\sfts3/4\sintegrity-check\scommand\sso\sthat\sit\sworks\swith\s"ORDER=DESC"\stables.\sFix\sfor\s[8a6fa2bb]. +D 2019-10-11T14:27:17.413 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 9b5ae495b3bf287aab3d92268b6fdc4eb68dd6d8c0342a0b316cf3157953a3f7 +F ext/fts3/fts3_write.c 2fd47cef0eb10ac977ea49be4ab4113b22fed59ddef184f0e01a76ee9c3c8d10 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -958,7 +958,7 @@ F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11e F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3misc.test 889f51b669e083b96a79a2045ff9baa212071ac1a5eb0e06979c63af3f3451f2 +F test/fts3misc.test 67bf293709e1a509a019a9192a5a5752b5384ac344ba0713e95af9fe22a027b5 F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bf875dc59909f9c22f7c1fc843bc4d9e5d97af5cb4ef43c4fa1d566ddfdeaacb -R a5c987ad61c2393e0885d5bb61727fe1 -U drh -Z cfe6e6f280cfd169c3139ebab07a317c +P ffd4c30620abe6ba38d82f3db934d18cc8468aaac4cd50a4e01be8910854d3f0 +R 9cbaf6d312ff6a805740af8711137a3b +U dan +Z 3644422e42869279e7f1f288a5bed267 diff --git a/manifest.uuid b/manifest.uuid index 8c6a71967d..c118063317 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ffd4c30620abe6ba38d82f3db934d18cc8468aaac4cd50a4e01be8910854d3f0 \ No newline at end of file +5863546df99abd1ad4ebcaba18dec647be4368e2c13ce0b28e48c8608d3e87ef \ No newline at end of file diff --git a/test/fts3misc.test b/test/fts3misc.test index 7f679d23f4..19d07edaf7 100644 --- a/test/fts3misc.test +++ b/test/fts3misc.test @@ -237,5 +237,35 @@ do_execsql_test 7.1 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 7.0.1 { + CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=DESC); + INSERT INTO vt0(c0) VALUES (0), (0); +} +do_execsql_test 7.0.2 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} +reset_db +do_execsql_test 7.1.1 { + CREATE VIRTUAL TABLE vt0 USING fts4(c0, order=ASC); + INSERT INTO vt0(c0) VALUES (0), (0); +} +do_execsql_test 7.1.2 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + +do_execsql_test 7.2.1 { + CREATE VIRTUAL TABLE ft USING fts4(c0, c1, order=DESC, prefix=1); + INSERT INTO ft VALUES('a b c d', 'hello world'); + INSERT INTO ft VALUES('negative', 'positive'); + INSERT INTO ft VALUES('hello world', 'a b c d'); +} +do_execsql_test 7.2.2 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + + finish_test From 8b4d0e2cbad230860c724088bcdacaed000b2a99 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Oct 2019 15:33:13 +0000 Subject: [PATCH 031/476] Ensure fts3/4 prefix indexes are flushed to disk before an 'optimize' command. Fix for [745f1abc]. FossilOrigin-Name: 4ed905b18847d4dbf5a2570052abced338065f824137b90300f62d77b3159d80 --- ext/fts3/fts3_write.c | 6 ++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3misc.test | 19 +++++++++++++++++-- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 058677774d..e4b91a82ab 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3482,7 +3482,10 @@ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ int rc; sqlite3_stmt *pAllLangid = 0; - rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + rc = sqlite3Fts3PendingTermsFlush(p); + if( rc==SQLITE_OK ){ + rc = fts3SqlStmt(p, SQL_SELECT_ALL_LANGID, &pAllLangid, 0); + } if( rc==SQLITE_OK ){ int rc2; sqlite3_bind_int(pAllLangid, 1, p->iPrevLangid); @@ -3503,7 +3506,6 @@ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){ } sqlite3Fts3SegmentsClose(p); - sqlite3Fts3PendingTermsClear(p); return (rc==SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc; } diff --git a/manifest b/manifest index 5d40462300..badcfcb33e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sfts3/4\sintegrity-check\scommand\sso\sthat\sit\sworks\swith\s"ORDER=DESC"\stables.\sFix\sfor\s[8a6fa2bb]. -D 2019-10-11T14:27:17.413 +C Ensure\sfts3/4\sprefix\sindexes\sare\sflushed\sto\sdisk\sbefore\san\s'optimize'\scommand.\sFix\sfor\s[745f1abc]. +D 2019-10-11T15:33:13.752 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 2fd47cef0eb10ac977ea49be4ab4113b22fed59ddef184f0e01a76ee9c3c8d10 +F ext/fts3/fts3_write.c 5e35b790778039aaa1267e0ad557c2518274fff9d97ea09301ecb6371dbc6118 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -958,7 +958,7 @@ F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11e F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3misc.test 67bf293709e1a509a019a9192a5a5752b5384ac344ba0713e95af9fe22a027b5 +F test/fts3misc.test a418198b2c3c56bddcaf657f41644715f6ad27ffa72a8ba8f542e93030517744 F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ffd4c30620abe6ba38d82f3db934d18cc8468aaac4cd50a4e01be8910854d3f0 -R 9cbaf6d312ff6a805740af8711137a3b +P 5863546df99abd1ad4ebcaba18dec647be4368e2c13ce0b28e48c8608d3e87ef +R 40ae78baf0fb340e9bc66e248358e43e U dan -Z 3644422e42869279e7f1f288a5bed267 +Z e8d62df0ae7b8d9d3710fd8698abaecb diff --git a/manifest.uuid b/manifest.uuid index c118063317..d63c60ec06 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5863546df99abd1ad4ebcaba18dec647be4368e2c13ce0b28e48c8608d3e87ef \ No newline at end of file +4ed905b18847d4dbf5a2570052abced338065f824137b90300f62d77b3159d80 \ No newline at end of file diff --git a/test/fts3misc.test b/test/fts3misc.test index 19d07edaf7..4532a79f05 100644 --- a/test/fts3misc.test +++ b/test/fts3misc.test @@ -238,6 +238,7 @@ do_execsql_test 7.1 { } #------------------------------------------------------------------------- +# Ticket [8a6fa2bb]. # reset_db do_execsql_test 7.0.1 { @@ -255,7 +256,6 @@ do_execsql_test 7.1.1 { do_execsql_test 7.1.2 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } - do_execsql_test 7.2.1 { CREATE VIRTUAL TABLE ft USING fts4(c0, c1, order=DESC, prefix=1); INSERT INTO ft VALUES('a b c d', 'hello world'); @@ -266,6 +266,21 @@ do_execsql_test 7.2.2 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } - +#------------------------------------------------------------------------- +# Ticket [745f1abc]. +# +reset_db +do_execsql_test 8.1 { + CREATE VIRTUAL TABLE vt0 USING fts4(c0, prefix=1); +} +do_execsql_test 8.2 { + BEGIN; + INSERT INTO vt0 VALUES (0); + INSERT INTO vt0(vt0) VALUES('optimize'); + COMMIT; +} +do_execsql_test 8.3 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} finish_test From 4a254f98e3fc2b214127f1714d27a2eccc4f7fda Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Oct 2019 16:01:21 +0000 Subject: [PATCH 032/476] Improvements to the LEFT JOIN strength reduction optimization. FossilOrigin-Name: 548082dfab5d9484279ccc11cd2833ac131b54b7481372b576d7c28bbb3294ea --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 6 +++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index badcfcb33e..7ab0dcc587 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sfts3/4\sprefix\sindexes\sare\sflushed\sto\sdisk\sbefore\san\s'optimize'\scommand.\sFix\sfor\s[745f1abc]. -D 2019-10-11T15:33:13.752 +C Improvements\sto\sthe\sLEFT\sJOIN\sstrength\sreduction\soptimization. +D 2019-10-11T16:01:21.642 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 88de5e67b378731da9a45c592122c754693c2a095db61dcd1a0cc64bb72b6145 +F src/expr.c 8e82108846bb8ad0651feb1672eb8aae82158b6240f5677bc72d6cdf80e9d7a8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5863546df99abd1ad4ebcaba18dec647be4368e2c13ce0b28e48c8608d3e87ef -R 40ae78baf0fb340e9bc66e248358e43e -U dan -Z e8d62df0ae7b8d9d3710fd8698abaecb +P 4ed905b18847d4dbf5a2570052abced338065f824137b90300f62d77b3159d80 +R b207e5537fa5845b32cb8d65da5d4e9f +U drh +Z 75f587b0cae941ddcaa1476b9bca25c8 diff --git a/manifest.uuid b/manifest.uuid index d63c60ec06..fad3987b87 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4ed905b18847d4dbf5a2570052abced338065f824137b90300f62d77b3159d80 \ No newline at end of file +548082dfab5d9484279ccc11cd2833ac131b54b7481372b576d7c28bbb3294ea \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b1f405cdc9..e28a7b044e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5231,8 +5231,12 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ Walker w; p = sqlite3ExprSkipCollateAndLikely(p); - if( p && p->op==TK_NOTNULL ){ + if( p==0 ) return 0; + if( p->op==TK_NOTNULL ){ p = p->pLeft; + }else if( p->op==TK_AND ){ + if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; + p = p->pRight; } w.xExprCallback = impliesNotNullRow; w.xSelectCallback = 0; From a1698993e6c84613e873929693f7886e151f30d9 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 11 Oct 2019 17:14:40 +0000 Subject: [PATCH 033/476] Futher improvements to LEFT JOIN strength reduction. FossilOrigin-Name: 8a39167bd2d46496f7484cfec371e4bad22da882209b01da9459c4ed5877da25 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 8 +++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 7ab0dcc587..055fc9b89e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sLEFT\sJOIN\sstrength\sreduction\soptimization. -D 2019-10-11T16:01:21.642 +C Futher\simprovements\sto\sLEFT\sJOIN\sstrength\sreduction. +D 2019-10-11T17:14:40.541 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 8e82108846bb8ad0651feb1672eb8aae82158b6240f5677bc72d6cdf80e9d7a8 +F src/expr.c 4c2a0d00a0d7701811a463b9af2c63d10b0c5ee7b8bde249309184f82d27b5b0 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4ed905b18847d4dbf5a2570052abced338065f824137b90300f62d77b3159d80 -R b207e5537fa5845b32cb8d65da5d4e9f +P 548082dfab5d9484279ccc11cd2833ac131b54b7481372b576d7c28bbb3294ea +R e92862a2f034c9f00bf2d8147c0c666e U drh -Z 75f587b0cae941ddcaa1476b9bca25c8 +Z e5d0b13ba33a14a9603b6e44d6857a13 diff --git a/manifest.uuid b/manifest.uuid index fad3987b87..44c1534158 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -548082dfab5d9484279ccc11cd2833ac131b54b7481372b576d7c28bbb3294ea \ No newline at end of file +8a39167bd2d46496f7484cfec371e4bad22da882209b01da9459c4ed5877da25 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e28a7b044e..0e827482b2 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5234,9 +5234,11 @@ int sqlite3ExprImpliesNonNullRow(Expr *p, int iTab){ if( p==0 ) return 0; if( p->op==TK_NOTNULL ){ p = p->pLeft; - }else if( p->op==TK_AND ){ - if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; - p = p->pRight; + }else{ + while( p->op==TK_AND ){ + if( sqlite3ExprImpliesNonNullRow(p->pLeft, iTab) ) return 1; + p = p->pRight; + } } w.xExprCallback = impliesNotNullRow; w.xSelectCallback = 0; From d681626a8b3b1070917f7c673a0dd55065ec2775 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Oct 2019 18:55:10 +0000 Subject: [PATCH 034/476] Update the zipfile extension to use deflateBound(), instead of compressBound(), to learn the maximum possible size of a deflate()d buffer. FossilOrigin-Name: f5ee30426e8876e70304f852153b56991a2a66e0f6a82597e9dcccf49163272d --- ext/misc/zipfile.c | 17 +++++++++-------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 0b14917cb2..0d66f6a6f5 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -981,25 +981,26 @@ static int zipfileDeflate( u8 **ppOut, int *pnOut, /* Output */ char **pzErr /* OUT: Error message */ ){ - sqlite3_int64 nAlloc = compressBound(nIn); - u8 *aOut; int rc = SQLITE_OK; + sqlite3_int64 nAlloc; + z_stream str; + u8 *aOut; + memset(&str, 0, sizeof(str)); + str.next_in = (Bytef*)aIn; + str.avail_in = nIn; + deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); + + nAlloc = deflateBound(&str, nIn); aOut = (u8*)sqlite3_malloc64(nAlloc); if( aOut==0 ){ rc = SQLITE_NOMEM; }else{ int res; - z_stream str; - memset(&str, 0, sizeof(str)); - str.next_in = (Bytef*)aIn; - str.avail_in = nIn; str.next_out = aOut; str.avail_out = nAlloc; - deflateInit2(&str, 9, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY); res = deflate(&str, Z_FINISH); - if( res==Z_STREAM_END ){ *ppOut = aOut; *pnOut = (int)str.total_out; diff --git a/manifest b/manifest index 055fc9b89e..456c9fea65 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Futher\simprovements\sto\sLEFT\sJOIN\sstrength\sreduction. -D 2019-10-11T17:14:40.541 +C Update\sthe\szipfile\sextension\sto\suse\sdeflateBound(),\sinstead\sof\scompressBound(),\sto\slearn\sthe\smaximum\spossible\ssize\sof\sa\sdeflate()d\sbuffer. +D 2019-10-11T18:55:10.084 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -323,7 +323,7 @@ F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c c1ca8f52330b4564207036b978edac8141c737bf612659bf6f7bee3ddd563a03 +F ext/misc/zipfile.c 7ad29133e304e40c8fe239bea10e101580ed56bc68c16d992af514cce19572d0 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 548082dfab5d9484279ccc11cd2833ac131b54b7481372b576d7c28bbb3294ea -R e92862a2f034c9f00bf2d8147c0c666e -U drh -Z e5d0b13ba33a14a9603b6e44d6857a13 +P 8a39167bd2d46496f7484cfec371e4bad22da882209b01da9459c4ed5877da25 +R eb06663b6457025b40a5a6ff154e9856 +U dan +Z efc0771126277e0cc41b7707a438e0f8 diff --git a/manifest.uuid b/manifest.uuid index 44c1534158..38561b7f5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8a39167bd2d46496f7484cfec371e4bad22da882209b01da9459c4ed5877da25 \ No newline at end of file +f5ee30426e8876e70304f852153b56991a2a66e0f6a82597e9dcccf49163272d \ No newline at end of file From a0fe5fe54fe57b4f1c8011d420c5775cc6f94968 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 12 Oct 2019 23:38:00 +0000 Subject: [PATCH 035/476] When Select-Trace is enabled (in debugging builds only) do not show the result of Window function tree rewrites if there are no window functions. FossilOrigin-Name: d1acf72ae1ea7484bb9c3a8630094f1a3a9597578c7b9d6e02fc0a4e3f59c57d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 456c9fea65..bbdc0f15c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\szipfile\sextension\sto\suse\sdeflateBound(),\sinstead\sof\scompressBound(),\sto\slearn\sthe\smaximum\spossible\ssize\sof\sa\sdeflate()d\sbuffer. -D 2019-10-11T18:55:10.084 +C When\sSelect-Trace\sis\senabled\s(in\sdebugging\sbuilds\sonly)\sdo\snot\sshow\sthe\nresult\sof\sWindow\sfunction\stree\srewrites\sif\sthere\sare\sno\swindow\sfunctions. +D 2019-10-12T23:38:00.145 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -525,7 +525,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c b3d64a7a3342471ce078251c5ba132f8ec66f994534f1070dda025b354a09a62 +F src/select.c 7ef05eeb7f686f84dd1428cbdca280c898915bbf56e1ea97bd42ecc070af78d3 F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e274 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1846,7 +1846,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8a39167bd2d46496f7484cfec371e4bad22da882209b01da9459c4ed5877da25 -R eb06663b6457025b40a5a6ff154e9856 -U dan -Z efc0771126277e0cc41b7707a438e0f8 +P f5ee30426e8876e70304f852153b56991a2a66e0f6a82597e9dcccf49163272d +R efdbb8351c1ff37fb18793c0f98348de +U drh +Z aeb1a204a5f6f383373587bc05ae8c43 diff --git a/manifest.uuid b/manifest.uuid index 38561b7f5d..b8e545826a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f5ee30426e8876e70304f852153b56991a2a66e0f6a82597e9dcccf49163272d \ No newline at end of file +d1acf72ae1ea7484bb9c3a8630094f1a3a9597578c7b9d6e02fc0a4e3f59c57d \ No newline at end of file diff --git a/src/select.c b/src/select.c index 7cc5cde0ec..a5377a2c20 100644 --- a/src/select.c +++ b/src/select.c @@ -5727,7 +5727,7 @@ int sqlite3Select( goto select_end; } #if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x108 ){ + if( p->pWin && (sqlite3SelectTrace & 0x108)!=0 ){ SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n")); sqlite3TreeViewSelect(0, p, 0); } From 2d82269ca8ccc13328af42cd9dad7edd565f9456 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 14 Oct 2019 15:15:50 +0000 Subject: [PATCH 036/476] Fix a problem with row-value IN(...) operators and virtual tables. FossilOrigin-Name: aa57d7abac0bb92d4d5fd4e093a11cf8efc04e4eed748b2a400d01f137250649 --- ext/fts5/test/fts5misc.test | 26 +++++++++++ manifest | 17 +++---- manifest.uuid | 2 +- src/wherecode.c | 4 +- test/rowvaluevtab.test | 91 +++++++++++++++++++++++++++++++++++++ 5 files changed, 130 insertions(+), 10 deletions(-) create mode 100644 test/rowvaluevtab.test diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index d4e55f0974..9be73aeb3b 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -193,5 +193,31 @@ do_execsql_test 6.1 { INSERT INTO vt0(vt0) VALUES('rebuild'); } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 7.0 { + CREATE VIRTUAL TABLE t1 USING fts5(x); + INSERT INTO t1(rowid, x) VALUES(1, 'hello world'); + INSERT INTO t1(rowid, x) VALUES(2, 'well said'); + INSERT INTO t1(rowid, x) VALUES(3, 'hello said'); + INSERT INTO t1(rowid, x) VALUES(4, 'well world'); + + CREATE TABLE t2 (a, b); + INSERT INTO t2 VALUES(1, 'hello'); + INSERT INTO t2 VALUES(2, 'world'); + INSERT INTO t2 VALUES(3, 'said'); + INSERT INTO t2 VALUES(4, 'hello'); +} + +do_execsql_test 7.1 { + SELECT rowid FROM t1 WHERE (rowid, x) IN (SELECT a, b FROM t2); +} + +do_execsql_test 7.2 { + SELECT rowid FROM t1 WHERE rowid=2 AND t1 = 'hello'; +} + + finish_test diff --git a/manifest b/manifest index bbdc0f15c4..e0c8adf7d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sSelect-Trace\sis\senabled\s(in\sdebugging\sbuilds\sonly)\sdo\snot\sshow\sthe\nresult\sof\sWindow\sfunction\stree\srewrites\sif\sthere\sare\sno\swindow\sfunctions. -D 2019-10-12T23:38:00.145 +C Fix\sa\sproblem\swith\srow-value\sIN(...)\soperators\sand\svirtual\stables. +D 2019-10-14T15:15:50.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test f3edb5e6a370d6045f1b28979ee581a44e81d5f15d4e1779db3d3069914171fd +F ext/fts5/test/fts5misc.test adfccd3f065df52e306778c815f873ab779b9db34e9817b1d4b819132f914701 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -613,7 +613,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 9f3f23efc45934e7b7ea6c0c1042420b73053e7c3264feef6faf9ce6fbd5df61 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 -F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b +F src/wherecode.c fde87356e0393d91cf29f27817ed02583e152517b5cc641cd0d0c94912a5603a F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1270,6 +1270,7 @@ F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 +F test/rowvaluevtab.test 751a224b86d5c66d1d0bfa9887da9d6ab9a1c09e1268b5abe0ffdfdd418f122f F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 F test/savepoint.test 1f8a6b1aea9a0d05837adc463d4bf47bd9d0f1c842f1c2a9caccd639baf34bf9 @@ -1846,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f5ee30426e8876e70304f852153b56991a2a66e0f6a82597e9dcccf49163272d -R efdbb8351c1ff37fb18793c0f98348de -U drh -Z aeb1a204a5f6f383373587bc05ae8c43 +P d1acf72ae1ea7484bb9c3a8630094f1a3a9597578c7b9d6e02fc0a4e3f59c57d +R 8aede2fd3a2b367bcf55d8d9cd88d2ac +U dan +Z 27a81d4430496f3d39af57caa874466b diff --git a/manifest.uuid b/manifest.uuid index b8e545826a..ca8fb25889 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d1acf72ae1ea7484bb9c3a8630094f1a3a9597578c7b9d6e02fc0a4e3f59c57d \ No newline at end of file +aa57d7abac0bb92d4d5fd4e093a11cf8efc04e4eed748b2a400d01f137250649 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 2fbcba17e9..cf5ce5d4ae 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1307,7 +1307,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( pTerm = pLoop->aLTerm[j]; if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ disableTerm(pLevel, pTerm); - }else if( (pTerm->eOperator & WO_IN)!=0 ){ + }else if( (pTerm->eOperator & WO_IN)!=0 && + sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 + ){ Expr *pCompare; /* The comparison operator */ Expr *pRight; /* RHS of the comparison */ VdbeOp *pOp; /* Opcode to access the value of the IN constraint */ diff --git a/test/rowvaluevtab.test b/test/rowvaluevtab.test new file mode 100644 index 0000000000..7d5dc52651 --- /dev/null +++ b/test/rowvaluevtab.test @@ -0,0 +1,91 @@ +# 2018 October 14 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set ::testprefix rowvaluevtab + +register_echo_module db + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b, c); + CREATE INDEX t1b ON t1(b); + INSERT INTO t1 VALUES('one', 1, 1); + INSERT INTO t1 VALUES('two', 1, 2); + INSERT INTO t1 VALUES('three', 1, 3); + INSERT INTO t1 VALUES('four', 2, 1); + INSERT INTO t1 VALUES('five', 2, 2); + INSERT INTO t1 VALUES('six', 2, 3); + INSERT INTO t1 VALUES('seven', 3, 1); + INSERT INTO t1 VALUES('eight', 3, 2); + INSERT INTO t1 VALUES('nine', 3, 3); + + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<10000 + ) INSERT INTO t1 SELECT NULL, NULL, NULL FROM s; + CREATE VIRTUAL TABLE e1 USING echo(t1); +} + +proc do_vfilter4_test {tn sql expected} { + set res [list] + db eval "explain $sql" { + if {$opcode=="VFilter"} { + lappend res $p4 + } + } + uplevel [list do_test $tn [list set {} $res] [list {*}$expected]] +} + +do_execsql_test 1.1 { + SELECT a FROM e1 WHERE (b, c) = (2, 2) +} {five} +do_vfilter4_test 1.1f { + SELECT a FROM e1 WHERE (b, c) = (?, ?) +} {{SELECT rowid, a, b, c FROM 't1' WHERE b = ?}} + +do_execsql_test 1.2 { + SELECT a FROM e1 WHERE (b, c) > (2, 2) +} {six seven eight nine} +do_vfilter4_test 1.2f { + SELECT a FROM e1 WHERE (b, c) > (2, 2) +} { + {SELECT rowid, a, b, c FROM 't1' WHERE b >= ?} +} + +do_execsql_test 1.3 { + SELECT a FROM e1 WHERE (b, c) >= (2, 2) +} {five six seven eight nine} +do_vfilter4_test 1.3f { + SELECT a FROM e1 WHERE (b, c) >= (2, 2) +} { + {SELECT rowid, a, b, c FROM 't1' WHERE b >= ?} +} + +do_execsql_test 1.3 { + SELECT a FROM e1 WHERE (b, c) BETWEEN (1, 2) AND (2, 3) +} {two three four five six} +do_vfilter4_test 1.3f { + SELECT a FROM e1 WHERE (b, c) BETWEEN (1, 2) AND (2, 3) +} { + {SELECT rowid, a, b, c FROM 't1' WHERE b >= ? AND b <= ?} +} + +do_execsql_test 1.4 { + SELECT a FROM e1 WHERE (b, c) IN ( VALUES(2, 2) ) +} {five} +do_vfilter4_test 1.4f { + SELECT a FROM e1 WHERE (b, c) IN ( VALUES(2, 2) ) +} {{SELECT rowid, a, b, c FROM 't1' WHERE b = ?}} + +finish_test + From 4a9f379c9c1e5053d6550c27a1a3289cf1a6544c Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 14 Oct 2019 15:24:20 +0000 Subject: [PATCH 037/476] New test cases in test/fuzzdata8.db. FossilOrigin-Name: 344d9cb0c726078af6deb4a26bed3aded5b26914bb286d3446d3a4e9150840b7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1359872 -> 1364992 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e0c8adf7d1..9f7e150ca6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\srow-value\sIN(...)\soperators\sand\svirtual\stables. -D 2019-10-14T15:15:50.018 +C New\stest\scases\sin\stest/fuzzdata8.db. +D 2019-10-14T15:24:20.778 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1015,7 +1015,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 57e6d5017998c7b96a1662e6437e25fdd9a38da7fdb1393213f929f8871b4c43 +F test/fuzzdata8.db 14b531b71ba1fb5f86aa80b741f98867c2d25bd0731b966513e4af04700e2557 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d1acf72ae1ea7484bb9c3a8630094f1a3a9597578c7b9d6e02fc0a4e3f59c57d -R 8aede2fd3a2b367bcf55d8d9cd88d2ac -U dan -Z 27a81d4430496f3d39af57caa874466b +P aa57d7abac0bb92d4d5fd4e093a11cf8efc04e4eed748b2a400d01f137250649 +R ca568602d34a734421b347284b3a3d99 +U drh +Z d532a8411ac1d1ff35d5311fa4be383e diff --git a/manifest.uuid b/manifest.uuid index ca8fb25889..d53877e082 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa57d7abac0bb92d4d5fd4e093a11cf8efc04e4eed748b2a400d01f137250649 \ No newline at end of file +344d9cb0c726078af6deb4a26bed3aded5b26914bb286d3446d3a4e9150840b7 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 0c0178eb7b325bafada782f19835c9e8577c9fd9..89406974898f29e8cac0e556157d009f8949fe4c 100644 GIT binary patch delta 27866 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 P3?ilc1oE-``)B_Li>pHh delta 25520 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 Date: Mon, 14 Oct 2019 20:32:31 +0000 Subject: [PATCH 038/476] Futher improvements to the IN operator for row-values on virtual tables. FossilOrigin-Name: bc751fb64d5b08e5ca4c85cd1c6fbf09590fa9dad7e176ba373082ea373655b5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 6 ++++-- test/fuzzdata8.db | Bin 1364992 -> 1371136 bytes 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 9f7e150ca6..da13312c73 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scases\sin\stest/fuzzdata8.db. -D 2019-10-14T15:24:20.778 +C Futher\simprovements\sto\sthe\sIN\soperator\sfor\srow-values\son\svirtual\stables. +D 2019-10-14T20:32:31.002 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 9f3f23efc45934e7b7ea6c0c1042420b73053e7c3264feef6faf9ce6fbd5df61 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 -F src/wherecode.c fde87356e0393d91cf29f27817ed02583e152517b5cc641cd0d0c94912a5603a +F src/wherecode.c e6173659b15105ab9cc62388ea83077587aec8b77622e6b1da7bac029334d411 F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1015,7 +1015,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 14b531b71ba1fb5f86aa80b741f98867c2d25bd0731b966513e4af04700e2557 +F test/fuzzdata8.db 7a8baf778cbaf9c9744c9dd9b7aa66c4365d96c0ef8e1900e99a48a48f19778c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P aa57d7abac0bb92d4d5fd4e093a11cf8efc04e4eed748b2a400d01f137250649 -R ca568602d34a734421b347284b3a3d99 +P 344d9cb0c726078af6deb4a26bed3aded5b26914bb286d3446d3a4e9150840b7 +R 2718afa6f840036afeb5adff293ecb86 U drh -Z d532a8411ac1d1ff35d5311fa4be383e +Z b3560113c59df505425231fe27d4299c diff --git a/manifest.uuid b/manifest.uuid index d53877e082..d83dff67ae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -344d9cb0c726078af6deb4a26bed3aded5b26914bb286d3446d3a4e9150840b7 \ No newline at end of file +bc751fb64d5b08e5ca4c85cd1c6fbf09590fa9dad7e176ba373082ea373655b5 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index cf5ce5d4ae..3a8fba81bb 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1305,6 +1305,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( iIn = pLevel->u.in.nIn; for(j=nConstraint-1; j>=0; j--){ pTerm = pLoop->aLTerm[j]; + if( (pTerm->eOperator & WO_IN)!=0 ) iIn--; if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ disableTerm(pLevel, pTerm); }else if( (pTerm->eOperator & WO_IN)!=0 && @@ -1320,8 +1321,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** encoding of the value in the register, so it *must* be reloaded. */ assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed ); if( !db->mallocFailed ){ - assert( iIn>0 ); - pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[--iIn].addrInTop); + assert( iIn>=0 && iInu.in.nIn ); + pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop); assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid ); assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 ); assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 ); @@ -1345,6 +1346,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( } } } + assert( iIn==0 || db->mallocFailed ); /* These registers need to be preserved in case there is an IN operator ** loop. So we could deallocate the registers here (and potentially ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 89406974898f29e8cac0e556157d009f8949fe4c..e024e6d627e997f393089741f9a34ccc5fded452 100644 GIT binary patch delta 23679 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 delta 22521 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 From 4ec3e820a00c5372972a0f1b143b2797b21ffb9f Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 15 Oct 2019 19:01:55 +0000 Subject: [PATCH 039/476] Formatting change on a multi-line conditional, for improved clarity. No logic changes. FossilOrigin-Name: 7248e3476511ecd317f54edcfe1e87443bfdcc1b10c89c7734eefcabafec6c0b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index da13312c73..1876174cf9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Futher\simprovements\sto\sthe\sIN\soperator\sfor\srow-values\son\svirtual\stables. -D 2019-10-14T20:32:31.002 +C Formatting\schange\son\sa\smulti-line\sconditional,\sfor\simproved\sclarity.\nNo\slogic\schanges. +D 2019-10-15T19:01:55.901 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 9f3f23efc45934e7b7ea6c0c1042420b73053e7c3264feef6faf9ce6fbd5df61 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 -F src/wherecode.c e6173659b15105ab9cc62388ea83077587aec8b77622e6b1da7bac029334d411 +F src/wherecode.c 57d034a0dbca9f86e1a691f74e469ed09ff49d04712b838fb68596b76a9af7d2 F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 344d9cb0c726078af6deb4a26bed3aded5b26914bb286d3446d3a4e9150840b7 -R 2718afa6f840036afeb5adff293ecb86 +P bc751fb64d5b08e5ca4c85cd1c6fbf09590fa9dad7e176ba373082ea373655b5 +R 3dc274e5f048c65fb3fe7dfe730dc64a U drh -Z b3560113c59df505425231fe27d4299c +Z a66229c65bafcb1e69be0fef5ecdca35 diff --git a/manifest.uuid b/manifest.uuid index d83dff67ae..30f2e65a57 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc751fb64d5b08e5ca4c85cd1c6fbf09590fa9dad7e176ba373082ea373655b5 \ No newline at end of file +7248e3476511ecd317f54edcfe1e87443bfdcc1b10c89c7734eefcabafec6c0b \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 3a8fba81bb..e40e3f2704 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1308,8 +1308,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( (pTerm->eOperator & WO_IN)!=0 ) iIn--; if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){ disableTerm(pLevel, pTerm); - }else if( (pTerm->eOperator & WO_IN)!=0 && - sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 + }else if( (pTerm->eOperator & WO_IN)!=0 + && sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 ){ Expr *pCompare; /* The comparison operator */ Expr *pRight; /* RHS of the comparison */ From 81f7b372700d7595f486d364a26304b052eda55a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 16 Oct 2019 12:18:59 +0000 Subject: [PATCH 040/476] Initial experimental code for generated column support. Non-functional. FossilOrigin-Name: 11d472c1df707b8d03ec57d8fc582a34f5eb89a9d02a154a9871650c65065b45 --- manifest | 35 +++++++++++---------- manifest.uuid | 2 +- src/build.c | 73 ++++++++++++++++++++++++++++++++++++++++++++ src/delete.c | 7 +++-- src/expr.c | 34 +++++++++++++++------ src/parse.y | 6 ++++ src/pragma.c | 4 +-- src/resolve.c | 31 +++++++++++-------- src/select.c | 2 +- src/sqliteInt.h | 52 ++++++++++++++++++------------- src/update.c | 9 +++--- src/wherecode.c | 4 +-- tool/mkkeywordhash.c | 2 ++ 13 files changed, 190 insertions(+), 71 deletions(-) diff --git a/manifest b/manifest index 1876174cf9..d7670f50bb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Formatting\schange\son\sa\smulti-line\sconditional,\sfor\simproved\sclarity.\nNo\slogic\schanges. -D 2019-10-15T19:01:55.901 +C Initial\sexperimental\scode\sfor\sgenerated\scolumn\ssupport.\s\sNon-functional. +D 2019-10-16T12:18:59.297 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,15 +469,15 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 13de2fdabbabcf2e2aaf6443a049fb851d9d3170136c08345468e158ceea3dc6 +F src/build.c 0ed5a7bb102a1972ce045b7a14753ed65bf62c7e32a44f162bfdce6f50bd7619 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 -F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 4c2a0d00a0d7701811a463b9af2c63d10b0c5ee7b8bde249309184f82d27b5b0 +F src/delete.c fd10ac325c73bdf4d558530745d70df01fe6f7a0763553045adf42a62c303dc9 +F src/expr.c 6c2b2dc1d7eb9af9920e9f0a51f0fcc5f6bf0166ea88caa32175f3543f2290f1 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -514,23 +514,23 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 19c8b65c87a5bec5efcb7eaf44e3178d860bc77baab4b03d7b53b08369ac83bf +F src/parse.y 516984fb37a025a2034456924f9e395b12162026c84f81e13270acab519f49e4 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c b47bc7db02ab13d04c680aee424466b4e34f4ef5aa7b2e464876ec005806f98f +F src/pragma.c 941aad9029be6fc71fb3dd58db122710d3f8da0ee48bf2b3350364694d000c98 F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 +F src/resolve.c 2160146697e6e0ba251b5a954e16f542b6e684fb4778cec2994094ab401ef996 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 7ef05eeb7f686f84dd1428cbdca280c898915bbf56e1ea97bd42ecc070af78d3 +F src/select.c ac9270006d5e1c283012fe116f36a8d496a49a296943f777176f61c0c903ea00 F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e274 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 40f81bb57b0723403d5da77314d459f536ddd0f07d57434a94df35e790b6b268 +F src/sqliteInt.h dcef2c667f65742385e13847823b298fc75a8980ca572ed2bf0ff15b68a4ea32 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,7 +592,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c 7f05fad5e145248a00048aeb0bac78b8fdb4ed17216e14a6eb24c55596e87ee7 +F src/update.c 1ad2eb4006a06b13f5eadbbdebe0c4dc7e987428dfdeef18429f533d2dae8618 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -613,7 +613,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 9f3f23efc45934e7b7ea6c0c1042420b73053e7c3264feef6faf9ce6fbd5df61 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 -F src/wherecode.c 57d034a0dbca9f86e1a691f74e469ed09ff49d04712b838fb68596b76a9af7d2 +F src/wherecode.c 39df666a7281d3153b9f9d2cb04321cbb7cc403623a2862a292cb074e1b4a203 F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1775,7 +1775,7 @@ F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 -F tool/mkkeywordhash.c bc5bcc92ebcaf15345346be7cf2204b83ed649b5208234adb5e543c061209bbf +F tool/mkkeywordhash.c 8973d556c5ee984b510269623c316ce0767f61dbd789075a05f213f3a576d840 F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6a13ea F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 @@ -1847,7 +1847,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bc751fb64d5b08e5ca4c85cd1c6fbf09590fa9dad7e176ba373082ea373655b5 -R 3dc274e5f048c65fb3fe7dfe730dc64a +P 7248e3476511ecd317f54edcfe1e87443bfdcc1b10c89c7734eefcabafec6c0b +R 3d12505eaf33c3dd163aeb1612c4c830 +T *branch * generated-columns +T *sym-generated-columns * +T -sym-trunk * U drh -Z a66229c65bafcb1e69be0fef5ecdca35 +Z 84f42f4fd8439ebec34b72547b3c2d42 diff --git a/manifest.uuid b/manifest.uuid index 30f2e65a57..cd38124276 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7248e3476511ecd317f54edcfe1e87443bfdcc1b10c89c7734eefcabafec6c0b \ No newline at end of file +11d472c1df707b8d03ec57d8fc582a34f5eb89a9d02a154a9871650c65065b45 \ No newline at end of file diff --git a/src/build.c b/src/build.c index e4f8d5e3c6..7e1f3b40cf 100644 --- a/src/build.c +++ b/src/build.c @@ -888,6 +888,27 @@ i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ return -1; } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** Of the iCol-th column in table pTab, return the index of that column +** as stored on disk. Usually the return value is the same as the iCol +** input, however the return value may be less there are prior VIRTUAL +** columns. +** +** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro +*/ +i16 sqlite3ColumnOfTable(Table *pTab, i16 iCol){ + int i; + i16 n; + assert( iColnCol ); + if( pTab->nVCol==0 ) return iCol; + for(i=0, n=0; iaCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) n++; + } + return n; +} +#endif + /* ** Begin constructing a new table representation in memory. This is ** the first of several action routines that get called in response @@ -1520,6 +1541,47 @@ void sqlite3AddCollateType(Parse *pParse, Token *pToken){ } } +/* Change the most recently parsed column to be a GENERATED ALWAYS AS +** column. +*/ +void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + u8 eType = COLFLAG_VIRTUAL; + Table *pTab = pParse->pNewTable; + Column *pCol; + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, pExpr); + } + if( pTab==0 ) goto generated_done; + pCol = &(pTab->aCol[pTab->nCol-1]); + if( pCol->pDflt ) goto generated_error; + if( pType ){ + if( pType->n==7 && sqlite3StrNICmp("virtual",pType->z,7)==0 ){ + /* no-op */ + }else if( pType->n==6 && sqlite3StrNICmp("stored",pType->z,6)==0 ){ + eType = COLFLAG_STORED; + }else{ + goto generated_error; + } + } + pTab->nVCol++; + pCol->colFlags |= eType; + pCol->pDflt = sqlite3ExprDup(pParse->db, pExpr, 0); + goto generated_done; + +generated_error: + sqlite3ErrorMsg(pParse, "bad GENERATED ALWAYS AS clause on column \"%s\"", + pCol->zName); +generated_done: + sqlite3ExprDelete(pParse->db, pExpr); +#else + /* Throw and error for the GENERATED ALWAYS AS clause if the + ** SQLITE_OMIT_GENERATED_COLUMNS compile-time option is used. */ + sqlite3ErrorMsg(pParse, "GENERATED ALWAYS AS not supported"); + sqlite3ExprDelete(pParse->db, pExpr); +#endif +} + /* ** This function returns the collation sequence for database native text ** encoding identified by the string zName, length nName. @@ -2114,6 +2176,17 @@ void sqlite3EndTable( sqlite3ResolveSelfReference(pParse, p, NC_IsCheck, 0, p->pCheck); } #endif /* !defined(SQLITE_OMIT_CHECK) */ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( p->nVCol ){ + int ii; + for(ii=0; iinCol; ii++){ + if( (p->aCol[ii].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL))!=0 ){ + sqlite3ResolveSelfReference(pParse, p, NC_GenCol, + p->aCol[ii].pDflt, 0); + } + } + } +#endif /* Estimate the average row size for the table and for all implied indices */ estimateTableWidth(p); diff --git a/src/delete.c b/src/delete.c index e3a0abc2c0..271bdbd482 100644 --- a/src/delete.c +++ b/src/delete.c @@ -475,13 +475,13 @@ void sqlite3DeleteFrom( if( pPk ){ for(i=0; iaiColumn[i]>=0 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iTabCur, pPk->aiColumn[i], iPk+i); } iKey = iPk; }else{ iKey = ++pParse->nMem; - sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, -1, iKey); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iTabCur, -1, iKey); } if( eOnePass!=ONEPASS_OFF ){ @@ -737,7 +737,8 @@ void sqlite3GenerateRowDelete( testcase( mask!=0xffffffff && iCol==31 ); testcase( mask!=0xffffffff && iCol==32 ); if( mask==0xffffffff || (iCol<=31 && (mask & MASKBIT32(iCol))!=0) ){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+iCol+1); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, iCol, + iOld+iCol+1); } } diff --git a/src/expr.c b/src/expr.c index 0e827482b2..fea7b0a18b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3365,7 +3365,7 @@ void sqlite3ExprCodeLoadIndexColumn( sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); pParse->iSelfTab = 0; }else{ - sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, + sqlite3ExprCodeGetColumnOfTable(pParse, pIdx->pTable, iTabCur, iTabCol, regOut); } } @@ -3374,12 +3374,14 @@ void sqlite3ExprCodeLoadIndexColumn( ** Generate code to extract the value of the iCol-th column of a table. */ void sqlite3ExprCodeGetColumnOfTable( - Vdbe *v, /* The VDBE under construction */ + Parse *pParse, /* Parsing context */ Table *pTab, /* The table containing the value */ int iTabCur, /* The table cursor. Or the PK cursor for WITHOUT ROWID */ int iCol, /* Index of the column to extract */ int regOut /* Extract the value into this register */ ){ + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); if( pTab==0 ){ sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut); return; @@ -3387,10 +3389,25 @@ void sqlite3ExprCodeGetColumnOfTable( if( iCol<0 || iCol==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); }else{ - int op = IsVirtual(pTab) ? OP_VColumn : OP_Column; - int x = iCol; - if( !HasRowid(pTab) && !IsVirtual(pTab) ){ + int op; + int x; + if( IsVirtual(pTab) ){ + op = OP_VColumn; + x = iCol; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( pTab->aCol[iCol].colFlags & COLFLAG_VIRTUAL ){ + int savedSelfTab = pParse->iSelfTab; + pParse->iSelfTab = iTabCur+1; + sqlite3ExprCode(pParse, pTab->aCol[iCol].pDflt, iCol); + pParse->iSelfTab = savedSelfTab; + return; +#endif + }else if( !HasRowid(pTab) ){ x = sqlite3ColumnOfIndex(sqlite3PrimaryKeyIndex(pTab), iCol); + op = OP_Column; + }else{ + x = sqlite3ColumnOfTable(pTab,iCol); + op = OP_Column; } sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); } @@ -3414,11 +3431,10 @@ int sqlite3ExprCodeGetColumn( int iReg, /* Store results here */ u8 p5 /* P5 value for OP_Column + FLAGS */ ){ - Vdbe *v = pParse->pVdbe; - assert( v!=0 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iTable, iColumn, iReg); + assert( pParse->pVdbe!=0 ); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iTable, iColumn, iReg); if( p5 ){ - sqlite3VdbeChangeP5(v, p5); + sqlite3VdbeChangeP5(pParse->pVdbe, p5); } return iReg; } diff --git a/src/parse.y b/src/parse.y index 7d31dda405..028a8c77dd 100644 --- a/src/parse.y +++ b/src/parse.y @@ -347,6 +347,12 @@ ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R). {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} +ccons ::= GENERATED ALWAYS AS generated. +ccons ::= AS generated. +generated ::= LP expr(E) RP. + {sqlite3AddGenerated(pParse,E,0);} +generated ::= LP expr(E) RP ID(TYPE). + {sqlite3AddGenerated(pParse,E,&TYPE);} // The optional AUTOINCREMENT keyword %type autoinc {int} diff --git a/src/pragma.c b/src/pragma.c index 858e314a1e..4c715019e7 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1398,7 +1398,7 @@ void sqlite3Pragma( ** this case. */ for(j=0; jnCol; j++){ int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom; - sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, 0, iCol, regRow+j); sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); } @@ -1586,7 +1586,7 @@ void sqlite3Pragma( int jmp2; if( j==pTab->iPKey ) continue; if( pTab->aCol[j].notNull==0 ) continue; - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, j, 3); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, diff --git a/src/resolve.c b/src/resolve.c index e66dc18eb8..657746842d 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -414,7 +414,7 @@ static int lookupName( if( cnt==0 && cntTab==1 && pMatch - && (pNC->ncFlags & NC_IdxExpr)==0 + && (pNC->ncFlags & (NC_IdxExpr|NC_GenCol))==0 && sqlite3IsRowid(zCol) && VisibleRowid(pMatch->pTab) ){ @@ -625,12 +625,15 @@ static void notValid( const char *zMsg, /* Type of error */ int validMask /* Set of contexts for which prohibited */ ){ - assert( (validMask&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr))==0 ); + assert( (validMask&~(NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol))==0 ); if( (pNC->ncFlags & validMask)!=0 ){ const char *zIn = "partial index WHERE clauses"; if( pNC->ncFlags & NC_IdxExpr ) zIn = "index expressions"; #ifndef SQLITE_OMIT_CHECK else if( pNC->ncFlags & NC_IsCheck ) zIn = "CHECK constraints"; +#endif +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pNC->ncFlags & NC_GenCol ) zIn = "GENERATED ALWAYS AS columns"; #endif sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); } @@ -723,7 +726,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ zColumn = pExpr->u.zToken; }else{ Expr *pLeft = pExpr->pLeft; - notValid(pParse, pNC, "the \".\" operator", NC_IdxExpr); + notValid(pParse, pNC, "the \".\" operator", NC_IdxExpr|NC_GenCol); pRight = pExpr->pRight; if( pRight->op==TK_ID ){ zDb = 0; @@ -820,7 +823,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** sqlite_version() that might change over time cannot be used ** in an index. */ notValid(pParse, pNC, "non-deterministic functions", - NC_IdxExpr|NC_PartIdx); + NC_IdxExpr|NC_PartIdx|NC_GenCol); } if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 && pParse->nested==0 @@ -964,7 +967,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_IN ); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ int nRef = pNC->nRef; - notValid(pParse, pNC, "subqueries", NC_IsCheck|NC_PartIdx|NC_IdxExpr); + notValid(pParse, pNC, "subqueries", + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol); sqlite3WalkSelect(pWalker, pExpr->x.pSelect); assert( pNC->nRef>=nRef ); if( nRef!=pNC->nRef ){ @@ -975,7 +979,8 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ break; } case TK_VARIABLE: { - notValid(pParse, pNC, "parameters", NC_IsCheck|NC_PartIdx|NC_IdxExpr); + notValid(pParse, pNC, "parameters", + NC_IsCheck|NC_PartIdx|NC_IdxExpr|NC_GenCol); break; } case TK_IS: @@ -1788,6 +1793,7 @@ void sqlite3ResolveSelectNames( ** (2) WHERE clauses on partial indices ** (3) Expressions in indexes on expressions ** (4) Expression arguments to VACUUM INTO. +** (5) GENERATED ALWAYS as expressions ** ** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN ** nodes of the expression is set to -1 and the Expr.iColumn value is @@ -1796,18 +1802,19 @@ void sqlite3ResolveSelectNames( ** Any errors cause an error message to be set in pParse. */ int sqlite3ResolveSelfReference( - Parse *pParse, /* Parsing context */ - Table *pTab, /* The table being referenced, or NULL */ - int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr, or 0 */ - Expr *pExpr, /* Expression to resolve. May be NULL. */ - ExprList *pList /* Expression list to resolve. May be NULL. */ + Parse *pParse, /* Parsing context */ + Table *pTab, /* The table being referenced, or NULL */ + int type, /* NC_IsCheck, NC_PartIdx, NC_IdxExpr, NC_GenCol, or 0 */ + Expr *pExpr, /* Expression to resolve. May be NULL. */ + ExprList *pList /* Expression list to resolve. May be NULL. */ ){ SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ NameContext sNC; /* Name context for pParse->pNewTable */ int rc; assert( type==0 || pTab!=0 ); - assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr || pTab==0 ); + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr + || type==NC_GenCol || pTab==0 ); memset(&sNC, 0, sizeof(sNC)); memset(&sSrc, 0, sizeof(sSrc)); if( pTab ){ diff --git a/src/select.c b/src/select.c index a5377a2c20..f63ca06f4a 100644 --- a/src/select.c +++ b/src/select.c @@ -6417,7 +6417,7 @@ int sqlite3Select( struct AggInfo_col *pCol = &sAggInfo.aCol[i]; if( pCol->iSorterColumn>=j ){ int r1 = j + regBase; - sqlite3ExprCodeGetColumnOfTable(v, + sqlite3ExprCodeGetColumnOfTable(pParse, pCol->pTab, pCol->iTable, pCol->iColumn, r1); j++; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 44a82223e6..e16a5066c9 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1823,7 +1823,7 @@ struct Module { */ struct Column { char *zName; /* Name of this column, \000, then the type */ - Expr *pDflt; /* Default value of this column */ + Expr *pDflt; /* Default value or GENERATED ALWAYS AS value */ 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 */ @@ -1833,11 +1833,13 @@ struct Column { /* Allowed values for Column.colFlags: */ -#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ -#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ -#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ -#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */ +#define COLFLAG_PRIMKEY 0x0001 /* Column is part of the primary key */ +#define COLFLAG_HIDDEN 0x0002 /* A hidden column in a virtual table */ +#define COLFLAG_HASTYPE 0x0004 /* Type name follows column name */ +#define COLFLAG_UNIQUE 0x0008 /* Column def contains "UNIQUE" or "PK" */ #define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ +#define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ +#define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ /* ** A "Collating Sequence" is defined by an instance of the following @@ -1977,6 +1979,7 @@ struct Table { u32 tabFlags; /* Mask of TF_* values */ i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ i16 nCol; /* Number of columns in this table */ + i16 nVCol; /* Number of virtual columns */ LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ LogEst szTabRow; /* Estimated size of each table row in bytes */ #ifdef SQLITE_ENABLE_COSTMULT @@ -2808,21 +2811,22 @@ struct NameContext { ** NC_HasWin == EP_Win ** */ -#define NC_AllowAgg 0x0001 /* Aggregate functions are allowed here */ -#define NC_PartIdx 0x0002 /* True if resolving a partial index WHERE */ -#define NC_IsCheck 0x0004 /* True if resolving names in a CHECK constraint */ -#define NC_InAggFunc 0x0008 /* True if analyzing arguments to an agg func */ -#define NC_HasAgg 0x0010 /* One or more aggregate functions seen */ -#define NC_IdxExpr 0x0020 /* True if resolving columns of CREATE INDEX */ -#define NC_VarSelect 0x0040 /* A correlated subquery has been seen */ -#define NC_UEList 0x0080 /* True if uNC.pEList is used */ -#define NC_UAggInfo 0x0100 /* True if uNC.pAggInfo is used */ -#define NC_UUpsert 0x0200 /* True if uNC.pUpsert is used */ -#define NC_MinMaxAgg 0x1000 /* min/max aggregates seen. See note above */ -#define NC_Complex 0x2000 /* True if a function or subquery seen */ -#define NC_AllowWin 0x4000 /* Window functions are allowed here */ -#define NC_HasWin 0x8000 /* One or more window functions seen */ -#define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */ +#define NC_AllowAgg 0x00001 /* Aggregate functions are allowed here */ +#define NC_PartIdx 0x00002 /* True if resolving a partial index WHERE */ +#define NC_IsCheck 0x00004 /* True if resolving a CHECK constraint */ +#define NC_InAggFunc 0x00008 /* True if analyzing arguments to an agg func */ +#define NC_HasAgg 0x00010 /* One or more aggregate functions seen */ +#define NC_IdxExpr 0x00020 /* True if resolving columns of CREATE INDEX */ +#define NC_VarSelect 0x00040 /* A correlated subquery has been seen */ +#define NC_UEList 0x00080 /* True if uNC.pEList is used */ +#define NC_UAggInfo 0x00100 /* True if uNC.pAggInfo is used */ +#define NC_UUpsert 0x00200 /* True if uNC.pUpsert is used */ +#define NC_MinMaxAgg 0x01000 /* min/max aggregates seen. See note above */ +#define NC_Complex 0x02000 /* True if a function or subquery seen */ +#define NC_AllowWin 0x04000 /* Window functions are allowed here */ +#define NC_HasWin 0x08000 /* One or more window functions seen */ +#define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */ +#define NC_GenCol 0x20000 /* True for a GENERATED ALWAYS AS clause */ /* ** An instance of the following object describes a single ON CONFLICT @@ -3938,6 +3942,11 @@ Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); void sqlite3OpenMasterTable(Parse *, int); Index *sqlite3PrimaryKeyIndex(Table*); i16 sqlite3ColumnOfIndex(Index*, i16); +#ifdef SQLITE_OMIT_GENERATED_COLUMNS +# define sqlite3ColumnOfTable(T,X) (X) /* No-op pass-through */ +#else + i16 sqlite3ColumnOfTable(Table*, i16); +#endif void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); #if SQLITE_ENABLE_HIDDEN_COLUMNS void sqlite3ColumnPropertiesFromName(Table*, Column*); @@ -3950,6 +3959,7 @@ void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); void sqlite3AddCheckConstraint(Parse*, Expr*); void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); void sqlite3AddCollateType(Parse*, Token*); +void sqlite3AddGenerated(Parse*,Expr*,Token*); void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); @@ -4053,7 +4063,7 @@ int sqlite3WhereOkOnePass(WhereInfo*, int*); #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 sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); +void sqlite3ExprCodeGetColumnOfTable(Parse*, Table*, int, int, int); void sqlite3ExprCodeMove(Parse*, int, int, int); void sqlite3ExprCode(Parse*, Expr*, int); void sqlite3ExprCodeCopy(Parse*, Expr*, int); diff --git a/src/update.c b/src/update.c index 458550b95d..9826ae2707 100644 --- a/src/update.c +++ b/src/update.c @@ -542,7 +542,8 @@ void sqlite3Update( ** is not required) and leave the PK fields in the array of registers. */ for(i=0; iaiColumn[i]>=0 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur,pPk->aiColumn[i],iPk+i); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, + pPk->aiColumn[i], iPk+i); } if( eOnePass ){ if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen); @@ -628,7 +629,7 @@ void sqlite3Update( || (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 ){ testcase( oldmask!=0xffffffff && i==31 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regOld+i); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, regOld+i); }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i); } @@ -669,7 +670,7 @@ void sqlite3Update( */ testcase( i==31 ); testcase( i==32 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, regNew+i); }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); } @@ -709,7 +710,7 @@ void sqlite3Update( */ for(i=0; inCol; i++){ if( aXRef[i]<0 && i!=pTab->iPKey ){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, regNew+i); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, regNew+i); } } } diff --git a/src/wherecode.c b/src/wherecode.c index e40e3f2704..39b9040db7 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -2072,7 +2072,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); if( HasRowid(pTab) ){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, regRowid); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iCur, -1, regRowid); jmp1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, regRowid, iSet); VdbeCoverage(v); @@ -2086,7 +2086,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( r = sqlite3GetTempRange(pParse, nPk); for(iPk=0; iPkaiColumn[iPk]; - sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol, r+iPk); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iCur, iCol,r+iPk); } /* Check if the temp table already contains this key. If so, diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index 77bc4ac5c0..b5784fdecd 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -164,6 +164,7 @@ static Keyword aKeywordTable[] = { { "AFTER", "TK_AFTER", TRIGGER }, { "ALL", "TK_ALL", ALWAYS }, { "ALTER", "TK_ALTER", ALTER }, + { "ALWAYS", "TK_ALWAYS", ALWAYS }, { "ANALYZE", "TK_ANALYZE", ANALYZE }, { "AND", "TK_AND", ALWAYS }, { "AS", "TK_AS", ALWAYS }, @@ -216,6 +217,7 @@ static Keyword aKeywordTable[] = { { "FOREIGN", "TK_FOREIGN", FKEY }, { "FROM", "TK_FROM", ALWAYS }, { "FULL", "TK_JOIN_KW", ALWAYS }, + { "GENERATED", "TK_GENERATED", ALWAYS }, { "GLOB", "TK_LIKE_KW", ALWAYS }, { "GROUP", "TK_GROUP", ALWAYS }, { "GROUPS", "TK_GROUPS", WINDOWFUNC }, From 2da8d6fe7428fb9f82b5224b7adb9c65098e459c Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 16 Oct 2019 14:56:03 +0000 Subject: [PATCH 041/476] If an AFTER DELETE trigger fires when a conflict row is deleted by REPLACE conflict resolution, make sure the conflict really has been resolved and that the trigger did not recreate the row before continuing. Ticket [a8a4847a2d96f5de] FossilOrigin-Name: eea1e7aa57e74c4329003f4550168e2aed9e33d2301a3ba84b10781a9cebbc1b --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/insert.c | 9 ++++++++ test/insert.test | 53 +++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 67 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 1876174cf9..4973cbac79 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Formatting\schange\son\sa\smulti-line\sconditional,\sfor\simproved\sclarity.\nNo\slogic\schanges. -D 2019-10-15T19:01:55.901 +C If\san\sAFTER\sDELETE\strigger\sfires\swhen\sa\sconflict\srow\sis\sdeleted\sby\sREPLACE\nconflict\sresolution,\smake\ssure\sthe\sconflict\sreally\shas\sbeen\sresolved\sand\sthat\nthe\strigger\sdid\snot\srecreate\sthe\srow\sbefore\scontinuing.\nTicket\s[a8a4847a2d96f5de] +D 2019-10-16T14:56:03.686 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 40557ebd69f4115e7a273f9304a8ab637a47ce44f3c6923396928f023967b5e8 +F src/insert.c d9cb78faa39180915ed940f0dcb3b168002f72e4f4926081a9553719fd12f6a1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1060,7 +1060,7 @@ F test/indexexpr1.test c26c8b352311c1deb30642cd0379e5cb94e416c7e9e0885e92d9e0155 F test/indexexpr2.test b580f378423bca443ffab47ada677203cfcf8a60f48a8aa20065f27c8f7739b5 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 72004f6a900a25bd3f1ce9a72e73d02749644666a8ce6d6d2dba061137e5aa63 +F test/insert.test c0e1b23f6359e06316b3a49f7747c5d65c0b6473619011e4fb86f6801edba6df F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test 7802ada6ba8738661b9f6c0e26858d3375b40cc7180289fd350644cd7a08fec9 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bc751fb64d5b08e5ca4c85cd1c6fbf09590fa9dad7e176ba373082ea373655b5 -R 3dc274e5f048c65fb3fe7dfe730dc64a +P 7248e3476511ecd317f54edcfe1e87443bfdcc1b10c89c7734eefcabafec6c0b +R ba1e81530d1e44a95d6e773164db4f87 U drh -Z a66229c65bafcb1e69be0fef5ecdca35 +Z 2617114f912aef1c01f5243e59a012d0 diff --git a/manifest.uuid b/manifest.uuid index 30f2e65a57..6ee651e6e9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7248e3476511ecd317f54edcfe1e87443bfdcc1b10c89c7734eefcabafec6c0b \ No newline at end of file +eea1e7aa57e74c4329003f4550168e2aed9e33d2301a3ba84b10781a9cebbc1b \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index d9078b89db..690845a7da 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1582,6 +1582,8 @@ void sqlite3GenerateConstraintChecks( sqlite3MultiWrite(pParse); sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regNewData, 1, 0, OE_Replace, 1, -1); + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); + sqlite3RowidConstraint(pParse, OE_Abort, pTab); }else{ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK assert( HasRowid(pTab) ); @@ -1829,16 +1831,23 @@ void sqlite3GenerateConstraintChecks( } default: { Trigger *pTrigger = 0; + int bRetryConstraintCheck = 0; assert( onError==OE_Replace ); if( db->flags&SQLITE_RecTriggers ){ pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); } if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ sqlite3MultiWrite(pParse); + bRetryConstraintCheck = 1; } sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regR, nPkField, 0, OE_Replace, (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur); + if( bRetryConstraintCheck ){ + sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, + regIdx, pIdx->nKeyCol); VdbeCoverage(v); + sqlite3UniqueConstraint(pParse, OE_Abort, pIdx); + } seenReplace = 1; break; } diff --git a/test/insert.test b/test/insert.test index 397a0e6ff9..e9bd8d6d7b 100644 --- a/test/insert.test +++ b/test/insert.test @@ -1,4 +1,4 @@ -# 2001 September 15 +# 2001-09-15 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: @@ -11,7 +11,6 @@ # This file implements regression tests for SQLite library. The # focus of this file is testing the INSERT statement. # -# $Id: insert.test,v 1.31 2007/04/05 11:25:59 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -458,7 +457,7 @@ do_execsql_test insert-14.1 { SELECT x FROM t14; } {1} -integrity_check insert-99.0 +integrity_check insert-14.2 # 2019-08-12. # @@ -475,5 +474,53 @@ do_execsql_test insert-15.1 { SELECT a, length(b) FROM t1; } {4 33000} +# 2019-10-16 +# ticket https://www.sqlite.org/src/info/a8a4847a2d96f5de +# On a REPLACE INTO, if an AFTER trigger adds back the conflicting +# row, you can end up with the wrong number of rows in an index. +# +db close +sqlite3 db :memory: +do_catchsql_test insert-16.1 { + PRAGMA recursive_triggers = true; + CREATE TABLE t0(c0,c1); + CREATE UNIQUE INDEX i0 ON t0(c0); + INSERT INTO t0(c0,c1) VALUES(123,1); + CREATE TRIGGER tr0 AFTER DELETE ON t0 + BEGIN + INSERT INTO t0 VALUES(123,2); + END; + REPLACE INTO t0(c0,c1) VALUES(123,3); +} {1 {UNIQUE constraint failed: t0.c0}} +do_execsql_test insert-16.2 { + SELECT * FROM t0; +} {123 1} +integrity_check insert-16.3 +do_catchsql_test insert-16.4 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + CREATE INDEX t1b ON t1(b); + INSERT INTO t1 VALUES(1, 'one'); + CREATE TRIGGER tr3 AFTER DELETE ON t1 BEGIN + INSERT INTO t1 VALUES(1, 'three'); + END; + REPLACE INTO t1 VALUES(1, 'two'); +} {1 {UNIQUE constraint failed: t1.a}} +integrity_check insert-16.5 +do_catchsql_test insert-16.6 { + PRAGMA foreign_keys = 1; + CREATE TABLE p1(a, b UNIQUE); + CREATE TABLE c1(c, d REFERENCES p1(b) ON DELETE CASCADE); + CREATE TRIGGER tr6 AFTER DELETE ON c1 BEGIN + INSERT INTO p1 VALUES(4, 1); + END; + INSERT INTO p1 VALUES(1, 1); + INSERT INTO c1 VALUES(2, 1); + REPLACE INTO p1 VALUES(3, 1); +} {1 {UNIQUE constraint failed: p1.b}} +integrity_check insert-16.7 + + + + finish_test From 16fd04cdbe01c2cd9f90383592555bae7f4d9927 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 16 Oct 2019 17:46:22 +0000 Subject: [PATCH 042/476] Enhancements to SQL query normalization for UPDATE statements. FossilOrigin-Name: bba975c7af3de9aeb5c62fb8b05d61b96e4ecd0b030008442bbdd345e1e5f134 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/tokenize.c | 4 ++-- src/update.c | 7 ++++--- test/normalize.test | 30 ++++++++++++++++++++++++++++++ 5 files changed, 46 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 4973cbac79..984f37cafc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\san\sAFTER\sDELETE\strigger\sfires\swhen\sa\sconflict\srow\sis\sdeleted\sby\sREPLACE\nconflict\sresolution,\smake\ssure\sthe\sconflict\sreally\shas\sbeen\sresolved\sand\sthat\nthe\strigger\sdid\snot\srecreate\sthe\srow\sbefore\scontinuing.\nTicket\s[a8a4847a2d96f5de] -D 2019-10-16T14:56:03.686 +C Enhancements\sto\sSQL\squery\snormalization\sfor\sUPDATE\sstatements. +D 2019-10-16T17:46:22.273 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -589,10 +589,10 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e +F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c 7f05fad5e145248a00048aeb0bac78b8fdb4ed17216e14a6eb24c55596e87ee7 +F src/update.c 1487ee46b6ec36c59fe2c127b6f7daa88daaaf6e58eee8c441377f9b9fb5a684 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -1180,7 +1180,7 @@ F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e -F test/normalize.test 422027884ffb67ebba32bb78487c67cf67643496d19c077b07044bdba071a3f6 +F test/normalize.test f23b6c5926c59548635fcf39678ac613e726121e073dd902a3062fbb83903b72 F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7248e3476511ecd317f54edcfe1e87443bfdcc1b10c89c7734eefcabafec6c0b -R ba1e81530d1e44a95d6e773164db4f87 -U drh -Z 2617114f912aef1c01f5243e59a012d0 +P eea1e7aa57e74c4329003f4550168e2aed9e33d2301a3ba84b10781a9cebbc1b +R e1eefe483bc6d1fcca7df84837a3f1f8 +U mistachkin +Z 9a870c611a385fdc7dbdc0a96b27ae55 diff --git a/manifest.uuid b/manifest.uuid index 6ee651e6e9..3dc24692bb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eea1e7aa57e74c4329003f4550168e2aed9e33d2301a3ba84b10781a9cebbc1b \ No newline at end of file +bba975c7af3de9aeb5c62fb8b05d61b96e4ecd0b030008442bbdd345e1e5f134 \ No newline at end of file diff --git a/src/tokenize.c b/src/tokenize.c index 40f7b4aad9..48f92218d3 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -757,7 +757,7 @@ char *sqlite3Normalize( int nParen; /* Number of nested levels of parentheses */ int iStartIN; /* Start of RHS of IN operator in z[] */ int nParenAtIN; /* Value of nParent at start of RHS of IN operator */ - int j; /* Bytes of normalized SQL generated so far */ + u32 j; /* Bytes of normalized SQL generated so far */ sqlite3_str *pStr; /* The normalized SQL string under construction */ db = sqlite3VdbeDb(pVdbe); @@ -801,7 +801,7 @@ char *sqlite3Normalize( } case TK_RP: { if( iStartIN>0 && nParen==nParenAtIN ){ - assert( pStr->nChar>=iStartIN ); + assert( pStr->nChar>=(u32)iStartIN ); pStr->nChar = iStartIN+1; sqlite3_str_append(pStr, "?,?,?", 5); iStartIN = 0; diff --git a/src/update.c b/src/update.c index 458550b95d..155bc5d5a3 100644 --- a/src/update.c +++ b/src/update.c @@ -289,6 +289,10 @@ void sqlite3Update( sNC.uNC.pUpsert = pUpsert; sNC.ncFlags = NC_UUpsert; + /* Begin generating code. */ + v = sqlite3GetVdbe(pParse); + if( v==0 ) goto update_cleanup; + /* Resolve the column names in all the expressions of the ** of the UPDATE statement. Also find the column index ** for each column to be updated in the pChanges array. For each @@ -386,9 +390,6 @@ void sqlite3Update( memset(aToOpen, 1, nIdx+1); } - /* Begin generating code. */ - v = sqlite3GetVdbe(pParse); - if( v==0 ) goto update_cleanup; if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); sqlite3BeginWriteOperation(pParse, pTrigger || hasFK, iDb); diff --git a/test/normalize.test b/test/normalize.test index 8b0c7ed8db..29a5aabb26 100644 --- a/test/normalize.test +++ b/test/normalize.test @@ -347,6 +347,36 @@ foreach {tnum sql flags norm} { {SELECT x FROM t1 WHERE x IN ([x] IS NOT NULL, NULL, 1, 'a', "b", x'00');} 0x2 {0 {SELECT x FROM t1 WHERE x IN(x IS NOT NULL,?,?,?,b,?);}} + + 800 + {ATTACH "normalize800.db" AS somefile;} + 0x2 + {0 {ATTACH"normalize800.db"AS somefile;}} + + 810 + {ATTACH DATABASE "normalize810.db" AS somefile;} + 0x2 + {0 {ATTACH DATABASE"normalize810.db"AS somefile;}} + + 900 + {INSERT INTO t1 (x) VALUES("sl1"), (1), ("sl2"), ('i');} + 0x2 + {0 {INSERT INTO t1(x)VALUES(?),(?),(?),(?);}} + + 910 + {UPDATE t1 SET x = "sl1" WHERE x IN (1, "sl2", 'i');} + 0x2 + {0 {UPDATE t1 SET x=?WHERE x IN(?,?,?);}} + + 920 + {UPDATE t1 SET x = "y" WHERE x IN (1, "sl1", 'i');} + 0x2 + {0 {UPDATE t1 SET x=y WHERE x IN(?,?,?);}} + + 930 + {DELETE FROM t1 WHERE x IN (1, "sl1", 'i');} + 0x2 + {0 {DELETE FROM t1 WHERE x IN(?,?,?);}} } { do_test $tnum { set code [catch { From 7e508f1ee2d671976fd1dbe4a8fdbc840ba39b97 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 16 Oct 2019 19:31:46 +0000 Subject: [PATCH 043/476] Simple INSERT and SELECT operations working with VIRTUAL columns. FossilOrigin-Name: 7f9f90b1b885fa9905b296f2e0fcc9b2341019b42fc839722a93cf60e49a9252 --- manifest | 23 ++++++++++------------- manifest.uuid | 2 +- src/expr.c | 2 +- src/insert.c | 21 +++++++++++++++++---- src/parse.y | 6 ++---- src/pragma.c | 2 +- src/sqliteInt.h | 1 + 7 files changed, 33 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index d7670f50bb..f1dc653477 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Initial\sexperimental\scode\sfor\sgenerated\scolumn\ssupport.\s\sNon-functional. -D 2019-10-16T12:18:59.297 +C Simple\sINSERT\sand\sSELECT\soperations\sworking\swith\sVIRTUAL\scolumns. +D 2019-10-16T19:31:46.693 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c fd10ac325c73bdf4d558530745d70df01fe6f7a0763553045adf42a62c303dc9 -F src/expr.c 6c2b2dc1d7eb9af9920e9f0a51f0fcc5f6bf0166ea88caa32175f3543f2290f1 +F src/expr.c 5f2e2678c17325d41fbcb0e76c40d50f4ac5ddbd57bf6a6e62d7db2e5f899654 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 40557ebd69f4115e7a273f9304a8ab637a47ce44f3c6923396928f023967b5e8 +F src/insert.c de9dea8081c500156d8c2e0079a123d56ef736d283ec7806f401886dd55c5ab7 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -514,11 +514,11 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 516984fb37a025a2034456924f9e395b12162026c84f81e13270acab519f49e4 +F src/parse.y bc453ce808316facd191413bfa4ec6730a1d693b98fd8be5addef8fbfd62bb7b F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c 941aad9029be6fc71fb3dd58db122710d3f8da0ee48bf2b3350364694d000c98 +F src/pragma.c a9511633bc0ee6c67b9ed244d7b1c0770c71e5211d94c8c97d631974166d59b4 F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 @@ -530,7 +530,7 @@ F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e27 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h dcef2c667f65742385e13847823b298fc75a8980ca572ed2bf0ff15b68a4ea32 +F src/sqliteInt.h 47d43085f2165aa4ddb87f8a0341937104dfd94bcce0445d296eac8e59ab25e2 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1847,10 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7248e3476511ecd317f54edcfe1e87443bfdcc1b10c89c7734eefcabafec6c0b -R 3d12505eaf33c3dd163aeb1612c4c830 -T *branch * generated-columns -T *sym-generated-columns * -T -sym-trunk * +P 11d472c1df707b8d03ec57d8fc582a34f5eb89a9d02a154a9871650c65065b45 +R 899dceb15c24c2e2f3f3f41aea0d96fa U drh -Z 84f42f4fd8439ebec34b72547b3c2d42 +Z 2fd76d80cb2634f812acd88fb56b891f diff --git a/manifest.uuid b/manifest.uuid index cd38124276..43616447f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -11d472c1df707b8d03ec57d8fc582a34f5eb89a9d02a154a9871650c65065b45 \ No newline at end of file +7f9f90b1b885fa9905b296f2e0fcc9b2341019b42fc839722a93cf60e49a9252 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index fea7b0a18b..e02e146582 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3398,7 +3398,7 @@ void sqlite3ExprCodeGetColumnOfTable( }else if( pTab->aCol[iCol].colFlags & COLFLAG_VIRTUAL ){ int savedSelfTab = pParse->iSelfTab; pParse->iSelfTab = iTabCur+1; - sqlite3ExprCode(pParse, pTab->aCol[iCol].pDflt, iCol); + sqlite3ExprCode(pParse, pTab->aCol[iCol].pDflt, regOut); pParse->iSelfTab = savedSelfTab; return; #endif diff --git a/src/insert.c b/src/insert.c index d9078b89db..f2ed9d9a32 100644 --- a/src/insert.c +++ b/src/insert.c @@ -37,7 +37,8 @@ void sqlite3OpenTable( sqlite3TableLock(pParse, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName); if( HasRowid(pTab) ){ - sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nCol); + sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, + pTab->nCol - pTab->nVCol); VdbeComment((v, "%s", pTab->zName)); }else{ Index *pPk = sqlite3PrimaryKeyIndex(pTab); @@ -673,6 +674,14 @@ void sqlite3Insert( if( j==pTab->iPKey ){ ipkColumn = i; assert( !withoutRowid ); } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ + sqlite3ErrorMsg(pParse, + "cannot INSERT into generated column \"%s\"", + pTab->aCol[j].zName); + goto insert_cleanup; + } +#endif break; } } @@ -788,7 +797,7 @@ void sqlite3Insert( ** of columns to be inserted into the table. */ for(i=0; inCol; i++){ - nHidden += (IsHiddenColumn(&pTab->aCol[i]) ? 1 : 0); + if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ) nHidden++; } if( pColumn==0 && nColumn && nColumn!=(pTab->nCol-nHidden) ){ sqlite3ErrorMsg(pParse, @@ -1006,9 +1015,12 @@ void sqlite3Insert( continue; } if( pColumn==0 ){ - if( IsHiddenColumn(&pTab->aCol[i]) ){ + if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ){ j = -1; nHidden++; + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + continue; + } }else{ j = i - nHidden; } @@ -1862,7 +1874,8 @@ void sqlite3GenerateConstraintChecks( /* Generate the table record */ if( HasRowid(pTab) ){ int regRec = aRegIdx[ix]; - sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, pTab->nCol, regRec); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, + pTab->nCol-pTab->nVCol, regRec); sqlite3SetMakeRecordP5(v, pTab); if( !bAffinityDone ){ sqlite3TableAffinity(v, pTab, 0); diff --git a/src/parse.y b/src/parse.y index 028a8c77dd..b38304aa7c 100644 --- a/src/parse.y +++ b/src/parse.y @@ -349,10 +349,8 @@ ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} ccons ::= GENERATED ALWAYS AS generated. ccons ::= AS generated. -generated ::= LP expr(E) RP. - {sqlite3AddGenerated(pParse,E,0);} -generated ::= LP expr(E) RP ID(TYPE). - {sqlite3AddGenerated(pParse,E,&TYPE);} +generated ::= LP expr(E) RP. {sqlite3AddGenerated(pParse,E,0);} +generated ::= LP expr(E) RP ID(TYPE). {sqlite3AddGenerated(pParse,E,&TYPE);} // The optional AUTOINCREMENT keyword %type autoinc {int} diff --git a/src/pragma.c b/src/pragma.c index 4c715019e7..652810eae2 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1577,7 +1577,7 @@ void sqlite3Pragma( loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); if( !isQuick ){ /* Sanity check on record header decoding */ - sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-1, 3); + sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-pTab->nVCol-1,3); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); } /* Verify that all NOT NULL columns really are NOT NULL */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e16a5066c9..94d7107a08 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1840,6 +1840,7 @@ struct Column { #define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ #define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ #define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ +#define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ /* ** A "Collating Sequence" is defined by an instance of the following From c27ea2ae8df4207e6b2479b46904c73d7cd1775f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 16 Oct 2019 20:05:56 +0000 Subject: [PATCH 044/476] ALTER TABLE is able to add a VIRTUAL column. FossilOrigin-Name: 120c6b78cb51532f783014605f1107d40b2e4f54e3852fb1f8f167d0c0b78c69 --- manifest | 18 ++++++------ manifest.uuid | 2 +- src/alter.c | 73 +++++++++++++++++++++++++------------------------ src/build.c | 2 +- src/insert.c | 6 ++-- src/sqliteInt.h | 1 + 6 files changed, 54 insertions(+), 48 deletions(-) diff --git a/manifest b/manifest index f1dc653477..991a0bbbff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simple\sINSERT\sand\sSELECT\soperations\sworking\swith\sVIRTUAL\scolumns. -D 2019-10-16T19:31:46.693 +C ALTER\sTABLE\sis\sable\sto\sadd\sa\sVIRTUAL\scolumn. +D 2019-10-16T20:05:56.905 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -459,7 +459,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 5773b28684a001dcab45adcefa3cbf5e846335c0c8fee0da8a3770cb0123bba8 +F src/alter.c 8a4317e2b322d4da9489cf2aa1d513a3a6f3e4863552dd5e59d08cdaca73c487 F src/analyze.c 481d9cf34a3c70631ef5c416be70033e8d4cd85eb5ad1b37286aed8b0e29e889 F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 0ed5a7bb102a1972ce045b7a14753ed65bf62c7e32a44f162bfdce6f50bd7619 +F src/build.c 6cb40a36b3ec6a4b2dc36e0bd53e42ad448700c48b419569eae711cde4b175d3 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c de9dea8081c500156d8c2e0079a123d56ef736d283ec7806f401886dd55c5ab7 +F src/insert.c c54ef99a0c47788a3cf2ace9ef9717b137484569e4c04bd940fc5222a6b3c209 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e27 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 47d43085f2165aa4ddb87f8a0341937104dfd94bcce0445d296eac8e59ab25e2 +F src/sqliteInt.h 6418b27039289b0274077c0f4f54b82c3150881b64dddb7d128786b55ec09920 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 11d472c1df707b8d03ec57d8fc582a34f5eb89a9d02a154a9871650c65065b45 -R 899dceb15c24c2e2f3f3f41aea0d96fa +P 7f9f90b1b885fa9905b296f2e0fcc9b2341019b42fc839722a93cf60e49a9252 +R 8a88337d2c1f89903f9ecf943d42ac46 U drh -Z 2fd76d80cb2634f812acd88fb56b891f +Z e34cdc64b33126ce9923adb3fcc6f90a diff --git a/manifest.uuid b/manifest.uuid index 43616447f9..3dd4dbb534 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7f9f90b1b885fa9905b296f2e0fcc9b2341019b42fc839722a93cf60e49a9252 \ No newline at end of file +120c6b78cb51532f783014605f1107d40b2e4f54e3852fb1f8f167d0c0b78c69 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 9d02d3835a..f8cada0e34 100644 --- a/src/alter.c +++ b/src/alter.c @@ -298,14 +298,6 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ } #endif - /* If the default value for the new column was specified with a - ** literal NULL, then set pDflt to 0. This simplifies checking - ** for an SQL NULL default below. - */ - assert( pDflt==0 || pDflt->op==TK_SPAN ); - if( pDflt && pDflt->pLeft->op==TK_NULL ){ - pDflt = 0; - } /* Check that the new column is not specified as PRIMARY KEY or UNIQUE. ** If there is a NOT NULL constraint, then the default value for the @@ -319,35 +311,46 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ sqlite3ErrorMsg(pParse, "Cannot add a UNIQUE column"); return; } - if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ - sqlite3ErrorMsg(pParse, - "Cannot add a REFERENCES column with non-NULL default value"); - return; - } - if( pCol->notNull && !pDflt ){ - sqlite3ErrorMsg(pParse, - "Cannot add a NOT NULL column with default value NULL"); - return; + if( (pCol->colFlags & COLFLAG_GENERATED)==0 ){ + /* If the default value for the new column was specified with a + ** literal NULL, then set pDflt to 0. This simplifies checking + ** for an SQL NULL default below. + */ + assert( pDflt==0 || pDflt->op==TK_SPAN ); + if( pDflt && pDflt->pLeft->op==TK_NULL ){ + pDflt = 0; + } + if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ + sqlite3ErrorMsg(pParse, + "Cannot add a REFERENCES column with non-NULL default value"); + return; + } + if( pCol->notNull && !pDflt ){ + sqlite3ErrorMsg(pParse, + "Cannot add a NOT NULL column with default value NULL"); + return; + } + + /* Ensure the default expression is something that sqlite3ValueFromExpr() + ** can handle (i.e. not CURRENT_TIME etc.) + */ + if( pDflt ){ + sqlite3_value *pVal = 0; + int rc; + rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); + assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); + if( rc!=SQLITE_OK ){ + assert( db->mallocFailed == 1 ); + return; + } + if( !pVal ){ + sqlite3ErrorMsg(pParse,"Cannot add a column with non-constant default"); + return; + } + sqlite3ValueFree(pVal); + } } - /* Ensure the default expression is something that sqlite3ValueFromExpr() - ** can handle (i.e. not CURRENT_TIME etc.) - */ - if( pDflt ){ - sqlite3_value *pVal = 0; - int rc; - rc = sqlite3ValueFromExpr(db, pDflt, SQLITE_UTF8, SQLITE_AFF_BLOB, &pVal); - assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); - if( rc!=SQLITE_OK ){ - assert( db->mallocFailed == 1 ); - return; - } - if( !pVal ){ - sqlite3ErrorMsg(pParse, "Cannot add a column with non-constant default"); - return; - } - sqlite3ValueFree(pVal); - } /* Modify the CREATE TABLE statement. */ zCol = sqlite3DbStrNDup(db, (char*)pColDef->z, pColDef->n); diff --git a/src/build.c b/src/build.c index 7e1f3b40cf..897e9183eb 100644 --- a/src/build.c +++ b/src/build.c @@ -1570,7 +1570,7 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ goto generated_done; generated_error: - sqlite3ErrorMsg(pParse, "bad GENERATED ALWAYS AS clause on column \"%s\"", + sqlite3ErrorMsg(pParse, "incorrect GENERATED ALWAYS AS on column \"%s\"", pCol->zName); generated_done: sqlite3ExprDelete(pParse->db, pExpr); diff --git a/src/insert.c b/src/insert.c index f2ed9d9a32..22c48d7f3c 100644 --- a/src/insert.c +++ b/src/insert.c @@ -532,6 +532,7 @@ void sqlite3Insert( u8 withoutRowid; /* 0 for normal table. 1 for WITHOUT ROWID table */ u8 bIdListInOrder; /* True if IDLIST is in table order */ ExprList *pList = 0; /* List of VALUES() to be inserted */ + int iRegStore; /* Register in which to store next column */ /* Register allocations */ int regFromSelect = 0;/* Base register for data coming from SELECT */ @@ -1003,8 +1004,8 @@ void sqlite3Insert( ** with the first column. */ nHidden = 0; - for(i=0; inCol; i++){ - int iRegStore = regRowid+1+i; + iRegStore = regRowid+1; + for(i=0; inCol; i++, iRegStore++){ if( i==pTab->iPKey ){ /* The value of the INTEGER PRIMARY KEY column is always a NULL. ** Whenever this column is read, the rowid will be substituted @@ -1019,6 +1020,7 @@ void sqlite3Insert( j = -1; nHidden++; if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + iRegStore--; continue; } }else{ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 94d7107a08..eb815a79e0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1840,6 +1840,7 @@ struct Column { #define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ #define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ #define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ +#define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ #define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ /* From ab45fc041389b937cf82c20bec231905105f829d Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 16 Oct 2019 22:01:56 +0000 Subject: [PATCH 045/476] INSERT with named columns for a table with generated columns. FossilOrigin-Name: 64db39f92d68d1b9f23e48af35e16b969c38b58041fbe900066eeb3ddb291cef --- manifest | 16 ++++++------- manifest.uuid | 2 +- src/expr.c | 17 +++++++++----- src/insert.c | 60 ++++++++++++++++++++++++++++++------------------- src/sqliteInt.h | 1 + 5 files changed, 59 insertions(+), 37 deletions(-) diff --git a/manifest b/manifest index 991a0bbbff..45942a0a1a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C ALTER\sTABLE\sis\sable\sto\sadd\sa\sVIRTUAL\scolumn. -D 2019-10-16T20:05:56.905 +C INSERT\swith\snamed\scolumns\sfor\sa\stable\swith\sgenerated\scolumns. +D 2019-10-16T22:01:56.225 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c fd10ac325c73bdf4d558530745d70df01fe6f7a0763553045adf42a62c303dc9 -F src/expr.c 5f2e2678c17325d41fbcb0e76c40d50f4ac5ddbd57bf6a6e62d7db2e5f899654 +F src/expr.c 61d9043b1b9b82d72c919bcf5801a885a0ee7e41bf3e5ce3021b206a5706a949 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c c54ef99a0c47788a3cf2ace9ef9717b137484569e4c04bd940fc5222a6b3c209 +F src/insert.c 9dabd02b24946f4c38ae7ef566d65abc16476f9d26b3a630261f91e09c726722 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e27 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 6418b27039289b0274077c0f4f54b82c3150881b64dddb7d128786b55ec09920 +F src/sqliteInt.h ecade7aec917068cbbc96505eed645419e07799d91052926d418dd256d60b72d F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7f9f90b1b885fa9905b296f2e0fcc9b2341019b42fc839722a93cf60e49a9252 -R 8a88337d2c1f89903f9ecf943d42ac46 +P 120c6b78cb51532f783014605f1107d40b2e4f54e3852fb1f8f167d0c0b78c69 +R 69bb3625e06cb31ab7b6bfff123323c6 U drh -Z e34cdc64b33126ce9923adb3fcc6f90a +Z 504e145f33a96cfe775ae86c4e357f58 diff --git a/manifest.uuid b/manifest.uuid index 3dd4dbb534..927a0182f2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -120c6b78cb51532f783014605f1107d40b2e4f54e3852fb1f8f167d0c0b78c69 \ No newline at end of file +64db39f92d68d1b9f23e48af35e16b969c38b58041fbe900066eeb3ddb291cef \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e02e146582..c21006b115 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3381,6 +3381,7 @@ void sqlite3ExprCodeGetColumnOfTable( int regOut /* Extract the value into this register */ ){ Vdbe *v = pParse->pVdbe; + Column *pCol; assert( v!=0 ); if( pTab==0 ){ sqlite3VdbeAddOp3(v, OP_Column, iTabCur, iCol, regOut); @@ -3395,11 +3396,17 @@ void sqlite3ExprCodeGetColumnOfTable( op = OP_VColumn; x = iCol; #ifndef SQLITE_OMIT_GENERATED_COLUMNS - }else if( pTab->aCol[iCol].colFlags & COLFLAG_VIRTUAL ){ - int savedSelfTab = pParse->iSelfTab; - pParse->iSelfTab = iTabCur+1; - sqlite3ExprCode(pParse, pTab->aCol[iCol].pDflt, regOut); - pParse->iSelfTab = savedSelfTab; + }else if( (pCol = &pTab->aCol[iCol])->colFlags & COLFLAG_VIRTUAL ){ + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pCol->zName); + }else{ + int savedSelfTab = pParse->iSelfTab; + pCol->colFlags |= COLFLAG_BUSY; + pParse->iSelfTab = iTabCur+1; + sqlite3ExprCode(pParse, pTab->aCol[iCol].pDflt, regOut); + pParse->iSelfTab = savedSelfTab; + pCol->colFlags &= ~COLFLAG_BUSY; + } return; #endif }else if( !HasRowid(pTab) ){ diff --git a/src/insert.c b/src/insert.c index 22c48d7f3c..20b5d9a91c 100644 --- a/src/insert.c +++ b/src/insert.c @@ -130,7 +130,7 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ ** 'E' REAL */ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ - int i; + int i, j; char *zColAff = pTab->zColAff; if( zColAff==0 ){ sqlite3 *db = sqlite3VdbeDb(v); @@ -140,13 +140,15 @@ void sqlite3TableAffinity(Vdbe *v, Table *pTab, int iReg){ return; } - for(i=0; inCol; i++){ + for(i=j=0; inCol; i++){ assert( pTab->aCol[i].affinity!=0 ); - zColAff[i] = pTab->aCol[i].affinity; + if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){ + zColAff[j++] = pTab->aCol[i].affinity; + } } do{ - zColAff[i--] = 0; - }while( i>=0 && zColAff[i]<=SQLITE_AFF_BLOB ); + zColAff[j--] = 0; + }while( j>=0 && zColAff[j]<=SQLITE_AFF_BLOB ); pTab->zColAff = zColAff; } assert( zColAff!=0 ); @@ -1006,6 +1008,9 @@ void sqlite3Insert( nHidden = 0; iRegStore = regRowid+1; for(i=0; inCol; i++, iRegStore++){ + int k; + assert( i>=nHidden ); + assert( iRegStore==sqlite3ColumnOfTable(pTab,i)+regRowid+1 ); if( i==pTab->iPKey ){ /* The value of the INTEGER PRIMARY KEY column is always a NULL. ** Whenever this column is read, the rowid will be substituted @@ -1015,32 +1020,41 @@ void sqlite3Insert( sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); continue; } - if( pColumn==0 ){ - if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ){ - j = -1; - nHidden++; - if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ - iRegStore--; - continue; - } + if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ){ + nHidden++; + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + /* Virtual columns are no stored */ + iRegStore--; }else{ - j = i - nHidden; - } - }else{ - for(j=0; jnId; j++){ - if( pColumn->a[j].idx==i ) break; + /* Hidden and stored columns get the default value */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); } + continue; } - if( j<0 || nColumn==0 || (pColumn && j>=pColumn->nId) ){ + if( pColumn ){ + for(j=0; jnId && pColumn->a[j].idx!=i; j++){} + if( j>=pColumn->nId ){ + /* A column not named in the insert column list gets its + ** default value */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + } + k = j; + }else if( nColumn==0 ){ sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); - }else if( useTempTable ){ - sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, iRegStore); + continue; + }else{ + k = i - nHidden; + } + + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, k, iRegStore); }else if( pSelect ){ if( regFromSelect!=regData ){ - sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+j, iRegStore); + sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore); } }else{ - sqlite3ExprCode(pParse, pList->a[j].pExpr, iRegStore); + sqlite3ExprCode(pParse, pList->a[k].pExpr, iRegStore); } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index eb815a79e0..8455155ae0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1840,6 +1840,7 @@ struct Column { #define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ #define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ #define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ +#define COLFLAG_BUSY 0x0080 /* Blocks recursion on VIRTUAL columns */ #define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ #define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ From ab3c5f26ab72222c4ab0fdcee559b3e3a7c0d53b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Oct 2019 13:15:40 +0000 Subject: [PATCH 046/476] Fix the table_info and table_xinfo pragmas so that they work with virtual columns. Table_info omits virtual columns. Table_xinfo gives them a "hidden" flag of 2, and 3 for STORED columns. FossilOrigin-Name: 069351b85f9a706f60d3e98fbc8aaf40c374356b967c0464aede30ead3d9d18b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pragma.c | 17 ++++++++++++----- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 45942a0a1a..76163c6d4d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C INSERT\swith\snamed\scolumns\sfor\sa\stable\swith\sgenerated\scolumns. -D 2019-10-16T22:01:56.225 +C Fix\sthe\stable_info\sand\stable_xinfo\spragmas\sso\sthat\sthey\swork\swith\svirtual\ncolumns.\s\sTable_info\somits\svirtual\scolumns.\s\sTable_xinfo\sgives\sthem\sa\n"hidden"\sflag\sof\s2,\sand\s3\sfor\sSTORED\scolumns. +D 2019-10-17T13:15:40.320 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -518,7 +518,7 @@ F src/parse.y bc453ce808316facd191413bfa4ec6730a1d693b98fd8be5addef8fbfd62bb7b F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c a9511633bc0ee6c67b9ed244d7b1c0770c71e5211d94c8c97d631974166d59b4 +F src/pragma.c 7b4c4040124572d3e477f30a5daf640f7a8ea2f019f7c0a4031633f36ae9935a F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 120c6b78cb51532f783014605f1107d40b2e4f54e3852fb1f8f167d0c0b78c69 -R 69bb3625e06cb31ab7b6bfff123323c6 +P 64db39f92d68d1b9f23e48af35e16b969c38b58041fbe900066eeb3ddb291cef +R f385e86a0426e23d58beffa7242fb5ce U drh -Z 504e145f33a96cfe775ae86c4e357f58 +Z 1c8932097c2a1d388102affd6e7e0105 diff --git a/manifest.uuid b/manifest.uuid index 927a0182f2..31afc5e354 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -64db39f92d68d1b9f23e48af35e16b969c38b58041fbe900066eeb3ddb291cef \ No newline at end of file +069351b85f9a706f60d3e98fbc8aaf40c374356b967c0464aede30ead3d9d18b \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 652810eae2..551cc7aa0f 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1100,10 +1100,17 @@ void sqlite3Pragma( sqlite3CodeVerifySchema(pParse, iTabDb); sqlite3ViewGetColumnNames(pParse, pTab); for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ - int isHidden = IsHiddenColumn(pCol); - if( isHidden && pPragma->iArg==0 ){ + int isHidden = 0; + if( pCol->colFlags & COLFLAG_NOINSERT ){ nHidden++; - continue; + if( pPragma->iArg==0 ) continue; + if( pCol->colFlags & COLFLAG_VIRTUAL ){ + isHidden = 2; /* GENERATED ALWAYS AS ... VIRTUAL */ + }else if( pCol->colFlags & COLFLAG_VIRTUAL ){ + isHidden = 3; /* GENERATED ALWAYS AS ... STORED */ + }else{ + isHidden = 1; /* HIDDEN */ + } } if( (pCol->colFlags & COLFLAG_PRIMKEY)==0 ){ k = 0; @@ -1112,13 +1119,13 @@ void sqlite3Pragma( }else{ for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} } - assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN ); + assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN || isHidden>=2 ); sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", i-nHidden, pCol->zName, sqlite3ColumnType(pCol,""), pCol->notNull ? 1 : 0, - pCol->pDflt ? pCol->pDflt->u.zToken : 0, + pCol->pDflt && isHidden<2 ? pCol->pDflt->u.zToken : 0, k, isHidden); } From 676fa25a0f7737d7e233a840a5c2d7dffdccb75a Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Oct 2019 14:21:07 +0000 Subject: [PATCH 047/476] Bug fixes so that "make test" once against runs with no errors. FossilOrigin-Name: 7bfe0f679d8951b3e925bdf549efa0f8d6b514eddeaca69cbfddbd9476cfff5f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 13 ++++++++----- src/pragma.c | 6 ++++-- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 76163c6d4d..93dc0ecab7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\stable_info\sand\stable_xinfo\spragmas\sso\sthat\sthey\swork\swith\svirtual\ncolumns.\s\sTable_info\somits\svirtual\scolumns.\s\sTable_xinfo\sgives\sthem\sa\n"hidden"\sflag\sof\s2,\sand\s3\sfor\sSTORED\scolumns. -D 2019-10-17T13:15:40.320 +C Bug\sfixes\sso\sthat\s"make\stest"\sonce\sagainst\sruns\swith\sno\serrors. +D 2019-10-17T14:21:07.409 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 9dabd02b24946f4c38ae7ef566d65abc16476f9d26b3a630261f91e09c726722 +F src/insert.c 3cf6462f09ef50916e5e859b56cb7bbf3a7e0b8f25a9cac0c99c572ba08c0779 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -518,7 +518,7 @@ F src/parse.y bc453ce808316facd191413bfa4ec6730a1d693b98fd8be5addef8fbfd62bb7b F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c 7b4c4040124572d3e477f30a5daf640f7a8ea2f019f7c0a4031633f36ae9935a +F src/pragma.c 61abcb6d9f80d06ed3b0d0843a7cef32e96a569a27b94ebfd764dc6c1ce1cd1d F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 64db39f92d68d1b9f23e48af35e16b969c38b58041fbe900066eeb3ddb291cef -R f385e86a0426e23d58beffa7242fb5ce +P 069351b85f9a706f60d3e98fbc8aaf40c374356b967c0464aede30ead3d9d18b +R a9daba7f86da0ab938b557a0a9cc8b96 U drh -Z 1c8932097c2a1d388102affd6e7e0105 +Z 1fb219ce2b5d60344f9b3644d927ae0d diff --git a/manifest.uuid b/manifest.uuid index 31afc5e354..0a25f0c923 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -069351b85f9a706f60d3e98fbc8aaf40c374356b967c0464aede30ead3d9d18b \ No newline at end of file +7bfe0f679d8951b3e925bdf549efa0f8d6b514eddeaca69cbfddbd9476cfff5f \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 20b5d9a91c..1c628c670a 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1009,6 +1009,7 @@ void sqlite3Insert( iRegStore = regRowid+1; for(i=0; inCol; i++, iRegStore++){ int k; + u32 colFlags; assert( i>=nHidden ); assert( iRegStore==sqlite3ColumnOfTable(pTab,i)+regRowid+1 ); if( i==pTab->iPKey ){ @@ -1020,16 +1021,18 @@ void sqlite3Insert( sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); continue; } - if( pTab->aCol[i].colFlags & COLFLAG_NOINSERT ){ + if( ((colFlags = pTab->aCol[i].colFlags) & COLFLAG_NOINSERT)!=0 ){ nHidden++; - if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ /* Virtual columns are no stored */ iRegStore--; - }else{ - /* Hidden and stored columns get the default value */ + continue; + }else if( (colFlags & COLFLAG_STORED)!=0 || pColumn==0 ){ + /* Stored columns get the default value. Also hidden columns + ** that are not explicitly named in the INSERT */ sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; } - continue; } if( pColumn ){ for(j=0; jnId && pColumn->a[j].idx!=i; j++){} diff --git a/src/pragma.c b/src/pragma.c index 551cc7aa0f..d9f249d138 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1102,8 +1102,10 @@ void sqlite3Pragma( for(i=0, pCol=pTab->aCol; inCol; i++, pCol++){ int isHidden = 0; if( pCol->colFlags & COLFLAG_NOINSERT ){ - nHidden++; - if( pPragma->iArg==0 ) continue; + if( pPragma->iArg==0 ){ + nHidden++; + continue; + } if( pCol->colFlags & COLFLAG_VIRTUAL ){ isHidden = 2; /* GENERATED ALWAYS AS ... VIRTUAL */ }else if( pCol->colFlags & COLFLAG_VIRTUAL ){ From b2075011a7582bfa87ed426d5296cded24ea5095 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 17 Oct 2019 15:41:36 +0000 Subject: [PATCH 048/476] Avoid an infinite loop in fts3/4 incremental-merge in the case where the lowest level in the database contains segments but no data (because there is a delete-marker for each valid entry). Fix for [bf1aab89]. FossilOrigin-Name: 35beaee059a6cccead4311886ca928d936f23584cf435e35e265e98feea723dc --- ext/fts3/fts3_write.c | 21 +++++++++++++++------ manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts4merge.test | 15 +++++++++++++++ 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index e4b91a82ab..5246566e06 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -4950,8 +4950,15 @@ int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ } if( SQLITE_OK==rc && pCsr->nSegment==nSeg && SQLITE_OK==(rc = sqlite3Fts3SegReaderStart(p, pCsr, pFilter)) - && SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pCsr)) ){ + int bEmpty = 0; + rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( rc==SQLITE_OK ){ + bEmpty = 1; + }else if( rc!=SQLITE_ROW ){ + sqlite3Fts3SegReaderFinish(pCsr); + break; + } if( bUseHint && iIdx>0 ){ const char *zKey = pCsr->zTerm; int nKey = pCsr->nTerm; @@ -4962,11 +4969,13 @@ int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ if( rc==SQLITE_OK && pWriter->nLeafEst ){ fts3LogMerge(nSeg, iAbsLevel); - do { - rc = fts3IncrmergeAppend(p, pWriter, pCsr); - if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr); - if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK; - }while( rc==SQLITE_ROW ); + if( bEmpty==0 ){ + do { + rc = fts3IncrmergeAppend(p, pWriter, pCsr); + if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, pCsr); + if( pWriter->nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK; + }while( rc==SQLITE_ROW ); + } /* Update or delete the input segments */ if( rc==SQLITE_OK ){ diff --git a/manifest b/manifest index 984f37cafc..be0eda8fcc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\sSQL\squery\snormalization\sfor\sUPDATE\sstatements. -D 2019-10-16T17:46:22.273 +C Avoid\san\sinfinite\sloop\sin\sfts3/4\sincremental-merge\sin\sthe\scase\swhere\sthe\slowest\slevel\sin\sthe\sdatabase\scontains\ssegments\sbut\sno\sdata\s(because\sthere\sis\sa\sdelete-marker\sfor\seach\svalid\sentry).\sFix\sfor\s[bf1aab89]. +D 2019-10-17T15:41:36.813 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c 5e35b790778039aaa1267e0ad557c2518274fff9d97ea09301ecb6371dbc6118 +F ext/fts3/fts3_write.c aef93982656ef63851470a86c8f145d54dd4ebd9341f7493aefe45ddff0ce600 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -981,7 +981,7 @@ F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269 F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d F test/fts4langid.test 2168ba330af34f8a1c8832de0aab4c4b6fa195a16419c9c0c8aad59ceb6ff714 F test/fts4lastrowid.test 185835895948d5325c7710649824042373b2203149abe8024a9319d25234dfd7 -F test/fts4merge.test 1096e30b58ad616bd502141bfe5bfe4c3a518df89e958d41a5ed1ce322369b9c +F test/fts4merge.test e2b2ec21e287d54ec09824ccfb41e66896eeca568fc818ba0e0eb2efd94c35d2 F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 F test/fts4merge3.test 8d9ccb4a3d41c4c617a149d6c4b13ad02de797d0 F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eea1e7aa57e74c4329003f4550168e2aed9e33d2301a3ba84b10781a9cebbc1b -R e1eefe483bc6d1fcca7df84837a3f1f8 -U mistachkin -Z 9a870c611a385fdc7dbdc0a96b27ae55 +P bba975c7af3de9aeb5c62fb8b05d61b96e4ecd0b030008442bbdd345e1e5f134 +R c0ee123c55e0634eada3c2d56906af99 +U dan +Z 5c41036d47f05063f5938d5d5c2f4f4a diff --git a/manifest.uuid b/manifest.uuid index 3dc24692bb..076e023d3b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bba975c7af3de9aeb5c62fb8b05d61b96e4ecd0b030008442bbdd345e1e5f134 \ No newline at end of file +35beaee059a6cccead4311886ca928d936f23584cf435e35e265e98feea723dc \ No newline at end of file diff --git a/test/fts4merge.test b/test/fts4merge.test index 48661afd71..3cd693209d 100644 --- a/test/fts4merge.test +++ b/test/fts4merge.test @@ -326,7 +326,22 @@ foreach mod {fts3 fts4} { execsql { INSERT INTO t1(t1) VALUES('merge=200,10') } expr { ([db total_changes] - $x)>1 } } {0} +} +#------------------------------------------------------------------------- +# Test cases 8.* - ticket [bf1aab89]. +# +set testprefix fts4merge +reset_db +do_execsql_test 8.0 { + CREATE VIRTUAL TABLE t1 USING fts4(a, order=DESC); + INSERT INTO t1(a) VALUES (0); + INSERT INTO t1(a) VALUES (0); + UPDATE t1 SET a = NULL; +} + +do_execsql_test 8.1 { + INSERT INTO t1(t1) VALUES('merge=1,4'); } finish_test From 8a53ce2ff8a1e7e3fe867662568e13680cbb0e5e Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Oct 2019 15:59:03 +0000 Subject: [PATCH 049/476] Basic UPDATE functionality working for VIRTUAL tables. FossilOrigin-Name: c21959d4eb5d742a097a98e1874c0bf132dc962a97a65be1ab22d6ca3cf2b261 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/update.c | 43 ++++++++++++++++++++++++++++++------------- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 93dc0ecab7..ad6cb4a6ff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bug\sfixes\sso\sthat\s"make\stest"\sonce\sagainst\sruns\swith\sno\serrors. -D 2019-10-17T14:21:07.409 +C Basic\sUPDATE\sfunctionality\sworking\sfor\sVIRTUAL\stables. +D 2019-10-17T15:59:03.864 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -592,7 +592,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c 1ad2eb4006a06b13f5eadbbdebe0c4dc7e987428dfdeef18429f533d2dae8618 +F src/update.c ef3e261b43cc417e4d7e59ccf4fdae1b86d9bc1879d83820253e4a2105a63278 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 069351b85f9a706f60d3e98fbc8aaf40c374356b967c0464aede30ead3d9d18b -R a9daba7f86da0ab938b557a0a9cc8b96 +P 7bfe0f679d8951b3e925bdf549efa0f8d6b514eddeaca69cbfddbd9476cfff5f +R d18b3efac452c2846ba92424700e5afb U drh -Z 1fb219ce2b5d60344f9b3644d927ae0d +Z f4544de40926466a5b3f8950ba10f06a diff --git a/manifest.uuid b/manifest.uuid index 0a25f0c923..388e90dda5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7bfe0f679d8951b3e925bdf549efa0f8d6b514eddeaca69cbfddbd9476cfff5f \ No newline at end of file +c21959d4eb5d742a097a98e1874c0bf132dc962a97a65be1ab22d6ca3cf2b261 \ No newline at end of file diff --git a/src/update.c b/src/update.c index 9826ae2707..d0685d6589 100644 --- a/src/update.c +++ b/src/update.c @@ -147,7 +147,7 @@ void sqlite3Update( Expr *pLimit, /* LIMIT clause. May be null */ Upsert *pUpsert /* ON CONFLICT clause, or null */ ){ - int i, j; /* Loop counters */ + int i, j, k; /* Loop counters */ Table *pTab; /* The table to be updated */ int addrTop = 0; /* VDBE instruction address of the start of the loop */ WhereInfo *pWInfo; /* Information about the WHERE clause */ @@ -308,6 +308,14 @@ void sqlite3Update( }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){ chngPk = 1; } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ + sqlite3ErrorMsg(pParse, + "cannot UPDATE generated column \"%s\"", + pTab->aCol[j].zName); + goto update_cleanup; + } +#endif aXRef[j] = i; break; } @@ -623,15 +631,20 @@ void sqlite3Update( oldmask |= sqlite3TriggerColmask(pParse, pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError ); - for(i=0; inCol; i++){ + for(i=0, k=regOld; inCol; i++, k++){ + u32 colFlags = pTab->aCol[i].colFlags; + if( colFlags & COLFLAG_VIRTUAL ){ + k--; + continue; + } if( oldmask==0xffffffff || (i<32 && (oldmask & MASKBIT32(i))!=0) - || (pTab->aCol[i].colFlags & COLFLAG_PRIMKEY)!=0 + || (colFlags & COLFLAG_PRIMKEY)!=0 ){ testcase( oldmask!=0xffffffff && i==31 ); - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, regOld+i); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, k); }else{ - sqlite3VdbeAddOp2(v, OP_Null, 0, regOld+i); + sqlite3VdbeAddOp2(v, OP_Null, 0, k); } } if( chngRowid==0 && pPk==0 ){ @@ -655,13 +668,15 @@ void sqlite3Update( newmask = sqlite3TriggerColmask( pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError ); - for(i=0; inCol; i++){ + for(i=0, k=regNew; inCol; i++, k++){ if( i==pTab->iPKey ){ - sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); + sqlite3VdbeAddOp2(v, OP_Null, 0, k); + }else if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)!=0 ){ + k--; }else{ j = aXRef[i]; if( j>=0 ){ - sqlite3ExprCode(pParse, pChanges->a[j].pExpr, regNew+i); + sqlite3ExprCode(pParse, pChanges->a[j].pExpr, k); }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){ /* This branch loads the value of a column that will not be changed ** into a register. This is done if there are no BEFORE triggers, or @@ -670,9 +685,9 @@ void sqlite3Update( */ testcase( i==31 ); testcase( i==32 ); - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, regNew+i); + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, k); }else{ - sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); + sqlite3VdbeAddOp2(v, OP_Null, 0, k); } } } @@ -708,9 +723,11 @@ void sqlite3Update( ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26) ** for an example. */ - for(i=0; inCol; i++){ - if( aXRef[i]<0 && i!=pTab->iPKey ){ - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, regNew+i); + for(i=0, k=regNew; inCol; i++, k++){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + k--; + }else if( aXRef[i]<0 && i!=pTab->iPKey ){ + sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, k); } } } From ae3977a8f30bb859b858c36d03f07319ba210615 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Oct 2019 16:16:34 +0000 Subject: [PATCH 050/476] Fix the xfer optimization for generated columns, so that VACUUM works again. FossilOrigin-Name: 8f67b89b04622c1509dc102a83be7a80057dc791625804fc2c294089c98b97e4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 12 +++++++++++- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ad6cb4a6ff..67a4634513 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Basic\sUPDATE\sfunctionality\sworking\sfor\sVIRTUAL\stables. -D 2019-10-17T15:59:03.864 +C Fix\sthe\sxfer\soptimization\sfor\sgenerated\scolumns,\sso\sthat\sVACUUM\sworks\sagain. +D 2019-10-17T16:16:34.306 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 3cf6462f09ef50916e5e859b56cb7bbf3a7e0b8f25a9cac0c99c572ba08c0779 +F src/insert.c 608b6d99b95f95a657b0fd13048ca002dfa8f1c212771c56bca510f1776f583d F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7bfe0f679d8951b3e925bdf549efa0f8d6b514eddeaca69cbfddbd9476cfff5f -R d18b3efac452c2846ba92424700e5afb +P c21959d4eb5d742a097a98e1874c0bf132dc962a97a65be1ab22d6ca3cf2b261 +R 6aa9977527f4824498ace24e1ab11d24 U drh -Z f4544de40926466a5b3f8950ba10f06a +Z 5abd38c0a3e4636bc9783adf5f0cb09c diff --git a/manifest.uuid b/manifest.uuid index 388e90dda5..adeb66ff57 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c21959d4eb5d742a097a98e1874c0bf132dc962a97a65be1ab22d6ca3cf2b261 \ No newline at end of file +8f67b89b04622c1509dc102a83be7a80057dc791625804fc2c294089c98b97e4 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 1c628c670a..0abe244b34 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2289,6 +2289,10 @@ static int xferOptimization( return 0; /* Neither table may have __hidden__ columns */ } #endif + if( (pDestCol->colFlags & COLFLAG_GENERATED) != + (pSrcCol->colFlags & COLFLAG_GENERATED) ){ + return 0; /* Both columns have the same generated type */ + } if( pDestCol->affinity!=pSrcCol->affinity ){ return 0; /* Affinity must be the same on all columns */ } @@ -2299,7 +2303,7 @@ static int xferOptimization( return 0; /* tab2 must be NOT NULL if tab1 is */ } /* Default values for second and subsequent columns need to match. */ - if( i>0 ){ + if( (pDestCol->colFlags & COLFLAG_GENERATED)==0 && i>0 ){ assert( pDestCol->pDflt==0 || pDestCol->pDflt->op==TK_SPAN ); assert( pSrcCol->pDflt==0 || pSrcCol->pDflt->op==TK_SPAN ); if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0) @@ -2309,6 +2313,12 @@ static int xferOptimization( return 0; /* Default values must be the same for all columns */ } } + /* Generator expressions for generated columns must match */ + if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ + if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){ + return 0; /* Different generator expressions */ + } + } } for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ if( IsUniqueIndex(pDestIdx) ){ From c143114460ec0c214218978baa98b6585649cc22 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Oct 2019 17:54:05 +0000 Subject: [PATCH 051/476] Some (but not all) INSERT and UPDATE statements now work for STORED columns. FossilOrigin-Name: fe7517bf4d360597576ab9aba29627d7926d23f2bbbfb3e7bf4d32761617574c --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/build.c | 7 +++++-- src/insert.c | 46 +++++++++++++++++++++++++++++++++++++++++++--- src/pragma.c | 4 ++-- src/sqliteInt.h | 22 ++++++++++++++++------ src/update.c | 18 ++++++++++++++---- src/vtab.c | 2 +- 8 files changed, 93 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index 67a4634513..48bf19ebc6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sxfer\soptimization\sfor\sgenerated\scolumns,\sso\sthat\sVACUUM\sworks\sagain. -D 2019-10-17T16:16:34.306 +C Some\s(but\snot\sall)\sINSERT\sand\sUPDATE\sstatements\snow\swork\sfor\sSTORED\scolumns. +D 2019-10-17T17:54:05.733 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 6cb40a36b3ec6a4b2dc36e0bd53e42ad448700c48b419569eae711cde4b175d3 +F src/build.c efbcb2e78a578bca138ea2d8a4b3ec44a6fef2630a1b79fb5ed619abd08068e5 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 608b6d99b95f95a657b0fd13048ca002dfa8f1c212771c56bca510f1776f583d +F src/insert.c 2402847e031cb9b1e95a776481706a38833339be1142e8bdc78fd59e65d7c87c F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -518,7 +518,7 @@ F src/parse.y bc453ce808316facd191413bfa4ec6730a1d693b98fd8be5addef8fbfd62bb7b F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c 61abcb6d9f80d06ed3b0d0843a7cef32e96a569a27b94ebfd764dc6c1ce1cd1d +F src/pragma.c c04340e810dd5d6d094f7fffa9278e9183ffd052f91b2dc20f83aea471f8756a F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 @@ -530,7 +530,7 @@ F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e27 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h ecade7aec917068cbbc96505eed645419e07799d91052926d418dd256d60b72d +F src/sqliteInt.h 8af46452e819f6304cc39922eb9f2153a53da44dcedae78cd59ae08e7ca7b164 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,7 +592,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c ef3e261b43cc417e4d7e59ccf4fdae1b86d9bc1879d83820253e4a2105a63278 +F src/update.c a66b56e5024541d2dd6794d0800b14f7a2cc968f6a1fdf84df2cb44048b35058 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -606,7 +606,7 @@ F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vtab.c 27998d5d738069f2cee981620a1f224558494ce06799d14dcb5e6f34b4cdcdd1 +F src/vtab.c 108f79166d4a232a8bfb9d46e2fbec191f83a87fe97f7b93fc4de976c3fa3434 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c21959d4eb5d742a097a98e1874c0bf132dc962a97a65be1ab22d6ca3cf2b261 -R 6aa9977527f4824498ace24e1ab11d24 +P 8f67b89b04622c1509dc102a83be7a80057dc791625804fc2c294089c98b97e4 +R f8d479928377499694b42044f6469958 U drh -Z 5abd38c0a3e4636bc9783adf5f0cb09c +Z aaf8a72afb67fb32144fc0364d09d870 diff --git a/manifest.uuid b/manifest.uuid index adeb66ff57..b3a551e5d8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8f67b89b04622c1509dc102a83be7a80057dc791625804fc2c294089c98b97e4 \ No newline at end of file +fe7517bf4d360597576ab9aba29627d7926d23f2bbbfb3e7bf4d32761617574c \ No newline at end of file diff --git a/src/build.c b/src/build.c index 897e9183eb..6937d6af28 100644 --- a/src/build.c +++ b/src/build.c @@ -1564,8 +1564,11 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ goto generated_error; } } - pTab->nVCol++; + if( eType==COLFLAG_VIRTUAL ) pTab->nVCol++; pCol->colFlags |= eType; + assert( TF_HasVirtual==COLFLAG_VIRTUAL ); + assert( TF_HasStored==COLFLAG_STORED ); + pTab->tabFlags |= eType; pCol->pDflt = sqlite3ExprDup(pParse->db, pExpr, 0); goto generated_done; @@ -2177,7 +2180,7 @@ void sqlite3EndTable( } #endif /* !defined(SQLITE_OMIT_CHECK) */ #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( p->nVCol ){ + if( p->tabFlags & (TF_HasVirtual|TF_HasStored) ){ int ii; for(ii=0; iinCol; ii++){ if( (p->aCol[ii].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL))!=0 ){ diff --git a/src/insert.c b/src/insert.c index 0abe244b34..04b91d8405 100644 --- a/src/insert.c +++ b/src/insert.c @@ -202,6 +202,36 @@ static int readsTable(Parse *p, int iDb, Table *pTab){ return 0; } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** All regular columns for table pTab have been puts into registers +** starting with iRegStore. The registers that correspond to STORED +** columns have not been initialized. This routine goes back and computes +** the values for STORED columns based on the previously computed normal +** columns. +*/ +void sqlite3ComputeStoredColumns( + Parse *pParse, /* Parsing context */ + int iRegStore, /* Register holding the first column */ + Table *pTab /* The table */ +){ + int i; + pParse->iSelfTab = -iRegStore; + for(i=0; inCol; i++, iRegStore++){ + u32 colFlags = pTab->aCol[i].colFlags; + if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ + /* Virtual columns are no stored */ + iRegStore--; + }else if( (colFlags & COLFLAG_STORED)!=0 ){ + /* Stored columns are handled on the second pass */ + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iRegStore); + } + } + pParse->iSelfTab = 0; +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + + #ifndef SQLITE_OMIT_AUTOINCREMENT /* ** Locate or create an AutoincInfo structure associated with table pTab @@ -1027,9 +1057,11 @@ void sqlite3Insert( /* Virtual columns are no stored */ iRegStore--; continue; - }else if( (colFlags & COLFLAG_STORED)!=0 || pColumn==0 ){ - /* Stored columns get the default value. Also hidden columns - ** that are not explicitly named in the INSERT */ + }else if( (colFlags & COLFLAG_STORED)!=0 ){ + /* Stored columns are handled on the second pass */ + continue; + }else if( pColumn==0 ){ + /* Hidden columns that are not explicitly named in the INSERT */ sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); continue; } @@ -1061,6 +1093,14 @@ void sqlite3Insert( } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Compute the new value for STORED columns after all other + ** columns have already been computed */ + if( pTab->tabFlags & TF_HasStored ){ + sqlite3ComputeStoredColumns(pParse, regRowid+1, pTab); + } +#endif + /* Generate code to check constraints and generate index keys and ** do the insertion. */ diff --git a/src/pragma.c b/src/pragma.c index d9f249d138..a3dfff2b73 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1108,9 +1108,9 @@ void sqlite3Pragma( } if( pCol->colFlags & COLFLAG_VIRTUAL ){ isHidden = 2; /* GENERATED ALWAYS AS ... VIRTUAL */ - }else if( pCol->colFlags & COLFLAG_VIRTUAL ){ + }else if( pCol->colFlags & COLFLAG_STORED ){ isHidden = 3; /* GENERATED ALWAYS AS ... STORED */ - }else{ + }else{ assert( pCol->colFlags & COLFLAG_HIDDEN ); isHidden = 1; /* HIDDEN */ } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 8455155ae0..508487954c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2009,20 +2009,27 @@ struct Table { ** 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. +** special handling during INSERT processing. The "OOO" means "Out Of Order". +** +** Constraints: +** +** TF_HasVirtual == COLFLAG_Virtual +** TF_HasStored == COLFLAG_Stored */ #define TF_Readonly 0x0001 /* Read-only system table */ #define TF_Ephemeral 0x0002 /* An ephemeral table */ #define TF_HasPrimaryKey 0x0004 /* Table has a primary key */ #define TF_Autoincrement 0x0008 /* Integer primary key is autoincrement */ #define TF_HasStat1 0x0010 /* nRowLogEst set from sqlite_stat1 */ -#define TF_WithoutRowid 0x0020 /* No rowid. PRIMARY KEY is the key */ -#define TF_NoVisibleRowid 0x0040 /* No user-visible "rowid" column */ -#define TF_OOOHidden 0x0080 /* Out-of-Order hidden columns */ +#define TF_HasVirtual 0x0020 /* Has one or more VIRTUAL columns */ +#define TF_HasStored 0x0040 /* Has one or more STORED columns */ +#define TF_WithoutRowid 0x0080 /* No rowid. PRIMARY KEY is the key */ #define TF_StatsUsed 0x0100 /* Query planner decisions affected by ** Index.aiRowLogEst[] values */ -#define TF_HasNotNull 0x0200 /* Contains NOT NULL constraints */ -#define TF_Shadow 0x0400 /* True for a shadow table */ +#define TF_NoVisibleRowid 0x0200 /* No user-visible "rowid" column */ +#define TF_OOOHidden 0x0400 /* Out-of-Order hidden columns */ +#define TF_HasNotNull 0x0800 /* Contains NOT NULL constraints */ +#define TF_Shadow 0x1000 /* True for a shadow table */ /* ** Test to see whether or not a table is a virtual table. This is @@ -4020,6 +4027,9 @@ void sqlite3FreeIndex(sqlite3*, Index*); # define sqlite3AutoincrementEnd(X) #endif void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + void sqlite3ComputeStoredColumns(Parse*, int, Table*); +#endif void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); int sqlite3IdListIndex(IdList*,const char*); diff --git a/src/update.c b/src/update.c index d0685d6589..9b29757921 100644 --- a/src/update.c +++ b/src/update.c @@ -671,8 +671,8 @@ void sqlite3Update( for(i=0, k=regNew; inCol; i++, k++){ if( i==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Null, 0, k); - }else if( (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)!=0 ){ - k--; + }else if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)!=0 ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; }else{ j = aXRef[i]; if( j>=0 ){ @@ -691,6 +691,11 @@ void sqlite3Update( } } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasStored ){ + sqlite3ComputeStoredColumns(pParse, regNew, pTab); + } +#endif /* Fire any BEFORE UPDATE triggers. This happens before constraints are ** verified. One could argue that this is wrong. @@ -724,12 +729,17 @@ void sqlite3Update( ** for an example. */ for(i=0, k=regNew; inCol; i++, k++){ - if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ - k--; + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; }else if( aXRef[i]<0 && i!=pTab->iPKey ){ sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, k); } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasStored ){ + sqlite3ComputeStoredColumns(pParse, regNew, pTab); + } +#endif } if( !isView ){ diff --git a/src/vtab.c b/src/vtab.c index 33a38021f5..a2032c7ae0 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -624,7 +624,7 @@ static int vtabCallConstructor( rc = SQLITE_ERROR; }else{ int iCol; - u8 oooHidden = 0; + u16 oooHidden = 0; /* If everything went according to plan, link the new VTable structure ** into the linked list headed by pTab->pVTable. Then loop through the ** columns of the table to see if any of them contain the token "hidden". From d4cd292c2aa7e453ee3879d47df0c0503b47db75 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Oct 2019 18:07:22 +0000 Subject: [PATCH 052/476] Bug fix with INSERT using an explicit column list on a table with a non-final STORED column. FossilOrigin-Name: 61b4459ae6a6cc182c11abbc8b1dd629f77beb088d7ccad5e563d8d4769056df --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 48bf19ebc6..9ad58ca2f9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Some\s(but\snot\sall)\sINSERT\sand\sUPDATE\sstatements\snow\swork\sfor\sSTORED\scolumns. -D 2019-10-17T17:54:05.733 +C Bug\sfix\swith\sINSERT\susing\san\sexplicit\scolumn\slist\son\sa\stable\swith\na\snon-final\sSTORED\scolumn. +D 2019-10-17T18:07:22.142 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 2402847e031cb9b1e95a776481706a38833339be1142e8bdc78fd59e65d7c87c +F src/insert.c 603a076777fc517847c55bcb5e6ab96191c1727ef4bf353f7154f2770cd352c2 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8f67b89b04622c1509dc102a83be7a80057dc791625804fc2c294089c98b97e4 -R f8d479928377499694b42044f6469958 +P fe7517bf4d360597576ab9aba29627d7926d23f2bbbfb3e7bf4d32761617574c +R 1758d4287c38e70ebe46598e4b662121 U drh -Z aaf8a72afb67fb32144fc0364d09d870 +Z d0910071efb9b72075e77f5cb05b8223 diff --git a/manifest.uuid b/manifest.uuid index b3a551e5d8..9cc2345c09 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fe7517bf4d360597576ab9aba29627d7926d23f2bbbfb3e7bf4d32761617574c \ No newline at end of file +61b4459ae6a6cc182c11abbc8b1dd629f77beb088d7ccad5e563d8d4769056df \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 04b91d8405..0a140fd4cd 100644 --- a/src/insert.c +++ b/src/insert.c @@ -220,7 +220,7 @@ void sqlite3ComputeStoredColumns( for(i=0; inCol; i++, iRegStore++){ u32 colFlags = pTab->aCol[i].colFlags; if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ - /* Virtual columns are no stored */ + /* Virtual columns are not stored */ iRegStore--; }else if( (colFlags & COLFLAG_STORED)!=0 ){ /* Stored columns are handled on the second pass */ @@ -694,7 +694,7 @@ void sqlite3Insert( ** is appears in the original table. (The index of the INTEGER ** PRIMARY KEY in the original table is pTab->iPKey.) */ - bIdListInOrder = (pTab->tabFlags & TF_OOOHidden)==0; + bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0; if( pColumn ){ for(i=0; inId; i++){ pColumn->a[i].idx = -1; From 0b0b3a95d025430c83563ee390656901734f9988 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 17 Oct 2019 18:35:57 +0000 Subject: [PATCH 053/476] In the Table object, change the nVCol field to nNVCol - the number of non-virtual columns, as that is the quantity that we need most. FossilOrigin-Name: 4ad66af04a654d92711d2d056ce8f35cd21eac4b99fb8d78be1a314620b6d29e --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/build.c | 11 ++++++++--- src/insert.c | 6 ++---- src/pragma.c | 2 +- src/sqliteInt.h | 2 +- 6 files changed, 22 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 9ad58ca2f9..69da213089 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bug\sfix\swith\sINSERT\susing\san\sexplicit\scolumn\slist\son\sa\stable\swith\na\snon-final\sSTORED\scolumn. -D 2019-10-17T18:07:22.142 +C In\sthe\sTable\sobject,\schange\sthe\snVCol\sfield\sto\snNVCol\s-\sthe\snumber\sof\nnon-virtual\scolumns,\sas\sthat\sis\sthe\squantity\sthat\swe\sneed\smost. +D 2019-10-17T18:35:57.978 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c efbcb2e78a578bca138ea2d8a4b3ec44a6fef2630a1b79fb5ed619abd08068e5 +F src/build.c a6424bece3662d57b19f8ead1541c959036bc632ac57f7f6f7801833c8e544da F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 603a076777fc517847c55bcb5e6ab96191c1727ef4bf353f7154f2770cd352c2 +F src/insert.c 96e3cd32ddc5cfc75b2a03ced36f49a31105cfbda3939f1e239109bdd12227e8 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -518,7 +518,7 @@ F src/parse.y bc453ce808316facd191413bfa4ec6730a1d693b98fd8be5addef8fbfd62bb7b F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c c04340e810dd5d6d094f7fffa9278e9183ffd052f91b2dc20f83aea471f8756a +F src/pragma.c a2cee4630b456f1f4727f93e2813d1cd197965c2ba2105be30f4c6104343727f F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 @@ -530,7 +530,7 @@ F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e27 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 8af46452e819f6304cc39922eb9f2153a53da44dcedae78cd59ae08e7ca7b164 +F src/sqliteInt.h 67d8d7f2d734823a978e50764563046759c23c6fa752c91e4f33b9815539e3e1 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fe7517bf4d360597576ab9aba29627d7926d23f2bbbfb3e7bf4d32761617574c -R 1758d4287c38e70ebe46598e4b662121 +P 61b4459ae6a6cc182c11abbc8b1dd629f77beb088d7ccad5e563d8d4769056df +R 3d476f0303fa6cd5641db0923ba30a4b U drh -Z d0910071efb9b72075e77f5cb05b8223 +Z 39ac0138a046fe5fcbf36ab2cfc09aa2 diff --git a/manifest.uuid b/manifest.uuid index 9cc2345c09..480b2fbc94 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61b4459ae6a6cc182c11abbc8b1dd629f77beb088d7ccad5e563d8d4769056df \ No newline at end of file +4ad66af04a654d92711d2d056ce8f35cd21eac4b99fb8d78be1a314620b6d29e \ No newline at end of file diff --git a/src/build.c b/src/build.c index 6937d6af28..ebb5243997 100644 --- a/src/build.c +++ b/src/build.c @@ -901,7 +901,7 @@ i16 sqlite3ColumnOfTable(Table *pTab, i16 iCol){ int i; i16 n; assert( iColnCol ); - if( pTab->nVCol==0 ) return iCol; + if( (pTab->tabFlags & TF_HasVirtual)==0 ) return iCol; for(i=0, n=0; iaCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) n++; } @@ -1564,7 +1564,6 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ goto generated_error; } } - if( eType==COLFLAG_VIRTUAL ) pTab->nVCol++; pCol->colFlags |= eType; assert( TF_HasVirtual==COLFLAG_VIRTUAL ); assert( TF_HasStored==COLFLAG_STORED ); @@ -2127,6 +2126,7 @@ void sqlite3EndTable( assert( !db->mallocFailed ); p = pParse->pNewTable; if( p==0 ) return; + p->nNVCol = p->nCol; if( pSelect==0 && isShadowTableName(db, p->zName) ){ p->tabFlags |= TF_Shadow; @@ -2183,7 +2183,12 @@ void sqlite3EndTable( if( p->tabFlags & (TF_HasVirtual|TF_HasStored) ){ int ii; for(ii=0; iinCol; ii++){ - if( (p->aCol[ii].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL))!=0 ){ + u32 colFlags = p->aCol[ii].colFlags; + if( (colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL))!=0 ){ + if( colFlags & COLFLAG_VIRTUAL ){ + p->nNVCol--; + assert( p->nNVCol>=0 ); + } sqlite3ResolveSelfReference(pParse, p, NC_GenCol, p->aCol[ii].pDflt, 0); } diff --git a/src/insert.c b/src/insert.c index 0a140fd4cd..cd3eaf293d 100644 --- a/src/insert.c +++ b/src/insert.c @@ -37,8 +37,7 @@ void sqlite3OpenTable( sqlite3TableLock(pParse, iDb, pTab->tnum, (opcode==OP_OpenWrite)?1:0, pTab->zName); if( HasRowid(pTab) ){ - sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, - pTab->nCol - pTab->nVCol); + sqlite3VdbeAddOp4Int(v, opcode, iCur, pTab->tnum, iDb, pTab->nNVCol); VdbeComment((v, "%s", pTab->zName)); }else{ Index *pPk = sqlite3PrimaryKeyIndex(pTab); @@ -1933,8 +1932,7 @@ void sqlite3GenerateConstraintChecks( /* Generate the table record */ if( HasRowid(pTab) ){ int regRec = aRegIdx[ix]; - sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, - pTab->nCol-pTab->nVCol, regRec); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regNewData+1, pTab->nNVCol, regRec); sqlite3SetMakeRecordP5(v, pTab); if( !bAffinityDone ){ sqlite3TableAffinity(v, pTab, 0); diff --git a/src/pragma.c b/src/pragma.c index a3dfff2b73..750ddb1404 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1586,7 +1586,7 @@ void sqlite3Pragma( loopTop = sqlite3VdbeAddOp2(v, OP_AddImm, 7, 1); if( !isQuick ){ /* Sanity check on record header decoding */ - sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nCol-pTab->nVCol-1,3); + sqlite3VdbeAddOp3(v, OP_Column, iDataCur, pTab->nNVCol-1,3); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); } /* Verify that all NOT NULL columns really are NOT NULL */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 508487954c..2726a0ac4e 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1982,7 +1982,7 @@ struct Table { u32 tabFlags; /* Mask of TF_* values */ i16 iPKey; /* If not negative, use aCol[iPKey] as the rowid */ i16 nCol; /* Number of columns in this table */ - i16 nVCol; /* Number of virtual columns */ + i16 nNVCol; /* Number of columns that are not VIRTUAL */ LogEst nRowLogEst; /* Estimated rows in table - from sqlite_stat1 table */ LogEst szTabRow; /* Estimated size of each table row in bytes */ #ifdef SQLITE_ENABLE_COSTMULT From 9942ef0d95c5a34bec24b669f454fc157bbf8eee Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2019 02:19:18 +0000 Subject: [PATCH 054/476] STORED columns can now reference other STORED columns, in any order, as long as there are not loops. FossilOrigin-Name: 0d236698e64b2a4b46f91a25279c406e0bf392fe66116678456f0a034c11d7b4 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 46 ++++++++++++++++++++++++++++++++++++++-------- src/insert.c | 17 ++++++++++++++++- src/sqliteInt.h | 5 +++-- 5 files changed, 66 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 69da213089..9e844296d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sTable\sobject,\schange\sthe\snVCol\sfield\sto\snNVCol\s-\sthe\snumber\sof\nnon-virtual\scolumns,\sas\sthat\sis\sthe\squantity\sthat\swe\sneed\smost. -D 2019-10-17T18:35:57.978 +C STORED\scolumns\scan\snow\sreference\sother\sSTORED\scolumns,\sin\sany\sorder,\sas\slong\nas\sthere\sare\snot\sloops. +D 2019-10-18T02:19:18.134 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c fd10ac325c73bdf4d558530745d70df01fe6f7a0763553045adf42a62c303dc9 -F src/expr.c 61d9043b1b9b82d72c919bcf5801a885a0ee7e41bf3e5ce3021b206a5706a949 +F src/expr.c e492fffa17f9b89ba01790715d8f6b3a14b1af6b486163a6690b3fee4b3e4529 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 96e3cd32ddc5cfc75b2a03ced36f49a31105cfbda3939f1e239109bdd12227e8 +F src/insert.c 3115663711fabc6a79b96f4c5f1a4cd64f79778c51a1f18b4180c2959785f636 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e27 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 67d8d7f2d734823a978e50764563046759c23c6fa752c91e4f33b9815539e3e1 +F src/sqliteInt.h aa16ccbbe83b06807da56079398412a995c904e0c0bb5a18eb5c659eb5c96898 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 61b4459ae6a6cc182c11abbc8b1dd629f77beb088d7ccad5e563d8d4769056df -R 3d476f0303fa6cd5641db0923ba30a4b +P 4ad66af04a654d92711d2d056ce8f35cd21eac4b99fb8d78be1a314620b6d29e +R 9578e8b1b10efcdb33ad67045419d288 U drh -Z 39ac0138a046fe5fcbf36ab2cfc09aa2 +Z f6acd0d3a8cdd8b86a336efd8f5324bf diff --git a/manifest.uuid b/manifest.uuid index 480b2fbc94..c8abb502de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4ad66af04a654d92711d2d056ce8f35cd21eac4b99fb8d78be1a314620b6d29e \ No newline at end of file +0d236698e64b2a4b46f91a25279c406e0bf392fe66116678456f0a034c11d7b4 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c21006b115..c026c9583b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3577,19 +3577,49 @@ expr_code_doover: } if( iTab<0 ){ if( pParse->iSelfTab<0 ){ - /* Generating CHECK constraints or inserting into partial index */ - assert( pExpr->y.pTab!=0 ); + /* Other columns in the same row for CHECK constraints or + ** generated columns or for inserting into partial index. + ** The row is unpacked into registers beginning at + ** 0-(pParse->iSelfTab). The rowid (if any) is in a register + ** immediately prior to the first column. + */ + Column *pCol; + Table *pTab = pExpr->y.pTab; + int iSrc; + assert( pTab!=0 ); assert( pExpr->iColumn>=XN_ROWID ); assert( pExpr->iColumny.pTab->nCol ); - if( pExpr->iColumn>=0 - && pExpr->y.pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL - ){ - sqlite3VdbeAddOp2(v, OP_SCopy, pExpr->iColumn - pParse->iSelfTab, - target); + if( pExpr->iColumn<0 ){ + return -1-pParse->iSelfTab; + } + pCol = pTab->aCol + pExpr->iColumn; + iSrc = sqlite3ColumnOfTable(pTab, pExpr->iColumn) - pParse->iSelfTab; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pCol->colFlags & COLFLAG_GENERATED ){ + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", + pCol->zName); + return 0; + } + pCol->colFlags |= COLFLAG_BUSY; + if( pCol->colFlags & COLFLAG_VIRTUAL ){ + target = sqlite3ExprCodeTarget(pParse, pCol->pDflt, target); + }else{ + target = iSrc; + if( pCol->colFlags & COLFLAG_NOTAVAIL ){ + sqlite3ExprCode(pParse, pCol->pDflt, iSrc); + } + } + pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); + return target; + }else +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + if( pCol->affinity==SQLITE_AFF_REAL ){ + sqlite3VdbeAddOp2(v, OP_SCopy, iSrc, target); sqlite3VdbeAddOp1(v, OP_RealAffinity, target); return target; }else{ - return pExpr->iColumn - pParse->iSelfTab; + return iSrc; } }else{ /* Coding an expression that is part of an index where column names diff --git a/src/insert.c b/src/insert.c index cd3eaf293d..d53db3dd3e 100644 --- a/src/insert.c +++ b/src/insert.c @@ -215,15 +215,30 @@ void sqlite3ComputeStoredColumns( Table *pTab /* The table */ ){ int i; + /* Because there can be multiple STORED columns that refer to one another, + ** either directly or through VIRTUAL columns, this is a two pass + ** algorithm. On the first pass, mark all STORED columns as NOT-AVAILABLE. + */ + for(i=0; inCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_STORED ){ + pTab->aCol[i].colFlags |= COLFLAG_NOTAVAIL; + } + } + /* On the second pass, compute the value of each NOT-AVAILABLE column. + ** Companion code in the TK_COLUMN case of sqlite3ExprCodeTarget() will + ** compute dependencies and mark remove the COLSPAN_NOTAVAIL mark, as + ** they are needed. + */ pParse->iSelfTab = -iRegStore; for(i=0; inCol; i++, iRegStore++){ u32 colFlags = pTab->aCol[i].colFlags; if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ /* Virtual columns are not stored */ iRegStore--; - }else if( (colFlags & COLFLAG_STORED)!=0 ){ + }else if( (colFlags & COLFLAG_NOTAVAIL)!=0 ){ /* Stored columns are handled on the second pass */ sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iRegStore); + colFlags &= ~COLFLAG_NOTAVAIL; } } pParse->iSelfTab = 0; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 2726a0ac4e..f6646e4b82 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1828,7 +1828,7 @@ struct Column { u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ char affinity; /* One of the SQLITE_AFF_... values */ u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ - u8 colFlags; /* Boolean properties. See COLFLAG_ defines below */ + u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ }; /* Allowed values for Column.colFlags: @@ -1840,7 +1840,8 @@ struct Column { #define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ #define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ #define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ -#define COLFLAG_BUSY 0x0080 /* Blocks recursion on VIRTUAL columns */ +#define COLFLAG_BUSY 0x0080 /* Blocks recursion on GENERATED columns */ +#define COLFLAG_NOTAVAIL 0x0100 /* STORED column not yet calculated */ #define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ #define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ From 463e76ff8f024ca12d1bad4c6ab23e3a7a8247ce Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2019 10:05:06 +0000 Subject: [PATCH 055/476] Get indexes working on virtual columns. FossilOrigin-Name: 450c48766c8e62653d074c95f69b0576de3880d183a1d1e5992d88b6fce6cc39 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 21 ++++++++++++++------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 9e844296d9..ec2dc19b00 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C STORED\scolumns\scan\snow\sreference\sother\sSTORED\scolumns,\sin\sany\sorder,\sas\slong\nas\sthere\sare\snot\sloops. -D 2019-10-18T02:19:18.134 +C Get\sindexes\sworking\son\svirtual\scolumns. +D 2019-10-18T10:05:06.425 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 3115663711fabc6a79b96f4c5f1a4cd64f79778c51a1f18b4180c2959785f636 +F src/insert.c 689b21b415d4bfe2a0ea2cf0066974d2a93899fa51af12453664214fa0d534e6 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4ad66af04a654d92711d2d056ce8f35cd21eac4b99fb8d78be1a314620b6d29e -R 9578e8b1b10efcdb33ad67045419d288 +P 0d236698e64b2a4b46f91a25279c406e0bf392fe66116678456f0a034c11d7b4 +R 8109a098652bad982748ade2c7597bbf U drh -Z f6acd0d3a8cdd8b86a336efd8f5324bf +Z 4e41794c6cc4f099bab016eb4fec67c3 diff --git a/manifest.uuid b/manifest.uuid index c8abb502de..37fa61007b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d236698e64b2a4b46f91a25279c406e0bf392fe66116678456f0a034c11d7b4 \ No newline at end of file +450c48766c8e62653d074c95f69b0576de3880d183a1d1e5992d88b6fce6cc39 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index d53db3dd3e..f3bfeb4f60 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1755,14 +1755,21 @@ void sqlite3GenerateConstraintChecks( sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[i].pExpr, regIdx+i); pParse->iSelfTab = 0; VdbeComment((v, "%s column %d", pIdx->zName, i)); + }else if( iField==XN_ROWID || iField==pTab->iPKey ){ + x = regNewData; + sqlite3VdbeAddOp2(v, OP_IntCopy, x, regIdx+i); + VdbeComment((v, "rowid")); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( pTab->aCol[iField].colFlags & COLFLAG_VIRTUAL ){ + pParse->iSelfTab = -(regNewData+1); + sqlite3ExprCodeCopy(pParse, pTab->aCol[iField].pDflt, regIdx+i); + pParse->iSelfTab = 0; + VdbeComment((v, "%s column %d", pIdx->zName, i)); +#endif }else{ - if( iField==XN_ROWID || iField==pTab->iPKey ){ - x = regNewData; - }else{ - x = iField + regNewData + 1; - } - sqlite3VdbeAddOp2(v, iField<0 ? OP_IntCopy : OP_SCopy, x, regIdx+i); - VdbeComment((v, "%s", iField<0 ? "rowid" : pTab->aCol[iField].zName)); + x = sqlite3ColumnOfTable(pTab, iField) + regNewData + 1; + sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); + VdbeComment((v, "%s", pTab->aCol[iField].zName)); } } sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); From 01ef55e0f55e3dd49f4d70177e6e03e540a1eae5 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2019 12:14:48 +0000 Subject: [PATCH 056/476] Fix sqlite3ColumnOfIndex() to account for virtual columns. FossilOrigin-Name: 447271123e3b467d9271a4c0cf27f47af2f865c9298b8c355d9e766411a1f422 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 8 ++++++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ec2dc19b00..8b1604787a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Get\sindexes\sworking\son\svirtual\scolumns. -D 2019-10-18T10:05:06.425 +C Fix\ssqlite3ColumnOfIndex()\sto\saccount\sfor\svirtual\scolumns. +D 2019-10-18T12:14:48.871 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c a6424bece3662d57b19f8ead1541c959036bc632ac57f7f6f7801833c8e544da +F src/build.c 5e5fc50bda07b83d8f602218dae3099c9b7ee7b71d6d59dfa642dc074877ec35 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0d236698e64b2a4b46f91a25279c406e0bf392fe66116678456f0a034c11d7b4 -R 8109a098652bad982748ade2c7597bbf +P 450c48766c8e62653d074c95f69b0576de3880d183a1d1e5992d88b6fce6cc39 +R b12f2d235ff67ce42b63b55b4cb45601 U drh -Z 4e41794c6cc4f099bab016eb4fec67c3 +Z c0d073b04d67e49c297ac9c42fae3a3a diff --git a/manifest.uuid b/manifest.uuid index 37fa61007b..d4b8a06657 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -450c48766c8e62653d074c95f69b0576de3880d183a1d1e5992d88b6fce6cc39 \ No newline at end of file +447271123e3b467d9271a4c0cf27f47af2f865c9298b8c355d9e766411a1f422 \ No newline at end of file diff --git a/src/build.c b/src/build.c index ebb5243997..3441e07779 100644 --- a/src/build.c +++ b/src/build.c @@ -882,6 +882,14 @@ Index *sqlite3PrimaryKeyIndex(Table *pTab){ */ i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ int i; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + Table *pTab = pIdx->pTable; + if( pTab->tabFlags & TF_HasVirtual ){ + for(i=0; i<=iCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) iCol++; + } + } +#endif for(i=0; inColumn; i++){ if( iCol==pIdx->aiColumn[i] ) return i; } From 6df9c4b990059e43845f60752ae18565ddb7d702 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2019 12:52:08 +0000 Subject: [PATCH 057/476] Claw back some performance from the sqlite3ExprGetColumnOfTable() routine. FossilOrigin-Name: e8426acb94179ff49549aced6ea3c26c49ba4761c2f414fa1772d6a031edc79d --- manifest | 28 ++++++++++++++-------------- manifest.uuid | 2 +- src/delete.c | 7 +++---- src/expr.c | 10 ++++------ src/pragma.c | 4 ++-- src/select.c | 2 +- src/sqliteInt.h | 2 +- src/update.c | 8 ++++---- src/vdbe.h | 1 + src/vdbeaux.c | 7 +++++++ src/wherecode.c | 4 ++-- 11 files changed, 40 insertions(+), 35 deletions(-) diff --git a/manifest b/manifest index 8b1604787a..281510f5d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssqlite3ColumnOfIndex()\sto\saccount\sfor\svirtual\scolumns. -D 2019-10-18T12:14:48.871 +C Claw\sback\ssome\sperformance\sfrom\sthe\ssqlite3ExprGetColumnOfTable()\sroutine. +D 2019-10-18T12:52:08.655 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -476,8 +476,8 @@ F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 -F src/delete.c fd10ac325c73bdf4d558530745d70df01fe6f7a0763553045adf42a62c303dc9 -F src/expr.c e492fffa17f9b89ba01790715d8f6b3a14b1af6b486163a6690b3fee4b3e4529 +F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf +F src/expr.c e2c2f78c9f63de2bedabf34f8f25968c6b2317313d1ef15a37c8aa9bd29dcf75 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -518,19 +518,19 @@ F src/parse.y bc453ce808316facd191413bfa4ec6730a1d693b98fd8be5addef8fbfd62bb7b F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 -F src/pragma.c a2cee4630b456f1f4727f93e2813d1cd197965c2ba2105be30f4c6104343727f +F src/pragma.c 986fdd27f1ddb712eaf7af4ac5c4d7e0ad97ce9c5d2f069e02f89bb7e7d06496 F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 2160146697e6e0ba251b5a954e16f542b6e684fb4778cec2994094ab401ef996 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c ac9270006d5e1c283012fe116f36a8d496a49a296943f777176f61c0c903ea00 +F src/select.c 7ef05eeb7f686f84dd1428cbdca280c898915bbf56e1ea97bd42ecc070af78d3 F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e274 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h aa16ccbbe83b06807da56079398412a995c904e0c0bb5a18eb5c659eb5c96898 +F src/sqliteInt.h 769a3d9f244fe08c219aadc8474d180e3adca2c26cb5b13603adef4910b6ccf1 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,16 +592,16 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c d3615f0cbe4db5949503bf5916f3cd4fa5de855d5b4ef560f3b6dd5629423a1e F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c a66b56e5024541d2dd6794d0800b14f7a2cc968f6a1fdf84df2cb44048b35058 +F src/update.c c9020ecd59e80836a1bfccc406af3658a18bada4f17319fcc791db6643cbcac0 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 9a3f4c2ec6c45e4bd5db465e77e79dfdf5bdc5cf3a8c0bfe9549da209b9c18bc -F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf +F src/vdbe.h b02904e1bd45c26fdf00c04844b9cfa825763aa5150b6d89ce88b8ab03581d0a F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e -F src/vdbeaux.c a35a1785f980c44838b636a6d55a46b25ad80f2a2065851f165ab143aa46f99c +F src/vdbeaux.c a669f412027b6820cace9bf42e280c28304fc72bfc3475283ef33a5cce80e2e8 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -613,7 +613,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 9f3f23efc45934e7b7ea6c0c1042420b73053e7c3264feef6faf9ce6fbd5df61 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 -F src/wherecode.c 39df666a7281d3153b9f9d2cb04321cbb7cc403623a2862a292cb074e1b4a203 +F src/wherecode.c b9bb13fce68edf2eee56154a53adb923df7c0cf410fb319d0b2c4001c58a2c73 F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 450c48766c8e62653d074c95f69b0576de3880d183a1d1e5992d88b6fce6cc39 -R b12f2d235ff67ce42b63b55b4cb45601 +P 447271123e3b467d9271a4c0cf27f47af2f865c9298b8c355d9e766411a1f422 +R e46b1fe53b3eb28b7fe52d4e742c44d4 U drh -Z c0d073b04d67e49c297ac9c42fae3a3a +Z 941773dbc3af30d7e5e82c7718d2d1bf diff --git a/manifest.uuid b/manifest.uuid index d4b8a06657..a7110e869a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -447271123e3b467d9271a4c0cf27f47af2f865c9298b8c355d9e766411a1f422 \ No newline at end of file +e8426acb94179ff49549aced6ea3c26c49ba4761c2f414fa1772d6a031edc79d \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 271bdbd482..e3a0abc2c0 100644 --- a/src/delete.c +++ b/src/delete.c @@ -475,13 +475,13 @@ void sqlite3DeleteFrom( if( pPk ){ for(i=0; iaiColumn[i]>=0 ); - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iTabCur, + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, pPk->aiColumn[i], iPk+i); } iKey = iPk; }else{ iKey = ++pParse->nMem; - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iTabCur, -1, iKey); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, -1, iKey); } if( eOnePass!=ONEPASS_OFF ){ @@ -737,8 +737,7 @@ void sqlite3GenerateRowDelete( testcase( mask!=0xffffffff && iCol==31 ); testcase( mask!=0xffffffff && iCol==32 ); if( mask==0xffffffff || (iCol<=31 && (mask & MASKBIT32(iCol))!=0) ){ - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, iCol, - iOld+iCol+1); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+iCol+1); } } diff --git a/src/expr.c b/src/expr.c index c026c9583b..41ffe716ea 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3365,7 +3365,7 @@ void sqlite3ExprCodeLoadIndexColumn( sqlite3ExprCodeCopy(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); pParse->iSelfTab = 0; }else{ - sqlite3ExprCodeGetColumnOfTable(pParse, pIdx->pTable, iTabCur, + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, iTabCol, regOut); } } @@ -3374,13 +3374,12 @@ void sqlite3ExprCodeLoadIndexColumn( ** Generate code to extract the value of the iCol-th column of a table. */ void sqlite3ExprCodeGetColumnOfTable( - Parse *pParse, /* Parsing context */ + Vdbe *v, /* Parsing context */ Table *pTab, /* The table containing the value */ int iTabCur, /* The table cursor. Or the PK cursor for WITHOUT ROWID */ int iCol, /* Index of the column to extract */ int regOut /* Extract the value into this register */ ){ - Vdbe *v = pParse->pVdbe; Column *pCol; assert( v!=0 ); if( pTab==0 ){ @@ -3397,6 +3396,7 @@ void sqlite3ExprCodeGetColumnOfTable( x = iCol; #ifndef SQLITE_OMIT_GENERATED_COLUMNS }else if( (pCol = &pTab->aCol[iCol])->colFlags & COLFLAG_VIRTUAL ){ + Parse *pParse = sqlite3VdbeParser(v); if( pCol->colFlags & COLFLAG_BUSY ){ sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pCol->zName); }else{ @@ -3417,8 +3417,6 @@ void sqlite3ExprCodeGetColumnOfTable( op = OP_Column; } sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); - } - if( iCol>=0 ){ sqlite3ColumnDefault(v, pTab, iCol, regOut); } } @@ -3439,7 +3437,7 @@ int sqlite3ExprCodeGetColumn( u8 p5 /* P5 value for OP_Column + FLAGS */ ){ assert( pParse->pVdbe!=0 ); - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iTable, iColumn, iReg); + sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg); if( p5 ){ sqlite3VdbeChangeP5(pParse->pVdbe, p5); } diff --git a/src/pragma.c b/src/pragma.c index 750ddb1404..8e2607e5a1 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1407,7 +1407,7 @@ void sqlite3Pragma( ** this case. */ for(j=0; jnCol; j++){ int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom; - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, 0, iCol, regRow+j); + sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j); sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); } @@ -1595,7 +1595,7 @@ void sqlite3Pragma( int jmp2; if( j==pTab->iPKey ) continue; if( pTab->aCol[j].notNull==0 ) continue; - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, j, 3); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, j, 3); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, diff --git a/src/select.c b/src/select.c index f63ca06f4a..a5377a2c20 100644 --- a/src/select.c +++ b/src/select.c @@ -6417,7 +6417,7 @@ int sqlite3Select( struct AggInfo_col *pCol = &sAggInfo.aCol[i]; if( pCol->iSorterColumn>=j ){ int r1 = j + regBase; - sqlite3ExprCodeGetColumnOfTable(pParse, + sqlite3ExprCodeGetColumnOfTable(v, pCol->pTab, pCol->iTable, pCol->iColumn, r1); j++; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f6646e4b82..2066ff5f82 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4077,7 +4077,7 @@ int sqlite3WhereOkOnePass(WhereInfo*, int*); #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 sqlite3ExprCodeGetColumnOfTable(Parse*, Table*, int, int, int); +void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); void sqlite3ExprCodeMove(Parse*, int, int, int); void sqlite3ExprCode(Parse*, Expr*, int); void sqlite3ExprCodeCopy(Parse*, Expr*, int); diff --git a/src/update.c b/src/update.c index 9b29757921..56ddec67bc 100644 --- a/src/update.c +++ b/src/update.c @@ -550,7 +550,7 @@ void sqlite3Update( ** is not required) and leave the PK fields in the array of registers. */ for(i=0; iaiColumn[i]>=0 ); - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pPk->aiColumn[i], iPk+i); } if( eOnePass ){ @@ -642,7 +642,7 @@ void sqlite3Update( || (colFlags & COLFLAG_PRIMKEY)!=0 ){ testcase( oldmask!=0xffffffff && i==31 ); - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, k); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, k); } @@ -685,7 +685,7 @@ void sqlite3Update( */ testcase( i==31 ); testcase( i==32 ); - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, k); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); }else{ sqlite3VdbeAddOp2(v, OP_Null, 0, k); } @@ -732,7 +732,7 @@ void sqlite3Update( if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; }else if( aXRef[i]<0 && i!=pTab->iPKey ){ - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iDataCur, i, k); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); } } #ifndef SQLITE_OMIT_GENERATED_COLUMNS diff --git a/src/vdbe.h b/src/vdbe.h index e3aaaa1ce2..5d53017f53 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -179,6 +179,7 @@ typedef struct VdbeOpList VdbeOpList; ** for a description of what each of these routines does. */ Vdbe *sqlite3VdbeCreate(Parse*); +Parse *sqlite3VdbeParser(Vdbe*); int sqlite3VdbeAddOp0(Vdbe*,int); int sqlite3VdbeAddOp1(Vdbe*,int,int); int sqlite3VdbeAddOp2(Vdbe*,int,int,int); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index c89b7d4197..c85bdc3874 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -42,6 +42,13 @@ Vdbe *sqlite3VdbeCreate(Parse *pParse){ return p; } +/* +** Return the Parse object that owns a Vdbe object. +*/ +Parse *sqlite3VdbeParser(Vdbe *p){ + return p->pParse; +} + /* ** Change the error string stored in Vdbe.zErrMsg */ diff --git a/src/wherecode.c b/src/wherecode.c index 39b9040db7..af395a3266 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -2072,7 +2072,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( (pWInfo->wctrlFlags & WHERE_DUPLICATES_OK)==0 ){ int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); if( HasRowid(pTab) ){ - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iCur, -1, regRowid); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, regRowid); jmp1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, regRowid, iSet); VdbeCoverage(v); @@ -2086,7 +2086,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( r = sqlite3GetTempRange(pParse, nPk); for(iPk=0; iPkaiColumn[iPk]; - sqlite3ExprCodeGetColumnOfTable(pParse, pTab, iCur, iCol,r+iPk); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk); } /* Check if the temp table already contains this key. If so, From 491c5bea7ab5cd98361885ce1a5fac2424beae22 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2019 15:58:50 +0000 Subject: [PATCH 058/476] Enhance the ".imposter" command in the CLI so that the first argument can be an existing WITHOUT ROWID table instead of an index. The resulting imposter is the same table, but with columns in storage order and with all constraints removed. FossilOrigin-Name: 9dc0d34586eebf6705d9bd81494c417ac76707b8625d1ff99eda18b4ca2d8a50 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 43 +++++++++++++++++++++++++++++++++---------- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index be0eda8fcc..2cc6986f5f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\san\sinfinite\sloop\sin\sfts3/4\sincremental-merge\sin\sthe\scase\swhere\sthe\slowest\slevel\sin\sthe\sdatabase\scontains\ssegments\sbut\sno\sdata\s(because\sthere\sis\sa\sdelete-marker\sfor\seach\svalid\sentry).\sFix\sfor\s[bf1aab89]. -D 2019-10-17T15:41:36.813 +C Enhance\sthe\s".imposter"\scommand\sin\sthe\sCLI\sso\sthat\sthe\sfirst\sargument\ncan\sbe\san\sexisting\sWITHOUT\sROWID\stable\sinstead\sof\san\sindex.\s\sThe\sresulting\nimposter\sis\sthe\ssame\stable,\sbut\swith\scolumns\sin\sstorage\sorder\sand\swith\nall\sconstraints\sremoved. +D 2019-10-18T15:58:50.284 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -526,7 +526,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 7ef05eeb7f686f84dd1428cbdca280c898915bbf56e1ea97bd42ecc070af78d3 -F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e274 +F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa79 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bba975c7af3de9aeb5c62fb8b05d61b96e4ecd0b030008442bbdd345e1e5f134 -R c0ee123c55e0634eada3c2d56906af99 -U dan -Z 5c41036d47f05063f5938d5d5c2f4f4a +P 35beaee059a6cccead4311886ca928d936f23584cf435e35e265e98feea723dc +R 79321ef818ef0b98008c7f3041b73ac3 +U drh +Z 758d9d25f4ac17fe1f5333a4da39c6af diff --git a/manifest.uuid b/manifest.uuid index 076e023d3b..c818b549f5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35beaee059a6cccead4311886ca928d936f23584cf435e35e265e98feea723dc \ No newline at end of file +9dc0d34586eebf6705d9bd81494c417ac76707b8625d1ff99eda18b4ca2d8a50 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 7f82675e35..f2473ce155 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7758,10 +7758,19 @@ static int do_meta_command(char *zLine, ShellState *p){ char *zCollist = 0; sqlite3_stmt *pStmt; int tnum = 0; + int isWO = 0; /* True if making an imposter of a WITHOUT ROWID table */ + int lenPK = 0; /* Length of the PRIMARY KEY string for isWO tables */ int i; if( !(nArg==3 || (nArg==2 && sqlite3_stricmp(azArg[1],"off")==0)) ){ utf8_printf(stderr, "Usage: .imposter INDEX IMPOSTER\n" " .imposter off\n"); + /* Also allowed, but not documented: + ** + ** .imposter TABLE IMPOSTER + ** + ** where TABLE is a WITHOUT ROWID table. In that case, the + ** imposter is another WITHOUT ROWID table with the columns in + ** storage order. */ rc = 1; goto meta_command_exit; } @@ -7770,19 +7779,22 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 0, 1); goto meta_command_exit; } - zSql = sqlite3_mprintf("SELECT rootpage FROM sqlite_master" - " WHERE name='%q' AND type='index'", azArg[1]); + zSql = sqlite3_mprintf( + "SELECT rootpage, 0 FROM sqlite_master" + " WHERE name='%q' AND type='index'" + "UNION ALL " + "SELECT rootpage, 1 FROM sqlite_master" + " WHERE name='%q' AND type='table'" + " AND sql LIKE '%%without%%rowid%%'", + azArg[1], azArg[1] + ); sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); if( sqlite3_step(pStmt)==SQLITE_ROW ){ tnum = sqlite3_column_int(pStmt, 0); + isWO = sqlite3_column_int(pStmt, 1); } sqlite3_finalize(pStmt); - if( tnum==0 ){ - utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); - rc = 1; - goto meta_command_exit; - } zSql = sqlite3_mprintf("PRAGMA index_xinfo='%q'", azArg[1]); rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); sqlite3_free(zSql); @@ -7799,6 +7811,9 @@ static int do_meta_command(char *zLine, ShellState *p){ zCol = zLabel; } } + if( isWO && lenPK==0 && sqlite3_column_int(pStmt,5)==0 && zCollist ){ + lenPK = (int)strlen(zCollist); + } if( zCollist==0 ){ zCollist = sqlite3_mprintf("\"%w\"", zCol); }else{ @@ -7806,9 +7821,16 @@ static int do_meta_command(char *zLine, ShellState *p){ } } sqlite3_finalize(pStmt); + if( i==0 || tnum==0 ){ + utf8_printf(stderr, "no such index: \"%s\"\n", azArg[1]); + rc = 1; + sqlite3_free(zCollist); + goto meta_command_exit; + } + if( lenPK==0 ) lenPK = 100000; zSql = sqlite3_mprintf( - "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%s))WITHOUT ROWID", - azArg[2], zCollist, zCollist); + "CREATE TABLE \"%w\"(%s,PRIMARY KEY(%.*s))WITHOUT ROWID", + azArg[2], zCollist, lenPK, zCollist); sqlite3_free(zCollist); rc = sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, p->db, "main", 1, tnum); if( rc==SQLITE_OK ){ @@ -7819,7 +7841,8 @@ static int do_meta_command(char *zLine, ShellState *p){ }else{ utf8_printf(stdout, "%s;\n", zSql); raw_printf(stdout, - "WARNING: writing to an imposter table will corrupt the index!\n" + "WARNING: writing to an imposter table will corrupt the \"%s\" %s!\n", + azArg[1], isWO ? "table" : "index" ); } }else{ From 8e10d74b214c1ff1bb542266c256f4a9ee3e9b47 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2019 17:42:47 +0000 Subject: [PATCH 059/476] Get generated columns working for WITHOUT ROWID tables. FossilOrigin-Name: 9f409649ec4282a47f0a8b079b419f1922e0c24779b297f477ced168d5b7910d --- manifest | 18 ++++++------ manifest.uuid | 2 +- src/build.c | 75 +++++++++++++++++++++++++++++++++---------------- src/insert.c | 21 +++++++++++--- src/sqliteInt.h | 4 ++- src/where.c | 2 ++ 6 files changed, 83 insertions(+), 39 deletions(-) diff --git a/manifest b/manifest index 281510f5d9..685e339225 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Claw\sback\ssome\sperformance\sfrom\sthe\ssqlite3ExprGetColumnOfTable()\sroutine. -D 2019-10-18T12:52:08.655 +C Get\sgenerated\scolumns\sworking\sfor\sWITHOUT\sROWID\stables. +D 2019-10-18T17:42:47.815 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 5e5fc50bda07b83d8f602218dae3099c9b7ee7b71d6d59dfa642dc074877ec35 +F src/build.c 1872ee2d0e09df69081ed25402b3e381d20df49981084d441e99e4dfe4d553fd F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 689b21b415d4bfe2a0ea2cf0066974d2a93899fa51af12453664214fa0d534e6 +F src/insert.c 6a9f9899469e3da1c2e50677fe34597c8315c7daa14f1b907872e598f40b7f13 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in d70bcf630c4073eaa994fa74be98886c781918e794cb8b562be8df10f018e27 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 769a3d9f244fe08c219aadc8474d180e3adca2c26cb5b13603adef4910b6ccf1 +F src/sqliteInt.h 9ccea3812a75ad6781fb113a4a5273ad0975ada4ed0e140542cc166b0edc34ca F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -611,7 +611,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 9f3f23efc45934e7b7ea6c0c1042420b73053e7c3264feef6faf9ce6fbd5df61 +F src/where.c b7c662afaad3894b4a1ab60fe048b741705b5b4f6fa6dddbaa2fd7230404a4e8 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 F src/wherecode.c b9bb13fce68edf2eee56154a53adb923df7c0cf410fb319d0b2c4001c58a2c73 F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 447271123e3b467d9271a4c0cf27f47af2f865c9298b8c355d9e766411a1f422 -R e46b1fe53b3eb28b7fe52d4e742c44d4 +P e8426acb94179ff49549aced6ea3c26c49ba4761c2f414fa1772d6a031edc79d +R a1d17655d7716207219f9bae89301b1f U drh -Z 941773dbc3af30d7e5e82c7718d2d1bf +Z 8a3f73b128c9189e66135d5ce5fb6bf2 diff --git a/manifest.uuid b/manifest.uuid index a7110e869a..3afd9384c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e8426acb94179ff49549aced6ea3c26c49ba4761c2f414fa1772d6a031edc79d \ No newline at end of file +9f409649ec4282a47f0a8b079b419f1922e0c24779b297f477ced168d5b7910d \ No newline at end of file diff --git a/src/build.c b/src/build.c index 3441e07779..1972915b7c 100644 --- a/src/build.c +++ b/src/build.c @@ -877,19 +877,11 @@ Index *sqlite3PrimaryKeyIndex(Table *pTab){ } /* -** Return the column of index pIdx that corresponds to table -** column iCol. Return -1 if not found. +** Return the true column number of index pIdx that corresponds to table +** true column iCol. Return -1 if not found. */ i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ int i; -#ifndef SQLITE_OMIT_GENERATED_COLUMNS - Table *pTab = pIdx->pTable; - if( pTab->tabFlags & TF_HasVirtual ){ - for(i=0; i<=iCol; i++){ - if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) iCol++; - } - } -#endif for(i=0; inColumn; i++){ if( iCol==pIdx->aiColumn[i] ) return i; } @@ -897,13 +889,40 @@ i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ } #ifndef SQLITE_OMIT_GENERATED_COLUMNS -/* -** Of the iCol-th column in table pTab, return the index of that column -** as stored on disk. Usually the return value is the same as the iCol -** input, however the return value may be less there are prior VIRTUAL -** columns. +/* Convert a storage column number into a true column number. ** -** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro +** The storage column number (0,1,2,....) is the index of the value +** as it appears in the record on disk. The true column number +** is the index (0,1,2,...) of the column in the CREATE TABLE statement. +** +** The storage column number is less than the true column number if +** and only there are virtual columns to the left. +** +** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. +** +** This function is the inverse of sqlite3ColumnOfTable(). +*/ +i16 sqlite3ColumnOfStorage(Table *pTab, i16 iCol){ + if( pTab->tabFlags & TF_HasVirtual ){ + int i; + for(i=0; i<=iCol; i++){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) iCol++; + } + } + return iCol; +} +#endif + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* Convert a true column number into a storage column number. +** +** The storage column number (0,1,2,....) is the index of the value +** as it appears in the record on disk. The true column number +** is the index (0,1,2,...) of the column in the CREATE TABLE statement. +** +** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. +** +** This function is the inverse of sqlite3ColumnOfStorage(). */ i16 sqlite3ColumnOfTable(Table *pTab, i16 iCol){ int i; @@ -2050,11 +2069,14 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ */ nExtra = 0; for(i=0; inCol; i++){ - if( !hasColumn(pPk->aiColumn, nPk, i) ) nExtra++; + if( !hasColumn(pPk->aiColumn, nPk, i) + && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) nExtra++; } if( resizeIndexObject(db, pPk, nPk+nExtra) ) return; for(i=0, j=nPk; inCol; i++){ - if( !hasColumn(pPk->aiColumn, j, i) ){ + if( !hasColumn(pPk->aiColumn, j, i) + && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 + ){ assert( jnColumn ); pPk->aiColumn[j] = i; pPk->azColl[j] = sqlite3StrBINARY; @@ -2062,7 +2084,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ } } assert( pPk->nColumn==j ); - assert( pTab->nCol<=j ); + assert( pTab->nNVCol<=j ); recomputeColumnsNotIndexed(pPk); } @@ -2172,14 +2194,11 @@ void sqlite3EndTable( } if( (p->tabFlags & TF_HasPrimaryKey)==0 ){ sqlite3ErrorMsg(pParse, "PRIMARY KEY missing on table %s", p->zName); - }else{ - p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; - convertToWithoutRowidTable(pParse, p); + return; } + p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; } - iDb = sqlite3SchemaToIndex(db, p->pSchema); - #ifndef SQLITE_OMIT_CHECK /* Resolve names in all CHECK constraint expressions. */ @@ -2204,6 +2223,14 @@ void sqlite3EndTable( } #endif + /* Special processing for WITHOUT ROWID Tables */ + if( (tabOpts & TF_WithoutRowid)!=0 ){ + convertToWithoutRowidTable(pParse, p); + } + + iDb = sqlite3SchemaToIndex(db, p->pSchema); + + /* Estimate the average row size for the table and for all implied indices */ estimateTableWidth(p); for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ diff --git a/src/insert.c b/src/insert.c index f3bfeb4f60..d2e1efd5db 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1433,6 +1433,7 @@ void sqlite3GenerateConstraintChecks( /* Test all NOT NULL constraints. */ for(i=0; iiPKey ){ continue; /* ROWID is never NULL */ } @@ -1453,14 +1454,26 @@ void sqlite3GenerateConstraintChecks( assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail || onError==OE_Ignore || onError==OE_Replace ); addr1 = 0; + if( (pTab->tabFlags & TF_HasVirtual)==0 ){ + iReg = regNewData+1+i; + }else if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + iReg = ++pParse->nMem; + assert( pParse->iSelfTab==0 ); + pParse->iSelfTab = -regNewData; + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iReg); + pParse->iSelfTab = 0; + if( onError==OE_Replace ) onError = OE_Abort; + }else{ + iReg = sqlite3ColumnOfTable(pTab, i) + regNewData + 1; + } switch( onError ){ case OE_Replace: { assert( onError==OE_Replace ); addr1 = sqlite3VdbeMakeLabel(pParse); - sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1); VdbeCoverage(v); sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1); VdbeCoverage(v); onError = OE_Abort; /* Fall through into the OE_Abort case to generate code that runs @@ -1474,7 +1487,7 @@ void sqlite3GenerateConstraintChecks( char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, pTab->aCol[i].zName); sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, - regNewData+1+i); + iReg); sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); VdbeCoverage(v); @@ -1483,7 +1496,7 @@ void sqlite3GenerateConstraintChecks( } default: { assert( onError==OE_Ignore ); - sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); + sqlite3VdbeAddOp2(v, OP_IsNull, iReg, ignoreDest); VdbeCoverage(v); break; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 2066ff5f82..a1e6e175bb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3954,9 +3954,11 @@ void sqlite3OpenMasterTable(Parse *, int); Index *sqlite3PrimaryKeyIndex(Table*); i16 sqlite3ColumnOfIndex(Index*, i16); #ifdef SQLITE_OMIT_GENERATED_COLUMNS -# define sqlite3ColumnOfTable(T,X) (X) /* No-op pass-through */ +# define sqlite3ColumnOfTable(T,X) (X) /* No-op pass-through */ +# define sqlite3ColumnOfStorage(T,X) (X) /* No-op pass-through */ #else i16 sqlite3ColumnOfTable(Table*, i16); + i16 sqlite3ColumnOfStorage(Table*, i16); #endif void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); #if SQLITE_ENABLE_HIDDEN_COLUMNS diff --git a/src/where.c b/src/where.c index 1a43b8d19e..252e90665c 100644 --- a/src/where.c +++ b/src/where.c @@ -5378,6 +5378,8 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ Index *pPk = sqlite3PrimaryKeyIndex(pTab); x = pPk->aiColumn[x]; assert( x>=0 ); + }else{ + x = sqlite3ColumnOfStorage(pTab,x); } x = sqlite3ColumnOfIndex(pIdx, x); if( x>=0 ){ From f95909c7648942e7157722c33b5e5f9293bf3436 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2019 18:33:25 +0000 Subject: [PATCH 060/476] Fixes for WITHOUT ROWID tables with VIRTUAL columns and an INTEGER PRIMARY KEY. FossilOrigin-Name: 86074da0fd2949e231898ef0bc672d90fd89cefa49fb0eb50ff398fbdd91d1ad --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 17 ++++------------- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index ec1a5b3065..74c780e22f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\strunk\senhancements\sinto\sthe\sgenerated-columns\sbranch. -D 2019-10-18T17:47:47.787 +C Fixes\sfor\sWITHOUT\sROWID\stables\swith\sVIRTUAL\scolumns\sand\san\sINTEGER\sPRIMARY\sKEY. +D 2019-10-18T18:33:25.975 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 1872ee2d0e09df69081ed25402b3e381d20df49981084d441e99e4dfe4d553fd +F src/build.c c38f1b8942572cecf2b9e4abb6984be73ebb6c5c0fdd91c776734d73460fcaf8 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9f409649ec4282a47f0a8b079b419f1922e0c24779b297f477ced168d5b7910d 9dc0d34586eebf6705d9bd81494c417ac76707b8625d1ff99eda18b4ca2d8a50 -R 8ebd80e22c07677946c96a01428911bf +P 85bc4524d76999080faa4474e8880d2b6a2ac3a7f6a76239af4de1a42f8138c8 +R 0af80221f2d400634eaa464ec81f7f65 U drh -Z 73fa86e472de993d3352f53eb78454b7 +Z f141c57ae5a92a7a4189b1c5f348b449 diff --git a/manifest.uuid b/manifest.uuid index 5cd80d372b..d0d7b9d0ae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -85bc4524d76999080faa4474e8880d2b6a2ac3a7f6a76239af4de1a42f8138c8 \ No newline at end of file +86074da0fd2949e231898ef0bc672d90fd89cefa49fb0eb50ff398fbdd91d1ad \ No newline at end of file diff --git a/src/build.c b/src/build.c index 1972915b7c..f00dc32ad0 100644 --- a/src/build.c +++ b/src/build.c @@ -1226,6 +1226,7 @@ void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ pCol->colFlags |= COLFLAG_HASTYPE; } p->nCol++; + p->nNVCol++; pParse->constraintName.n = 0; } @@ -1591,6 +1592,7 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ goto generated_error; } } + if( eType==COLFLAG_VIRTUAL ) pTab->nNVCol--; pCol->colFlags |= eType; assert( TF_HasVirtual==COLFLAG_VIRTUAL ); assert( TF_HasStored==COLFLAG_STORED ); @@ -2156,7 +2158,6 @@ void sqlite3EndTable( assert( !db->mallocFailed ); p = pParse->pNewTable; if( p==0 ) return; - p->nNVCol = p->nCol; if( pSelect==0 && isShadowTableName(db, p->zName) ){ p->tabFlags |= TF_Shadow; @@ -2197,7 +2198,9 @@ void sqlite3EndTable( return; } p->tabFlags |= TF_WithoutRowid | TF_NoVisibleRowid; + convertToWithoutRowidTable(pParse, p); } + iDb = sqlite3SchemaToIndex(db, p->pSchema); #ifndef SQLITE_OMIT_CHECK /* Resolve names in all CHECK constraint expressions. @@ -2212,10 +2215,6 @@ void sqlite3EndTable( for(ii=0; iinCol; ii++){ u32 colFlags = p->aCol[ii].colFlags; if( (colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL))!=0 ){ - if( colFlags & COLFLAG_VIRTUAL ){ - p->nNVCol--; - assert( p->nNVCol>=0 ); - } sqlite3ResolveSelfReference(pParse, p, NC_GenCol, p->aCol[ii].pDflt, 0); } @@ -2223,14 +2222,6 @@ void sqlite3EndTable( } #endif - /* Special processing for WITHOUT ROWID Tables */ - if( (tabOpts & TF_WithoutRowid)!=0 ){ - convertToWithoutRowidTable(pParse, p); - } - - iDb = sqlite3SchemaToIndex(db, p->pSchema); - - /* Estimate the average row size for the table and for all implied indices */ estimateTableWidth(p); for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ From b9bcf7ca600ab8a94018adc2eac4115441a09d89 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Oct 2019 13:29:10 +0000 Subject: [PATCH 061/476] Refactor names of column index transformation functions, for clarity. Get generated columns working with ALTER TABLE RENAME COLUMN. FossilOrigin-Name: 27ab41c9102e7801ff829488fc123a8040da008bef373d6704efbe2f93e1da90 --- manifest | 30 +++++++++++++++--------------- manifest.uuid | 2 +- src/alter.c | 5 +++++ src/analyze.c | 2 +- src/build.c | 38 +++++++++++++++++++++----------------- src/expr.c | 9 +++++---- src/insert.c | 8 ++++---- src/sqliteInt.h | 27 ++++++++++++++++++++------- src/upsert.c | 2 +- src/vdbeapi.c | 4 ++-- src/where.c | 4 ++-- src/wherecode.c | 6 +++--- 12 files changed, 80 insertions(+), 57 deletions(-) diff --git a/manifest b/manifest index 74c780e22f..8ebde088c2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fixes\sfor\sWITHOUT\sROWID\stables\swith\sVIRTUAL\scolumns\sand\san\sINTEGER\sPRIMARY\sKEY. -D 2019-10-18T18:33:25.975 +C Refactor\snames\sof\scolumn\sindex\stransformation\sfunctions,\sfor\sclarity.\nGet\sgenerated\scolumns\sworking\swith\sALTER\sTABLE\sRENAME\sCOLUMN. +D 2019-10-19T13:29:10.933 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -459,8 +459,8 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 8a4317e2b322d4da9489cf2aa1d513a3a6f3e4863552dd5e59d08cdaca73c487 -F src/analyze.c 481d9cf34a3c70631ef5c416be70033e8d4cd85eb5ad1b37286aed8b0e29e889 +F src/alter.c fa7486bfd12be8c8a0d4425767fa42203ca9e946c9613bb37924643c622706bf +F src/analyze.c fd70b9c7a683230a7f7936af64dd25308e93d7c9819a3168493a7c7703481f80 F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c c38f1b8942572cecf2b9e4abb6984be73ebb6c5c0fdd91c776734d73460fcaf8 +F src/build.c fb6464e8ae5364a7a31915432f349d209a1a3fd287edbce651600bf46ccacd34 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c e2c2f78c9f63de2bedabf34f8f25968c6b2317313d1ef15a37c8aa9bd29dcf75 +F src/expr.c 8caa6f07be582979dec421beda6b77033f9b50f97bb1844e189f920a41b781ee F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 1e565be06343e9d24a6c4f82023e5b0ffb0358c41fb4fb28f95fe50c9f9727b4 +F src/insert.c 66662a52c4e205dbaeb318591bf2aaf1b957920003d1911c6a0dce6dfaad1eed F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa7 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 9ccea3812a75ad6781fb113a4a5273ad0975ada4ed0e140542cc166b0edc34ca +F src/sqliteInt.h 7fa9357635e6c32c61d103054a4d4040392d81a798cfe982c09d4ed5568aa724 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -593,14 +593,14 @@ F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572 F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e F src/update.c ca754bbcb5662184bf5face4b67686bed8f53a36cf3def87cbb238deb1086b9b -F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 +F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 9a3f4c2ec6c45e4bd5db465e77e79dfdf5bdc5cf3a8c0bfe9549da209b9c18bc F src/vdbe.h b02904e1bd45c26fdf00c04844b9cfa825763aa5150b6d89ce88b8ab03581d0a F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 -F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e +F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c a669f412027b6820cace9bf42e280c28304fc72bfc3475283ef33a5cce80e2e8 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 @@ -611,9 +611,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c b7c662afaad3894b4a1ab60fe048b741705b5b4f6fa6dddbaa2fd7230404a4e8 +F src/where.c 7b2d928b70ac885fb63c871e97d3502f3e0fbe14ec605ba05675d03f20aa6c5e F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 -F src/wherecode.c b9bb13fce68edf2eee56154a53adb923df7c0cf410fb319d0b2c4001c58a2c73 +F src/wherecode.c d96190c0b536339375846048ad3c41758b4bd6baaf8f8f350da5911d42bc4a61 F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 85bc4524d76999080faa4474e8880d2b6a2ac3a7f6a76239af4de1a42f8138c8 -R 0af80221f2d400634eaa464ec81f7f65 +P 86074da0fd2949e231898ef0bc672d90fd89cefa49fb0eb50ff398fbdd91d1ad +R 72d8383f6985e8f8ce5ac07723f6738a U drh -Z f141c57ae5a92a7a4189b1c5f348b449 +Z 25261f5626aab97bfd8acba5a24fa871 diff --git a/manifest.uuid b/manifest.uuid index d0d7b9d0ae..9b4c67a7fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -86074da0fd2949e231898ef0bc672d90fd89cefa49fb0eb50ff398fbdd91d1ad \ No newline at end of file +27ab41c9102e7801ff829488fc123a8040da008bef373d6704efbe2f93e1da90 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index f8cada0e34..b7389bf9cb 100644 --- a/src/alter.c +++ b/src/alter.c @@ -1334,6 +1334,11 @@ static void renameColumnFunc( sqlite3WalkExprList(&sWalker, pIdx->aColExpr); } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + for(i=0; inCol; i++){ + sqlite3WalkExpr(&sWalker, sParse.pNewTable->aCol[i].pDflt); + } +#endif for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){ for(i=0; inCol; i++){ diff --git a/src/analyze.c b/src/analyze.c index 8f73853c85..6df6e7a6ec 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1182,7 +1182,7 @@ static void analyzeOneTable( int j, k, regKey; regKey = sqlite3GetTempRange(pParse, pPk->nKeyCol); for(j=0; jnKeyCol; j++){ - k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); assert( k>=0 && knColumn ); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); VdbeComment((v, "%s", pTab->aCol[pPk->aiColumn[j]].zName)); diff --git a/src/build.c b/src/build.c index f00dc32ad0..48f3a1c1ea 100644 --- a/src/build.c +++ b/src/build.c @@ -877,10 +877,12 @@ Index *sqlite3PrimaryKeyIndex(Table *pTab){ } /* -** Return the true column number of index pIdx that corresponds to table -** true column iCol. Return -1 if not found. +** Convert an table column number into a index column number. That is, +** for the column iCol in the table (as defined by the CREATE TABLE statement) +** find the (first) offset of that column in index pIdx. Or return -1 +** if column iCol is not used in index pIdx. */ -i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ +i16 sqlite3TableColumnToIndex(Index *pIdx, i16 iCol){ int i; for(i=0; inColumn; i++){ if( iCol==pIdx->aiColumn[i] ) return i; @@ -889,20 +891,20 @@ i16 sqlite3ColumnOfIndex(Index *pIdx, i16 iCol){ } #ifndef SQLITE_OMIT_GENERATED_COLUMNS -/* Convert a storage column number into a true column number. +/* Convert a storage column number into a table column number. ** ** The storage column number (0,1,2,....) is the index of the value ** as it appears in the record on disk. The true column number ** is the index (0,1,2,...) of the column in the CREATE TABLE statement. ** -** The storage column number is less than the true column number if -** and only there are virtual columns to the left. +** The storage column number is less than the table column number if +** and only there are VIRTUAL columns to the left. ** ** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. ** -** This function is the inverse of sqlite3ColumnOfTable(). +** This function is the inverse of sqlite3TableColumnToStorage(). */ -i16 sqlite3ColumnOfStorage(Table *pTab, i16 iCol){ +i16 sqlite3StorageColumnToTable(Table *pTab, i16 iCol){ if( pTab->tabFlags & TF_HasVirtual ){ int i; for(i=0; i<=iCol; i++){ @@ -914,7 +916,7 @@ i16 sqlite3ColumnOfStorage(Table *pTab, i16 iCol){ #endif #ifndef SQLITE_OMIT_GENERATED_COLUMNS -/* Convert a true column number into a storage column number. +/* Convert a table column number into a storage column number. ** ** The storage column number (0,1,2,....) is the index of the value ** as it appears in the record on disk. The true column number @@ -922,9 +924,9 @@ i16 sqlite3ColumnOfStorage(Table *pTab, i16 iCol){ ** ** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. ** -** This function is the inverse of sqlite3ColumnOfStorage(). +** This function is the inverse of sqlite3StorageColumnToTable(). */ -i16 sqlite3ColumnOfTable(Table *pTab, i16 iCol){ +i16 sqlite3TableColumnToStorage(Table *pTab, i16 iCol){ int i; i16 n; assert( iColnCol ); @@ -1577,11 +1579,12 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ u8 eType = COLFLAG_VIRTUAL; Table *pTab = pParse->pNewTable; Column *pCol; - if( IN_RENAME_OBJECT ){ - sqlite3RenameExprUnmap(pParse, pExpr); - } if( pTab==0 ) goto generated_done; pCol = &(pTab->aCol[pTab->nCol-1]); + if( IN_DECLARE_VTAB ){ + sqlite3ErrorMsg(pParse, "virtual tables cannot use computed columns"); + goto generated_done; + } if( pCol->pDflt ) goto generated_error; if( pType ){ if( pType->n==7 && sqlite3StrNICmp("virtual",pType->z,7)==0 ){ @@ -1597,7 +1600,8 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ assert( TF_HasVirtual==COLFLAG_VIRTUAL ); assert( TF_HasStored==COLFLAG_STORED ); pTab->tabFlags |= eType; - pCol->pDflt = sqlite3ExprDup(pParse->db, pExpr, 0); + pCol->pDflt = pExpr; + pExpr = 0; goto generated_done; generated_error: @@ -3651,13 +3655,13 @@ void sqlite3CreateIndex( /* If this index contains every column of its table, then mark ** it as a covering index */ assert( HasRowid(pTab) - || pTab->iPKey<0 || sqlite3ColumnOfIndex(pIndex, pTab->iPKey)>=0 ); + || pTab->iPKey<0 || sqlite3TableColumnToIndex(pIndex, pTab->iPKey)>=0 ); recomputeColumnsNotIndexed(pIndex); if( pTblName!=0 && pIndex->nColumn>=pTab->nCol ){ pIndex->isCovering = 1; for(j=0; jnCol; j++){ if( j==pTab->iPKey ) continue; - if( sqlite3ColumnOfIndex(pIndex,j)>=0 ) continue; + if( sqlite3TableColumnToIndex(pIndex,j)>=0 ) continue; pIndex->isCovering = 0; break; } diff --git a/src/expr.c b/src/expr.c index 41ffe716ea..c57a0000d5 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3410,10 +3410,10 @@ void sqlite3ExprCodeGetColumnOfTable( return; #endif }else if( !HasRowid(pTab) ){ - x = sqlite3ColumnOfIndex(sqlite3PrimaryKeyIndex(pTab), iCol); + x = sqlite3TableColumnToIndex(sqlite3PrimaryKeyIndex(pTab), iCol); op = OP_Column; }else{ - x = sqlite3ColumnOfTable(pTab,iCol); + x = sqlite3TableColumnToStorage(pTab,iCol); op = OP_Column; } sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); @@ -3591,7 +3591,8 @@ expr_code_doover: return -1-pParse->iSelfTab; } pCol = pTab->aCol + pExpr->iColumn; - iSrc = sqlite3ColumnOfTable(pTab, pExpr->iColumn) - pParse->iSelfTab; + iSrc = sqlite3TableColumnToStorage(pTab, pExpr->iColumn) + - pParse->iSelfTab; #ifndef SQLITE_OMIT_GENERATED_COLUMNS if( pCol->colFlags & COLFLAG_GENERATED ){ if( pCol->colFlags & COLFLAG_BUSY ){ @@ -5320,7 +5321,7 @@ struct IdxCover { static int exprIdxCover(Walker *pWalker, Expr *pExpr){ if( pExpr->op==TK_COLUMN && pExpr->iTable==pWalker->u.pIdxCover->iCur - && sqlite3ColumnOfIndex(pWalker->u.pIdxCover->pIdx, pExpr->iColumn)<0 + && sqlite3TableColumnToIndex(pWalker->u.pIdxCover->pIdx, pExpr->iColumn)<0 ){ pWalker->eCode = 1; return WRC_Abort; diff --git a/src/insert.c b/src/insert.c index fe275d5a01..88b8e6ad26 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1055,7 +1055,7 @@ void sqlite3Insert( int k; u32 colFlags; assert( i>=nHidden ); - assert( iRegStore==sqlite3ColumnOfTable(pTab,i)+regRowid+1 ); + assert( iRegStore==sqlite3TableColumnToStorage(pTab,i)+regRowid+1 ); if( i==pTab->iPKey ){ /* The value of the INTEGER PRIMARY KEY column is always a NULL. ** Whenever this column is read, the rowid will be substituted @@ -1464,7 +1464,7 @@ void sqlite3GenerateConstraintChecks( pParse->iSelfTab = 0; if( onError==OE_Replace ) onError = OE_Abort; }else{ - iReg = sqlite3ColumnOfTable(pTab, i) + regNewData + 1; + iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; } switch( onError ){ case OE_Replace: { @@ -1782,7 +1782,7 @@ void sqlite3GenerateConstraintChecks( VdbeComment((v, "%s column %d", pIdx->zName, i)); #endif }else{ - x = sqlite3ColumnOfTable(pTab, iField) + regNewData + 1; + x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1; sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); VdbeComment((v, "%s", pTab->aCol[iField].zName)); } @@ -1873,7 +1873,7 @@ void sqlite3GenerateConstraintChecks( if( pIdx!=pPk ){ for(i=0; inKeyCol; i++){ assert( pPk->aiColumn[i]>=0 ); - x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); + x = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); VdbeComment((v, "%s.%s", pTab->zName, pTab->aCol[pPk->aiColumn[i]].zName)); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a1e6e175bb..10b2eeaf3f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1818,8 +1818,21 @@ struct Module { }; /* -** information about each column of an SQL table is held in an instance -** of this structure. +** Information about each column of an SQL table is held in an instance +** of the Column structure, in the Table.aCol[] array. +** +** Definitions: +** +** "table column index" This is the index of the column in the +** Table.aCol[] array, and also the index of +** the column in the original CREATE TABLE stmt. +** +** "storage column index" This is the index of the column in the +** record BLOB generated by the OP_MakeRecord +** opcode. The storage column index is less than +** or equal to the table column index. It is +** equal if and only if there are no VIRTUAL +** columns to the left. */ struct Column { char *zName; /* Name of this column, \000, then the type */ @@ -3952,13 +3965,13 @@ void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char); Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); void sqlite3OpenMasterTable(Parse *, int); Index *sqlite3PrimaryKeyIndex(Table*); -i16 sqlite3ColumnOfIndex(Index*, i16); +i16 sqlite3TableColumnToIndex(Index*, i16); #ifdef SQLITE_OMIT_GENERATED_COLUMNS -# define sqlite3ColumnOfTable(T,X) (X) /* No-op pass-through */ -# define sqlite3ColumnOfStorage(T,X) (X) /* No-op pass-through */ +# define sqlite3TableColumnToStorage(T,X) (X) /* No-op pass-through */ +# define sqlite3StorageColumnToTable(T,X) (X) /* No-op pass-through */ #else - i16 sqlite3ColumnOfTable(Table*, i16); - i16 sqlite3ColumnOfStorage(Table*, i16); + i16 sqlite3TableColumnToStorage(Table*, i16); + i16 sqlite3StorageColumnToTable(Table*, i16); #endif void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); #if SQLITE_ENABLE_HIDDEN_COLUMNS diff --git a/src/upsert.c b/src/upsert.c index 7beb9ffaec..5db4f5fc90 100644 --- a/src/upsert.c +++ b/src/upsert.c @@ -226,7 +226,7 @@ void sqlite3UpsertDoUpdate( for(i=0; iaiColumn[i]>=0 ); - k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i); VdbeComment((v, "%s.%s", pIdx->zName, pTab->aCol[pPk->aiColumn[i]].zName)); diff --git a/src/vdbeapi.c b/src/vdbeapi.c index c7968ee60d..074d458815 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1831,7 +1831,7 @@ int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ goto preupdate_old_out; } if( p->pPk ){ - iIdx = sqlite3ColumnOfIndex(p->pPk, iIdx); + iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); } if( iIdx>=p->pCsr->nField || iIdx<0 ){ rc = SQLITE_RANGE; @@ -1921,7 +1921,7 @@ int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ goto preupdate_new_out; } if( p->pPk && p->op!=SQLITE_UPDATE ){ - iIdx = sqlite3ColumnOfIndex(p->pPk, iIdx); + iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); } if( iIdx>=p->pCsr->nField || iIdx<0 ){ rc = SQLITE_RANGE; diff --git a/src/where.c b/src/where.c index 252e90665c..ec2d3847b7 100644 --- a/src/where.c +++ b/src/where.c @@ -5379,9 +5379,9 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ x = pPk->aiColumn[x]; assert( x>=0 ); }else{ - x = sqlite3ColumnOfStorage(pTab,x); + x = sqlite3StorageColumnToTable(pTab,x); } - x = sqlite3ColumnOfIndex(pIdx, x); + x = sqlite3TableColumnToIndex(pIdx, x); if( x>=0 ){ pOp->p2 = x; pOp->p1 = pLevel->iIdxCur; diff --git a/src/wherecode.c b/src/wherecode.c index af395a3266..686a8d6f9a 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -823,7 +823,7 @@ static int codeCursorHintCheckExpr(Walker *pWalker, Expr *pExpr){ assert( pHint->pIdx!=0 ); if( pExpr->op==TK_COLUMN && pExpr->iTable==pHint->iTabCur - && sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn)<0 + && sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn)<0 ){ pWalker->eCode = 1; } @@ -891,7 +891,7 @@ static int codeCursorHintFixExpr(Walker *pWalker, Expr *pExpr){ pExpr->iTable = reg; }else if( pHint->pIdx!=0 ){ pExpr->iTable = pHint->iIdxCur; - pExpr->iColumn = sqlite3ColumnOfIndex(pHint->pIdx, pExpr->iColumn); + pExpr->iColumn = sqlite3TableColumnToIndex(pHint->pIdx, pExpr->iColumn); assert( pExpr->iColumn>=0 ); } }else if( pExpr->op==TK_AGG_FUNCTION ){ @@ -1826,7 +1826,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( Index *pPk = sqlite3PrimaryKeyIndex(pIdx->pTable); iRowidReg = sqlite3GetTempRange(pParse, pPk->nKeyCol); for(j=0; jnKeyCol; j++){ - k = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[j]); + k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, iRowidReg+j); } sqlite3VdbeAddOp4Int(v, OP_NotFound, iCur, addrCont, From c5f808d85ef130717aee1bc7e7ffcd934c84ab66 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Oct 2019 15:01:52 +0000 Subject: [PATCH 062/476] Add testcase macros. FossilOrigin-Name: fb9c9bb284d441bd7aa34c87b6fd8ce57d036c17623d82354154fc6286bdd134 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 15 +++++++++------ src/insert.c | 2 ++ src/where.c | 1 + 5 files changed, 21 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 8ebde088c2..729ea94862 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactor\snames\sof\scolumn\sindex\stransformation\sfunctions,\sfor\sclarity.\nGet\sgenerated\scolumns\sworking\swith\sALTER\sTABLE\sRENAME\sCOLUMN. -D 2019-10-19T13:29:10.933 +C Add\stestcase\smacros. +D 2019-10-19T15:01:52.518 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 8caa6f07be582979dec421beda6b77033f9b50f97bb1844e189f920a41b781ee +F src/expr.c 254252a94890f2493a5e214971342bfdf228857483ea7a263ae75048ff67f5b5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 66662a52c4e205dbaeb318591bf2aaf1b957920003d1911c6a0dce6dfaad1eed +F src/insert.c 2f1b93da19a9a65eab197534dcc3fb569708b1a7035da5b229063b7f13e71253 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -611,7 +611,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 7b2d928b70ac885fb63c871e97d3502f3e0fbe14ec605ba05675d03f20aa6c5e +F src/where.c 9ab206102932b7fe0e05f8e9133b5c0a351c0fd6f01e5d65ae4d1cd116aa89e6 F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 F src/wherecode.c d96190c0b536339375846048ad3c41758b4bd6baaf8f8f350da5911d42bc4a61 F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 86074da0fd2949e231898ef0bc672d90fd89cefa49fb0eb50ff398fbdd91d1ad -R 72d8383f6985e8f8ce5ac07723f6738a +P 27ab41c9102e7801ff829488fc123a8040da008bef373d6704efbe2f93e1da90 +R 72df5515bebd9dc031bf51cf11383344 U drh -Z 25261f5626aab97bfd8acba5a24fa871 +Z dca30fedc0b8883c88ac3723c3316cd7 diff --git a/manifest.uuid b/manifest.uuid index 9b4c67a7fe..7c08b6a36c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -27ab41c9102e7801ff829488fc123a8040da008bef373d6704efbe2f93e1da90 \ No newline at end of file +fb9c9bb284d441bd7aa34c87b6fd8ce57d036c17623d82354154fc6286bdd134 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c57a0000d5..01e99428f3 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3410,10 +3410,12 @@ void sqlite3ExprCodeGetColumnOfTable( return; #endif }else if( !HasRowid(pTab) ){ + testcase( iCol!=sqlite3TableColumnToStorage(pTab, iCol) ); x = sqlite3TableColumnToIndex(sqlite3PrimaryKeyIndex(pTab), iCol); op = OP_Column; }else{ x = sqlite3TableColumnToStorage(pTab,iCol); + testcase( x!=iCol ); op = OP_Column; } sqlite3VdbeAddOp3(v, op, iTabCur, x, regOut); @@ -3584,15 +3586,16 @@ expr_code_doover: Column *pCol; Table *pTab = pExpr->y.pTab; int iSrc; + int iCol = pExpr->iColumn; assert( pTab!=0 ); - assert( pExpr->iColumn>=XN_ROWID ); - assert( pExpr->iColumny.pTab->nCol ); - if( pExpr->iColumn<0 ){ + assert( iCol>=XN_ROWID ); + assert( iColy.pTab->nCol ); + if( iCol<0 ){ return -1-pParse->iSelfTab; } - pCol = pTab->aCol + pExpr->iColumn; - iSrc = sqlite3TableColumnToStorage(pTab, pExpr->iColumn) - - pParse->iSelfTab; + pCol = pTab->aCol + iCol; + testcase( iCol!=sqlite3TableColumnToStorage(pTab,iCol) ); + iSrc = sqlite3TableColumnToStorage(pTab, iCol) - pParse->iSelfTab; #ifndef SQLITE_OMIT_GENERATED_COLUMNS if( pCol->colFlags & COLFLAG_GENERATED ){ if( pCol->colFlags & COLFLAG_BUSY ){ diff --git a/src/insert.c b/src/insert.c index 88b8e6ad26..e15e9feed2 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1464,6 +1464,7 @@ void sqlite3GenerateConstraintChecks( pParse->iSelfTab = 0; if( onError==OE_Replace ) onError = OE_Abort; }else{ + testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; } switch( onError ){ @@ -1782,6 +1783,7 @@ void sqlite3GenerateConstraintChecks( VdbeComment((v, "%s column %d", pIdx->zName, i)); #endif }else{ + testcase( sqlite3TableColumnToStorage(pTab, iField)!=iField ); x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1; sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); VdbeComment((v, "%s", pTab->aCol[iField].zName)); diff --git a/src/where.c b/src/where.c index ec2d3847b7..dc2b463f28 100644 --- a/src/where.c +++ b/src/where.c @@ -5379,6 +5379,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ x = pPk->aiColumn[x]; assert( x>=0 ); }else{ + testcase( x!=sqlite3StorageColumnToTable(pTab,x) ); x = sqlite3StorageColumnToTable(pTab,x); } x = sqlite3TableColumnToIndex(pIdx, x); From dd6cc9b52abf6c4ae15a57a9f3d6e3c1e848f589 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Oct 2019 18:47:27 +0000 Subject: [PATCH 063/476] Work toward getting generated columns to work with triggers. Still more work to do in this area. FossilOrigin-Name: 932a37275d7e932f8237d32c8fc6087ed8cd342fe01ef2f7a43c7237ab84c9ac --- manifest | 20 ++++++++-------- manifest.uuid | 2 +- src/build.c | 42 +++++++++++++++++++++++++++------ src/expr.c | 25 ++++++++------------ src/insert.c | 63 ++++++++++++++++++++++++------------------------- src/sqliteInt.h | 2 +- src/update.c | 8 +++---- 7 files changed, 92 insertions(+), 70 deletions(-) diff --git a/manifest b/manifest index 729ea94862..2d2a9b70e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stestcase\smacros. -D 2019-10-19T15:01:52.518 +C Work\stoward\sgetting\sgenerated\scolumns\sto\swork\swith\striggers.\s\sStill\smore\nwork\sto\sdo\sin\sthis\sarea. +D 2019-10-19T18:47:27.679 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c fb6464e8ae5364a7a31915432f349d209a1a3fd287edbce651600bf46ccacd34 +F src/build.c c6421066f1ce6ce789a8346818f7ce00fec47f469004fa6b6d31643d793d2b2d F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 254252a94890f2493a5e214971342bfdf228857483ea7a263ae75048ff67f5b5 +F src/expr.c ffa1cda4277078c0572055f46f83d06dc2e0a89b843e601bef6f9dc8fd430f41 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 2f1b93da19a9a65eab197534dcc3fb569708b1a7035da5b229063b7f13e71253 +F src/insert.c fd8ba5c85b6e96770957f3f23b66fb619adb287dcd53e6f19fb5e8ddaf9b792a F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa7 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 7fa9357635e6c32c61d103054a4d4040392d81a798cfe982c09d4ed5568aa724 +F src/sqliteInt.h 1929d5f85ce9e4aba60540c70f88ef6fcd2bb272ee52b7dfee96126775dd12b9 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,7 +592,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c ca754bbcb5662184bf5face4b67686bed8f53a36cf3def87cbb238deb1086b9b +F src/update.c e5c432097191e6e6c73e48364daa58b257b30a8b0d54b018fd0bd9415cd7b553 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 27ab41c9102e7801ff829488fc123a8040da008bef373d6704efbe2f93e1da90 -R 72df5515bebd9dc031bf51cf11383344 +P fb9c9bb284d441bd7aa34c87b6fd8ce57d036c17623d82354154fc6286bdd134 +R 3288eb40d3c7dad01a2cfbfeeeb4e1e7 U drh -Z dca30fedc0b8883c88ac3723c3316cd7 +Z dcf9ae594cbfb14d7391aa7ed9f45058 diff --git a/manifest.uuid b/manifest.uuid index 7c08b6a36c..2f83dfbcb3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fb9c9bb284d441bd7aa34c87b6fd8ce57d036c17623d82354154fc6286bdd134 \ No newline at end of file +932a37275d7e932f8237d32c8fc6087ed8cd342fe01ef2f7a43c7237ab84c9ac \ No newline at end of file diff --git a/src/build.c b/src/build.c index 48f3a1c1ea..c688a68e0f 100644 --- a/src/build.c +++ b/src/build.c @@ -901,8 +901,6 @@ i16 sqlite3TableColumnToIndex(Index *pIdx, i16 iCol){ ** and only there are VIRTUAL columns to the left. ** ** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. -** -** This function is the inverse of sqlite3TableColumnToStorage(). */ i16 sqlite3StorageColumnToTable(Table *pTab, i16 iCol){ if( pTab->tabFlags & TF_HasVirtual ){ @@ -919,12 +917,36 @@ i16 sqlite3StorageColumnToTable(Table *pTab, i16 iCol){ /* Convert a table column number into a storage column number. ** ** The storage column number (0,1,2,....) is the index of the value -** as it appears in the record on disk. The true column number -** is the index (0,1,2,...) of the column in the CREATE TABLE statement. +** as it appears in the record on disk. Or, if the input column is +** the N-th virtual column (zero-based) then the storage number is +** the number of non-virtual columns in the table plus N. ** -** If SQLITE_OMIT_GENERATED_COLUMNS, this routine is a no-op macro. +** The true column number is the index (0,1,2,...) of the column in +** the CREATE TABLE statement. ** -** This function is the inverse of sqlite3StorageColumnToTable(). +** If the input column is a VIRTUAL column, then it should not appear +** in storage. But the value sometimes is cached in registers that +** follow the range of registers used to construct storage. This +** avoids computing the same VIRTUAL column multiple times, and provides +** values for use by OP_Param opcodes in triggers. Hence, if the +** input column is a VIRTUAL table, put it after all the other columns. +** +** In the following, N means "normal column", S means STORED, and +** V means VIRTUAL. Suppose the CREATE TABLE has columns like this: +** +** CREATE TABLE ex(N,S,V,N,S,V,N,S,V); +** -- 0 1 2 3 4 5 6 7 8 +** +** Then the mapping from this function is as follows: +** +** INPUTS: 0 1 2 3 4 5 6 7 8 +** OUTPUTS: 0 1 6 2 3 7 4 5 8 +** +** So, in other words, this routine shifts all the virtual columns to +** the end. +** +** If SQLITE_OMIT_GENERATED_COLUMNS then there are no virtual columns and +** this routine is a no-op macro. */ i16 sqlite3TableColumnToStorage(Table *pTab, i16 iCol){ int i; @@ -934,7 +956,13 @@ i16 sqlite3TableColumnToStorage(Table *pTab, i16 iCol){ for(i=0, n=0; iaCol[i].colFlags & COLFLAG_VIRTUAL)==0 ) n++; } - return n; + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ + /* iCol is a virtual column itself */ + return pTab->nNVCol + i - n; + }else{ + /* iCol is a normal or stored column */ + return n; + } } #endif diff --git a/src/expr.c b/src/expr.c index 01e99428f3..b868ed969a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3604,16 +3604,11 @@ expr_code_doover: return 0; } pCol->colFlags |= COLFLAG_BUSY; - if( pCol->colFlags & COLFLAG_VIRTUAL ){ - target = sqlite3ExprCodeTarget(pParse, pCol->pDflt, target); - }else{ - target = iSrc; - if( pCol->colFlags & COLFLAG_NOTAVAIL ){ - sqlite3ExprCode(pParse, pCol->pDflt, iSrc); - } + if( pCol->colFlags & COLFLAG_NOTAVAIL ){ + sqlite3ExprCode(pParse, pCol->pDflt, iSrc); } pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); - return target; + return iSrc; }else #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ if( pCol->affinity==SQLITE_AFF_REAL ){ @@ -4088,17 +4083,19 @@ expr_code_doover: ** p1==2 -> old.b p1==5 -> new.b */ Table *pTab = pExpr->y.pTab; - int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + pExpr->iColumn; + int iCol = pExpr->iColumn; + int p1 = pExpr->iTable * (pTab->nCol+1) + 1 + + (iCol>=0 ? sqlite3TableColumnToStorage(pTab, iCol) : -1); assert( pExpr->iTable==0 || pExpr->iTable==1 ); - assert( pExpr->iColumn>=-1 && pExpr->iColumnnCol ); - assert( pTab->iPKey<0 || pExpr->iColumn!=pTab->iPKey ); + assert( iCol>=-1 && iColnCol ); + assert( pTab->iPKey<0 || iCol!=pTab->iPKey ); assert( p1>=0 && p1<(pTab->nCol*2+2) ); sqlite3VdbeAddOp2(v, OP_Param, p1, target); VdbeComment((v, "r[%d]=%s.%s", target, (pExpr->iTable ? "new" : "old"), - (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[pExpr->iColumn].zName) + (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[iCol].zName) )); #ifndef SQLITE_OMIT_FLOATING_POINT @@ -4107,9 +4104,7 @@ expr_code_doover: ** ** EVIDENCE-OF: R-60985-57662 SQLite will convert the value back to ** floating point when extracting it from the record. */ - if( pExpr->iColumn>=0 - && pTab->aCol[pExpr->iColumn].affinity==SQLITE_AFF_REAL - ){ + if( iCol>=0 && pTab->aCol[iCol].affinity==SQLITE_AFF_REAL ){ sqlite3VdbeAddOp1(v, OP_RealAffinity, target); } #endif diff --git a/src/insert.c b/src/insert.c index e15e9feed2..7eba08e955 100644 --- a/src/insert.c +++ b/src/insert.c @@ -205,22 +205,23 @@ static int readsTable(Parse *p, int iDb, Table *pTab){ /* ** All regular columns for table pTab have been puts into registers ** starting with iRegStore. The registers that correspond to STORED -** columns have not been initialized. This routine goes back and computes -** the values for STORED columns based on the previously computed normal -** columns. +** or VIRTUAL columns have not yet been initialized. This routine goes +** back and computes the values for those columns based on the previously +** computed normal columns. */ -void sqlite3ComputeStoredColumns( +void sqlite3ComputeGeneratedColumns( Parse *pParse, /* Parsing context */ int iRegStore, /* Register holding the first column */ Table *pTab /* The table */ ){ int i; - /* Because there can be multiple STORED columns that refer to one another, - ** either directly or through VIRTUAL columns, this is a two pass - ** algorithm. On the first pass, mark all STORED columns as NOT-AVAILABLE. + int nv; + /* Because there can be multiple generated columns that refer to one another, + ** this is a two-pass algorithm. On the first pass, mark all generated + ** columns as "not available". */ for(i=0; inCol; i++){ - if( pTab->aCol[i].colFlags & COLFLAG_STORED ){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ pTab->aCol[i].colFlags |= COLFLAG_NOTAVAIL; } } @@ -230,16 +231,23 @@ void sqlite3ComputeStoredColumns( ** they are needed. */ pParse->iSelfTab = -iRegStore; - for(i=0; inCol; i++, iRegStore++){ + for(i=nv=0; inCol; i++){ u32 colFlags = pTab->aCol[i].colFlags; - if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ - /* Virtual columns are not stored */ - iRegStore--; - }else if( (colFlags & COLFLAG_NOTAVAIL)!=0 ){ - /* Stored columns are handled on the second pass */ - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iRegStore); + if( (colFlags & COLFLAG_NOTAVAIL)!=0 ){ + assert( colFlags & COLFLAG_GENERATED ); + if( colFlags & COLFLAG_VIRTUAL ){ + /* Virtual columns go at the end */ + assert( pTab->nNVCol+nv == sqlite3TableColumnToStorage(pTab,i) ); + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, + iRegStore+pTab->nNVCol+nv); + }else{ + /* Stored columns go in column order */ + assert( i-nv == sqlite3TableColumnToStorage(pTab,i) ); + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iRegStore+i-nv); + } colFlags &= ~COLFLAG_NOTAVAIL; } + if( (colFlags & COLFLAG_VIRTUAL)!=0 ) nv++; } pParse->iSelfTab = 0; } @@ -1055,7 +1063,6 @@ void sqlite3Insert( int k; u32 colFlags; assert( i>=nHidden ); - assert( iRegStore==sqlite3TableColumnToStorage(pTab,i)+regRowid+1 ); if( i==pTab->iPKey ){ /* The value of the INTEGER PRIMARY KEY column is always a NULL. ** Whenever this column is read, the rowid will be substituted @@ -1108,10 +1115,10 @@ void sqlite3Insert( } #ifndef SQLITE_OMIT_GENERATED_COLUMNS - /* Compute the new value for STORED columns after all other + /* Compute the new value for generated columns after all other ** columns have already been computed */ - if( pTab->tabFlags & TF_HasStored ){ - sqlite3ComputeStoredColumns(pParse, regRowid+1, pTab); + if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ + sqlite3ComputeGeneratedColumns(pParse, regRowid+1, pTab); } #endif @@ -1454,19 +1461,11 @@ void sqlite3GenerateConstraintChecks( assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail || onError==OE_Ignore || onError==OE_Replace ); addr1 = 0; - if( (pTab->tabFlags & TF_HasVirtual)==0 ){ - iReg = regNewData+1+i; - }else if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ){ - iReg = ++pParse->nMem; - assert( pParse->iSelfTab==0 ); - pParse->iSelfTab = -regNewData; - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iReg); - pParse->iSelfTab = 0; - if( onError==OE_Replace ) onError = OE_Abort; - }else{ - testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); - iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; - } + testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); + testcase( pTab->aCol[i].colFlags & COLFLAG_GENERATED ); + iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; switch( onError ){ case OE_Replace: { assert( onError==OE_Replace ); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 10b2eeaf3f..00013bd172 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4044,7 +4044,7 @@ void sqlite3FreeIndex(sqlite3*, Index*); #endif void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); #ifndef SQLITE_OMIT_GENERATED_COLUMNS - void sqlite3ComputeStoredColumns(Parse*, int, Table*); + void sqlite3ComputeGeneratedColumns(Parse*, int, Table*); #endif void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); diff --git a/src/update.c b/src/update.c index 08502cf5e3..79b6fbd2a5 100644 --- a/src/update.c +++ b/src/update.c @@ -693,8 +693,8 @@ void sqlite3Update( } } #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( pTab->tabFlags & TF_HasStored ){ - sqlite3ComputeStoredColumns(pParse, regNew, pTab); + if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); } #endif @@ -737,8 +737,8 @@ void sqlite3Update( } } #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( pTab->tabFlags & TF_HasStored ){ - sqlite3ComputeStoredColumns(pParse, regNew, pTab); + if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); } #endif } From 52612bec3c7ff5f3ce61bc7380600a5831bbe1bb Mon Sep 17 00:00:00 2001 From: dan Date: Sun, 20 Oct 2019 08:26:08 +0000 Subject: [PATCH 064/476] Fix a resource leak in fts5 that could occur if an auxiliary function is called from within a query that does not use the full-text index. FossilOrigin-Name: b528bdcd45db1b783ecd9739c3d3c890f04de7003f079668970eafaf8e23b2f3 --- ext/fts5/fts5Int.h | 5 +++++ ext/fts5/fts5_index.c | 12 ++++++------ ext/fts5/fts5_main.c | 1 + ext/fts5/test/fts5matchinfo.test | 26 ++++++++++++++++++++++++++ manifest | 20 ++++++++++---------- manifest.uuid | 2 +- 6 files changed, 49 insertions(+), 17 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 8bc339de3b..e0287d1616 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -422,6 +422,11 @@ int sqlite3Fts5IterNextFrom(Fts5IndexIter*, i64 iMatch); */ void sqlite3Fts5IterClose(Fts5IndexIter*); +/* +** Close the reader blob handle, if it is open. +*/ +void sqlite3Fts5IndexCloseReader(Fts5Index*); + /* ** This interface is used by the fts5vocab module. */ diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 5c1365a51e..816274df49 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -614,7 +614,7 @@ static int fts5LeafFirstTermOff(Fts5Data *pLeaf){ /* ** Close the read-only blob handle, if it is open. */ -static void fts5CloseReader(Fts5Index *p){ +void sqlite3Fts5IndexCloseReader(Fts5Index *p){ if( p->pReader ){ sqlite3_blob *pReader = p->pReader; p->pReader = 0; @@ -643,7 +643,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ assert( p->pReader==0 ); p->pReader = pBlob; if( rc!=SQLITE_OK ){ - fts5CloseReader(p); + sqlite3Fts5IndexCloseReader(p); } if( rc==SQLITE_ABORT ) rc = SQLITE_OK; } @@ -5204,7 +5204,7 @@ int sqlite3Fts5IndexBeginWrite(Fts5Index *p, int bDelete, i64 iRowid){ int sqlite3Fts5IndexSync(Fts5Index *p){ assert( p->rc==SQLITE_OK ); fts5IndexFlush(p); - fts5CloseReader(p); + sqlite3Fts5IndexCloseReader(p); return fts5IndexReturn(p); } @@ -5215,7 +5215,7 @@ int sqlite3Fts5IndexSync(Fts5Index *p){ ** records must be invalidated. */ int sqlite3Fts5IndexRollback(Fts5Index *p){ - fts5CloseReader(p); + sqlite3Fts5IndexCloseReader(p); fts5IndexDiscardData(p); fts5StructureInvalidate(p); /* assert( p->rc==SQLITE_OK ); */ @@ -5456,7 +5456,7 @@ int sqlite3Fts5IndexQuery( if( p->rc ){ sqlite3Fts5IterClose((Fts5IndexIter*)pRet); pRet = 0; - fts5CloseReader(p); + sqlite3Fts5IndexCloseReader(p); } *ppIter = (Fts5IndexIter*)pRet; @@ -5529,7 +5529,7 @@ void sqlite3Fts5IterClose(Fts5IndexIter *pIndexIter){ Fts5Iter *pIter = (Fts5Iter*)pIndexIter; Fts5Index *pIndex = pIter->pIndex; fts5MultiIterFree(pIter); - fts5CloseReader(pIndex); + sqlite3Fts5IndexCloseReader(pIndex); } } diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index fc4ec0c482..a0450a6e4f 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -744,6 +744,7 @@ static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ sqlite3_free(pCsr->zRankArgs); } + sqlite3Fts5IndexCloseReader(pTab->p.pIndex); memset(&pCsr->ePlan, 0, sizeof(Fts5Cursor) - ((u8*)&pCsr->ePlan - (u8*)pCsr)); } diff --git a/ext/fts5/test/fts5matchinfo.test b/ext/fts5/test/fts5matchinfo.test index 4dc04b7897..d8d8d84e79 100644 --- a/ext/fts5/test/fts5matchinfo.test +++ b/ext/fts5/test/fts5matchinfo.test @@ -491,4 +491,30 @@ do_catchsql_test 14.2 { SELECT matchinfo(x1, 'd') FROM x1('a b c'); } {1 {unrecognized matchinfo flag: d}} +#------------------------------------------------------------------------- +# Test using matchinfo() and similar on a non-full-text query +# +do_execsql_test 15.0 { + CREATE VIRTUAL TABLE t1 USING fts5(x, y); + INSERT INTO t1 VALUES('a', 'b'); + INSERT INTO t1 VALUES('c', 'd'); +} + +do_execsql_test 15.1 { + SELECT quote(matchinfo(t1, 'n')) FROM t1 LIMIT 1; +} {X'02000000'} + +do_execsql_test 15.2 { + DELETE FROM t1_content WHERE rowid=1; + SELECT quote(matchinfo(t1, 'n')) FROM t1 LIMIT 1; +} {X'02000000'} + +fts5_aux_test_functions db +do_execsql_test 15.3 { + SELECT fts5_test_all(t1) FROM t1 LIMIT 1; +} { + {columnsize {0 0} columntext {c d} columntotalsize {2 2} poslist {} tokenize {c d} rowcount 2} +} + finish_test + diff --git a/manifest b/manifest index 2cc6986f5f..471284c55b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\s".imposter"\scommand\sin\sthe\sCLI\sso\sthat\sthe\sfirst\sargument\ncan\sbe\san\sexisting\sWITHOUT\sROWID\stable\sinstead\sof\san\sindex.\s\sThe\sresulting\nimposter\sis\sthe\ssame\stable,\sbut\swith\scolumns\sin\sstorage\sorder\sand\swith\nall\sconstraints\sremoved. -D 2019-10-18T15:58:50.284 +C Fix\sa\sresource\sleak\sin\sfts5\sthat\scould\soccur\sif\san\sauxiliary\sfunction\sis\scalled\sfrom\swithin\sa\squery\sthat\sdoes\snot\suse\sthe\sfull-text\sindex. +D 2019-10-20T08:26:08.728 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -110,14 +110,14 @@ F ext/fts3/unicode/mkunicode.tcl bf7fcaa6d68e6d38223467983785d054f1cff4d9e3905dd F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 7c9da96f2b9dcfa4dd94081fb2d87ec418d8cdb35b25df56756c334b6b558fd7 -F ext/fts5/fts5Int.h 3966afab063063ea9fcbf84ac386f3f094c99ade4452e529c0a0d56375d984c1 +F ext/fts5/fts5Int.h d7cbc214ee167496f70905667e18f73ea0402f7ef09236ce305e117e0efc866a F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 F ext/fts5/fts5_config.c aab6117f8f85933e051c66f227414fdcaf7f2313688e16276b895f9d42d28e5c F ext/fts5/fts5_expr.c 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c ce199410b2cd7d625c1da5b684a5c1fbcfe90f7a10bae18e2fbb051b9a2acbe5 -F ext/fts5/fts5_main.c bf637030722badf06667d28f7159e4c209dbafd7aa76c33f387104b78ad147e1 +F ext/fts5/fts5_index.c d1bfebebe873905fe5d450e275b45af2d635b3e276452086f681c6d3d750398d +F ext/fts5/fts5_main.c 1b2d41fd7cc2e8277f60e4156826f41fe5d6b1ccc2e54d70450883ab2ca697d2 F ext/fts5/fts5_storage.c 167e3d8f8052a71032d498e32a2f2ed5ffe489e5d4d47e298adfa02ed55c7882 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -186,7 +186,7 @@ F ext/fts5/test/fts5integrity.test 4317561cd25eca7df16aa1f7d1a700ee958059fa63978 F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad -F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 +F ext/fts5/test/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 F ext/fts5/test/fts5misc.test adfccd3f065df52e306778c815f873ab779b9db34e9817b1d4b819132f914701 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 35beaee059a6cccead4311886ca928d936f23584cf435e35e265e98feea723dc -R 79321ef818ef0b98008c7f3041b73ac3 -U drh -Z 758d9d25f4ac17fe1f5333a4da39c6af +P 9dc0d34586eebf6705d9bd81494c417ac76707b8625d1ff99eda18b4ca2d8a50 +R 1446fe5ff2305d447db9356138aa9638 +U dan +Z 8eec37beaa1889d440099062804581d3 diff --git a/manifest.uuid b/manifest.uuid index c818b549f5..27d8107492 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9dc0d34586eebf6705d9bd81494c417ac76707b8625d1ff99eda18b4ca2d8a50 \ No newline at end of file +b528bdcd45db1b783ecd9739c3d3c890f04de7003f079668970eafaf8e23b2f3 \ No newline at end of file From f5f1915d599b1a0aba8fab35178c90031fdb362d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Oct 2019 01:04:11 +0000 Subject: [PATCH 065/476] Changes to the INSERT logic to make it simpler and faster and so that it works with generated columns and BEFORE triggers. FossilOrigin-Name: bc368cb090376d33d3844e3689c4f6bd19eed758e39b878ee67fef93b1c839ea --- manifest | 18 ++--- manifest.uuid | 2 +- src/build.c | 4 +- src/expr.c | 36 +-------- src/insert.c | 196 +++++++++++++++++++++++++++--------------------- src/sqliteInt.h | 1 - 6 files changed, 125 insertions(+), 132 deletions(-) diff --git a/manifest b/manifest index 2d2a9b70e5..b164bf9dd0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Work\stoward\sgetting\sgenerated\scolumns\sto\swork\swith\striggers.\s\sStill\smore\nwork\sto\sdo\sin\sthis\sarea. -D 2019-10-19T18:47:27.679 +C Changes\sto\sthe\sINSERT\slogic\sto\smake\sit\ssimpler\sand\sfaster\sand\sso\sthat\nit\sworks\swith\sgenerated\scolumns\sand\sBEFORE\striggers. +D 2019-10-21T01:04:11.302 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c c6421066f1ce6ce789a8346818f7ce00fec47f469004fa6b6d31643d793d2b2d +F src/build.c b5eefc5b29788ff43062aa15f08e17df843fcc3dedbf6ad2e8a5ecfdd71c83a8 F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c ffa1cda4277078c0572055f46f83d06dc2e0a89b843e601bef6f9dc8fd430f41 +F src/expr.c e00d483f68fcaa2bfb334ba21550f949ca92b239f86ca22824577988efc53010 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c fd8ba5c85b6e96770957f3f23b66fb619adb287dcd53e6f19fb5e8ddaf9b792a +F src/insert.c db411a28a6c5bf159c0ea9f9b7dde1b41b4be6f393a77b574e8086dd4bea0153 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa7 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 1929d5f85ce9e4aba60540c70f88ef6fcd2bb272ee52b7dfee96126775dd12b9 +F src/sqliteInt.h 49ade8ae4322263c4bfb46ededd566f6351a82380294bb11efb91d2ae100ca24 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fb9c9bb284d441bd7aa34c87b6fd8ce57d036c17623d82354154fc6286bdd134 -R 3288eb40d3c7dad01a2cfbfeeeb4e1e7 +P 932a37275d7e932f8237d32c8fc6087ed8cd342fe01ef2f7a43c7237ab84c9ac +R 47a4a5169a9bdb2c3c1d9653909f73fd U drh -Z dcf9ae594cbfb14d7391aa7ed9f45058 +Z f477eaf49473bce8390a1ef42b7a8a95 diff --git a/manifest.uuid b/manifest.uuid index 2f83dfbcb3..1071898fde 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -932a37275d7e932f8237d32c8fc6087ed8cd342fe01ef2f7a43c7237ab84c9ac \ No newline at end of file +bc368cb090376d33d3844e3689c4f6bd19eed758e39b878ee67fef93b1c839ea \ No newline at end of file diff --git a/src/build.c b/src/build.c index c688a68e0f..4501d41d46 100644 --- a/src/build.c +++ b/src/build.c @@ -2329,7 +2329,7 @@ void sqlite3EndTable( pSelTab = sqlite3ResultSetOfSelect(pParse, pSelect, SQLITE_AFF_BLOB); if( pSelTab==0 ) return; assert( p->aCol==0 ); - p->nCol = pSelTab->nCol; + p->nCol = p->nNVCol = pSelTab->nCol; p->aCol = pSelTab->aCol; pSelTab->nCol = 0; pSelTab->aCol = 0; @@ -2617,7 +2617,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ ** the column names from the SELECT statement that defines the view. */ assert( pTable->aCol==0 ); - pTable->nCol = pSelTab->nCol; + pTable->nCol = pTable->nNVCol = pSelTab->nCol; pTable->aCol = pSelTab->aCol; pSelTab->nCol = 0; pSelTab->aCol = 0; diff --git a/src/expr.c b/src/expr.c index b868ed969a..1c562fdf5e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4337,14 +4337,10 @@ void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ int inReg; assert( target>0 && target<=pParse->nMem ); - if( pExpr && pExpr->op==TK_REGISTER ){ - sqlite3VdbeAddOp2(pParse->pVdbe, OP_Copy, pExpr->iTable, target); - }else{ - inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); - assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); - if( inReg!=target && pParse->pVdbe ){ - sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); - } + inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); + assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); + if( inReg!=target && pParse->pVdbe ){ + sqlite3VdbeAddOp2(pParse->pVdbe, OP_SCopy, inReg, target); } } @@ -4374,30 +4370,6 @@ void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){ } } -/* -** Generate code that evaluates the given expression and puts the result -** in register target. -** -** Also make a copy of the expression results into another "cache" register -** and modify the expression so that the next time it is evaluated, -** the result is a copy of the cache register. -** -** This routine is used for expressions that are used multiple -** times. They are evaluated once and the results of the expression -** are reused. -*/ -void sqlite3ExprCodeAndCache(Parse *pParse, Expr *pExpr, int target){ - Vdbe *v = pParse->pVdbe; - int iMem; - - assert( target>0 ); - assert( pExpr->op!=TK_REGISTER ); - sqlite3ExprCode(pParse, pExpr, target); - iMem = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_Copy, target, iMem); - exprToRegister(pExpr, iMem); -} - /* ** Generate code that pushes the value of every element of the given ** expression list into a sequence of registers beginning at target. diff --git a/src/insert.c b/src/insert.c index 7eba08e955..8640a77b66 100644 --- a/src/insert.c +++ b/src/insert.c @@ -561,7 +561,7 @@ void sqlite3Insert( Parse *pParse, /* Parser context */ SrcList *pTabList, /* Name of table into which we are inserting */ Select *pSelect, /* A SELECT statement to use as the data source */ - IdList *pColumn, /* Column names corresponding to IDLIST. */ + IdList *pColumn, /* Column names corresponding to IDLIST, or NULL. */ int onError, /* How to handle constraint errors */ Upsert *pUpsert /* ON CONFLICT clauses for upsert, or NULL */ ){ @@ -694,8 +694,8 @@ void sqlite3Insert( */ regAutoinc = autoIncBegin(pParse, iDb, pTab); - /* Allocate registers for holding the rowid of the new row, - ** the content of the new row, and the assembled row record. + /* Allocate a block registers to hold the rowid and the values + ** for all columns of the new row. */ regRowid = regIns = pParse->nMem+1; pParse->nMem += pTab->nCol + 1; @@ -714,7 +714,15 @@ void sqlite3Insert( ** the index into IDLIST of the primary key column. ipkColumn is ** the index of the primary key as it appears in IDLIST, not as ** is appears in the original table. (The index of the INTEGER - ** PRIMARY KEY in the original table is pTab->iPKey.) + ** PRIMARY KEY in the original table is pTab->iPKey.) After this + ** loop, if ipkColumn==(-1), that means that integer primary key + ** is unspecified, and hence the table is either WITHOUT ROWID or + ** it will automatically generated an integer primary key. + ** + ** bIdListInOrder is true if the columns in IDLIST are in storage + ** order. This enables an optimization that avoids shuffling the + ** columns into storage order. False negatives are harmless, + ** but false positives will cause database corruption. */ bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0; if( pColumn ){ @@ -937,8 +945,88 @@ void sqlite3Insert( */ addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); + if( ipkColumn>=0 ){ + /* tag-20191021-001: If the INTEGER PRIMARY KEY is being generated by the + ** SELECT, go ahead and copy the value into the rowid slot now, so that + ** the value does not get overwritten by a NULL at tag-20191021-002. */ + sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); + } } + /* Compute data for ordinary columns of the new entry. Values + ** are written in storage order into registers starting with regData. + ** Only ordinary columns are computed in this loop. The rowid + ** (if there is one) is computed later and generated columns are + ** computed after the rowid since they might depend on the value + ** of the rowid. + */ + nHidden = 0; + iRegStore = regData; assert( regData==regRowid+1 ); + for(i=0; inCol; i++, iRegStore++){ + int k; + u32 colFlags; + assert( i>=nHidden ); + if( i==pTab->iPKey ){ + /* tag-20191021-002: References to the INTEGER PRIMARY KEY are filled + ** using the rowid. So put a NULL in the IPK slot of the record to avoid + ** using excess space. The file format definition requires this extra + ** NULL - we cannot optimize further by skipping the column completely */ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + continue; + } + if( ((colFlags = pTab->aCol[i].colFlags) & COLFLAG_NOINSERT)!=0 ){ + nHidden++; + if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ + /* Virtual columns do not participate in OP_MakeRecord. So back up + ** iRegStore by one slot to compensate for the iRegStore++ in the + ** outer for() loop */ + iRegStore--; + continue; + }else if( (colFlags & COLFLAG_STORED)!=0 ){ + /* Stored columns are computed later. But if there are BEFORE + ** triggers, the slots used for stored columns will be OP_Copy-ed + ** to a second block of registers, so the register needs to be + ** initialized to NULL to avoid an uninitialized register read */ + if( tmask & TRIGGER_BEFORE ){ + sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); + } + continue; + }else if( pColumn==0 ){ + /* Hidden columns that are not explicitly named in the INSERT + ** get there default value */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + } + } + if( pColumn ){ + for(j=0; jnId && pColumn->a[j].idx!=i; j++){} + if( j>=pColumn->nId ){ + /* A column not named in the insert column list gets its + ** default value */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + } + k = j; + }else if( nColumn==0 ){ + /* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */ + sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + continue; + }else{ + k = i - nHidden; + } + + if( useTempTable ){ + sqlite3VdbeAddOp3(v, OP_Column, srcTab, k, iRegStore); + }else if( pSelect ){ + if( regFromSelect!=regData ){ + sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore); + } + }else{ + sqlite3ExprCode(pParse, pList->a[k].pExpr, iRegStore); + } + } + + /* Run the BEFORE and INSTEAD OF triggers, if there are any */ endOfLoop = sqlite3VdbeMakeLabel(pParse); @@ -973,25 +1061,19 @@ void sqlite3Insert( */ assert( !IsVirtual(pTab) ); - /* Create the new column data - */ - for(i=j=0; inCol; i++){ - if( pColumn ){ - for(j=0; jnId; j++){ - if( pColumn->a[j].idx==i ) break; - } - } - if( (!useTempTable && !pList) || (pColumn && j>=pColumn->nId) - || (pColumn==0 && IsOrdinaryHiddenColumn(&pTab->aCol[i])) ){ - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regCols+i+1); - }else if( useTempTable ){ - sqlite3VdbeAddOp3(v, OP_Column, srcTab, j, regCols+i+1); - }else{ - assert( pSelect==0 ); /* Otherwise useTempTable is true */ - sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr, regCols+i+1); - } - if( pColumn==0 && !IsOrdinaryHiddenColumn(&pTab->aCol[i]) ) j++; + /* Copy the new data already generated. */ + assert( pTab->nNVCol>0 ); + sqlite3VdbeAddOp3(v, OP_Copy, regRowid+1, regCols+1, pTab->nNVCol-1); + +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Compute the new value for generated columns after all other + ** columns have already been computed. This must be done after + ** computing the ROWID in case one of the generated columns + ** refers to the ROWID. */ + if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ + sqlite3ComputeGeneratedColumns(pParse, regCols+1, pTab); } +#endif /* If this is an INSERT on a view with an INSTEAD OF INSERT trigger, ** do not attempt any conversions before assembling the record. @@ -1009,19 +1091,17 @@ void sqlite3Insert( sqlite3ReleaseTempRange(pParse, regCols, pTab->nCol+1); } - /* Compute the content of the next row to insert into a range of - ** registers beginning at regIns. - */ if( !isView ){ if( IsVirtual(pTab) ){ /* The row that the VUpdate opcode will delete: none */ sqlite3VdbeAddOp2(v, OP_Null, 0, regIns); } if( ipkColumn>=0 ){ + /* Compute the new rowid */ if( useTempTable ){ sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regRowid); }else if( pSelect ){ - sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); + /* Rowid already initialized at tag-20191021-001 */ }else{ Expr *pIpk = pList->a[ipkColumn].pExpr; if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ @@ -1054,69 +1134,11 @@ void sqlite3Insert( } autoIncStep(pParse, regAutoinc, regRowid); - /* Compute data for all columns of the new entry, beginning - ** with the first column. - */ - nHidden = 0; - iRegStore = regRowid+1; - for(i=0; inCol; i++, iRegStore++){ - int k; - u32 colFlags; - assert( i>=nHidden ); - if( i==pTab->iPKey ){ - /* The value of the INTEGER PRIMARY KEY column is always a NULL. - ** Whenever this column is read, the rowid will be substituted - ** in its place. Hence, fill this column with a NULL to avoid - ** taking up data space with information that will never be used. - ** As there may be shallow copies of this value, make it a soft-NULL */ - sqlite3VdbeAddOp1(v, OP_SoftNull, iRegStore); - continue; - } - if( ((colFlags = pTab->aCol[i].colFlags) & COLFLAG_NOINSERT)!=0 ){ - nHidden++; - if( (colFlags & COLFLAG_VIRTUAL)!=0 ){ - /* Virtual columns are no stored */ - iRegStore--; - continue; - }else if( (colFlags & COLFLAG_STORED)!=0 ){ - /* Stored columns are handled on the second pass */ - continue; - }else if( pColumn==0 ){ - /* Hidden columns that are not explicitly named in the INSERT */ - sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); - continue; - } - } - if( pColumn ){ - for(j=0; jnId && pColumn->a[j].idx!=i; j++){} - if( j>=pColumn->nId ){ - /* A column not named in the insert column list gets its - ** default value */ - sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); - continue; - } - k = j; - }else if( nColumn==0 ){ - sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); - continue; - }else{ - k = i - nHidden; - } - - if( useTempTable ){ - sqlite3VdbeAddOp3(v, OP_Column, srcTab, k, iRegStore); - }else if( pSelect ){ - if( regFromSelect!=regData ){ - sqlite3VdbeAddOp2(v, OP_SCopy, regFromSelect+k, iRegStore); - } - }else{ - sqlite3ExprCode(pParse, pList->a[k].pExpr, iRegStore); - } - } - #ifndef SQLITE_OMIT_GENERATED_COLUMNS /* Compute the new value for generated columns after all other - ** columns have already been computed */ + ** columns have already been computed. This must be done after + ** computing the ROWID in case one of the generated columns + ** refers to the ROWID. */ if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ sqlite3ComputeGeneratedColumns(pParse, regRowid+1, pTab); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 00013bd172..e586674f91 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4100,7 +4100,6 @@ void sqlite3ExprCodeFactorable(Parse*, Expr*, int); int sqlite3ExprCodeAtInit(Parse*, Expr*, int); int sqlite3ExprCodeTemp(Parse*, Expr*, int*); int sqlite3ExprCodeTarget(Parse*, Expr*, int); -void sqlite3ExprCodeAndCache(Parse*, Expr*, int); 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 */ From 276d7f78470002e09ede5bd96556cddbc23cd678 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Oct 2019 16:15:57 +0000 Subject: [PATCH 066/476] Try to fix a harmless compiler warning reported by ICC. FossilOrigin-Name: 7f41b44ca2ecb907ea0fd09a974ac9dbdf911463a94f0f77c826cf1b1d9c3e8c --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/lempar.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 471284c55b..3b1a218271 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sresource\sleak\sin\sfts5\sthat\scould\soccur\sif\san\sauxiliary\sfunction\sis\scalled\sfrom\swithin\sa\squery\sthat\sdoes\snot\suse\sthe\sfull-text\sindex. -D 2019-10-20T08:26:08.728 +C Try\sto\sfix\sa\sharmless\scompiler\swarning\sreported\sby\sICC. +D 2019-10-21T16:15:57.553 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1767,7 +1767,7 @@ F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f F tool/lemon.c 61d5f0af1eff8f754b75ddca668c9897fd30759e389bfffb42ce9e4d38fd4746 -F tool/lempar.c eb2841e2a7fd484cf44b1f526b06e7ab0f216d2f41818bf9485e8f38e3d1db19 +F tool/lempar.c 34b136b281ae022277738d8b51061237fb330deaa317010d89375117e3a028aa F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9dc0d34586eebf6705d9bd81494c417ac76707b8625d1ff99eda18b4ca2d8a50 -R 1446fe5ff2305d447db9356138aa9638 -U dan -Z 8eec37beaa1889d440099062804581d3 +P b528bdcd45db1b783ecd9739c3d3c890f04de7003f079668970eafaf8e23b2f3 +R 6092914249b2bab0f110a245cdadcc45 +U drh +Z 6dcf0ab02e4e7edf064ddf88070a5fda diff --git a/manifest.uuid b/manifest.uuid index 27d8107492..4bfc390634 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b528bdcd45db1b783ecd9739c3d3c890f04de7003f079668970eafaf8e23b2f3 \ No newline at end of file +7f41b44ca2ecb907ea0fd09a974ac9dbdf911463a94f0f77c826cf1b1d9c3e8c \ No newline at end of file diff --git a/tool/lempar.c b/tool/lempar.c index f75ad51c39..f8e0885e35 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -1068,6 +1068,6 @@ int ParseFallback(int iToken){ return yyFallback[iToken]; #else (void)iToken; -#endif return 0; +#endif } From 2c3de90da1a6dcb5291b2fdb6d889a51743d21c6 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Oct 2019 23:41:56 +0000 Subject: [PATCH 067/476] Add a VdbeCoverage() macro that was omitted from check-in [eea1e7aa57e74c43]. FossilOrigin-Name: cd2317d04c1c4bcf5fe63aa02a6051bdfae8f5566a098e3f45bf9ec1dd0c3ea6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 3b1a218271..b9d4b33a08 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Try\sto\sfix\sa\sharmless\scompiler\swarning\sreported\sby\sICC. -D 2019-10-21T16:15:57.553 +C Add\sa\sVdbeCoverage()\smacro\sthat\swas\somitted\sfrom\scheck-in\s[eea1e7aa57e74c43]. +D 2019-10-21T23:41:56.569 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c d9cb78faa39180915ed940f0dcb3b168002f72e4f4926081a9553719fd12f6a1 +F src/insert.c 69e47d76598d26f87cc9b32b9e9fc84e49e3b9371b5d9ae8465f38486ad9665e F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b528bdcd45db1b783ecd9739c3d3c890f04de7003f079668970eafaf8e23b2f3 -R 6092914249b2bab0f110a245cdadcc45 +P 7f41b44ca2ecb907ea0fd09a974ac9dbdf911463a94f0f77c826cf1b1d9c3e8c +R 68b8eca796fc459e763498795f66f3ad U drh -Z 6dcf0ab02e4e7edf064ddf88070a5fda +Z cb9fad97a2f046f52d8adf2a38eb83cb diff --git a/manifest.uuid b/manifest.uuid index 4bfc390634..3fab508907 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7f41b44ca2ecb907ea0fd09a974ac9dbdf911463a94f0f77c826cf1b1d9c3e8c \ No newline at end of file +cd2317d04c1c4bcf5fe63aa02a6051bdfae8f5566a098e3f45bf9ec1dd0c3ea6 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 690845a7da..3bb1ee706a 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1583,6 +1583,7 @@ void sqlite3GenerateConstraintChecks( sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regNewData, 1, 0, OE_Replace, 1, -1); sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); + VdbeCoverage(v); sqlite3RowidConstraint(pParse, OE_Abort, pTab); }else{ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK From 898c527eafd8bf263a3c3626ff421804558132f9 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Oct 2019 00:03:41 +0000 Subject: [PATCH 068/476] When flipping ("commuting") a comparison operator, set the new EP_Commuted bit rather than adding extra EP_Collate bits, to single later processing that the order of precedence for COLLATE operators is inverted. Fix for ticket [b47e3627ecaadbde] FossilOrigin-Name: 90f7c477354d67d22d5eb0da22dac579f384ab44743fdc19887220e32203ebc2 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/expr.c | 38 +++++++++++++++++++++++++++++++------- src/select.c | 4 ++-- src/sqliteInt.h | 3 ++- src/where.c | 10 ++++------ src/whereInt.h | 1 - src/whereexpr.c | 38 +++++--------------------------------- 8 files changed, 56 insertions(+), 62 deletions(-) diff --git a/manifest b/manifest index b9d4b33a08..b06aa5e02f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sVdbeCoverage()\smacro\sthat\swas\somitted\sfrom\scheck-in\s[eea1e7aa57e74c43]. -D 2019-10-21T23:41:56.569 +C When\sflipping\s("commuting")\sa\scomparison\soperator,\sset\sthe\snew\sEP_Commuted\nbit\srather\sthan\sadding\sextra\sEP_Collate\sbits,\sto\ssingle\slater\sprocessing\sthat\nthe\sorder\sof\sprecedence\sfor\sCOLLATE\soperators\sis\sinverted.\nFix\sfor\sticket\s[b47e3627ecaadbde] +D 2019-10-22T00:03:41.431 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 4c2a0d00a0d7701811a463b9af2c63d10b0c5ee7b8bde249309184f82d27b5b0 +F src/expr.c da4b31b0dfba1bf7891d996e91eff371b4eb5672341beb0c54299f56bc745cbc F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -525,12 +525,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 7ef05eeb7f686f84dd1428cbdca280c898915bbf56e1ea97bd42ecc070af78d3 +F src/select.c 9c81d168b5a7ddc2277a6f6d3daec9ddd0ff5cebf12628d7e342f3c337231e7e F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa79 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 40f81bb57b0723403d5da77314d459f536ddd0f07d57434a94df35e790b6b268 +F src/sqliteInt.h 5e98328254a8932a912cd12960cc7a4f22078a56bc9c617ffe042ad554c0db68 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -611,10 +611,10 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 9f3f23efc45934e7b7ea6c0c1042420b73053e7c3264feef6faf9ce6fbd5df61 -F src/whereInt.h 2c6bae136a7c0be6ff75dc36950d1968c67d005c8e51d7a9d77cb996bb4843d9 +F src/where.c 148fa1ce9d6421a2c325291cae7681b3492cf1f219ff58f9ef38695a7f3c61ff +F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 57d034a0dbca9f86e1a691f74e469ed09ff49d04712b838fb68596b76a9af7d2 -F src/whereexpr.c 05c283d26aa9c3f5d1bf13a5f6a573b43295b9db280eff18e26f97d7d7f119b4 +F src/whereexpr.c ab3c687a33aa3ca75744a74e82c0eab703a88627131cf72707f5346f04cb8539 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7f41b44ca2ecb907ea0fd09a974ac9dbdf911463a94f0f77c826cf1b1d9c3e8c -R 68b8eca796fc459e763498795f66f3ad +P cd2317d04c1c4bcf5fe63aa02a6051bdfae8f5566a098e3f45bf9ec1dd0c3ea6 +R 3a3c136ff4c96296b02b1f2633ff663b U drh -Z cb9fad97a2f046f52d8adf2a38eb83cb +Z 20a6808e6237368aa12eb5e4f5b30bb2 diff --git a/manifest.uuid b/manifest.uuid index 3fab508907..c3d5218682 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cd2317d04c1c4bcf5fe63aa02a6051bdfae8f5566a098e3f45bf9ec1dd0c3ea6 \ No newline at end of file +90f7c477354d67d22d5eb0da22dac579f384ab44743fdc19887220e32203ebc2 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 0e827482b2..7e80796f4b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -339,6 +339,22 @@ CollSeq *sqlite3BinaryCompareCollSeq( return pColl; } +/* Expresssion p is a comparison operator. Return a collation sequence +** appropriate for the comparison operator. +** +** This is normally just a wrapper around sqlite3BinaryCompareCollSeq(). +** However, if the OP_Commuted flag is set, then the order of the operands +** is reversed in the sqlite3BinaryCompareCollSeq() call so that the +** correct collating sequence is found. +*/ +CollSeq *sqlite3ExprCompareCollSeq(Parse *pParse, Expr *p){ + if( ExprHasProperty(p, EP_Commuted) ){ + return sqlite3BinaryCompareCollSeq(pParse, p->pRight, p->pLeft); + }else{ + return sqlite3BinaryCompareCollSeq(pParse, p->pLeft, p->pRight); + } +} + /* ** Generate code for a comparison operator. */ @@ -349,13 +365,18 @@ static int codeCompare( int opcode, /* The comparison opcode */ int in1, int in2, /* Register holding operands */ int dest, /* Jump here if true. */ - int jumpIfNull /* If true, jump if either operand is NULL */ + int jumpIfNull, /* If true, jump if either operand is NULL */ + int isCommuted /* The comparison has been commuted */ ){ int p5; int addr; CollSeq *p4; - p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); + if( isCommuted ){ + p4 = sqlite3BinaryCompareCollSeq(pParse, pRight, pLeft); + }else{ + p4 = sqlite3BinaryCompareCollSeq(pParse, pLeft, pRight); + } p5 = binaryCompareP5(pLeft, pRight, jumpIfNull); addr = sqlite3VdbeAddOp4(pParse->pVdbe, opcode, in2, dest, in1, (void*)p4, P4_COLLSEQ); @@ -566,6 +587,7 @@ static void codeVectorCompare( int regRight = 0; u8 opx = op; int addrDone = sqlite3VdbeMakeLabel(pParse); + int isCommuted = ExprHasProperty(pExpr,EP_Commuted); if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); @@ -595,7 +617,7 @@ static void codeVectorCompare( assert( i>=0 && ipRight, ®Free2); codeCompare(pParse, pLeft, pExpr->pRight, op, - r1, r2, inReg, SQLITE_STOREP2 | p5); + r1, r2, inReg, SQLITE_STOREP2 | p5, + ExprHasProperty(pExpr,EP_Commuted)); assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); @@ -4585,7 +4608,7 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, - r1, r2, dest, jumpIfNull); + r1, r2, dest, jumpIfNull, ExprHasProperty(pExpr,EP_Commuted)); assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); @@ -4760,7 +4783,7 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ r1 = sqlite3ExprCodeTemp(pParse, pExpr->pLeft, ®Free1); r2 = sqlite3ExprCodeTemp(pParse, pExpr->pRight, ®Free2); codeCompare(pParse, pExpr->pLeft, pExpr->pRight, op, - r1, r2, dest, jumpIfNull); + r1, r2, dest, jumpIfNull,ExprHasProperty(pExpr,EP_Commuted)); assert(TK_LT==OP_Lt); testcase(op==OP_Lt); VdbeCoverageIf(v,op==OP_Lt); assert(TK_LE==OP_Le); testcase(op==OP_Le); VdbeCoverageIf(v,op==OP_Le); assert(TK_GT==OP_Gt); testcase(op==OP_Gt); VdbeCoverageIf(v,op==OP_Gt); @@ -4946,7 +4969,8 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ return 2; } } - if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; + if( (pA->flags & (EP_Distinct|EP_Commuted)) + != (pB->flags & (EP_Distinct|EP_Commuted)) ) return 2; if( (combinedFlags & EP_TokenOnly)==0 ){ if( combinedFlags & EP_xIsSelect ) return 2; if( (combinedFlags & EP_FixedCol)==0 diff --git a/src/select.c b/src/select.c index a5377a2c20..abb381a16a 100644 --- a/src/select.c +++ b/src/select.c @@ -4170,14 +4170,14 @@ static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ if( pRight->op==TK_COLUMN && !ExprHasProperty(pRight, EP_FixedCol) && sqlite3ExprIsConstant(pLeft) - && sqlite3IsBinary(sqlite3BinaryCompareCollSeq(pConst->pParse,pLeft,pRight)) + && sqlite3IsBinary(sqlite3ExprCompareCollSeq(pConst->pParse,pExpr)) ){ constInsert(pConst, pRight, pLeft); }else if( pLeft->op==TK_COLUMN && !ExprHasProperty(pLeft, EP_FixedCol) && sqlite3ExprIsConstant(pRight) - && sqlite3IsBinary(sqlite3BinaryCompareCollSeq(pConst->pParse,pLeft,pRight)) + && sqlite3IsBinary(sqlite3ExprCompareCollSeq(pConst->pParse,pExpr)) ){ constInsert(pConst, pLeft, pRight); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 44a82223e6..c41978acb3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2527,7 +2527,7 @@ struct Expr { #define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ #define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ #define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ - /* 0x000200 Available for reuse */ +#define EP_Commuted 0x000200 /* Comparison operator has been commuted */ #define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ #define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ #define EP_Skip 0x001000 /* Operator does not contribute to affinity */ @@ -4517,6 +4517,7 @@ char *sqlite3Normalize(Vdbe*, const char*); #endif int sqlite3Reprepare(Vdbe*); void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); +CollSeq *sqlite3ExprCompareCollSeq(Parse*,Expr*); CollSeq *sqlite3BinaryCompareCollSeq(Parse *, Expr *, Expr *); int sqlite3TempInMemory(const sqlite3*); const char *sqlite3JournalModename(int); diff --git a/src/where.c b/src/where.c index 1a43b8d19e..a7d34961e1 100644 --- a/src/where.c +++ b/src/where.c @@ -279,8 +279,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ continue; } assert(pX->pLeft); - pColl = sqlite3BinaryCompareCollSeq(pParse, - pX->pLeft, pX->pRight); + pColl = sqlite3ExprCompareCollSeq(pParse, pX); if( pColl==0 ) pColl = pParse->db->pDfltColl; if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ continue; @@ -801,8 +800,8 @@ static void constructAutomaticIndex( Expr *pX = pTerm->pExpr; idxCols |= cMask; pIdx->aiColumn[n] = pTerm->u.leftColumn; - pColl = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight); - pIdx->azColl[n] = pColl ? pColl->zName : sqlite3StrBINARY; + pColl = sqlite3ExprCompareCollSeq(pParse, pX); + pIdx->azColl[n] = ALWAYS(pColl) ? pColl->zName : sqlite3StrBINARY; n++; } } @@ -2802,7 +2801,6 @@ static int whereUsablePartialIndex(int iTab, WhereClause *pWC, Expr *pWhere){ if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ Expr *pExpr; - if( pTerm->wtFlags & TERM_NOPARTIDX ) continue; pExpr = pTerm->pExpr; if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->iRightJoinTable==iTab) && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) @@ -3265,7 +3263,7 @@ const char *sqlite3_vtab_collation(sqlite3_index_info *pIdxInfo, int iCons){ int iTerm = pIdxInfo->aConstraint[iCons].iTermOffset; Expr *pX = pHidden->pWC->a[iTerm].pExpr; if( pX->pLeft ){ - pC = sqlite3BinaryCompareCollSeq(pHidden->pParse, pX->pLeft, pX->pRight); + pC = sqlite3ExprCompareCollSeq(pHidden->pParse, pX); } zRet = (pC ? pC->zName : sqlite3StrBINARY); } diff --git a/src/whereInt.h b/src/whereInt.h index 64978cf110..e63ca46d53 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -291,7 +291,6 @@ struct WhereTerm { #define TERM_LIKE 0x400 /* The original LIKE operator */ #define TERM_IS 0x800 /* Term.pExpr is an IS operator */ #define TERM_VARSELECT 0x1000 /* Term.pExpr contains a correlated sub-query */ -#define TERM_NOPARTIDX 0x2000 /* Not for use to enable a partial index */ /* ** An instance of the WhereScan object is used as an iterator for locating diff --git a/src/whereexpr.c b/src/whereexpr.c index a161310799..ea174e1f3e 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -109,39 +109,11 @@ static int allowedOp(int op){ /* ** Commute a comparison operator. Expressions of the form "X op Y" ** are converted into "Y op X". -** -** If left/right precedence rules come into play when determining the -** collating sequence, then COLLATE operators are adjusted to ensure -** that the collating sequence does not change. For example: -** "Y collate NOCASE op X" becomes "X op Y" because any collation sequence on -** the left hand side of a comparison overrides any collation sequence -** attached to the right. For the same reason the EP_Collate flag -** is not commuted. -** -** The return value is extra flags that are added to the WhereTerm object -** after it is commuted. The only extra flag ever added is TERM_NOPARTIDX -** which prevents the term from being used to enable a partial index if -** COLLATE changes have been made. */ static u16 exprCommute(Parse *pParse, Expr *pExpr){ - u16 expRight = (pExpr->pRight->flags & EP_Collate); - u16 expLeft = (pExpr->pLeft->flags & EP_Collate); - u16 wtFlags = 0; - assert( allowedOp(pExpr->op) && pExpr->op!=TK_IN ); - if( expRight==expLeft ){ - /* Either X and Y both have COLLATE operator or neither do */ - if( expRight ){ - /* Both X and Y have COLLATE operators. Make sure X is always - ** used by clearing the EP_Collate flag from Y. */ - pExpr->pRight->flags &= ~EP_Collate; - wtFlags |= TERM_NOPARTIDX; - }else if( sqlite3ExprCollSeq(pParse, pExpr->pLeft)!=0 ){ - /* Neither X nor Y have COLLATE operators, but X has a non-default - ** collating sequence. So add the EP_Collate marker on X to cause - ** it to be searched first. */ - pExpr->pLeft->flags |= EP_Collate; - wtFlags |= TERM_NOPARTIDX; - } + if( sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight) != + sqlite3BinaryCompareCollSeq(pParse, pExpr->pRight, pExpr->pLeft) ){ + pExpr->flags ^= EP_Commuted; } SWAP(Expr*,pExpr->pRight,pExpr->pLeft); if( pExpr->op>=TK_GT ){ @@ -152,7 +124,7 @@ static u16 exprCommute(Parse *pParse, Expr *pExpr){ assert( pExpr->op>=TK_GT && pExpr->op<=TK_GE ); pExpr->op = ((pExpr->op-TK_GT)^2)+TK_GT; } - return wtFlags; + return 0; } /* @@ -930,7 +902,7 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr){ ){ return 0; } - pColl = sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight); + pColl = sqlite3ExprCompareCollSeq(pParse, pExpr); if( sqlite3IsBinary(pColl) ) return 1; return sqlite3ExprCollSeqMatch(pParse, pExpr->pLeft, pExpr->pRight); } From a5d0911546c0d41f142a33fc3622df7ef7d8a81d Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Oct 2019 01:00:16 +0000 Subject: [PATCH 069/476] Move the sqlite3LocateCollSeq(), sqlite3FindCollSeq(), and sqlite3GetCollSeq() routines so that they are all beside one another in the callback.c source file. No logic changes. FossilOrigin-Name: 9ff80a9bf8fee776e2f282d0597215b77d48093ebc71d047ad1457da0582ddbc --- manifest | 14 +++--- manifest.uuid | 2 +- src/build.c | 35 ------------- src/callback.c | 132 +++++++++++++++++++++++++++++++------------------ 4 files changed, 91 insertions(+), 92 deletions(-) diff --git a/manifest b/manifest index b06aa5e02f..659ff29737 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sflipping\s("commuting")\sa\scomparison\soperator,\sset\sthe\snew\sEP_Commuted\nbit\srather\sthan\sadding\sextra\sEP_Collate\sbits,\sto\ssingle\slater\sprocessing\sthat\nthe\sorder\sof\sprecedence\sfor\sCOLLATE\soperators\sis\sinverted.\nFix\sfor\sticket\s[b47e3627ecaadbde] -D 2019-10-22T00:03:41.431 +C Move\sthe\ssqlite3LocateCollSeq(),\ssqlite3FindCollSeq(),\sand\nsqlite3GetCollSeq()\sroutines\sso\sthat\sthey\sare\sall\sbeside\sone\sanother\sin\nthe\scallback.c\ssource\sfile.\s\sNo\slogic\schanges. +D 2019-10-22T01:00:16.928 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,8 +469,8 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 13de2fdabbabcf2e2aaf6443a049fb851d9d3170136c08345468e158ceea3dc6 -F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 +F src/build.c 0e558ef847ccc4b6aa38dee44cde9d9df46e953b0a66e4fa4376265824955fe3 +F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cd2317d04c1c4bcf5fe63aa02a6051bdfae8f5566a098e3f45bf9ec1dd0c3ea6 -R 3a3c136ff4c96296b02b1f2633ff663b +P 90f7c477354d67d22d5eb0da22dac579f384ab44743fdc19887220e32203ebc2 +R 3a6f62c10243ee61b28a93dbeca6af23 U drh -Z 20a6808e6237368aa12eb5e4f5b30bb2 +Z 533045e8c1f04d69c5fc59655d97ca67 diff --git a/manifest.uuid b/manifest.uuid index c3d5218682..217b679a00 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -90f7c477354d67d22d5eb0da22dac579f384ab44743fdc19887220e32203ebc2 \ No newline at end of file +9ff80a9bf8fee776e2f282d0597215b77d48093ebc71d047ad1457da0582ddbc \ No newline at end of file diff --git a/src/build.c b/src/build.c index e4f8d5e3c6..22a57a240b 100644 --- a/src/build.c +++ b/src/build.c @@ -1520,41 +1520,6 @@ void sqlite3AddCollateType(Parse *pParse, Token *pToken){ } } -/* -** This function returns the collation sequence for database native text -** encoding identified by the string zName, length nName. -** -** If the requested collation sequence is not available, or not available -** in the database native encoding, the collation factory is invoked to -** request it. If the collation factory does not supply such a sequence, -** and the sequence is available in another text encoding, then that is -** returned instead. -** -** If no versions of the requested collations sequence are available, or -** another error occurs, NULL is returned and an error message written into -** pParse. -** -** This routine is a wrapper around sqlite3FindCollSeq(). This routine -** invokes the collation factory if the named collation cannot be found -** and generates an error message. -** -** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() -*/ -CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ - sqlite3 *db = pParse->db; - u8 enc = ENC(db); - u8 initbusy = db->init.busy; - CollSeq *pColl; - - pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); - if( !initbusy && (!pColl || !pColl->xCmp) ){ - pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); - } - - return pColl; -} - - /* ** Generate code that will increment the schema cookie. ** diff --git a/src/callback.c b/src/callback.c index ad53bd4d3c..a360e46ee4 100644 --- a/src/callback.c +++ b/src/callback.c @@ -65,51 +65,6 @@ static int synthCollSeq(sqlite3 *db, CollSeq *pColl){ return SQLITE_ERROR; } -/* -** This function is responsible for invoking the collation factory callback -** or substituting a collation sequence of a different encoding when the -** requested collation sequence is not available in the desired encoding. -** -** If it is not NULL, then pColl must point to the database native encoding -** collation sequence with name zName, length nName. -** -** The return value is either the collation sequence to be used in database -** db for collation type name zName, length nName, or NULL, if no collation -** sequence can be found. If no collation is found, leave an error message. -** -** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() -*/ -CollSeq *sqlite3GetCollSeq( - Parse *pParse, /* Parsing context */ - u8 enc, /* The desired encoding for the collating sequence */ - CollSeq *pColl, /* Collating sequence with native encoding, or NULL */ - const char *zName /* Collating sequence name */ -){ - CollSeq *p; - sqlite3 *db = pParse->db; - - p = pColl; - if( !p ){ - p = sqlite3FindCollSeq(db, enc, zName, 0); - } - if( !p || !p->xCmp ){ - /* No collation sequence of this type for this encoding is registered. - ** Call the collation factory to see if it can supply us with one. - */ - callCollNeeded(db, enc, zName); - p = sqlite3FindCollSeq(db, enc, zName, 0); - } - if( p && !p->xCmp && synthCollSeq(db, p) ){ - p = 0; - } - assert( !p || p->xCmp ); - if( p==0 ){ - sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); - pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; - } - return p; -} - /* ** This routine is called on a collation sequence before it is used to ** check that it is defined. An undefined collation sequence exists when @@ -202,10 +157,10 @@ static CollSeq *findCollSeqEntry( ** See also: sqlite3LocateCollSeq(), sqlite3GetCollSeq() */ CollSeq *sqlite3FindCollSeq( - sqlite3 *db, - u8 enc, - const char *zName, - int create + sqlite3 *db, /* Database connection to search */ + u8 enc, /* Desired text encoding */ + const char *zName, /* Name of the collating sequence. Might be NULL */ + int create /* True to create CollSeq if doesn't already exist */ ){ CollSeq *pColl; if( zName ){ @@ -219,6 +174,85 @@ CollSeq *sqlite3FindCollSeq( return pColl; } +/* +** This function is responsible for invoking the collation factory callback +** or substituting a collation sequence of a different encoding when the +** requested collation sequence is not available in the desired encoding. +** +** If it is not NULL, then pColl must point to the database native encoding +** collation sequence with name zName, length nName. +** +** The return value is either the collation sequence to be used in database +** db for collation type name zName, length nName, or NULL, if no collation +** sequence can be found. If no collation is found, leave an error message. +** +** See also: sqlite3LocateCollSeq(), sqlite3FindCollSeq() +*/ +CollSeq *sqlite3GetCollSeq( + Parse *pParse, /* Parsing context */ + u8 enc, /* The desired encoding for the collating sequence */ + CollSeq *pColl, /* Collating sequence with native encoding, or NULL */ + const char *zName /* Collating sequence name */ +){ + CollSeq *p; + sqlite3 *db = pParse->db; + + p = pColl; + if( !p ){ + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( !p || !p->xCmp ){ + /* No collation sequence of this type for this encoding is registered. + ** Call the collation factory to see if it can supply us with one. + */ + callCollNeeded(db, enc, zName); + p = sqlite3FindCollSeq(db, enc, zName, 0); + } + if( p && !p->xCmp && synthCollSeq(db, p) ){ + p = 0; + } + assert( !p || p->xCmp ); + if( p==0 ){ + sqlite3ErrorMsg(pParse, "no such collation sequence: %s", zName); + pParse->rc = SQLITE_ERROR_MISSING_COLLSEQ; + } + return p; +} + +/* +** This function returns the collation sequence for database native text +** encoding identified by the string zName. +** +** If the requested collation sequence is not available, or not available +** in the database native encoding, the collation factory is invoked to +** request it. If the collation factory does not supply such a sequence, +** and the sequence is available in another text encoding, then that is +** returned instead. +** +** If no versions of the requested collations sequence are available, or +** another error occurs, NULL is returned and an error message written into +** pParse. +** +** This routine is a wrapper around sqlite3FindCollSeq(). This routine +** invokes the collation factory if the named collation cannot be found +** and generates an error message. +** +** See also: sqlite3FindCollSeq(), sqlite3GetCollSeq() +*/ +CollSeq *sqlite3LocateCollSeq(Parse *pParse, const char *zName){ + sqlite3 *db = pParse->db; + u8 enc = ENC(db); + u8 initbusy = db->init.busy; + CollSeq *pColl; + + pColl = sqlite3FindCollSeq(db, enc, zName, initbusy); + if( !initbusy && (!pColl || !pColl->xCmp) ){ + pColl = sqlite3GetCollSeq(pParse, enc, pColl, zName); + } + + return pColl; +} + /* During the search for the best function definition, this procedure ** is called to test how well the function passed as the first argument ** matches the request for a function with nArg arguments in a system From 98c94e60d0b6a59c63cb0618be8307d34e3b97a6 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Oct 2019 11:29:22 +0000 Subject: [PATCH 070/476] Previous check-in to fix [b47e3627ecaadbde] was incomplete. This check-in completes the fix and adds a test cases. FossilOrigin-Name: c7da1c01f1f239e68c2173ac5748b8c5798271e43bdcee68f51f97cd0ca92bd5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/whereexpr.c | 7 +++++-- test/rowvalue.test | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 659ff29737..8c107179f6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\sthe\ssqlite3LocateCollSeq(),\ssqlite3FindCollSeq(),\sand\nsqlite3GetCollSeq()\sroutines\sso\sthat\sthey\sare\sall\sbeside\sone\sanother\sin\nthe\scallback.c\ssource\sfile.\s\sNo\slogic\schanges. -D 2019-10-22T01:00:16.928 +C Previous\scheck-in\sto\sfix\s[b47e3627ecaadbde]\swas\sincomplete.\s\sThis\scheck-in\ncompletes\sthe\sfix\sand\sadds\sa\stest\scases. +D 2019-10-22T11:29:22.330 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 148fa1ce9d6421a2c325291cae7681b3492cf1f219ff58f9ef38695a7f3c61ff F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 57d034a0dbca9f86e1a691f74e469ed09ff49d04712b838fb68596b76a9af7d2 -F src/whereexpr.c ab3c687a33aa3ca75744a74e82c0eab703a88627131cf72707f5346f04cb8539 +F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1260,7 +1260,7 @@ F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test a3e729d5c1f32da03bba15af1e3128218d2ba3c40d4f4ed5fa0497a713df68ea +F test/rowvalue.test e923271bc7448eb418e22af723e90223525d9c2a9d40acfc8124beac5dbb2bd6 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 90f7c477354d67d22d5eb0da22dac579f384ab44743fdc19887220e32203ebc2 -R 3a6f62c10243ee61b28a93dbeca6af23 +P 9ff80a9bf8fee776e2f282d0597215b77d48093ebc71d047ad1457da0582ddbc +R afcf07bfa3aa997eb10b76d021564d31 U drh -Z 533045e8c1f04d69c5fc59655d97ca67 +Z 3c9d55fa5bc6fe09c146135efce06e8a diff --git a/manifest.uuid b/manifest.uuid index 217b679a00..60f43863b3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ff80a9bf8fee776e2f282d0597215b77d48093ebc71d047ad1457da0582ddbc \ No newline at end of file +c7da1c01f1f239e68c2173ac5748b8c5798271e43bdcee68f51f97cd0ca92bd5 \ No newline at end of file diff --git a/src/whereexpr.c b/src/whereexpr.c index ea174e1f3e..7daf7508c7 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -111,8 +111,11 @@ static int allowedOp(int op){ ** are converted into "Y op X". */ static u16 exprCommute(Parse *pParse, Expr *pExpr){ - if( sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight) != - sqlite3BinaryCompareCollSeq(pParse, pExpr->pRight, pExpr->pLeft) ){ + if( pExpr->pLeft->op==TK_VECTOR + || pExpr->pRight->op==TK_VECTOR + || sqlite3BinaryCompareCollSeq(pParse, pExpr->pLeft, pExpr->pRight) != + sqlite3BinaryCompareCollSeq(pParse, pExpr->pRight, pExpr->pLeft) + ){ pExpr->flags ^= EP_Commuted; } SWAP(Expr*,pExpr->pRight,pExpr->pLeft); diff --git a/test/rowvalue.test b/test/rowvalue.test index e859024711..813795dec3 100644 --- a/test/rowvalue.test +++ b/test/rowvalue.test @@ -570,4 +570,20 @@ do_execsql_test 22.100 { SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 5,6); } {1 0 1 0 0 1 0 1} +# 2019-10-21 Ticket b47e3627ecaadbde +# +do_execsql_test 23.100 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(aa COLLATE NOCASE, bb); + INSERT INTO t0 VALUES('a', 'A'); + SELECT (+bb,1) >= (aa, 1), (aa,1)<=(+bb,1) FROM t0; + SELECT 2 FROM t0 WHERE (+bb,1) >= (aa,1); + SELECT 3 FROM t0 WHERE (aa,1) <= (+bb,1); +} {0 1 3} +do_execsql_test 23.110 { + SELECT (SELECT +bb,1) >= (aa, 1), (aa,1)<=(SELECT +bb,1) FROM t0; + SELECT 2 FROM t0 WHERE (SELECT +bb,1) >= (aa,1); + SELECT 3 FROM t0 WHERE (aa,1) <= (SELECT +bb,1); +} {0 1 3} + finish_test From 427b96aedf422b1a8e906e47e8852033c70939c4 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Oct 2019 13:01:24 +0000 Subject: [PATCH 071/476] New testcase() macros. Fix a problem with INSERT when the IPK is to the right of generated columns. FossilOrigin-Name: 412799fc5527aaca987e4e04b8a4f774dcdb70fb80e3a126dc3a26d48a66935c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/build.c | 8 ++++++-- src/insert.c | 28 ++++++++++++++++++++++++---- src/sqliteInt.h | 1 + src/update.c | 12 +++++++++--- 6 files changed, 50 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index ca085798dd..939aaa0a07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\schanges\son\strunk\sinto\sthe\sgenerated-columns\sbranch. -D 2019-10-22T12:02:09.134 +C New\stestcase()\smacros.\s\sFix\sa\sproblem\swith\sINSERT\swhen\sthe\sIPK\sis\sto\sthe\nright\sof\sgenerated\scolumns. +D 2019-10-22T13:01:24.252 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c c8d76afe573ad68678206f85c122544d65932f95ad067e17570de930de4b0276 +F src/build.c acf54f35164aff7f0b06b82aae357e76e08b74e4c904bafd96643d4e155f34f8 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c f657ee9898f147d3dd96986dae2611afb75bcef8dd3644f182232f5ca2268a0e +F src/insert.c 760925fe9b4796e968bb9cd11426a3b9f6cc2c35b7b7acc5f25bcc84b73fb5a8 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa7 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 3a498ce50d079e0b2c4d780fc48d93024afaac4511021bc121d4277cb1a3df56 +F src/sqliteInt.h ca968d2d348b7aa4cef7a16fdb7738c15834318e5bd9eca8a49388f48f0695a8 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,7 +592,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c e5c432097191e6e6c73e48364daa58b257b30a8b0d54b018fd0bd9415cd7b553 +F src/update.c 287146d2ce191228f0afaa34ffcaaaa196e2c2e2664008914e925dea6a64403e F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bc368cb090376d33d3844e3689c4f6bd19eed758e39b878ee67fef93b1c839ea c7da1c01f1f239e68c2173ac5748b8c5798271e43bdcee68f51f97cd0ca92bd5 -R 3ed2fbe0c143869ff55bbbadcc27c112 +P ba123b8c201053d8f9387de38f3513b06f7721b28d79fab8489f96d336105117 +R c1cc6d4a971f76b9e92c16fa65923060 U drh -Z c16a467e1be0aad7834a9c102a3d7298 +Z 35d27d665bc3fbce0f6de471df281b5a diff --git a/manifest.uuid b/manifest.uuid index 7095e594e6..0a61aea937 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ba123b8c201053d8f9387de38f3513b06f7721b28d79fab8489f96d336105117 \ No newline at end of file +412799fc5527aaca987e4e04b8a4f774dcdb70fb80e3a126dc3a26d48a66935c \ No newline at end of file diff --git a/src/build.c b/src/build.c index ad65c25ef7..2ba9398226 100644 --- a/src/build.c +++ b/src/build.c @@ -2207,11 +2207,15 @@ void sqlite3EndTable( } #endif /* !defined(SQLITE_OMIT_CHECK) */ #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( p->tabFlags & (TF_HasVirtual|TF_HasStored) ){ + if( p->tabFlags & TF_HasGenerated ){ int ii; + testcase( p->tabFlags & TF_HasVirtual ); + testcase( p->tabFlags & TF_HasStored ); for(ii=0; iinCol; ii++){ u32 colFlags = p->aCol[ii].colFlags; - if( (colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL))!=0 ){ + if( (colFlags & COLFLAG_GENERATED)!=0 ){ + testcase( colFlags & COLFLAG_VIRTUAL ); + testcase( colFlags & COLFLAG_STORED ); sqlite3ResolveSelfReference(pParse, p, NC_GenCol, p->aCol[ii].pDflt, 0); } diff --git a/src/insert.c b/src/insert.c index c90f9d2726..1995f9634c 100644 --- a/src/insert.c +++ b/src/insert.c @@ -222,6 +222,8 @@ void sqlite3ComputeGeneratedColumns( */ for(i=0; inCol; i++){ if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colflags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colflags & COLFLAG_STORED ); pTab->aCol[i].colFlags |= COLFLAG_NOTAVAIL; } } @@ -854,6 +856,19 @@ void sqlite3Insert( */ if( pColumn==0 && nColumn>0 ){ ipkColumn = pTab->iPKey; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasGenerated ); + for(i=ipkColumn-1; i>=0; i--){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_GENERATED ); + ipkColumn--; + } + } + } +#endif } /* Make sure the number of columns in the source data matches the number @@ -1070,7 +1085,9 @@ void sqlite3Insert( ** columns have already been computed. This must be done after ** computing the ROWID in case one of the generated columns ** refers to the ROWID. */ - if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); sqlite3ComputeGeneratedColumns(pParse, regCols+1, pTab); } #endif @@ -1139,7 +1156,9 @@ void sqlite3Insert( ** columns have already been computed. This must be done after ** computing the ROWID in case one of the generated columns ** refers to the ROWID. */ - if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); sqlite3ComputeGeneratedColumns(pParse, regRowid+1, pTab); } #endif @@ -1486,7 +1505,6 @@ void sqlite3GenerateConstraintChecks( testcase( i!=sqlite3TableColumnToStorage(pTab, i) ); testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); - testcase( pTab->aCol[i].colFlags & COLFLAG_GENERATED ); iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1; switch( onError ){ case OE_Replace: { @@ -2422,7 +2440,9 @@ static int xferOptimization( /* Generator expressions for generated columns must match */ if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){ - return 0; /* Different generator expressions */ + testcase( pDestCol->colflags & COLFLAG_VIRTUAL ); + testcase( pDestCol->colflags & COLFLAG_STORED ); + return 0; /* Different generator expressions */ } } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index c9dee9e23f..06464acb55 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2037,6 +2037,7 @@ struct Table { #define TF_HasStat1 0x0010 /* nRowLogEst set from sqlite_stat1 */ #define TF_HasVirtual 0x0020 /* Has one or more VIRTUAL columns */ #define TF_HasStored 0x0040 /* Has one or more STORED columns */ +#define TF_HasGenerated 0x0060 /* Combo: HasVirtual + HasStored */ #define TF_WithoutRowid 0x0080 /* No rowid. PRIMARY KEY is the key */ #define TF_StatsUsed 0x0100 /* Query planner decisions affected by ** Index.aiRowLogEst[] values */ diff --git a/src/update.c b/src/update.c index 79b6fbd2a5..48413a0df9 100644 --- a/src/update.c +++ b/src/update.c @@ -313,7 +313,9 @@ void sqlite3Update( chngPk = 1; } #ifndef SQLITE_OMIT_GENERATED_COLUMNS - else if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ + else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); sqlite3ErrorMsg(pParse, "cannot UPDATE generated column \"%s\"", pTab->aCol[j].zName); @@ -693,7 +695,9 @@ void sqlite3Update( } } #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); } #endif @@ -737,7 +741,9 @@ void sqlite3Update( } } #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( pTab->tabFlags & (TF_HasStored|TF_HasVirtual) ){ + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); } #endif From 7e7fd73b25f83b6aac246a79990e0f5ff3019e7c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Oct 2019 13:59:23 +0000 Subject: [PATCH 072/476] In UPDATE processing, include generated columns in the set of columns being updated if and only if their generator expressions reference some other column that is being updated. FossilOrigin-Name: d38176e93a628e03f1bd8b689fbc4152a1495388da917c2d89cefed04353d2d6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 10 ++++++++-- src/update.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 939aaa0a07..723757465a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stestcase()\smacros.\s\sFix\sa\sproblem\swith\sINSERT\swhen\sthe\sIPK\sis\sto\sthe\nright\sof\sgenerated\scolumns. -D 2019-10-22T13:01:24.252 +C In\sUPDATE\sprocessing,\sinclude\sgenerated\scolumns\sin\sthe\sset\sof\scolumns\sbeing\nupdated\sif\sand\sonly\sif\stheir\sgenerator\sexpressions\sreference\ssome\sother\ncolumn\sthat\sis\sbeing\supdated. +D 2019-10-22T13:59:23.530 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c acf54f35164aff7f0b06b82aae357e76e08b74e4c904bafd96643d4e155f34f8 +F src/build.c 27471914e516d7d0f21d16c74f9e84bdfda1160bfd11e33a74cbe1d5a08dbc9e F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -592,7 +592,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c 287146d2ce191228f0afaa34ffcaaaa196e2c2e2664008914e925dea6a64403e +F src/update.c 3a5e1fa8e29413ee633f049bf9f0e1eb33a03a53cb55b6ea290120b324fbf46e F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ba123b8c201053d8f9387de38f3513b06f7721b28d79fab8489f96d336105117 -R c1cc6d4a971f76b9e92c16fa65923060 +P 412799fc5527aaca987e4e04b8a4f774dcdb70fb80e3a126dc3a26d48a66935c +R d35fda238d05afc96b47f324f26c5dfe U drh -Z 35d27d665bc3fbce0f6de471df281b5a +Z 00de734fe264a9e4a103cd3816a6d374 diff --git a/manifest.uuid b/manifest.uuid index 0a61aea937..e9177c9e9c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -412799fc5527aaca987e4e04b8a4f774dcdb70fb80e3a126dc3a26d48a66935c \ No newline at end of file +d38176e93a628e03f1bd8b689fbc4152a1495388da917c2d89cefed04353d2d6 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 2ba9398226..efdcb59b1e 100644 --- a/src/build.c +++ b/src/build.c @@ -1405,6 +1405,12 @@ void sqlite3AddDefaultValue( if( !sqlite3ExprIsConstantOrFunction(pExpr, db->init.busy) ){ sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", pCol->zName); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colflags & COLFLAG_VIRTUAL ); + testcase( pCol->colflags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, "cannot use DEFAULT on a generated column"); +#endif }else{ /* A copy of pExpr is used instead of the original, as pExpr contains ** tokens that point to volatile memory. @@ -1633,14 +1639,14 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ goto generated_done; generated_error: - sqlite3ErrorMsg(pParse, "incorrect GENERATED ALWAYS AS on column \"%s\"", + sqlite3ErrorMsg(pParse, "error in generated column \"%s\"", pCol->zName); generated_done: sqlite3ExprDelete(pParse->db, pExpr); #else /* Throw and error for the GENERATED ALWAYS AS clause if the ** SQLITE_OMIT_GENERATED_COLUMNS compile-time option is used. */ - sqlite3ErrorMsg(pParse, "GENERATED ALWAYS AS not supported"); + sqlite3ErrorMsg(pParse, "generated columns not supported"); sqlite3ExprDelete(pParse->db, pExpr); #endif } diff --git a/src/update.c b/src/update.c index 48413a0df9..d690b69f95 100644 --- a/src/update.c +++ b/src/update.c @@ -356,6 +356,33 @@ void sqlite3Update( assert( chngPk==0 || chngPk==1 ); chngKey = chngRowid + chngPk; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Mark generated columns as changing if their generator expressions + ** reference any changing column. The actual aXRef[] value for + ** generated expressions is not used, other than to check to see that it + ** is non-negative, so the value of aXRef[] for generated columns can be + ** set to any non-negative number. We use 99999 so that the value is + ** obvious when looking at aXRef[] in a symbolic debugger. + */ + if( pTab->tabFlags & TF_HasGenerated ){ + int bProgress; + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + do{ + bProgress = 0; + for(i=0; inCol; i++){ + if( aXRef[i]>=0 ) continue; + if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ) continue; + if( sqlite3ExprReferencesUpdatedColumn(pTab->aCol[i].pDflt, + aXRef, chngRowid) ){ + aXRef[i] = 99999; + bProgress = 1; + } + } + }while( bProgress ); + } +#endif + /* The SET expressions are not actually used inside the WHERE loop. ** So reset the colUsed mask. Unless this is a virtual table. In that ** case, set all bits of the colUsed mask (to ensure that the virtual @@ -952,6 +979,7 @@ static void updateVirtualTable( /* Populate the argument registers. */ for(i=0; inCol; i++){ + assert( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ); if( aXRef[i]>=0 ){ sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); }else{ From f4b1d8dc17dcd01eb01f3cafb3614d37eee31e56 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Oct 2019 15:45:03 +0000 Subject: [PATCH 073/476] Do not allow generated columns in the PRIMARY KEY. FossilOrigin-Name: 1a54743a3d327efc8ecc45b9fde91ddfea3fca36408f9b753453c31f2e4cc69c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 19 +++++++++++++++++-- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 723757465a..52be0a76b7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sUPDATE\sprocessing,\sinclude\sgenerated\scolumns\sin\sthe\sset\sof\scolumns\sbeing\nupdated\sif\sand\sonly\sif\stheir\sgenerator\sexpressions\sreference\ssome\sother\ncolumn\sthat\sis\sbeing\supdated. -D 2019-10-22T13:59:23.530 +C Do\snot\sallow\sgenerated\scolumns\sin\sthe\sPRIMARY\sKEY. +D 2019-10-22T15:45:03.587 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 27471914e516d7d0f21d16c74f9e84bdfda1160bfd11e33a74cbe1d5a08dbc9e +F src/build.c 27c8224737b4649ea6d264e8433e66bc226a6859c8e11a2f9849516c211da4d9 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 412799fc5527aaca987e4e04b8a4f774dcdb70fb80e3a126dc3a26d48a66935c -R d35fda238d05afc96b47f324f26c5dfe +P d38176e93a628e03f1bd8b689fbc4152a1495388da917c2d89cefed04353d2d6 +R a71a1c09fd9122c7a52773b96d8fa320 U drh -Z 00de734fe264a9e4a103cd3816a6d374 +Z cf574256bc3dfd7405d0c5f301ba621a diff --git a/manifest.uuid b/manifest.uuid index e9177c9e9c..fcbb946ead 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d38176e93a628e03f1bd8b689fbc4152a1495388da917c2d89cefed04353d2d6 \ No newline at end of file +1a54743a3d327efc8ecc45b9fde91ddfea3fca36408f9b753453c31f2e4cc69c \ No newline at end of file diff --git a/src/build.c b/src/build.c index efdcb59b1e..5cd9473fa2 100644 --- a/src/build.c +++ b/src/build.c @@ -1456,6 +1456,21 @@ static void sqlite3StringToId(Expr *p){ } } +/* +** Tag the given column as being part of the PRIMARY KEY +*/ +static void makeColumnPartOfPrimaryKey(Parse *pParse, Column *pCol){ + pCol->colFlags |= COLFLAG_PRIMKEY; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, + "generated columns cannot be part of the PRIMARY KEY"); + } +#endif +} + /* ** Designate the PRIMARY KEY for the table. pList is a list of names ** of columns that form the primary key. If pList is NULL, then the @@ -1495,7 +1510,7 @@ void sqlite3AddPrimaryKey( if( pList==0 ){ iCol = pTab->nCol - 1; pCol = &pTab->aCol[iCol]; - pCol->colFlags |= COLFLAG_PRIMKEY; + makeColumnPartOfPrimaryKey(pParse, pCol); nTerm = 1; }else{ nTerm = pList->nExpr; @@ -1508,7 +1523,7 @@ void sqlite3AddPrimaryKey( for(iCol=0; iColnCol; iCol++){ if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zName)==0 ){ pCol = &pTab->aCol[iCol]; - pCol->colFlags |= COLFLAG_PRIMKEY; + makeColumnPartOfPrimaryKey(pParse, pCol); break; } } From db36e255d5f7162f6abcdfcafeca4f22668e139c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Oct 2019 19:51:29 +0000 Subject: [PATCH 074/476] Disqualify row-value comparisons for use by an index if the right-hand side has an affinity that does not match the index. Fix for ticket [6ef984af8972c2eb] FossilOrigin-Name: 5c118617cf08e17a6edfdfba86e3fc49132a780990b68b52724c2aaeac85f506 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 3 +++ test/rowvalue.test | 9 +++++++++ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8c107179f6..66bec473c0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Previous\scheck-in\sto\sfix\s[b47e3627ecaadbde]\swas\sincomplete.\s\sThis\scheck-in\ncompletes\sthe\sfix\sand\sadds\sa\stest\scases. -D 2019-10-22T11:29:22.330 +C Disqualify\srow-value\scomparisons\sfor\suse\sby\san\sindex\sif\sthe\sright-hand\sside\nhas\san\saffinity\sthat\sdoes\snot\smatch\sthe\sindex.\nFix\sfor\sticket\s[6ef984af8972c2eb] +D 2019-10-22T19:51:29.935 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c da4b31b0dfba1bf7891d996e91eff371b4eb5672341beb0c54299f56bc745cbc +F src/expr.c e5dad5e67aa3caed02a41c4822d3df6a1b43fd4a19e93aa0f4a1709405c483fe F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1260,7 +1260,7 @@ F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test e923271bc7448eb418e22af723e90223525d9c2a9d40acfc8124beac5dbb2bd6 +F test/rowvalue.test 167919d94f2bec190c065f3448b24bc4f56b4f1f1c6cb4e490feae51ababf537 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9ff80a9bf8fee776e2f282d0597215b77d48093ebc71d047ad1457da0582ddbc -R afcf07bfa3aa997eb10b76d021564d31 +P c7da1c01f1f239e68c2173ac5748b8c5798271e43bdcee68f51f97cd0ca92bd5 +R 92e3bc21380d8b35cad891a2258f3a1e U drh -Z 3c9d55fa5bc6fe09c146135efce06e8a +Z d1b03389590fbac09e6d4dd5b27290df diff --git a/manifest.uuid b/manifest.uuid index 60f43863b3..4be46212ea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7da1c01f1f239e68c2173ac5748b8c5798271e43bdcee68f51f97cd0ca92bd5 \ No newline at end of file +5c118617cf08e17a6edfdfba86e3fc49132a780990b68b52724c2aaeac85f506 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 7e80796f4b..4a5c2d0ff2 100644 --- a/src/expr.c +++ b/src/expr.c @@ -70,6 +70,9 @@ char sqlite3ExprAffinity(Expr *pExpr){ pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr ); } + if( op==TK_VECTOR ){ + return sqlite3ExprAffinity(pExpr->x.pList->a[0].pExpr); + } return pExpr->affExpr; } diff --git a/test/rowvalue.test b/test/rowvalue.test index 813795dec3..8fb6e1ca02 100644 --- a/test/rowvalue.test +++ b/test/rowvalue.test @@ -586,4 +586,13 @@ do_execsql_test 23.110 { SELECT 3 FROM t0 WHERE (aa,1) <= (SELECT +bb,1); } {0 1 3} +# 2019-10-22 Ticket 6ef984af8972c2eb +do_execsql_test 24.100 { + DROP TABLE t0; + CREATE TABLE t0(c0 TEXT PRIMARY KEY); + INSERT INTO t0(c0) VALUES (''); + SELECT (t0.c0, TRUE) > (CAST(0 AS REAL), FALSE) FROM t0; + SELECT 2 FROM t0 WHERE (t0.c0, TRUE) > (CAST('' AS REAL), FALSE); +} {1 2} + finish_test From e70fa7feba0b07eb1b5fe4f5373182875e709b32 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Oct 2019 21:01:34 +0000 Subject: [PATCH 075/476] Take the declared column time into account when computing the values for generated columns, and apply appropriate affinity. FossilOrigin-Name: 9e04ba22dfce3998e61331ac229ff543ecccc590284c9dd5def21efbe594fba0 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 22 ++++++++++++++++++++-- src/insert.c | 8 ++++---- src/sqliteInt.h | 3 +++ 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 6999837016..da5bf8a3de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\srow-value\sfix\sfrom\strunk. -D 2019-10-22T20:16:04.350 +C Take\sthe\sdeclared\scolumn\stime\sinto\saccount\swhen\scomputing\sthe\svalues\sfor\ngenerated\scolumns,\sand\sapply\sappropriate\saffinity. +D 2019-10-22T21:01:34.082 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 738bcc441279eead08581ee8ee37d0dd56ded11361585b20b0af470c7c785291 +F src/expr.c bf20202a8db15eda35f160df741805509be8c1e5e3258e4770e48db6e27d7994 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 760925fe9b4796e968bb9cd11426a3b9f6cc2c35b7b7acc5f25bcc84b73fb5a8 +F src/insert.c 7ab2c74825809a7e3cb1fa5b480d052c96c939dafb449713a7a9da0d949447af F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -530,7 +530,7 @@ F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa7 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h ca968d2d348b7aa4cef7a16fdb7738c15834318e5bd9eca8a49388f48f0695a8 +F src/sqliteInt.h f8609e5a04eec2e89f35520b31c0b506ef905a3485f09b4dc4e20583743cee31 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1a54743a3d327efc8ecc45b9fde91ddfea3fca36408f9b753453c31f2e4cc69c 5c118617cf08e17a6edfdfba86e3fc49132a780990b68b52724c2aaeac85f506 -R 61ca5ca7599f2be6c4e9cd152abdc4cf +P 1fbd7438611174aa594485241c8cc2f4ea6d09c57ef2fc16c8995e8061fdfdd6 +R fea3b2f358faeafe90a4680ffb2fd073 U drh -Z c94abd09133b87123ef5ae9e8b7dbfb2 +Z e96baec64b302955260568266fc4d764 diff --git a/manifest.uuid b/manifest.uuid index c432a3e36c..5810853df2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1fbd7438611174aa594485241c8cc2f4ea6d09c57ef2fc16c8995e8061fdfdd6 \ No newline at end of file +9e04ba22dfce3998e61331ac229ff543ecccc590284c9dd5def21efbe594fba0 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 04dbd28798..0eb7af7f40 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3395,6 +3395,24 @@ void sqlite3ExprCodeLoadIndexColumn( } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* +** Generate code that will compute the value of generated column pCol +** and store the result in register regOut +*/ +void sqlite3ExprCodeGeneratedColumn( + Parse *pParse, + Column *pCol, + int regOut +){ + sqlite3ExprCode(pParse, pCol->pDflt, regOut); + if( pCol->affinity>=SQLITE_AFF_TEXT ){ + sqlite3VdbeAddOp4(pParse->pVdbe, OP_Affinity, regOut, 1, 0, + &pCol->affinity, 1); + } +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + /* ** Generate code to extract the value of the iCol-th column of a table. */ @@ -3428,7 +3446,7 @@ void sqlite3ExprCodeGetColumnOfTable( int savedSelfTab = pParse->iSelfTab; pCol->colFlags |= COLFLAG_BUSY; pParse->iSelfTab = iTabCur+1; - sqlite3ExprCode(pParse, pTab->aCol[iCol].pDflt, regOut); + sqlite3ExprCodeGeneratedColumn(pParse, pCol, regOut); pParse->iSelfTab = savedSelfTab; pCol->colFlags &= ~COLFLAG_BUSY; } @@ -3630,7 +3648,7 @@ expr_code_doover: } pCol->colFlags |= COLFLAG_BUSY; if( pCol->colFlags & COLFLAG_NOTAVAIL ){ - sqlite3ExprCode(pParse, pCol->pDflt, iSrc); + sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc); } pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); return iSrc; diff --git a/src/insert.c b/src/insert.c index 1995f9634c..be5f49c9ec 100644 --- a/src/insert.c +++ b/src/insert.c @@ -240,14 +240,14 @@ void sqlite3ComputeGeneratedColumns( if( colFlags & COLFLAG_VIRTUAL ){ /* Virtual columns go at the end */ assert( pTab->nNVCol+nv == sqlite3TableColumnToStorage(pTab,i) ); - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, - iRegStore+pTab->nNVCol+nv); + sqlite3ExprCodeGeneratedColumn(pParse, &pTab->aCol[i], + iRegStore+pTab->nNVCol+nv); }else{ /* Stored columns go in column order */ assert( i-nv == sqlite3TableColumnToStorage(pTab,i) ); - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, iRegStore+i-nv); + sqlite3ExprCodeGeneratedColumn(pParse, &pTab->aCol[i], iRegStore+i-nv); } - colFlags &= ~COLFLAG_NOTAVAIL; + pTab->aCol[i].colFlags &= ~COLFLAG_NOTAVAIL; } if( (colFlags & COLFLAG_VIRTUAL)!=0 ) nv++; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 06464acb55..e2002810fe 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4096,6 +4096,9 @@ int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int, u8); void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); void sqlite3ExprCodeMove(Parse*, int, int, int); void sqlite3ExprCode(Parse*, Expr*, int); +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +void sqlite3ExprCodeGeneratedColumn(Parse*, Column*, int); +#endif void sqlite3ExprCodeCopy(Parse*, Expr*, int); void sqlite3ExprCodeFactorable(Parse*, Expr*, int); int sqlite3ExprCodeAtInit(Parse*, Expr*, int); From a1a01ffb5e06c70610e34d9401ce8ca6eb6e0a7e Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Oct 2019 00:31:01 +0000 Subject: [PATCH 076/476] Fix the foreign key logic to be compatible with generated columns. FossilOrigin-Name: 3de57145a18c62ff9b556c7218d8b276000d0052e4890212fa9335235f22d03c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/fkey.c | 16 +++++++++++----- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index da5bf8a3de..bc121493ef 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Take\sthe\sdeclared\scolumn\stime\sinto\saccount\swhen\scomputing\sthe\svalues\sfor\ngenerated\scolumns,\sand\sapply\sappropriate\saffinity. -D 2019-10-22T21:01:34.082 +C Fix\sthe\sforeign\skey\slogic\sto\sbe\scompatible\swith\sgenerated\scolumns. +D 2019-10-23T00:31:01.003 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/expr.c bf20202a8db15eda35f160df741805509be8c1e5e3258e4770e48db6e27d7994 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 +F src/fkey.c ac56f02ffe7a3dff311654f86e3c2fd1ff2eb38862b0c07fd908d8cc0fb4a9a2 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1fbd7438611174aa594485241c8cc2f4ea6d09c57ef2fc16c8995e8061fdfdd6 -R fea3b2f358faeafe90a4680ffb2fd073 +P 9e04ba22dfce3998e61331ac229ff543ecccc590284c9dd5def21efbe594fba0 +R 4efaab9a7b4cdb038809c0556992ee41 U drh -Z e96baec64b302955260568266fc4d764 +Z 7c33f9873611248b66edeb0dcba63fe2 diff --git a/manifest.uuid b/manifest.uuid index 5810853df2..858109fa2d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e04ba22dfce3998e61331ac229ff543ecccc590284c9dd5def21efbe594fba0 \ No newline at end of file +3de57145a18c62ff9b556c7218d8b276000d0052e4890212fa9335235f22d03c \ No newline at end of file diff --git a/src/fkey.c b/src/fkey.c index 1b86692da7..c57fb14657 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -349,7 +349,7 @@ static void fkLookupParent( VdbeCoverage(v); } for(i=0; inCol; i++){ - int iReg = aiCol[i] + regData + 1; + int iReg = sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[i]) + regData + 1; sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iOk); VdbeCoverage(v); } @@ -365,7 +365,8 @@ static void fkLookupParent( ** is no matching parent key. Before using MustBeInt, make a copy of ** the value. Otherwise, the value inserted into the child key column ** will have INTEGER affinity applied to it, which may not be correct. */ - sqlite3VdbeAddOp2(v, OP_SCopy, aiCol[0]+1+regData, regTemp); + sqlite3VdbeAddOp2(v, OP_SCopy, + sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[0])+1+regData, regTemp); iMustBeInt = sqlite3VdbeAddOp2(v, OP_MustBeInt, regTemp, 0); VdbeCoverage(v); @@ -392,7 +393,9 @@ static void fkLookupParent( sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); for(i=0; ipFrom, aiCol[i])+1+regData, + regTemp+i); } /* If the parent table is the same as the child table, and we are about @@ -408,8 +411,11 @@ static void fkLookupParent( if( pTab==pFKey->pFrom && nIncr==1 ){ int iJump = sqlite3VdbeCurrentAddr(v) + nCol + 1; for(i=0; iaiColumn[i]+1+regData; + int iChild = sqlite3TableColumnToStorage(pFKey->pFrom,aiCol[i]) + +1+regData; + int iParent = 1+regData; + iParent += sqlite3TableColumnToStorage(pIdx->pTable, + pIdx->aiColumn[i]); assert( pIdx->aiColumn[i]>=0 ); assert( aiCol[i]!=pTab->iPKey ); if( pIdx->aiColumn[i]==pTab->iPKey ){ From ab0992f022b4e9ee5f0ac79a2fb6b3556e8a9cb2 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Oct 2019 03:53:10 +0000 Subject: [PATCH 077/476] Fix incorrect arguments to testcase() macros. FossilOrigin-Name: 812467fbf04ce00228a8381a5eee471e4e35cc63184a4538129fcd70b7cec979 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 4 ++-- src/insert.c | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index bc121493ef..deb7a10bbb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sforeign\skey\slogic\sto\sbe\scompatible\swith\sgenerated\scolumns. -D 2019-10-23T00:31:01.003 +C Fix\sincorrect\sarguments\sto\stestcase()\smacros. +D 2019-10-23T03:53:10.742 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 27c8224737b4649ea6d264e8433e66bc226a6859c8e11a2f9849516c211da4d9 +F src/build.c 7e4c835984afd813ab0511e6d2b6dad8e8dd8ecd227c58d589f36f15d588730f F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 7ab2c74825809a7e3cb1fa5b480d052c96c939dafb449713a7a9da0d949447af +F src/insert.c aa90da6540183b60e91886648678d1ab785276c2a1b35f5d6ac6939b8c44300c F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9e04ba22dfce3998e61331ac229ff543ecccc590284c9dd5def21efbe594fba0 -R 4efaab9a7b4cdb038809c0556992ee41 +P 3de57145a18c62ff9b556c7218d8b276000d0052e4890212fa9335235f22d03c +R a55e27ef47378211556554247e39924e U drh -Z 7c33f9873611248b66edeb0dcba63fe2 +Z fccb2616701d2c5fa9e700807faeffc4 diff --git a/manifest.uuid b/manifest.uuid index 858109fa2d..d7d25eec60 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3de57145a18c62ff9b556c7218d8b276000d0052e4890212fa9335235f22d03c \ No newline at end of file +812467fbf04ce00228a8381a5eee471e4e35cc63184a4538129fcd70b7cec979 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 5cd9473fa2..51398f16f1 100644 --- a/src/build.c +++ b/src/build.c @@ -1407,8 +1407,8 @@ void sqlite3AddDefaultValue( pCol->zName); #ifndef SQLITE_OMIT_GENERATED_COLUMNS }else if( pCol->colFlags & COLFLAG_GENERATED ){ - testcase( pCol->colflags & COLFLAG_VIRTUAL ); - testcase( pCol->colflags & COLFLAG_STORED ); + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); sqlite3ErrorMsg(pParse, "cannot use DEFAULT on a generated column"); #endif }else{ diff --git a/src/insert.c b/src/insert.c index be5f49c9ec..5b2505b2c8 100644 --- a/src/insert.c +++ b/src/insert.c @@ -222,8 +222,8 @@ void sqlite3ComputeGeneratedColumns( */ for(i=0; inCol; i++){ if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ - testcase( pTab->aCol[i].colflags & COLFLAG_VIRTUAL ); - testcase( pTab->aCol[i].colflags & COLFLAG_STORED ); + testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); pTab->aCol[i].colFlags |= COLFLAG_NOTAVAIL; } } @@ -2440,8 +2440,8 @@ static int xferOptimization( /* Generator expressions for generated columns must match */ if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){ - testcase( pDestCol->colflags & COLFLAG_VIRTUAL ); - testcase( pDestCol->colflags & COLFLAG_STORED ); + testcase( pDestCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pDestCol->colFlags & COLFLAG_STORED ); return 0; /* Different generator expressions */ } } From 6ab61d7052d3d384e18f99af8dc4d70b42f93153 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Oct 2019 15:47:33 +0000 Subject: [PATCH 078/476] Minor adjustments for clarity and test coverage. FossilOrigin-Name: 30065716878d4058e75eb510b0b27b68e5193d04625eb173210de8061f20f499 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/build.c | 2 +- src/insert.c | 45 +++++++++++++++++++++++++++++++++------------ src/resolve.c | 2 +- src/update.c | 4 ++-- src/vdbe.c | 1 - 7 files changed, 48 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index deb7a10bbb..102c2bdc79 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sincorrect\sarguments\sto\stestcase()\smacros. -D 2019-10-23T03:53:10.742 +C Minor\sadjustments\sfor\sclarity\sand\stest\scoverage. +D 2019-10-23T15:47:33.769 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 7e4c835984afd813ab0511e6d2b6dad8e8dd8ecd227c58d589f36f15d588730f +F src/build.c f7070af66656b75be79a79a8ac720f4f0f8b48ba56298f2d9bf0f982d07ed949 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -486,7 +486,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c aa90da6540183b60e91886648678d1ab785276c2a1b35f5d6ac6939b8c44300c +F src/insert.c 54425efd1d2ce8715907d3df7341adc55173769b7b279f85c015bbeb36a82389 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -523,7 +523,7 @@ F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 2160146697e6e0ba251b5a954e16f542b6e684fb4778cec2994094ab401ef996 +F src/resolve.c 9d6a3bdca1ebc759c4616fee0d7dd4cf62741f53db3a6b0117600f27c5b1406a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 9c81d168b5a7ddc2277a6f6d3daec9ddd0ff5cebf12628d7e342f3c337231e7e F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa79 @@ -592,12 +592,12 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c 3a5e1fa8e29413ee633f049bf9f0e1eb33a03a53cb55b6ea290120b324fbf46e +F src/update.c ae657f0db6a255011759ab9345ded7b54b828329a9dba04f94b4d4fa6e70e1ad F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 9a3f4c2ec6c45e4bd5db465e77e79dfdf5bdc5cf3a8c0bfe9549da209b9c18bc +F src/vdbe.c 9e4ba6bb8e5b827b9ae771ba62a92f3099adaacd36838d54042eb2499cd7f6f5 F src/vdbe.h b02904e1bd45c26fdf00c04844b9cfa825763aa5150b6d89ce88b8ab03581d0a F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3de57145a18c62ff9b556c7218d8b276000d0052e4890212fa9335235f22d03c -R a55e27ef47378211556554247e39924e +P 812467fbf04ce00228a8381a5eee471e4e35cc63184a4538129fcd70b7cec979 +R f0b4a76631d2a0cb79112ae41777ee3f U drh -Z fccb2616701d2c5fa9e700807faeffc4 +Z 9a9ae7faa8a1962c89b9945fd49858aa diff --git a/manifest.uuid b/manifest.uuid index d7d25eec60..37b0f6f9cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -812467fbf04ce00228a8381a5eee471e4e35cc63184a4538129fcd70b7cec979 \ No newline at end of file +30065716878d4058e75eb510b0b27b68e5193d04625eb173210de8061f20f499 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 51398f16f1..ecf54fe8cd 100644 --- a/src/build.c +++ b/src/build.c @@ -1628,7 +1628,7 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ u8 eType = COLFLAG_VIRTUAL; Table *pTab = pParse->pNewTable; Column *pCol; - if( pTab==0 ) goto generated_done; + if( NEVER(pTab==0) ) goto generated_done; pCol = &(pTab->aCol[pTab->nCol-1]); if( IN_DECLARE_VTAB ){ sqlite3ErrorMsg(pParse, "virtual tables cannot use computed columns"); diff --git a/src/insert.c b/src/insert.c index 5b2505b2c8..b6fdc3927e 100644 --- a/src/insert.c +++ b/src/insert.c @@ -857,13 +857,13 @@ void sqlite3Insert( if( pColumn==0 && nColumn>0 ){ ipkColumn = pTab->iPKey; #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( pTab->tabFlags & TF_HasGenerated ){ + if( ipkColumn>=0 && (pTab->tabFlags & TF_HasGenerated)!=0 ){ testcase( pTab->tabFlags & TF_HasVirtual ); - testcase( pTab->tabFlags & TF_HasGenerated ); + testcase( pTab->tabFlags & TF_HasStored ); for(i=ipkColumn-1; i>=0; i--){ if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); - testcase( pTab->aCol[i].colFlags & COLFLAG_GENERATED ); + testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); ipkColumn--; } } @@ -2413,10 +2413,39 @@ static int xferOptimization( return 0; /* Neither table may have __hidden__ columns */ } #endif +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + /* Even if tables t1 and t2 have identical schemas, if they contain + ** generated columns, then this statement is semantically incorrect: + ** + ** INSERT INTO t2 SELECT * FROM t1; + ** + ** The reason is that generated column values are returned by the + ** the SELECT statement on the right but the INSERT statement on the + ** left wants them to be omitted. + ** + ** Nevertheless, this is a useful notational shorthand to tell SQLite + ** to do a bulk transfer all of the content from t1 over to t2. + ** + ** We could, in theory, disable this (except for internal use by the + ** VACUUM command where it is actually needed). But why do that? It + ** seems harmless enough, and provides a useful service. + */ if( (pDestCol->colFlags & COLFLAG_GENERATED) != (pSrcCol->colFlags & COLFLAG_GENERATED) ){ - return 0; /* Both columns have the same generated type */ + return 0; /* Both columns have the same generated-column type */ } + /* But the transfer is only allowed if both the source and destination + ** tables have the exact same expressions for generated columns. + ** This requirement could be relaxed for VIRTUAL columns, I suppose. + */ + if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ + if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){ + testcase( pDestCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pDestCol->colFlags & COLFLAG_STORED ); + return 0; /* Different generator expressions */ + } + } +#endif if( pDestCol->affinity!=pSrcCol->affinity ){ return 0; /* Affinity must be the same on all columns */ } @@ -2437,14 +2466,6 @@ static int xferOptimization( return 0; /* Default values must be the same for all columns */ } } - /* Generator expressions for generated columns must match */ - if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ - if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){ - testcase( pDestCol->colFlags & COLFLAG_VIRTUAL ); - testcase( pDestCol->colFlags & COLFLAG_STORED ); - return 0; /* Different generator expressions */ - } - } } for(pDestIdx=pDest->pIndex; pDestIdx; pDestIdx=pDestIdx->pNext){ if( IsUniqueIndex(pDestIdx) ){ diff --git a/src/resolve.c b/src/resolve.c index 657746842d..a9c20b1016 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -633,7 +633,7 @@ static void notValid( else if( pNC->ncFlags & NC_IsCheck ) zIn = "CHECK constraints"; #endif #ifndef SQLITE_OMIT_GENERATED_COLUMNS - else if( pNC->ncFlags & NC_GenCol ) zIn = "GENERATED ALWAYS AS columns"; + else if( pNC->ncFlags & NC_GenCol ) zIn = "generated columns"; #endif sqlite3ErrorMsg(pParse, "%s prohibited in %s", zMsg, zIn); } diff --git a/src/update.c b/src/update.c index d690b69f95..816a6818be 100644 --- a/src/update.c +++ b/src/update.c @@ -314,8 +314,8 @@ void sqlite3Update( } #ifndef SQLITE_OMIT_GENERATED_COLUMNS else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){ - testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ); - testcase( pTab->aCol[i].colFlags & COLFLAG_STORED ); + testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[j].colFlags & COLFLAG_STORED ); sqlite3ErrorMsg(pParse, "cannot UPDATE generated column \"%s\"", pTab->aCol[j].zName); diff --git a/src/vdbe.c b/src/vdbe.c index 1082b13d14..7c8d2a4ef7 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3375,7 +3375,6 @@ case OP_AutoCommit: { p->rc = rc = SQLITE_BUSY; goto vdbe_return; } - assert( db->nStatement==0 ); sqlite3CloseSavepoints(db); if( p->rc==SQLITE_OK ){ rc = SQLITE_DONE; From 269d322de2df4adb550acb17086e0e61596feffb Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Oct 2019 18:09:39 +0000 Subject: [PATCH 079/476] When a vector comparison appears in the WHERE clause and the constraint side has a COLLATE clause on the first term of the vector, be sure to honor that COLLATE clause. Ticket [135c9da7513e5a97]. FossilOrigin-Name: 978b2d20cf95d0b7143e3104ce1e9d5c85002867b554dc6b21deb528b730bbc7 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 4 ++++ src/parse.y | 3 +++ src/treeview.c | 4 +++- test/rowvalue.test | 22 ++++++++++++++++++++++ 6 files changed, 42 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 66bec473c0..589ff26abd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disqualify\srow-value\scomparisons\sfor\suse\sby\san\sindex\sif\sthe\sright-hand\sside\nhas\san\saffinity\sthat\sdoes\snot\smatch\sthe\sindex.\nFix\sfor\sticket\s[6ef984af8972c2eb] -D 2019-10-22T19:51:29.935 +C When\sa\svector\scomparison\sappears\sin\sthe\sWHERE\sclause\sand\sthe\sconstraint\sside\nhas\sa\sCOLLATE\sclause\son\sthe\sfirst\sterm\sof\sthe\svector,\sbe\ssure\sto\shonor\sthat\nCOLLATE\sclause.\s\sTicket\s[135c9da7513e5a97]. +D 2019-10-23T18:09:39.550 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c e5dad5e67aa3caed02a41c4822d3df6a1b43fd4a19e93aa0f4a1709405c483fe +F src/expr.c afa8c1082e1bbcf68673deabd973504f0f975162c910d39f04806439f20b3657 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 6271fda51794b569d736eba4097d28f13080cd0c9eb66d5fcecb4b77336fae50 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -514,7 +514,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 19c8b65c87a5bec5efcb7eaf44e3178d860bc77baab4b03d7b53b08369ac83bf +F src/parse.y 72886e0ce14abd97351b0e4414f0c734ca397afa9b224334bd099edb978a6788 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -590,7 +590,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d -F src/treeview.c fddeb413159c3eeeaea3f496172f121cf3695606c461dc4e6dcee51417952df5 +F src/treeview.c 19e660b3a4ff8ae7dda426795020f0d2e1b349fa8cad19af9c9bf2a9063f2ef9 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e F src/update.c 1487ee46b6ec36c59fe2c127b6f7daa88daaaf6e58eee8c441377f9b9fb5a684 F src/upsert.c 710c91bb13e3c3fed5b6fe17cb13e09560bdd003ad8b8c51e6b16c80cfc48b10 @@ -1260,7 +1260,7 @@ F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test 167919d94f2bec190c065f3448b24bc4f56b4f1f1c6cb4e490feae51ababf537 +F test/rowvalue.test 92dc2c5fad808d6764c8e5fa14360b89dacb3cb33ba1498a52f226f89a04a868 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c7da1c01f1f239e68c2173ac5748b8c5798271e43bdcee68f51f97cd0ca92bd5 -R 92e3bc21380d8b35cad891a2258f3a1e +P 5c118617cf08e17a6edfdfba86e3fc49132a780990b68b52724c2aaeac85f506 +R 24923192bf7ab8d42b7ba3bf0a0f6b7d U drh -Z d1b03389590fbac09e6d4dd5b27290df +Z 19f14a6ea97ac0c0f4e66fe45a2ec552 diff --git a/manifest.uuid b/manifest.uuid index 4be46212ea..dc947ef36d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c118617cf08e17a6edfdfba86e3fc49132a780990b68b52724c2aaeac85f506 \ No newline at end of file +978b2d20cf95d0b7143e3104ce1e9d5c85002867b554dc6b21deb528b730bbc7 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4a5c2d0ff2..3b02cb963e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -175,6 +175,10 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ p = p->pLeft; continue; } + if( op==TK_VECTOR ){ + p = p->x.pList->a[0].pExpr; + continue; + } if( op==TK_COLLATE ){ pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); break; diff --git a/src/parse.y b/src/parse.y index 7d31dda405..4d6fd6e823 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1071,6 +1071,9 @@ expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. { A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); if( A ){ A->x.pList = pList; + if( pList->nExpr ){ + A->flags |= pList->a[0].pExpr->flags & EP_Propagate; + } }else{ sqlite3ExprListDelete(pParse->db, pList); } diff --git a/src/treeview.c b/src/treeview.c index 4979f59b58..47d885aaa1 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -661,7 +661,9 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ break; } case TK_VECTOR: { - sqlite3TreeViewBareExprList(pView, pExpr->x.pList, "VECTOR"); + char *z = sqlite3_mprintf("VECTOR%s",zFlgs); + sqlite3TreeViewBareExprList(pView, pExpr->x.pList, z); + sqlite3_free(z); break; } case TK_SELECT_COLUMN: { diff --git a/test/rowvalue.test b/test/rowvalue.test index 8fb6e1ca02..746b137168 100644 --- a/test/rowvalue.test +++ b/test/rowvalue.test @@ -595,4 +595,26 @@ do_execsql_test 24.100 { SELECT 2 FROM t0 WHERE (t0.c0, TRUE) > (CAST('' AS REAL), FALSE); } {1 2} +# 2019-10-23 Ticket 135c9da7513e5a97 +do_execsql_test 25.10 { + DROP TABLE t0; + CREATE TABLE t0(c0 UNIQUE); + INSERT INTO t0(c0) VALUES('a'); + SELECT (t0.c0, 0) < ('B' COLLATE NOCASE, 0) FROM t0; + SELECT 2 FROM t0 WHERE (t0.c0, 0) < ('B' COLLATE NOCASE, 0); +} {1 2} +do_execsql_test 25.20 { + SELECT ('B' COLLATE NOCASE, 0)> (t0.c0, 0) FROM t0; + SELECT 2 FROM t0 WHERE ('B' COLLATE NOCASE, 0)> (t0.c0, 0); +} {1 2} +do_execsql_test 25.30 { + SELECT ('B', 0)> (t0.c0 COLLATE nocase, 0) FROM t0; + SELECT 2 FROM t0 WHERE ('B', 0)> (t0.c0 COLLATE nocase, 0); +} {1 2} +do_execsql_test 25.40 { + SELECT (t0.c0 COLLATE nocase, 0) < ('B', 0) FROM t0; + SELECT 2 FROM t0 WHERE (t0.c0 COLLATE nocase, 0) < ('B', 0); +} {1 2} + + finish_test From 31269a9f5ff767cb1b9e910b41124fa11aca32f2 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Oct 2019 21:00:40 +0000 Subject: [PATCH 080/476] Add an experimental set of UUID processing functions as the uuid.c extension in ext/misc/uuid.c. FossilOrigin-Name: 1a6e009372cf9571e540812c8607e95a86740112a1091f03e3f632339eccb629 --- ext/misc/uuid.c | 231 ++++++++++++++++++++++++++++++++++++++++++++++++ manifest | 11 +-- manifest.uuid | 2 +- 3 files changed, 238 insertions(+), 6 deletions(-) create mode 100644 ext/misc/uuid.c diff --git a/ext/misc/uuid.c b/ext/misc/uuid.c new file mode 100644 index 0000000000..cb2878b203 --- /dev/null +++ b/ext/misc/uuid.c @@ -0,0 +1,231 @@ +/* +** 2019-10-23 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This SQLite extension implements functions that handling RFC-4122 UUIDs +** Three SQL functions are implemented: +** +** uuid() - generate a version 4 UUID as a string +** uuid_str(X) - convert a UUID X into a well-formed UUID string +** uuid_blob(X) - convert a UUID X into a 16-byte blob +** +** The output from uuid() and uuid_str(X) are always well-formed RFC-4122 +** UUID strings in this format: +** +** xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx +** +** All of the 'x', 'M', and 'N' values are lower-case hexadecimal digits. +** The M digit indicates the "version". For uuid()-generated UUIDs, the +** version is always "4" (a random UUID). The upper three bits of N digit +** are the "variant". This library only supports variant 1 (indicated +** by values of N between '8' and 'b') as those are overwhelming the most +** common. Other variants are for legacy compatibility only. +** +** The output of uuid_blob(X) is always a 16-byte blob. The UUID input +** string is converted in network byte order (big-endian) in accordance +** with RFC-4122 specifications for variant-1 UUIDs. Note that network +** byte order is *always* used, even if the input self-identifies as a +** variant-2 UUID. +** +** The input X to the uuid_str() and uuid_blob() functions can be either +** a string or a BLOB. If it is a BLOB it must be exactly 16 bytes in +** length or else a NULL is returned. If the input is a string it must +** consist of 32 hexadecimal digits, upper or lower case, optionally +** surrounded by {...} and with optional "-" characters interposed in the +** middle. The flexibility of input is inspired by the PostgreSQL +** implementation of UUID functions that accept in all of the following +** formats: +** +** A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11 +** {a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11} +** a0eebc999c0b4ef8bb6d6bb9bd380a11 +** a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11 +** {a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11} +** +** If any of the above inputs are passed into uuid_str(), the output will +** always be in the canonical RFC-4122 format: +** +** a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11 +** +** If the X input string has too few or too many digits or contains +** stray characters other than {, }, or -, then NULL is returned. +*/ +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 +#include +#include +#include + +#if !defined(SQLITE_ASCII) && !defined(SQLITE_EBCDIC) +# define SQLITE_ASCII 1 +#endif + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +static unsigned char sqlite3UuidHexToInt(int h){ + assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_ASCII + h += 9*(1&(h>>6)); +#endif +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); +#endif + return (unsigned char)(h & 0xf); +} + +/* +** Convert a 16-byte BLOB into a well-formed RFC-4122 UUID. The output +** buffer zStr should be at least 37 bytes in length. The output will +** be zero-terminated. +*/ +static void sqlite3UuidBlobToStr( + const unsigned char *aBlob, /* Input blob */ + unsigned char *zStr /* Write the answer here */ +){ + static const char zDigits[] = "0123456789abcdef"; + int i, k; + unsigned char x; + k = 0; + for(i=0, k=0x550; i<16; i++, k=k>>1){ + if( k&1 ){ + zStr[0] = '-'; + zStr++; + } + x = aBlob[i]; + zStr[0] = zDigits[x>>4]; + zStr[1] = zDigits[x&0xf]; + zStr += 2; + } + *zStr = 0; +} + +/* +** Attempt to parse a zero-terminated input string zStr into a binary +** UUID. Return 0 on success, or non-zero if the input string is not +** parsable. +*/ +static int sqlite3UuidStrToBlob( + const unsigned char *zStr, /* Input string */ + unsigned char *aBlob /* Write results here */ +){ + int i; + if( zStr[0]=='{' ) zStr++; + for(i=0; i<16; i++){ + if( zStr[0]=='-' ) zStr++; + if( isxdigit(zStr[0]) && isxdigit(zStr[1]) ){ + aBlob[i] = (sqlite3UuidHexToInt(zStr[0])<<4) + + sqlite3UuidHexToInt(zStr[1]); + zStr += 2; + }else{ + return 1; + } + } + if( zStr[0]=='}' ) zStr++; + return zStr[0]!=0; +} + +/* +** Render sqlite3_value pIn as a 16-byte UUID blob. Return a pointer +** to the blob, or NULL if the input is not well-formed. +*/ +static const unsigned char *sqlite3UuidInputToBlob( + sqlite3_value *pIn, /* Input text */ + unsigned char *pBuf /* output buffer */ +){ + switch( sqlite3_value_type(pIn) ){ + case SQLITE_TEXT: { + const unsigned char *z = sqlite3_value_text(pIn); + if( sqlite3UuidStrToBlob(z, pBuf) ) return 0; + return pBuf; + } + case SQLITE_BLOB: { + int n = sqlite3_value_bytes(pIn); + return n==16 ? sqlite3_value_blob(pIn) : 0; + } + default: { + return 0; + } + } +} + +/* Implementation of uuid() */ +static void sqlite3UuidFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + unsigned char aBlob[16]; + unsigned char zStr[37]; + (void)argc; + (void)argv; + sqlite3_randomness(16, aBlob); + aBlob[6] = (aBlob[6]&0x0f) + 0x40; + aBlob[8] = (aBlob[8]&0x3f) + 0x80; + sqlite3UuidBlobToStr(aBlob, zStr); + sqlite3_result_text(context, (char*)zStr, 36, SQLITE_TRANSIENT); +} + +/* Implementation of uuid_str() */ +static void sqlite3UuidStrFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + unsigned char aBlob[16]; + unsigned char zStr[37]; + const unsigned char *pBlob; + (void)argc; + pBlob = sqlite3UuidInputToBlob(argv[0], aBlob); + if( pBlob==0 ) return; + sqlite3UuidBlobToStr(pBlob, zStr); + sqlite3_result_text(context, (char*)zStr, 36, SQLITE_TRANSIENT); +} + +/* Implementation of uuid_blob() */ +static void sqlite3UuidBlobFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + unsigned char aBlob[16]; + const unsigned char *pBlob; + (void)argc; + pBlob = sqlite3UuidInputToBlob(argv[0], aBlob); + if( pBlob==0 ) return; + sqlite3_result_blob(context, pBlob, 16, SQLITE_TRANSIENT); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_uuid_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + rc = sqlite3_create_function(db, "uuid", 0, SQLITE_UTF8, 0, + sqlite3UuidFunc, 0, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "uuid_str", 1, SQLITE_UTF8, 0, + sqlite3UuidStrFunc, 0, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3_create_function(db, "uuid_blob", 1, SQLITE_UTF8, 0, + sqlite3UuidBlobFunc, 0, 0); + } + return rc; +} diff --git a/manifest b/manifest index 589ff26abd..b48aecb39e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sa\svector\scomparison\sappears\sin\sthe\sWHERE\sclause\sand\sthe\sconstraint\sside\nhas\sa\sCOLLATE\sclause\son\sthe\sfirst\sterm\sof\sthe\svector,\sbe\ssure\sto\shonor\sthat\nCOLLATE\sclause.\s\sTicket\s[135c9da7513e5a97]. -D 2019-10-23T18:09:39.550 +C Add\san\sexperimental\sset\sof\sUUID\sprocessing\sfunctions\sas\sthe\suuid.c\nextension\sin\sext/misc/uuid.c. +D 2019-10-23T21:00:40.803 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -318,6 +318,7 @@ F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da9 F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061ef1625f9 +F ext/misc/uuid.c db4db81e8c6a92ad6176ebd9f81dcb6870e331e1a286d0452f4319e3ba3df812 F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057b1cdb F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae @@ -1847,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5c118617cf08e17a6edfdfba86e3fc49132a780990b68b52724c2aaeac85f506 -R 24923192bf7ab8d42b7ba3bf0a0f6b7d +P 978b2d20cf95d0b7143e3104ce1e9d5c85002867b554dc6b21deb528b730bbc7 +R 64938473a0a5ad3e464c05ab968a1d3f U drh -Z 19f14a6ea97ac0c0f4e66fe45a2ec552 +Z 064b470a12983289ba0d29967199891d diff --git a/manifest.uuid b/manifest.uuid index dc947ef36d..c7965852a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -978b2d20cf95d0b7143e3104ce1e9d5c85002867b554dc6b21deb528b730bbc7 \ No newline at end of file +1a6e009372cf9571e540812c8607e95a86740112a1091f03e3f632339eccb629 \ No newline at end of file From 035f6d909fcdd2b36320b07aec608a6c75187593 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Oct 2019 01:04:10 +0000 Subject: [PATCH 081/476] Do not allow ALTER TABLE ADD COLUMN for a STORED column. FossilOrigin-Name: 42fc08bc1528a34a603c2c085b515766a8d33ae7ea0350a52b0ca24b94ebcbc5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/alter.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 102c2bdc79..c2f6adb666 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sadjustments\sfor\sclarity\sand\stest\scoverage. -D 2019-10-23T15:47:33.769 +C Do\snot\sallow\sALTER\sTABLE\sADD\sCOLUMN\sfor\sa\sSTORED\scolumn. +D 2019-10-24T01:04:10.370 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -459,7 +459,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c fa7486bfd12be8c8a0d4425767fa42203ca9e946c9613bb37924643c622706bf +F src/alter.c 0fdf14a1d1c61315a6d727252c579bc8cbfe62de195df6979dd784374e22032b F src/analyze.c fd70b9c7a683230a7f7936af64dd25308e93d7c9819a3168493a7c7703481f80 F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 812467fbf04ce00228a8381a5eee471e4e35cc63184a4538129fcd70b7cec979 -R f0b4a76631d2a0cb79112ae41777ee3f +P 30065716878d4058e75eb510b0b27b68e5193d04625eb173210de8061f20f499 +R 7202e3e1ab0c99bc839229fb4e803cbe U drh -Z 9a9ae7faa8a1962c89b9945fd49858aa +Z 98506792ef3b33ac52584457b01d83d1 diff --git a/manifest.uuid b/manifest.uuid index 37b0f6f9cd..9afd35a970 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -30065716878d4058e75eb510b0b27b68e5193d04625eb173210de8061f20f499 \ No newline at end of file +42fc08bc1528a34a603c2c085b515766a8d33ae7ea0350a52b0ca24b94ebcbc5 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index b7389bf9cb..0a82327d63 100644 --- a/src/alter.c +++ b/src/alter.c @@ -349,6 +349,9 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ } sqlite3ValueFree(pVal); } + }else if( pCol->colFlags & COLFLAG_STORED ){ + sqlite3ErrorMsg(pParse, "cannot add a STORED column"); + return; } From 06baba54b4d097113e8a425010d31f044df57f4b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Oct 2019 19:35:26 +0000 Subject: [PATCH 082/476] Correction to check-in [bec5b6d4d083556d] so that it detects *all* triggers that might perturb the insertion cursor. Ticket [50c09fc2cf0d91ce]. FossilOrigin-Name: 521f1d36282549488a47a434484a24924ee970d29f05a8ae499b7d536bcd692b --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/insert.c | 4 +--- src/vdbe.h | 3 +-- src/vdbeaux.c | 7 +++++++ test/trigger1.test | 16 ++++++++++++++++ 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index b48aecb39e..9d3af284e6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sexperimental\sset\sof\sUUID\sprocessing\sfunctions\sas\sthe\suuid.c\nextension\sin\sext/misc/uuid.c. -D 2019-10-23T21:00:40.803 +C Correction\sto\scheck-in\s[bec5b6d4d083556d]\sso\sthat\sit\sdetects\s*all*\ntriggers\sthat\smight\sperturb\sthe\sinsertion\scursor.\nTicket\s[50c09fc2cf0d91ce]. +D 2019-10-24T19:35:26.195 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 69e47d76598d26f87cc9b32b9e9fc84e49e3b9371b5d9ae8465f38486ad9665e +F src/insert.c 2b930afc0fb4c245916d19f638e4b332f4a6d8a3a7c73c288ec18e25caf46900 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -599,10 +599,10 @@ F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 9a3f4c2ec6c45e4bd5db465e77e79dfdf5bdc5cf3a8c0bfe9549da209b9c18bc -F src/vdbe.h 3f2b571e702e77e6bf031f0236e554aedfae643e991f69000320f481408455cf +F src/vdbe.h 7fbde1e64423368d7fd9b606dcde1c90eb24f6f7ea1f625d161731ac2f703fca F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 95001d0f84ee3cda344fed98ca0d7961deb4fc836b83495630d0af1f7cc4789e -F src/vdbeaux.c a35a1785f980c44838b636a6d55a46b25ad80f2a2065851f165ab143aa46f99c +F src/vdbeaux.c be3e250525e4a75f82a8cfa0dcfe2e9cad058cf16c8c568677c2b13043db1e2d F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -1570,7 +1570,7 @@ F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 F test/transitive1.test 293300f46916569f08875cdb2fe2134be2c27677 -F test/trigger1.test 6be279c9d48b25320eab68c30fd5268ab787955679f4c584128f71800247fb50 +F test/trigger1.test 746dc327e2a0817a22bfc6f5a5e423483d3e77b3733ac20a8fe939e6541b5e53 F test/trigger2.test 5cd7d69a7ba1143ee045e4ae2963ff32ae4c87a6 F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 978b2d20cf95d0b7143e3104ce1e9d5c85002867b554dc6b21deb528b730bbc7 -R 64938473a0a5ad3e464c05ab968a1d3f +P 1a6e009372cf9571e540812c8607e95a86740112a1091f03e3f632339eccb629 +R 261f5a821821bff58698ad94c5756d8a U drh -Z 064b470a12983289ba0d29967199891d +Z 32a0c838e11db7d7d6e97512ba7b2d3c diff --git a/manifest.uuid b/manifest.uuid index c7965852a7..0f8ad72971 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1a6e009372cf9571e540812c8607e95a86740112a1091f03e3f632339eccb629 \ No newline at end of file +521f1d36282549488a47a434484a24924ee970d29f05a8ae499b7d536bcd692b \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 3bb1ee706a..77b402c7ec 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1058,9 +1058,7 @@ void sqlite3Insert( ** cursor that is disturbed. And these instructions both clear the ** VdbeCursor.seekResult variable, disabling the OPFLAG_USESEEKRESULT ** functionality. */ - bUseSeek = (isReplace==0 || (pTrigger==0 && - ((db->flags & SQLITE_ForeignKeys)==0 || sqlite3FkReferences(pTab)==0) - )); + bUseSeek = (isReplace==0 || !sqlite3VdbeHasSubProgram(v)); sqlite3CompleteInsertion(pParse, pTab, iDataCur, iIdxCur, regIns, aRegIdx, 0, appendFlag, bUseSeek ); diff --git a/src/vdbe.h b/src/vdbe.h index e3aaaa1ce2..b59fc7a26d 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -278,9 +278,8 @@ UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(KeyInfo*); typedef int (*RecordCompare)(int,const void*,UnpackedRecord*); RecordCompare sqlite3VdbeFindCompare(UnpackedRecord*); -#ifndef SQLITE_OMIT_TRIGGER void sqlite3VdbeLinkSubProgram(Vdbe *, SubProgram *); -#endif +int sqlite3VdbeHasSubProgram(Vdbe*); int sqlite3NotPureFunc(sqlite3_context*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index c89b7d4197..86980b4ddc 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1098,6 +1098,13 @@ void sqlite3VdbeLinkSubProgram(Vdbe *pVdbe, SubProgram *p){ pVdbe->pProgram = p; } +/* +** Return true if the given Vdbe has any SubPrograms. +*/ +int sqlite3VdbeHasSubProgram(Vdbe *pVdbe){ + return pVdbe->pProgram!=0; +} + /* ** Change the opcode at addr into OP_Noop */ diff --git a/test/trigger1.test b/test/trigger1.test index ddb40e3adb..8fc3c74e77 100644 --- a/test/trigger1.test +++ b/test/trigger1.test @@ -782,4 +782,20 @@ do_execsql_test trigger1-20.1 { DROP TRIGGER r20_3; } {} +# 2019-10-24 ticket 50c09fc2cf0d91ce +# +db close +sqlite3 db :memory: +do_execsql_test trigger1-21.1 { + PRAGMA recursive_triggers = true; + CREATE TABLE t0(a, b, c UNIQUE); + CREATE UNIQUE INDEX i0 ON t0(b) WHERE a; + CREATE TRIGGER tr0 AFTER DELETE ON t0 BEGIN + DELETE FROM t0; + END; + INSERT INTO t0(a,b,c) VALUES(0,0,9),(1,1,1); + REPLACE INTO t0(a,b,c) VALUES(2,0,9); + SELECT * FROM t0; +} {2 0 9} + finish_test From c7476735c9b9e377958ab404f0130f3f43a219dc Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Oct 2019 20:29:25 +0000 Subject: [PATCH 083/476] Fix handling of covering indexes that use virtual columns. FossilOrigin-Name: e0f7e321eca91c49102649f70728de69347cbd7b16599b854203c24cfdc348e6 --- manifest | 16 +++++++-------- manifest.uuid | 2 +- src/build.c | 20 ++++++++++++++++--- src/sqliteInt.h | 1 + src/wherecode.c | 52 ++++++++++++++++++++++++++++++++++++++++++------- 5 files changed, 72 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index c2f6adb666..ef84588b6f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\sALTER\sTABLE\sADD\sCOLUMN\sfor\sa\sSTORED\scolumn. -D 2019-10-24T01:04:10.370 +C Fix\shandling\sof\scovering\sindexes\sthat\suse\svirtual\scolumns. +D 2019-10-24T20:29:25.035 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -469,7 +469,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c f7070af66656b75be79a79a8ac720f4f0f8b48ba56298f2d9bf0f982d07ed949 +F src/build.c 0c9704f95817aa585fdad2668c611280d0b62bc4c1c836cd1c797ba96879a7d6 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -530,7 +530,7 @@ F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa7 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h f8609e5a04eec2e89f35520b31c0b506ef905a3485f09b4dc4e20583743cee31 +F src/sqliteInt.h 5b2d25ba23135ece06886d82f60d9a16869506592e5950f3c09257b3b5d28d5c F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -613,7 +613,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 6ff3ef076485dd71efbbabcc7ddc0473c04a9bdcb524128939757b002466f2d1 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c d96190c0b536339375846048ad3c41758b4bd6baaf8f8f350da5911d42bc4a61 +F src/wherecode.c c491ae0ce1de97bc4eea566350a2d1e7c2c5fcf97b9d4c89593c4f068e21a30d F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 30065716878d4058e75eb510b0b27b68e5193d04625eb173210de8061f20f499 -R 7202e3e1ab0c99bc839229fb4e803cbe +P 42fc08bc1528a34a603c2c085b515766a8d33ae7ea0350a52b0ca24b94ebcbc5 +R 6a9e8fc570824aa923ac6838bd994212 U drh -Z 98506792ef3b33ac52584457b01d83d1 +Z b5f3ce7a354e5714077f87bfe3d7f12c diff --git a/manifest.uuid b/manifest.uuid index 9afd35a970..7f612f17c0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -42fc08bc1528a34a603c2c085b515766a8d33ae7ea0350a52b0ca24b94ebcbc5 \ No newline at end of file +e0f7e321eca91c49102649f70728de69347cbd7b16599b854203c24cfdc348e6 \ No newline at end of file diff --git a/src/build.c b/src/build.c index ecf54fe8cd..84440af676 100644 --- a/src/build.c +++ b/src/build.c @@ -1923,15 +1923,24 @@ static int isDupColumn(Index *pIdx, int nKey, Index *pPk, int iCol){ ** high-order bit of colNotIdxed is always 1. All unindexed columns ** of the table have a 1. ** +** 2019-10-24: For the purpose of this computation, virtual columns are +** not considered to be covered by the index, even if they are in the +** index, because we do not trust the logic in whereIndexExprTrans() to be +** able to find all instances of a reference to the indexed table column +** and convert them into references to the index. Hence we always want +** the actual table at hand in order to recompute the virtual column, if +** necessary. +** ** The colNotIdxed mask is AND-ed with the SrcList.a[].colUsed mask ** to determine if the index is covering index. */ static void recomputeColumnsNotIndexed(Index *pIdx){ Bitmask m = 0; int j; + Table *pTab = pIdx->pTable; for(j=pIdx->nColumn-1; j>=0; j--){ int x = pIdx->aiColumn[j]; - if( x>=0 ){ + if( x>=0 && (pTab->aCol[x].colFlags & COLFLAG_VIRTUAL)==0 ){ testcase( x==BMS-1 ); testcase( x==BMS-2 ); if( xiPKey; - }else if( pTab->aCol[j].notNull==0 ){ - pIndex->uniqNotNull = 0; + }else{ + if( pTab->aCol[j].notNull==0 ){ + pIndex->uniqNotNull = 0; + } + if( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ){ + pIndex->bHasVCol = 1; + } } pIndex->aiColumn[i] = (i16)j; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e2002810fe..d8668a278f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2295,6 +2295,7 @@ struct Index { unsigned hasStat1:1; /* aiRowLogEst values come from sqlite_stat1 */ unsigned bNoQuery:1; /* Do not use this index to optimize queries */ unsigned bAscKeyBug:1; /* True if the bba7b69f9849b5bf bug applies */ + unsigned bHasVCol:1; /* Index references one or more VIRTUAL columns */ #ifdef SQLITE_ENABLE_STAT4 int nSample; /* Number of elements in aSample[] */ int nSampleCol; /* Size of IndexSample.anEq[] and so on */ diff --git a/src/wherecode.c b/src/wherecode.c index 686a8d6f9a..0438cca54a 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1106,6 +1106,7 @@ typedef struct IdxExprTrans { int iTabCur; /* The cursor of the corresponding table */ int iIdxCur; /* The cursor for the index */ int iIdxCol; /* The column for the index */ + int iTabCol; /* The column for the table */ } IdxExprTrans; /* The walker node callback used to transform matching expressions into @@ -1128,10 +1129,30 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ } } +#ifndef SQLITE_OMIT_GENERATED_COLUMNS +/* A walker node callback that translates a column reference to a table +** into a corresponding column reference of an index. +*/ +static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + IdxExprTrans *pX = p->u.pIdxTrans; + if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ + pExpr->iTable = pX->iIdxCur; + pExpr->iColumn = pX->iIdxCol; + } + } + return WRC_Continue; +} +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + /* ** For an indexes on expression X, locate every instance of expression X ** in pExpr and change that subexpression into a reference to the appropriate ** column of the index. +** +** 2019-10-24: Updated to also translate references to a VIRTUAL column in +** the table into references to the corresponding (stored) column of the +** index. */ static void whereIndexExprTrans( Index *pIdx, /* The Index */ @@ -1141,20 +1162,35 @@ static void whereIndexExprTrans( ){ int iIdxCol; /* Column number of the index */ ExprList *aColExpr; /* Expressions that are indexed */ + Table *pTab; Walker w; IdxExprTrans x; aColExpr = pIdx->aColExpr; - if( aColExpr==0 ) return; /* Not an index on expressions */ + if( aColExpr==0 && !pIdx->bHasVCol ){ + /* The index does not reference any expressions or virtual columns + ** so no translations are needed. */ + return; + } + pTab = pIdx->pTable; memset(&w, 0, sizeof(w)); - w.xExprCallback = whereIndexExprTransNode; w.u.pIdxTrans = &x; x.iTabCur = iTabCur; x.iIdxCur = iIdxCur; - for(iIdxCol=0; iIdxColnExpr; iIdxCol++){ - if( pIdx->aiColumn[iIdxCol]!=XN_EXPR ) continue; - assert( aColExpr->a[iIdxCol].pExpr!=0 ); + for(iIdxCol=0; iIdxColnColumn; iIdxCol++){ + i16 iRef = pIdx->aiColumn[iIdxCol]; + if( iRef==XN_EXPR ){ + assert( aColExpr->a[iIdxCol].pExpr!=0 ); + x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; + w.xExprCallback = whereIndexExprTransNode; +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + }else if( iRef>=0 && (pTab->aCol[iRef].colFlags & COLFLAG_VIRTUAL)!=0 ){ + x.iTabCol = iRef; + w.xExprCallback = whereIndexExprTransColumn; +#endif /* SQLITE_OMIT_GENERATED_COLUMNS */ + }else{ + continue; + } x.iIdxCol = iIdxCol; - x.pIdxExpr = aColExpr->a[iIdxCol].pExpr; sqlite3WalkExpr(&w, pWInfo->pWhere); sqlite3WalkExprList(&w, pWInfo->pOrderBy); sqlite3WalkExprList(&w, pWInfo->pResultSet); @@ -1835,7 +1871,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( /* If pIdx is an index on one or more expressions, then look through ** all the expressions in pWInfo and try to transform matching expressions - ** into reference to index columns. + ** into reference to index columns. Also attempt to translate references + ** to virtual columns in the table into references to (stored) columns + ** of the index. ** ** Do not do this for the RHS of a LEFT JOIN. This is because the ** expression may be evaluated after OP_NullRow has been executed on From ef2df8f3435edb6ad260ab6ebbf0f151bf0a2a48 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 24 Oct 2019 20:35:27 +0000 Subject: [PATCH 084/476] In fts5, fix a case of overreading a buffer by 1 byte when counting characters in malformed utf-8. Fix for [dd1f67bf]. FossilOrigin-Name: 8d964e1c21d4cea699023e02b0616a75c5859dd083c9365cdcbc0676ebbdaae4 --- ext/fts5/fts5_index.c | 1 + ext/fts5/test/fts5misc.test | 13 +++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 816274df49..015696f7b6 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5318,6 +5318,7 @@ int sqlite3Fts5IndexCharlenToBytelen( for(i=0; i=nByte ) return 0; /* Input contains fewer than nChar chars */ if( (unsigned char)p[n++]>=0xc0 ){ + if( n>=nByte ) break; while( (p[n] & 0xc0)==0x80 ){ n++; if( n>=nByte ) break; diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index 9be73aeb3b..e58ae90547 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -218,6 +218,19 @@ do_execsql_test 7.2 { SELECT rowid FROM t1 WHERE rowid=2 AND t1 = 'hello'; } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 8.0 { + CREATE VIRTUAL TABLE vt0 USING fts5(c0, tokenize = "ascii", prefix = 1); + INSERT INTO vt0(c0) VALUES (x'd1'); +} + +breakpoint +do_execsql_test 8.1 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test diff --git a/manifest b/manifest index 9d3af284e6..f9593b107f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correction\sto\scheck-in\s[bec5b6d4d083556d]\sso\sthat\sit\sdetects\s*all*\ntriggers\sthat\smight\sperturb\sthe\sinsertion\scursor.\nTicket\s[50c09fc2cf0d91ce]. -D 2019-10-24T19:35:26.195 +C In\sfts5,\sfix\sa\scase\sof\soverreading\sa\sbuffer\sby\s1\sbyte\swhen\scounting\scharacters\sin\smalformed\sutf-8.\sFix\sfor\s[dd1f67bf]. +D 2019-10-24T20:35:27.749 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -116,7 +116,7 @@ F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6 F ext/fts5/fts5_config.c aab6117f8f85933e051c66f227414fdcaf7f2313688e16276b895f9d42d28e5c F ext/fts5/fts5_expr.c 5661fe64f4f5a499710df9561075de84b743f01e808af46df4130a9ec343a0fd F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c d1bfebebe873905fe5d450e275b45af2d635b3e276452086f681c6d3d750398d +F ext/fts5/fts5_index.c 99b77ae1f503978ca76985bcfff7345c822aed8bbaa8edb3747f804f614685b5 F ext/fts5/fts5_main.c 1b2d41fd7cc2e8277f60e4156826f41fe5d6b1ccc2e54d70450883ab2ca697d2 F ext/fts5/fts5_storage.c 167e3d8f8052a71032d498e32a2f2ed5ffe489e5d4d47e298adfa02ed55c7882 F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test adfccd3f065df52e306778c815f873ab779b9db34e9817b1d4b819132f914701 +F ext/fts5/test/fts5misc.test 1aefd6607106659a87dbce9f4766616c91e790ea84b9fa42e65096b7c99a132e F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1a6e009372cf9571e540812c8607e95a86740112a1091f03e3f632339eccb629 -R 261f5a821821bff58698ad94c5756d8a -U drh -Z 32a0c838e11db7d7d6e97512ba7b2d3c +P 521f1d36282549488a47a434484a24924ee970d29f05a8ae499b7d536bcd692b +R 0e068e9d9a1f90654b1d1392ec7133b9 +U dan +Z de4cd0a7404bbb9013415658a762354d diff --git a/manifest.uuid b/manifest.uuid index 0f8ad72971..05a16eff55 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -521f1d36282549488a47a434484a24924ee970d29f05a8ae499b7d536bcd692b \ No newline at end of file +8d964e1c21d4cea699023e02b0616a75c5859dd083c9365cdcbc0676ebbdaae4 \ No newline at end of file From 4485ac1a25e9919b5911a0db2ad7bed58be143d6 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Oct 2019 21:02:06 +0000 Subject: [PATCH 085/476] The previous fix was incomplete. It is also necessary to disable the Expr.y.pTab field when making the translation. FossilOrigin-Name: b99d5701312f7472e6b606bd824f9273617e2655920485bf50aa96d408064721 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index ef84588b6f..72ada93e96 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\shandling\sof\scovering\sindexes\sthat\suse\svirtual\scolumns. -D 2019-10-24T20:29:25.035 +C The\sprevious\sfix\swas\sincomplete.\s\sIt\sis\salso\snecessary\sto\sdisable\sthe\nExpr.y.pTab\sfield\swhen\smaking\sthe\stranslation. +D 2019-10-24T21:02:06.779 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -613,7 +613,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 6ff3ef076485dd71efbbabcc7ddc0473c04a9bdcb524128939757b002466f2d1 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c c491ae0ce1de97bc4eea566350a2d1e7c2c5fcf97b9d4c89593c4f068e21a30d +F src/wherecode.c 28a3f27b44165e05bac3031f9a9ee9901305647b6c9dfc0214544578066ab097 F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1847,7 +1847,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 42fc08bc1528a34a603c2c085b515766a8d33ae7ea0350a52b0ca24b94ebcbc5 -R 6a9e8fc570824aa923ac6838bd994212 +P e0f7e321eca91c49102649f70728de69347cbd7b16599b854203c24cfdc348e6 +R fd3794f20216cf9a398f8319df03644c U drh -Z b5f3ce7a354e5714077f87bfe3d7f12c +Z 2a2696445dbabbaa1fdad14d659304f0 diff --git a/manifest.uuid b/manifest.uuid index 7f612f17c0..7d09a5409c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e0f7e321eca91c49102649f70728de69347cbd7b16599b854203c24cfdc348e6 \ No newline at end of file +b99d5701312f7472e6b606bd824f9273617e2655920485bf50aa96d408064721 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 0438cca54a..351af766e6 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1139,6 +1139,7 @@ static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; + pExpr->y.pTab = 0; } } return WRC_Continue; From db561bcedaa38da1c4ac5097d6cab9e9567b1f1d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Oct 2019 14:46:05 +0000 Subject: [PATCH 086/476] Performance optimization in sqlite3BtreeCursor(). FossilOrigin-Name: ea068b099c96b8b9526114732d2a6be186cf381b7329d102778ad25b95510c9e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 33 +++++++++++++++++++++++---------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index f9593b107f..ca33b71ebd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sfts5,\sfix\sa\scase\sof\soverreading\sa\sbuffer\sby\s1\sbyte\swhen\scounting\scharacters\sin\smalformed\sutf-8.\sFix\sfor\s[dd1f67bf]. -D 2019-10-24T20:35:27.749 +C Performance\soptimization\sin\ssqlite3BtreeCursor(). +D 2019-10-25T14:46:05.015 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -467,7 +467,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5 +F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 F src/build.c 0e558ef847ccc4b6aa38dee44cde9d9df46e953b0a66e4fa4376265824955fe3 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 521f1d36282549488a47a434484a24924ee970d29f05a8ae499b7d536bcd692b -R 0e068e9d9a1f90654b1d1392ec7133b9 -U dan -Z de4cd0a7404bbb9013415658a762354d +P 8d964e1c21d4cea699023e02b0616a75c5859dd083c9365cdcbc0676ebbdaae4 +R 8536c2fabd9f7098038221269ecc3472 +U drh +Z ac1675b2b1cf8ed8d7717d3ccad9b463 diff --git a/manifest.uuid b/manifest.uuid index 05a16eff55..9f2d452b24 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8d964e1c21d4cea699023e02b0616a75c5859dd083c9365cdcbc0676ebbdaae4 \ No newline at end of file +ea068b099c96b8b9526114732d2a6be186cf381b7329d102778ad25b95510c9e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 2150638aee..b4c787edbf 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4379,9 +4379,13 @@ static int btreeCursor( allocateTempSpace(pBt); if( pBt->pTmpSpace==0 ) return SQLITE_NOMEM_BKPT; } - if( iTable==1 && btreePagecount(pBt)==0 ){ - assert( wrFlag==0 ); - iTable = 0; + if( iTable<=1 ){ + if( iTable<1 ){ + return SQLITE_CORRUPT_BKPT; + }else if( btreePagecount(pBt)==0 ){ + assert( wrFlag==0 ); + iTable = 0; + } } /* Now that no other errors can occur, finish filling in the BtCursor @@ -4406,6 +4410,19 @@ static int btreeCursor( pCur->eState = CURSOR_INVALID; return SQLITE_OK; } +static int btreeCursorWithLock( + Btree *p, /* The btree */ + int iTable, /* Root page of table to open */ + int wrFlag, /* 1 to write. 0 read-only */ + struct KeyInfo *pKeyInfo, /* First arg to comparison function */ + BtCursor *pCur /* Space for new cursor */ +){ + int rc; + sqlite3BtreeEnter(p); + rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); + sqlite3BtreeLeave(p); + return rc; +} int sqlite3BtreeCursor( Btree *p, /* The btree */ int iTable, /* Root page of table to open */ @@ -4413,15 +4430,11 @@ int sqlite3BtreeCursor( struct KeyInfo *pKeyInfo, /* First arg to xCompare() */ BtCursor *pCur /* Write new cursor here */ ){ - int rc; - if( iTable<1 ){ - rc = SQLITE_CORRUPT_BKPT; + if( p->sharable ){ + return btreeCursorWithLock(p, iTable, wrFlag, pKeyInfo, pCur); }else{ - sqlite3BtreeEnter(p); - rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); - sqlite3BtreeLeave(p); + return btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur); } - return rc; } /* From a407eccb6179ee033b8e83a6eab4734dd075664b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Oct 2019 00:04:21 +0000 Subject: [PATCH 087/476] If replace triggers are run during uniqueness checking, then rerun all uniqueness checks a second time using the ABORT algorithm. Fix for ticket [c1e19e12046d23fe] FossilOrigin-Name: fbac0c65d8464b126d385262d176864add55452ec9e3d5eb76ffee06e820cb9c --- manifest | 14 ++--- manifest.uuid | 2 +- src/insert.c | 143 ++++++++++++++++++++++++++++++++++++++++------- test/insert.test | 25 ++++++++- 4 files changed, 154 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index ca33b71ebd..fd044ebade 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sin\ssqlite3BtreeCursor(). -D 2019-10-25T14:46:05.015 +C If\sreplace\striggers\sare\srun\sduring\suniqueness\schecking,\sthen\srerun\sall\nuniqueness\schecks\sa\ssecond\stime\susing\sthe\sABORT\salgorithm.\nFix\sfor\sticket\s[c1e19e12046d23fe] +D 2019-10-26T00:04:21.466 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 2b930afc0fb4c245916d19f638e4b332f4a6d8a3a7c73c288ec18e25caf46900 +F src/insert.c 83ccd3f1f45f048bca2dbc0f9c34e8f3a57fdcbc43ddec04a7938090ffb85a9e F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1061,7 +1061,7 @@ F test/indexexpr1.test c26c8b352311c1deb30642cd0379e5cb94e416c7e9e0885e92d9e0155 F test/indexexpr2.test b580f378423bca443ffab47ada677203cfcf8a60f48a8aa20065f27c8f7739b5 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test c0e1b23f6359e06316b3a49f7747c5d65c0b6473619011e4fb86f6801edba6df +F test/insert.test d15bf96ec2120ecd27cb07be2b44b141a98b4b7f58762a40178f8205f9b9a96a F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test 7802ada6ba8738661b9f6c0e26858d3375b40cc7180289fd350644cd7a08fec9 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8d964e1c21d4cea699023e02b0616a75c5859dd083c9365cdcbc0676ebbdaae4 -R 8536c2fabd9f7098038221269ecc3472 +P ea068b099c96b8b9526114732d2a6be186cf381b7329d102778ad25b95510c9e +R cace6824aa8651d52f54d321985ad4c0 U drh -Z ac1675b2b1cf8ed8d7717d3ccad9b463 +Z 1fcf2849ed7e21c156487e77513e1cff diff --git a/manifest.uuid b/manifest.uuid index 9f2d452b24..62410d7fa7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea068b099c96b8b9526114732d2a6be186cf381b7329d102778ad25b95510c9e \ No newline at end of file +fbac0c65d8464b126d385262d176864add55452ec9e3d5eb76ffee06e820cb9c \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 77b402c7ec..e435f4363d 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1319,6 +1319,13 @@ void sqlite3GenerateConstraintChecks( int upsertJump = 0; /* Address of Goto that jumps into upsert subroutine */ int ipkTop = 0; /* Top of the IPK uniqueness check */ int ipkBottom = 0; /* OP_Goto at the end of the IPK uniqueness check */ + /* Variables associated with retesting uniqueness constraints after + ** replace triggers fire have run */ + int regTrigCnt; /* Register used to count replace trigger invocations */ + int addrRecheck = 0; /* Jump here to recheck all uniqueness constraints */ + int lblRecheckOk = 0; /* Each recheck jumps to this label if it passes */ + Trigger *pTrigger; /* List of DELETE triggers on the table pTab */ + int nReplaceTrig = 0; /* Number of replace triggers coded */ isUpdate = regOldData!=0; db = pParse->db; @@ -1483,6 +1490,50 @@ void sqlite3GenerateConstraintChecks( } } + /* Determine if it is possible that triggers (either explicitly coded + ** triggers or FK resolution actions) might run as a result of deletes + ** that happen when OE_Replace conflict resolution occurs. (Call these + ** "replace triggers".) If any replace triggers run, we will need to + ** recheck all of the uniqueness constraints after they have all run. + ** But on the recheck, the resolution is OE_Abort instead of OE_Replace. + ** + ** If replace triggers are a possibility, then + ** + ** (1) Allocate register regTrigCnt and initialize it to zero. + ** That register will count the number of replace triggers that + ** fire. Constraint recheck only occurs if the number if positive. + ** (2) Initialize pTrigger to the set of all DELETE triggers. + ** (3) Initialize addrRecheck and lblRecheckOk + ** + ** The uniqueness rechecking code will create a series of tests to run + ** in a second pass. The addrRecheck and lblRecheckOk variables are + ** used to link together these tests which are separated from each other + ** in the generate bytecode. + */ + if( (db->flags & (SQLITE_RecTriggers|SQLITE_ForeignKeys))==0 ){ + /* There are not DELETE triggers nor FK constraints. No constraint + ** rechecks are needed. */ + pTrigger = 0; + regTrigCnt = 0; + }else{ + if( db->flags&SQLITE_RecTriggers ){ + pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); + regTrigCnt = pTrigger!=0 || sqlite3FkRequired(pParse, pTab, 0, 0); + }else{ + pTrigger = 0; + regTrigCnt = sqlite3FkRequired(pParse, pTab, 0, 0); + } + if( regTrigCnt ){ + /* Replace triggers might exist. Allocate the counter and + ** initialize it to zero. */ + regTrigCnt = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Integer, 0, regTrigCnt); + VdbeComment((v, "trigger count")); + lblRecheckOk = sqlite3VdbeMakeLabel(pParse); + addrRecheck = lblRecheckOk; + } + } + /* If rowid is changing, make sure the new rowid does not previously ** exist in the table. */ @@ -1572,17 +1623,12 @@ void sqlite3GenerateConstraintChecks( ** to run without a statement journal if there are no indexes on the ** table. */ - Trigger *pTrigger = 0; - if( db->flags&SQLITE_RecTriggers ){ - pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); - } - if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ + if( regTrigCnt ){ sqlite3MultiWrite(pParse); sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regNewData, 1, 0, OE_Replace, 1, -1); - sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRowidOk, regNewData); - VdbeCoverage(v); - sqlite3RowidConstraint(pParse, OE_Abort, pTab); + sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ + nReplaceTrig++; }else{ #ifdef SQLITE_ENABLE_PREUPDATE_HOOK assert( HasRowid(pTab) ); @@ -1632,6 +1678,7 @@ void sqlite3GenerateConstraintChecks( int regR; /* Range of registers holding conflicting PK */ int iThisCur; /* Cursor for this UNIQUE index */ int addrUniqueOk; /* Jump here if the UNIQUE constraint is satisfied */ + int addrConflictCk; /* First opcode in the conflict check logic */ if( aRegIdx[ix]==0 ) continue; /* Skip indices that do not change */ if( pUpIdx==pIdx ){ @@ -1745,8 +1792,9 @@ void sqlite3GenerateConstraintChecks( /* Check to see if the new index entry will be unique */ sqlite3VdbeVerifyAbortable(v, onError); - sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, - regIdx, pIdx->nKeyCol); VdbeCoverage(v); + addrConflictCk = + sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, + regIdx, pIdx->nKeyCol); VdbeCoverage(v); /* Generate code to handle collisions */ regR = (pIdx==pPk) ? regIdx : sqlite3GetTempRange(pParse, nPkField); @@ -1829,23 +1877,59 @@ void sqlite3GenerateConstraintChecks( break; } default: { - Trigger *pTrigger = 0; - int bRetryConstraintCheck = 0; + int nConflictCk; /* Number of opcodes in conflict check logic */ + assert( onError==OE_Replace ); - if( db->flags&SQLITE_RecTriggers ){ - pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); - } - if( pTrigger || sqlite3FkRequired(pParse, pTab, 0, 0) ){ + nConflictCk = sqlite3VdbeCurrentAddr(v) - addrConflictCk; + if( regTrigCnt ){ sqlite3MultiWrite(pParse); - bRetryConstraintCheck = 1; + nReplaceTrig++; } sqlite3GenerateRowDelete(pParse, pTab, pTrigger, iDataCur, iIdxCur, regR, nPkField, 0, OE_Replace, (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur); - if( bRetryConstraintCheck ){ - sqlite3VdbeAddOp4Int(v, OP_NoConflict, iThisCur, addrUniqueOk, - regIdx, pIdx->nKeyCol); VdbeCoverage(v); + if( regTrigCnt ){ + VdbeOp *pOp; /* Conflict check opcode to copy */ + int p2; /* New P2 value for copied conflict check opcode */ + int addrBypass; /* Jump destination to bypass recheck logic */ + + sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ + addrBypass = sqlite3VdbeAddOp0(v, OP_Goto); /* Bypass recheck */ + VdbeComment((v, "bypass recheck")); + + /* Here we insert code that will be invoked after all constraint + ** checks have run, if and only if one or more replace triggers + ** fired. */ + sqlite3VdbeResolveLabel(v, lblRecheckOk); + lblRecheckOk = sqlite3VdbeMakeLabel(pParse); + if( pIdx->pPartIdxWhere ){ + /* Bypass the recheck if this partial index is not defined + ** for the current row */ + sqlite3VdbeAddOp2(v, OP_IsNull, regIdx, lblRecheckOk); + VdbeCoverage(v); + } + /* Copy the constraint check code from above, except change + ** the constraint-ok jump destination to be the address of + ** the next retest block */ + pOp = sqlite3VdbeGetOp(v, addrConflictCk); + while( nConflictCk>0 && !db->mallocFailed ){ + if( sqlite3OpcodeProperty[pOp->opcode]&OPFLG_JUMP ){ + p2 = lblRecheckOk; + }else{ + p2 = pOp->p2; + } + if( pOp->opcode!=OP_IdxRowid ){ + sqlite3VdbeAddOp4(v, pOp->opcode, pOp->p1, p2, pOp->p3, + pOp->p4.z, pOp->p4type); + sqlite3VdbeChangeP5(v, pOp->p5); + } + nConflictCk--; + pOp++; + } + /* If the retest fails, issue an abort */ sqlite3UniqueConstraint(pParse, OE_Abort, pIdx); + + sqlite3VdbeJumpHere(v, addrBypass); /* Terminate the recheck bypass */ } seenReplace = 1; break; @@ -1867,6 +1951,25 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeJumpHere(v, ipkBottom); } + /* Recheck all uniqueness constraints after replace triggers have run */ + testcase( regTrigCnt!=0 && nReplaceTrig==0 ); + if( nReplaceTrig ){ + sqlite3VdbeAddOp2(v, OP_IfNot, regTrigCnt, lblRecheckOk);VdbeCoverage(v); + if( !pPk ){ + if( isUpdate ){ + sqlite3VdbeAddOp3(v, OP_Eq, regNewData, addrRecheck, regOldData); + sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); + VdbeCoverage(v); + } + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, addrRecheck, regNewData); + VdbeCoverage(v); + sqlite3RowidConstraint(pParse, OE_Abort, pTab); + }else{ + sqlite3VdbeGoto(v, addrRecheck); + } + sqlite3VdbeResolveLabel(v, lblRecheckOk); + } + /* Generate the table record */ if( HasRowid(pTab) ){ int regRec = aRegIdx[ix]; diff --git a/test/insert.test b/test/insert.test index e9bd8d6d7b..b3549289a8 100644 --- a/test/insert.test +++ b/test/insert.test @@ -519,8 +519,29 @@ do_catchsql_test insert-16.6 { } {1 {UNIQUE constraint failed: p1.b}} integrity_check insert-16.7 +# 2019-10-25 ticket c1e19e12046d23fe +do_catchsql_test insert-17.1 { + PRAGMA temp.recursive_triggers = true; + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(aa, bb); + CREATE UNIQUE INDEX t0bb ON t0(bb); + CREATE TRIGGER "r17.1" BEFORE DELETE ON t0 + BEGIN INSERT INTO t0(aa,bb) VALUES(99,1); + END; + INSERT INTO t0(aa,bb) VALUES(10,20); + REPLACE INTO t0(aa,bb) VALUES(30,20); +} {1 {UNIQUE constraint failed: t0.rowid}} +integrity_check insert-17.2 +do_catchsql_test insert-17.3 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(a, b UNIQUE, c UNIQUE); + INSERT INTO t1(a,b,c) VALUES(1,1,1),(2,2,2),(3,3,3),(4,4,4); + CREATE TRIGGER "r17.3" AFTER DELETE ON t1 WHEN OLD.c<>3 BEGIN + INSERT INTO t1(rowid,a,b,c) VALUES(100,100,100,3); + END; + REPLACE INTO t1(rowid,a,b,c) VALUES(200,1,2,3); +} {1 {UNIQUE constraint failed: t1.c}} +integrity_check insert-17.4 - - finish_test From 0660884ea02dd51864223f7c31e0293b9bbd7429 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Oct 2019 01:43:14 +0000 Subject: [PATCH 088/476] Add missing VdbeCoverage() macro. Fix an off-by-one error in partial index handling. New test cases. Ticket [c1e19e12046d23fe] FossilOrigin-Name: 41cc8e3dab998f7efc898d18837ca7fdac94ea3f89954990c5231456bf725fee --- manifest | 14 ++++++------ manifest.uuid | 2 +- src/insert.c | 3 ++- test/insert.test | 58 +++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index fd044ebade..377c552dd5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sreplace\striggers\sare\srun\sduring\suniqueness\schecking,\sthen\srerun\sall\nuniqueness\schecks\sa\ssecond\stime\susing\sthe\sABORT\salgorithm.\nFix\sfor\sticket\s[c1e19e12046d23fe] -D 2019-10-26T00:04:21.466 +C Add\smissing\sVdbeCoverage()\smacro.\s\sFix\san\soff-by-one\serror\sin\spartial\sindex\nhandling.\s\sNew\stest\scases.\s\sTicket\s[c1e19e12046d23fe] +D 2019-10-26T01:43:14.417 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 83ccd3f1f45f048bca2dbc0f9c34e8f3a57fdcbc43ddec04a7938090ffb85a9e +F src/insert.c be086d71275a23bce61f3d9ab737ef135562d205ac5be1a4222385bdaa4376b5 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1061,7 +1061,7 @@ F test/indexexpr1.test c26c8b352311c1deb30642cd0379e5cb94e416c7e9e0885e92d9e0155 F test/indexexpr2.test b580f378423bca443ffab47ada677203cfcf8a60f48a8aa20065f27c8f7739b5 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test d15bf96ec2120ecd27cb07be2b44b141a98b4b7f58762a40178f8205f9b9a96a +F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test 7802ada6ba8738661b9f6c0e26858d3375b40cc7180289fd350644cd7a08fec9 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ea068b099c96b8b9526114732d2a6be186cf381b7329d102778ad25b95510c9e -R cace6824aa8651d52f54d321985ad4c0 +P fbac0c65d8464b126d385262d176864add55452ec9e3d5eb76ffee06e820cb9c +R 9e2b0bb43a4e8a1e459a6408a4d01f3f U drh -Z 1fcf2849ed7e21c156487e77513e1cff +Z 412ed0cb894f7416a9dbba390e20b800 diff --git a/manifest.uuid b/manifest.uuid index 62410d7fa7..99e0c4ee07 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fbac0c65d8464b126d385262d176864add55452ec9e3d5eb76ffee06e820cb9c \ No newline at end of file +41cc8e3dab998f7efc898d18837ca7fdac94ea3f89954990c5231456bf725fee \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index e435f4363d..e3aa483df5 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1905,7 +1905,7 @@ void sqlite3GenerateConstraintChecks( if( pIdx->pPartIdxWhere ){ /* Bypass the recheck if this partial index is not defined ** for the current row */ - sqlite3VdbeAddOp2(v, OP_IsNull, regIdx, lblRecheckOk); + sqlite3VdbeAddOp2(v, OP_IsNull, regIdx-1, lblRecheckOk); VdbeCoverage(v); } /* Copy the constraint check code from above, except change @@ -1922,6 +1922,7 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeAddOp4(v, pOp->opcode, pOp->p1, p2, pOp->p3, pOp->p4.z, pOp->p4type); sqlite3VdbeChangeP5(v, pOp->p5); + VdbeCoverageIf(v, p2!=pOp->p2 ); } nConflictCk--; pOp++; diff --git a/test/insert.test b/test/insert.test index b3549289a8..51e62268db 100644 --- a/test/insert.test +++ b/test/insert.test @@ -515,7 +515,7 @@ do_catchsql_test insert-16.6 { END; INSERT INTO p1 VALUES(1, 1); INSERT INTO c1 VALUES(2, 1); - REPLACE INTO p1 VALUES(3, 1); + REPLACE INTO p1 VALUES(3, 1);2 } {1 {UNIQUE constraint failed: p1.b}} integrity_check insert-16.7 @@ -542,6 +542,62 @@ do_catchsql_test insert-17.3 { REPLACE INTO t1(rowid,a,b,c) VALUES(200,1,2,3); } {1 {UNIQUE constraint failed: t1.c}} integrity_check insert-17.4 +do_execsql_test insert-17.5 { + CREATE TABLE t2(a INTEGER PRIMARY KEY, b); + CREATE UNIQUE INDEX t2b ON t2(b); + INSERT INTO t2(a,b) VALUES(1,1),(2,2),(3,3),(4,4); + CREATE TABLE fire(x); + CREATE TRIGGER t2r1 AFTER DELETE ON t2 BEGIN + INSERT INTO fire VALUES(old.a); + END; + UPDATE OR REPLACE t2 SET a=4, b=3 WHERE a=1; + SELECT *, 'x' FROM t2 ORDER BY a; +} {2 2 x 4 3 x} +do_execsql_test insert-17.6 { + SELECT x FROM fire ORDER BY x; +} {3 4} +do_execsql_test insert-17.7 { + DELETE FROM t2; + DELETE FROM fire; + INSERT INTO t2(a,b) VALUES(1,1),(2,2),(3,3),(4,4); + UPDATE OR REPLACE t2 SET a=1, b=3 WHERE a=1; + SELECT *, 'x' FROM t2 ORDER BY a; +} {1 3 x 2 2 x 4 4 x} +do_execsql_test insert-17.8 { + SELECT x FROM fire ORDER BY x; +} {3} +do_execsql_test insert-17.10 { + CREATE TABLE t3(a INTEGER PRIMARY KEY, b INT, c INT, d INT); + CREATE UNIQUE INDEX t3bpi ON t3(b) WHERE c<=d; + CREATE UNIQUE INDEX t3d ON t3(d); + INSERT INTO t3(a,b,c,d) VALUES(1,1,1,1),(2,1,3,2),(3,4,5,6); + CREATE TRIGGER t3r1 AFTER DELETE ON t3 BEGIN + SELECT 'hi'; + END; + REPLACE INTO t3(a,b,c,d) VALUES(4,4,8,9); +} {} +do_execsql_test insert-17.11 { + SELECT *, 'x' FROM t3 ORDER BY a; +} {1 1 1 1 x 2 1 3 2 x 4 4 8 9 x} +do_execsql_test insert-17.12 { + REPLACE INTO t3(a,b,c,d) VALUES(5,1,11,2); + SELECT *, 'x' FROM t3 ORDER BY a; +} {1 1 1 1 x 4 4 8 9 x 5 1 11 2 x} + +do_execsql_test insert-17.13 { + DELETE FROM t3; + INSERT INTO t3(a,b,c,d) VALUES(1,1,1,1),(2,1,3,2),(3,4,5,6); + DROP TRIGGER t3r1; + CREATE TRIGGER t3r1 AFTER DELETE ON t3 BEGIN + INSERT INTO t3(b,c,d) VALUES(old.b,old.c,old.d); + END; +} {} +do_catchsql_test insert-17.14 { + REPLACE INTO t3(a,b,c,d) VALUES(4,4,8,9); +} {1 {UNIQUE constraint failed: t3.b}} +do_catchsql_test insert-17.15 { + REPLACE INTO t3(a,b,c,d) VALUES(5,1,11,2); +} {1 {UNIQUE constraint failed: t3.d}} finish_test From d901b168b58bb82192bcfc5dcb3b7ae316af1497 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Oct 2019 12:27:55 +0000 Subject: [PATCH 089/476] Overnight, OSSFuzz helpfully pointed out a potential use-after-free bug in yesterdays changes, involving continued use of a pointer after the memory pointed to had been realloc()-ed. Thanks Google. FossilOrigin-Name: c422afb507dc875751e6a72e4ba5f4f0793097c0de4533c1600311f689e76ed7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 30 ++++++++++++++++-------------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 377c552dd5..5311e40b16 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\smissing\sVdbeCoverage()\smacro.\s\sFix\san\soff-by-one\serror\sin\spartial\sindex\nhandling.\s\sNew\stest\scases.\s\sTicket\s[c1e19e12046d23fe] -D 2019-10-26T01:43:14.417 +C Overnight,\sOSSFuzz\shelpfully\spointed\sout\sa\spotential\suse-after-free\sbug\sin\nyesterdays\schanges,\sinvolving\scontinued\suse\sof\sa\spointer\safter\sthe\smemory\npointed\sto\shad\sbeen\srealloc()-ed.\s\sThanks\sGoogle. +D 2019-10-26T12:27:55.016 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c be086d71275a23bce61f3d9ab737ef135562d205ac5be1a4222385bdaa4376b5 +F src/insert.c 0ac7d3441ead03a3a457ed5c5c0f7f3cc20d7b7a6822c14c95d820fa9a091b9c F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fbac0c65d8464b126d385262d176864add55452ec9e3d5eb76ffee06e820cb9c -R 9e2b0bb43a4e8a1e459a6408a4d01f3f +P 41cc8e3dab998f7efc898d18837ca7fdac94ea3f89954990c5231456bf725fee +R 85a03747b28d7a0450d46a9d4dc21bf2 U drh -Z 412ed0cb894f7416a9dbba390e20b800 +Z 237c760989c5c2d15ac113cc385665f5 diff --git a/manifest.uuid b/manifest.uuid index 99e0c4ee07..58e1f76c6e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -41cc8e3dab998f7efc898d18837ca7fdac94ea3f89954990c5231456bf725fee \ No newline at end of file +c422afb507dc875751e6a72e4ba5f4f0793097c0de4533c1600311f689e76ed7 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index e3aa483df5..6726177e54 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1889,8 +1889,6 @@ void sqlite3GenerateConstraintChecks( regR, nPkField, 0, OE_Replace, (pIdx==pPk ? ONEPASS_SINGLE : ONEPASS_OFF), iThisCur); if( regTrigCnt ){ - VdbeOp *pOp; /* Conflict check opcode to copy */ - int p2; /* New P2 value for copied conflict check opcode */ int addrBypass; /* Jump destination to bypass recheck logic */ sqlite3VdbeAddOp2(v, OP_AddImm, regTrigCnt, 1); /* incr trigger cnt */ @@ -1911,21 +1909,25 @@ void sqlite3GenerateConstraintChecks( /* Copy the constraint check code from above, except change ** the constraint-ok jump destination to be the address of ** the next retest block */ - pOp = sqlite3VdbeGetOp(v, addrConflictCk); while( nConflictCk>0 && !db->mallocFailed ){ - if( sqlite3OpcodeProperty[pOp->opcode]&OPFLG_JUMP ){ - p2 = lblRecheckOk; - }else{ - p2 = pOp->p2; - } - if( pOp->opcode!=OP_IdxRowid ){ - sqlite3VdbeAddOp4(v, pOp->opcode, pOp->p1, p2, pOp->p3, - pOp->p4.z, pOp->p4type); - sqlite3VdbeChangeP5(v, pOp->p5); - VdbeCoverageIf(v, p2!=pOp->p2 ); + VdbeOp x; /* Conflict check opcode to copy */ + /* The sqlite3VdbeAddOp4() call might reallocate the opcode array. + ** Hence, make a complete copy of the opcode, rather than using + ** a pointer to the opcode. */ + x = *sqlite3VdbeGetOp(v, addrConflictCk); + if( x.opcode!=OP_IdxRowid ){ + int p2; /* New P2 value for copied conflict check opcode */ + if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){ + p2 = lblRecheckOk; + }else{ + p2 = x.p2; + } + sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, x.p4.z, x.p4type); + sqlite3VdbeChangeP5(v, x.p5); + VdbeCoverageIf(v, p2!=x.p2); } nConflictCk--; - pOp++; + addrConflictCk++; } /* If the retest fails, issue an abort */ sqlite3UniqueConstraint(pParse, OE_Abort, pIdx); From 166bc383e274b40662991db0612498b038a0cbab Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Oct 2019 15:40:17 +0000 Subject: [PATCH 090/476] Minor changes to help ensure the pointer returned by sqlite3VdbeGetOp() is not used after it becomes invalid. FossilOrigin-Name: 346bdd49fb93aa58e8bd14250974d8c0c32cc7e8317c8b12da1fa44db10d8a3a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 5311e40b16..864b489bde 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Overnight,\sOSSFuzz\shelpfully\spointed\sout\sa\spotential\suse-after-free\sbug\sin\nyesterdays\schanges,\sinvolving\scontinued\suse\sof\sa\spointer\safter\sthe\smemory\npointed\sto\shad\sbeen\srealloc()-ed.\s\sThanks\sGoogle. -D 2019-10-26T12:27:55.016 +C Minor\schanges\sto\shelp\sensure\sthe\spointer\sreturned\sby\ssqlite3VdbeGetOp()\sis\nnot\sused\safter\sit\sbecomes\sinvalid. +D 2019-10-26T15:40:17.027 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -526,7 +526,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 9c81d168b5a7ddc2277a6f6d3daec9ddd0ff5cebf12628d7e342f3c337231e7e +F src/select.c 3395765ea3749341deb4c25e8339c3d626a8ac641a52c216e9632e48e620ba68 F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa79 F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 41cc8e3dab998f7efc898d18837ca7fdac94ea3f89954990c5231456bf725fee -R 85a03747b28d7a0450d46a9d4dc21bf2 +P c422afb507dc875751e6a72e4ba5f4f0793097c0de4533c1600311f689e76ed7 +R db228a05e58b529536c1de42c6c5fd0e U drh -Z 237c760989c5c2d15ac113cc385665f5 +Z a43bb1565ee5620721b3d2ce725b0a46 diff --git a/manifest.uuid b/manifest.uuid index 58e1f76c6e..01a1a9aea6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c422afb507dc875751e6a72e4ba5f4f0793097c0de4533c1600311f689e76ed7 \ No newline at end of file +346bdd49fb93aa58e8bd14250974d8c0c32cc7e8317c8b12da1fa44db10d8a3a \ No newline at end of file diff --git a/src/select.c b/src/select.c index abb381a16a..b21effc0a0 100644 --- a/src/select.c +++ b/src/select.c @@ -669,6 +669,7 @@ static void pushOntoSorter( testcase( pKI->nAllField > pKI->nKeyField+2 ); pOp->p4.pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pSort->pOrderBy,nOBSat, pKI->nAllField-pKI->nKeyField-1); + pOp = 0; /* Ensure pOp not used after sqltie3VdbeAddOp3() */ addrJmp = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse); @@ -1031,6 +1032,7 @@ static void selectInnerLoop( pOp->opcode = OP_Null; pOp->p1 = 1; pOp->p2 = regPrev; + pOp = 0; /* Ensure pOp is not used after sqlite3VdbeAddOp() */ iJump = sqlite3VdbeCurrentAddr(v) + nResultCol; for(i=0; i Date: Sat, 26 Oct 2019 16:02:34 +0000 Subject: [PATCH 091/476] Fix a problem in the legacy ".explain on" formatting when it is used on a query with more than 8 output columns. FossilOrigin-Name: 070b49825c5f87cce15be4b758f0dfdd65226ec379465ca527a18706a1f3b8f4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 864b489bde..d86b4042ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\schanges\sto\shelp\sensure\sthe\spointer\sreturned\sby\ssqlite3VdbeGetOp()\sis\nnot\sused\safter\sit\sbecomes\sinvalid. -D 2019-10-26T15:40:17.027 +C Fix\sa\sproblem\sin\sthe\slegacy\s".explain\son"\sformatting\swhen\sit\sis\sused\son\na\squery\swith\smore\sthan\s8\soutput\scolumns. +D 2019-10-26T16:02:34.898 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 3395765ea3749341deb4c25e8339c3d626a8ac641a52c216e9632e48e620ba68 -F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa79 +F src/shell.c.in 01d14c1e0a4dc45b6029baf1aa560de92b6b12c05a87e2270c1e4fc41ca0fd1e F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c422afb507dc875751e6a72e4ba5f4f0793097c0de4533c1600311f689e76ed7 -R db228a05e58b529536c1de42c6c5fd0e +P 346bdd49fb93aa58e8bd14250974d8c0c32cc7e8317c8b12da1fa44db10d8a3a +R 93c72ffd5e28250381ddc75e7592ec49 U drh -Z a43bb1565ee5620721b3d2ce725b0a46 +Z ff4e0c1d87bc1e1e843d86b79db1d8fb diff --git a/manifest.uuid b/manifest.uuid index 01a1a9aea6..7783658991 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -346bdd49fb93aa58e8bd14250974d8c0c32cc7e8317c8b12da1fa44db10d8a3a \ No newline at end of file +070b49825c5f87cce15be4b758f0dfdd65226ec379465ca527a18706a1f3b8f4 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f2473ce155..86856b3354 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1855,19 +1855,22 @@ static int shell_callback( const int *colWidth; int showHdr; char *rowSep; + int nWidth; if( p->cMode==MODE_Column ){ colWidth = p->colWidth; + nWidth = ArraySize(p->colWidth); showHdr = p->showHeader; rowSep = p->rowSeparator; }else{ colWidth = aExplainWidths; + nWidth = ArraySize(aExplainWidths); showHdr = 1; rowSep = SEP_Row; } if( p->cnt++==0 ){ for(i=0; icolWidth) ){ + if( i Date: Sat, 26 Oct 2019 16:38:49 +0000 Subject: [PATCH 092/476] Clarify some comments and add assert() and testcase() macros to the replace-trigger recheck logic for ticket [c1e19e12046d23fe] FossilOrigin-Name: 8c0042bd5ccd83f8794d19cbb1ec7564584f0dce54bfebc0ada00b836aca065f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 9 ++++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index d86b4042ea..32e13a0efb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sthe\slegacy\s".explain\son"\sformatting\swhen\sit\sis\sused\son\na\squery\swith\smore\sthan\s8\soutput\scolumns. -D 2019-10-26T16:02:34.898 +C Clarify\ssome\scomments\sand\sadd\sassert()\sand\stestcase()\smacros\sto\sthe\nreplace-trigger\srecheck\slogic\sfor\sticket\s[c1e19e12046d23fe] +D 2019-10-26T16:38:49.916 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 0ac7d3441ead03a3a457ed5c5c0f7f3cc20d7b7a6822c14c95d820fa9a091b9c +F src/insert.c 52b5fae35661c3b723c4c51000bc071d7eca5cf803ceb63752527db62134ad5f F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 346bdd49fb93aa58e8bd14250974d8c0c32cc7e8317c8b12da1fa44db10d8a3a -R 93c72ffd5e28250381ddc75e7592ec49 +P 070b49825c5f87cce15be4b758f0dfdd65226ec379465ca527a18706a1f3b8f4 +R 1028cc5a00baf8569b464c2a7604c8c5 U drh -Z ff4e0c1d87bc1e1e843d86b79db1d8fb +Z 8bf83f381e575a0d62d743fe518a1706 diff --git a/manifest.uuid b/manifest.uuid index 7783658991..4803638fa3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -070b49825c5f87cce15be4b758f0dfdd65226ec379465ca527a18706a1f3b8f4 \ No newline at end of file +8c0042bd5ccd83f8794d19cbb1ec7564584f0dce54bfebc0ada00b836aca065f \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 6726177e54..7e7fb0847d 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1501,8 +1501,8 @@ void sqlite3GenerateConstraintChecks( ** ** (1) Allocate register regTrigCnt and initialize it to zero. ** That register will count the number of replace triggers that - ** fire. Constraint recheck only occurs if the number if positive. - ** (2) Initialize pTrigger to the set of all DELETE triggers. + ** fire. Constraint recheck only occurs if the number is positive. + ** (2) Initialize pTrigger to the list of all DELETE triggers on pTab. ** (3) Initialize addrRecheck and lblRecheckOk ** ** The uniqueness rechecking code will create a series of tests to run @@ -1881,6 +1881,8 @@ void sqlite3GenerateConstraintChecks( assert( onError==OE_Replace ); nConflictCk = sqlite3VdbeCurrentAddr(v) - addrConflictCk; + assert( nConflictCk>0 ); + testcase( nConflictCk>1 ); if( regTrigCnt ){ sqlite3MultiWrite(pParse); nReplaceTrig++; @@ -1909,7 +1911,7 @@ void sqlite3GenerateConstraintChecks( /* Copy the constraint check code from above, except change ** the constraint-ok jump destination to be the address of ** the next retest block */ - while( nConflictCk>0 && !db->mallocFailed ){ + while( nConflictCk>0 ){ VdbeOp x; /* Conflict check opcode to copy */ /* The sqlite3VdbeAddOp4() call might reallocate the opcode array. ** Hence, make a complete copy of the opcode, rather than using @@ -1956,6 +1958,7 @@ void sqlite3GenerateConstraintChecks( /* Recheck all uniqueness constraints after replace triggers have run */ testcase( regTrigCnt!=0 && nReplaceTrig==0 ); + assert( regTrigCnt!=0 || nReplaceTrig==0 ); if( nReplaceTrig ){ sqlite3VdbeAddOp2(v, OP_IfNot, regTrigCnt, lblRecheckOk);VdbeCoverage(v); if( !pPk ){ From cbda9c7ac79f8751e18fba943e30fd67f8c68b02 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Oct 2019 17:08:06 +0000 Subject: [PATCH 093/476] Performance optimization on sqlite3GenerateConstraintChecks() - bypass the loop that checks each column for NOT NULL constraints if it is known in advance that the table has no NOT NULL constraints. FossilOrigin-Name: e3c3f4d7872f431a95627d52553101388c1e39458cc7e7f93fc81255f49a89a5 --- manifest | 14 +++---- manifest.uuid | 2 +- src/build.c | 1 + src/insert.c | 107 ++++++++++++++++++++++++++------------------------ 4 files changed, 64 insertions(+), 60 deletions(-) diff --git a/manifest b/manifest index 32e13a0efb..9eb5fce1f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Clarify\ssome\scomments\sand\sadd\sassert()\sand\stestcase()\smacros\sto\sthe\nreplace-trigger\srecheck\slogic\sfor\sticket\s[c1e19e12046d23fe] -D 2019-10-26T16:38:49.916 +C Performance\soptimization\son\ssqlite3GenerateConstraintChecks()\s-\sbypass\sthe\nloop\sthat\schecks\seach\scolumn\sfor\sNOT\sNULL\sconstraints\sif\sit\sis\sknown\sin\nadvance\sthat\sthe\stable\shas\sno\sNOT\sNULL\sconstraints. +D 2019-10-26T17:08:06.316 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -470,7 +470,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 0e558ef847ccc4b6aa38dee44cde9d9df46e953b0a66e4fa4376265824955fe3 +F src/build.c 2e17f27da8ff7bb52cd23dbd6a8c7269babf11bb1beae08e470c5b0f4b077801 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 52b5fae35661c3b723c4c51000bc071d7eca5cf803ceb63752527db62134ad5f +F src/insert.c 09e64dd9394a06bb25e54180312f16932c98643b53f576a7dd3b9344a635cf2c F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 070b49825c5f87cce15be4b758f0dfdd65226ec379465ca527a18706a1f3b8f4 -R 1028cc5a00baf8569b464c2a7604c8c5 +P 8c0042bd5ccd83f8794d19cbb1ec7564584f0dce54bfebc0ada00b836aca065f +R ea2c4191b4b2904c1eb46d03fcd394de U drh -Z 8bf83f381e575a0d62d743fe518a1706 +Z 5817472d3119aa1dc0ce67b1f895a616 diff --git a/manifest.uuid b/manifest.uuid index 4803638fa3..ea0e6e6048 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c0042bd5ccd83f8794d19cbb1ec7564584f0dce54bfebc0ada00b836aca065f \ No newline at end of file +e3c3f4d7872f431a95627d52553101388c1e39458cc7e7f93fc81255f49a89a5 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 22a57a240b..9adc4d5934 100644 --- a/src/build.c +++ b/src/build.c @@ -1836,6 +1836,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ pTab->aCol[i].notNull = OE_Abort; } } + pTab->tabFlags |= TF_HasNotNull; } /* Convert the P3 operand of the OP_CreateBtree opcode from BTREE_INTKEY diff --git a/src/insert.c b/src/insert.c index 7e7fb0847d..215aafb321 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1352,64 +1352,67 @@ void sqlite3GenerateConstraintChecks( /* Test all NOT NULL constraints. */ - for(i=0; iiPKey ){ - continue; /* ROWID is never NULL */ - } - if( aiChng && aiChng[i]<0 ){ - /* Don't bother checking for NOT NULL on columns that do not change */ - continue; - } - onError = pTab->aCol[i].notNull; - if( onError==OE_None ) continue; /* This column is allowed to be NULL */ - if( overrideError!=OE_Default ){ - onError = overrideError; - }else if( onError==OE_Default ){ - onError = OE_Abort; - } - if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){ - onError = OE_Abort; - } - assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail - || onError==OE_Ignore || onError==OE_Replace ); - addr1 = 0; - switch( onError ){ - case OE_Replace: { - assert( onError==OE_Replace ); - addr1 = sqlite3VdbeMakeLabel(pParse); - sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); - VdbeCoverage(v); - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); - VdbeCoverage(v); + if( pTab->tabFlags & TF_HasNotNull ){ + for(i=0; iaCol[i].notNull; + if( onError==OE_None ) continue; /* No NOT NULL on this column */ + assert( pTab->tabFlags & TF_HasNotNull ); + if( i==pTab->iPKey ){ + continue; /* ROWID is never NULL */ + } + if( aiChng && aiChng[i]<0 ){ + /* Don't bother checking for NOT NULL on columns that do not change */ + continue; + } + if( overrideError!=OE_Default ){ + onError = overrideError; + }else if( onError==OE_Default ){ onError = OE_Abort; - /* Fall through into the OE_Abort case to generate code that runs - ** if both the input and the default value are NULL */ } - case OE_Abort: - sqlite3MayAbort(pParse); - /* Fall through */ - case OE_Rollback: - case OE_Fail: { - char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, - pTab->aCol[i].zName); - sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, - regNewData+1+i); - sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); - sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); - VdbeCoverage(v); - if( addr1 ) sqlite3VdbeResolveLabel(v, addr1); - break; + if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){ + onError = OE_Abort; } - default: { - assert( onError==OE_Ignore ); - sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); - VdbeCoverage(v); - break; + assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail + || onError==OE_Ignore || onError==OE_Replace ); + addr1 = 0; + switch( onError ){ + case OE_Replace: { + assert( onError==OE_Replace ); + addr1 = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + VdbeCoverage(v); + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); + sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + VdbeCoverage(v); + onError = OE_Abort; + /* Fall through into the OE_Abort case to generate code that runs + ** if both the input and the default value are NULL */ + } + case OE_Abort: + sqlite3MayAbort(pParse); + /* Fall through */ + case OE_Rollback: + case OE_Fail: { + char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, + pTab->aCol[i].zName); + sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, + onError, regNewData+1+i); + sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); + sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); + VdbeCoverage(v); + if( addr1 ) sqlite3VdbeResolveLabel(v, addr1); + break; + } + default: { + assert( onError==OE_Ignore ); + sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); + VdbeCoverage(v); + break; + } } } } - + /* Test all CHECK constraints */ #ifndef SQLITE_OMIT_CHECK From c34f05cca799f39e881809aac9d9c8d5d47af4fb Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Oct 2019 18:56:12 +0000 Subject: [PATCH 094/476] Remove redundant code resulting from a merge error on the previous check-in. FossilOrigin-Name: 713fe86b8c9f3c9ef8af952019e99ba2f4741326226264de6a66baaeb1803d2a --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/insert.c | 2 -- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 8fac97f608..c4de10d000 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssupport\sfor\sgenerated\scolumns. -D 2019-10-26T18:47:47.117 +C Remove\sredundant\scode\sresulting\sfrom\sa\smerge\serror\son\sthe\sprevious\scheck-in. +D 2019-10-26T18:56:12.322 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 948bbd90277450f8d4f9ba4b881dd6676023d9e8bad56228064184dc85011cca +F src/insert.c 00f36e4061c4e85ff63ba3dc3ccffe6a53ab4013f090d64061584f414dbf9efe F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1848,8 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e3c3f4d7872f431a95627d52553101388c1e39458cc7e7f93fc81255f49a89a5 4ec57d88415fa4ea2e99d4a5671074ec6829d6824bc8509d5ae9c978d47d1419 -R f145bc7e6a3c49b3acdcdeb1a4214a2e -T +closed 4ec57d88415fa4ea2e99d4a5671074ec6829d6824bc8509d5ae9c978d47d1419 +P b855acf1831943b3914491ed0bc333131321930cab480a5281012a3aebbba492 +R 0a3a520f870448808e97b5392bf1f816 U drh -Z 906ad86e78e219feca2ac3d876e5c4a1 +Z ae64f236a7851596712eed7ea9b59b3e diff --git a/manifest.uuid b/manifest.uuid index f10065993b..690740748c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b855acf1831943b3914491ed0bc333131321930cab480a5281012a3aebbba492 \ No newline at end of file +713fe86b8c9f3c9ef8af952019e99ba2f4741326226264de6a66baaeb1803d2a \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index afec78b469..806e285131 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1497,8 +1497,6 @@ void sqlite3GenerateConstraintChecks( /* Don't bother checking for NOT NULL on columns that do not change */ continue; } - onError = pTab->aCol[i].notNull; - if( onError==OE_None ) continue; /* This column is allowed to be NULL */ if( overrideError!=OE_Default ){ onError = overrideError; }else if( onError==OE_Default ){ From 1231b4773deac1c7d5c44b9119ed053f96c69e90 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Oct 2019 23:51:44 +0000 Subject: [PATCH 095/476] Remove code from the constraint checker that generates virtual column values with the incorrect time. Turns out the the regular code for all other columns works correctly and so the incorrect special-case code is not actually needed. Fix for ticket [3ea175512444b0d1]. FossilOrigin-Name: 5b4c0f2ddc6f324e23bbde0ee3d1ab672cfe8ab5044c9b693f4c33cdd75c211e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 7 ------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index c4de10d000..2405222cbe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sredundant\scode\sresulting\sfrom\sa\smerge\serror\son\sthe\sprevious\scheck-in. -D 2019-10-26T18:56:12.322 +C Remove\scode\sfrom\sthe\sconstraint\schecker\sthat\sgenerates\svirtual\scolumn\svalues\nwith\sthe\sincorrect\stime.\s\sTurns\sout\sthe\sthe\sregular\scode\sfor\sall\sother\ncolumns\sworks\scorrectly\sand\sso\sthe\sincorrect\sspecial-case\scode\sis\snot\nactually\sneeded.\s\sFix\sfor\sticket\s[3ea175512444b0d1]. +D 2019-10-26T23:51:44.685 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 00f36e4061c4e85ff63ba3dc3ccffe6a53ab4013f090d64061584f414dbf9efe +F src/insert.c dfb4a734327097ee8e61c2668227e6dc57b35018a24da07d2c19efef573a4b80 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b855acf1831943b3914491ed0bc333131321930cab480a5281012a3aebbba492 -R 0a3a520f870448808e97b5392bf1f816 +P 713fe86b8c9f3c9ef8af952019e99ba2f4741326226264de6a66baaeb1803d2a +R 911d1cba6780e60660279f15cc5e6d6a U drh -Z ae64f236a7851596712eed7ea9b59b3e +Z 9d034d9c80d0c7936d2ef22f3b68e349 diff --git a/manifest.uuid b/manifest.uuid index 690740748c..3df7283d09 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -713fe86b8c9f3c9ef8af952019e99ba2f4741326226264de6a66baaeb1803d2a \ No newline at end of file +5b4c0f2ddc6f324e23bbde0ee3d1ab672cfe8ab5044c9b693f4c33cdd75c211e \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 806e285131..8d53bafe72 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1862,13 +1862,6 @@ void sqlite3GenerateConstraintChecks( x = regNewData; sqlite3VdbeAddOp2(v, OP_IntCopy, x, regIdx+i); VdbeComment((v, "rowid")); -#ifndef SQLITE_OMIT_GENERATED_COLUMNS - }else if( pTab->aCol[iField].colFlags & COLFLAG_VIRTUAL ){ - pParse->iSelfTab = -(regNewData+1); - sqlite3ExprCodeCopy(pParse, pTab->aCol[iField].pDflt, regIdx+i); - pParse->iSelfTab = 0; - VdbeComment((v, "%s column %d", pIdx->zName, i)); -#endif }else{ testcase( sqlite3TableColumnToStorage(pTab, iField)!=iField ); x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1; From a0e16a22614ae2fb63487cff12f71551baedc005 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 27 Oct 2019 22:22:24 +0000 Subject: [PATCH 096/476] Improved detection of attempts to use a generated column as part of the primary key. Ticket [91e86951016a6802] FossilOrigin-Name: 6d1bbba9a004a2491c76b4a7d09edb9b738102c46fdcb3e0f7b22bffa719518e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 2405222cbe..ae3445a3bc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\scode\sfrom\sthe\sconstraint\schecker\sthat\sgenerates\svirtual\scolumn\svalues\nwith\sthe\sincorrect\stime.\s\sTurns\sout\sthe\sthe\sregular\scode\sfor\sall\sother\ncolumns\sworks\scorrectly\sand\sso\sthe\sincorrect\sspecial-case\scode\sis\snot\nactually\sneeded.\s\sFix\sfor\sticket\s[3ea175512444b0d1]. -D 2019-10-26T23:51:44.685 +C Improved\sdetection\sof\sattempts\sto\suse\sa\sgenerated\scolumn\sas\spart\sof\sthe\nprimary\skey.\s\sTicket\s[91e86951016a6802] +D 2019-10-27T22:22:24.363 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -470,7 +470,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 3dea3b75107c83243b8b2244334c3c574865a12d33d0b86d345123f4dc1ca8d6 +F src/build.c 8563e54761426053e60eeeed524c0dfce18aec444788c281262289133d96d2ba F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 713fe86b8c9f3c9ef8af952019e99ba2f4741326226264de6a66baaeb1803d2a -R 911d1cba6780e60660279f15cc5e6d6a +P 5b4c0f2ddc6f324e23bbde0ee3d1ab672cfe8ab5044c9b693f4c33cdd75c211e +R 98f02ccd3921e003a0a834d3e6082717 U drh -Z 9d034d9c80d0c7936d2ef22f3b68e349 +Z f57911151293bc6b4b4024d6f416e937 diff --git a/manifest.uuid b/manifest.uuid index 3df7283d09..0bc29a03e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b4c0f2ddc6f324e23bbde0ee3d1ab672cfe8ab5044c9b693f4c33cdd75c211e \ No newline at end of file +6d1bbba9a004a2491c76b4a7d09edb9b738102c46fdcb3e0f7b22bffa719518e \ No newline at end of file diff --git a/src/build.c b/src/build.c index cb4cc4397c..fa0a9d91fa 100644 --- a/src/build.c +++ b/src/build.c @@ -1649,6 +1649,9 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ assert( TF_HasVirtual==COLFLAG_VIRTUAL ); assert( TF_HasStored==COLFLAG_STORED ); pTab->tabFlags |= eType; + if( pCol->colFlags & COLFLAG_PRIMKEY ){ + makeColumnPartOfPrimaryKey(pParse, pCol); /* For the error message */ + } pCol->pDflt = pExpr; pExpr = 0; goto generated_done; From 76baf799a284623a4c73c518b7814bf0c92fb60c Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2019 04:20:28 +0000 Subject: [PATCH 097/476] ALWAYS macro added for coverage. FossilOrigin-Name: a1e1ba9145049491c593ac70d9e05149662d34770129c270d702f284cd19a481 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ae3445a3bc..07ad119fd5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdetection\sof\sattempts\sto\suse\sa\sgenerated\scolumn\sas\spart\sof\sthe\nprimary\skey.\s\sTicket\s[91e86951016a6802] -D 2019-10-27T22:22:24.363 +C ALWAYS\smacro\sadded\sfor\scoverage. +D 2019-10-28T04:20:28.875 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 97d46c41ea4185e8711560d7484cf5b4887fd2317dec79637be23454b5147647 +F src/parse.y 5f09d382d55ae7832d4975d71d851ea0cffa89c3803ff59cc4802220a0e3a476 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5b4c0f2ddc6f324e23bbde0ee3d1ab672cfe8ab5044c9b693f4c33cdd75c211e -R 98f02ccd3921e003a0a834d3e6082717 +P 6d1bbba9a004a2491c76b4a7d09edb9b738102c46fdcb3e0f7b22bffa719518e +R c8301beb24039cb03a30be98ac41fcb7 U drh -Z f57911151293bc6b4b4024d6f416e937 +Z e9503b1900639f10766b08dd9bfb970e diff --git a/manifest.uuid b/manifest.uuid index 0bc29a03e5..5c92b32a96 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6d1bbba9a004a2491c76b4a7d09edb9b738102c46fdcb3e0f7b22bffa719518e \ No newline at end of file +a1e1ba9145049491c593ac70d9e05149662d34770129c270d702f284cd19a481 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 7689288db6..79b9da7a4a 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1075,7 +1075,7 @@ expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. { A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0); if( A ){ A->x.pList = pList; - if( pList->nExpr ){ + if( ALWAYS(pList->nExpr) ){ A->flags |= pList->a[0].pExpr->flags & EP_Propagate; } }else{ From 0f28e1bdd93e443292fafb3527a594372b40a7c4 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Oct 2019 13:07:01 +0000 Subject: [PATCH 098/476] Remove a NEVER() comparison from sqlite3ExprCompare(). FossilOrigin-Name: f4285297e1e7ebef90bfc0f71402a4e1726d31bc15b69fec13a1f0d98fed1f08 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 07ad119fd5..8b272728a7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C ALWAYS\smacro\sadded\sfor\scoverage. -D 2019-10-28T04:20:28.875 +C Remove\sa\sNEVER()\scomparison\sfrom\ssqlite3ExprCompare(). +D 2019-10-28T13:07:01.396 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 91429fb52958fd2ff0f5360a2cc9f41dd811dc8666d22cbb033f1557dd5fdbc2 +F src/expr.c c158710c5de9452fb3f82f038ed96026f1ce1a2a1fcd9bbdb2172f33bfe9fd72 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c ac56f02ffe7a3dff311654f86e3c2fd1ff2eb38862b0c07fd908d8cc0fb4a9a2 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6d1bbba9a004a2491c76b4a7d09edb9b738102c46fdcb3e0f7b22bffa719518e -R c8301beb24039cb03a30be98ac41fcb7 +P a1e1ba9145049491c593ac70d9e05149662d34770129c270d702f284cd19a481 +R 46f7afb441998f472c7c4a0add076940 U drh -Z e9503b1900639f10766b08dd9bfb970e +Z c81acde55a3e6239d1de172d83220668 diff --git a/manifest.uuid b/manifest.uuid index 5c92b32a96..c872093d77 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1e1ba9145049491c593ac70d9e05149662d34770129c270d702f284cd19a481 \ No newline at end of file +f4285297e1e7ebef90bfc0f71402a4e1726d31bc15b69fec13a1f0d98fed1f08 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4ae6876620..7dd5577364 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5030,9 +5030,9 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ ){ if( pA->iColumn!=pB->iColumn ) return 2; if( pA->op2!=pB->op2 ) return 2; - if( pA->op!=TK_IN - && pA->iTable!=pB->iTable - && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; + if( pA->op!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){ + return 2; + } } } return 0; From 9930cfe878dfedf36ff4010a3781ba1758308c28 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 28 Oct 2019 13:54:59 +0000 Subject: [PATCH 099/476] Fix a problem in fts3 causing it to report corruption if a doclist contains consectutive rowid entries that differ by more than 2^63. FossilOrigin-Name: 0b0a3048f9df88bbc8979f2ac5247bee7d7bc1e585faca252610d2fcbe36d51d --- ext/fts3/fts3_write.c | 6 ++---- ext/fts5/test/fts5misc.test | 21 ++++++++++++++++++++- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- test/altertab3.test | 32 +++++++++++++++++++++++++++++++- test/fts3misc.test | 20 ++++++++++++++++++++ 6 files changed, 84 insertions(+), 17 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 5246566e06..10492b18c2 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -2966,14 +2966,12 @@ int sqlite3Fts3SegReaderStep( ** doclist. */ sqlite3_int64 iDelta; if( p->bDescIdx && nDoclist>0 ){ + if( iPrev<=iDocid ) return FTS_CORRUPT_VTAB; iDelta = iPrev - iDocid; }else{ + if( nDoclist>0 && iPrev>=iDocid ) return FTS_CORRUPT_VTAB; iDelta = iDocid - iPrev; } - if( iDelta<=0 && (nDoclist>0 || iDelta!=iDocid) ){ - return FTS_CORRUPT_VTAB; - } - assert( nDoclist>0 || iDelta==iDocid ); nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); if( nDoclist+nByte>pCsr->nBuffer ){ diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index e58ae90547..e2f4b2d09c 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -226,11 +226,30 @@ do_execsql_test 8.0 { INSERT INTO vt0(c0) VALUES (x'd1'); } -breakpoint do_execsql_test 8.1 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 9.0 { + CREATE VIRTUAL TABLE t1 using FTS5(mailcontent); + insert into t1(rowid, mailcontent) values + (-4764623217061966105, 'we are going to upgrade'), + (8324454597464624651, 'we are going to upgrade'); +} + +do_execsql_test 9.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} + +do_execsql_test 9.2 { + SELECT rowid FROM t1('upgrade'); +} { + -4764623217061966105 8324454597464624651 +} + finish_test diff --git a/manifest b/manifest index 8b272728a7..c7c280add7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\scomparison\sfrom\ssqlite3ExprCompare(). -D 2019-10-28T13:07:01.396 +C Fix\sa\sproblem\sin\sfts3\scausing\sit\sto\sreport\scorruption\sif\sa\sdoclist\scontains\sconsectutive\srowid\sentries\sthat\sdiffer\sby\smore\sthan\s2^63. +D 2019-10-28T13:54:59.510 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -99,7 +99,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c aef93982656ef63851470a86c8f145d54dd4ebd9341f7493aefe45ddff0ce600 +F ext/fts3/fts3_write.c bf724ff69dd497eb8399452ecd44e39d8eb420472bf555b826dede4b05e9accd F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 @@ -189,7 +189,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 50d86da66ec5b27603dcd90ba0227f5d9deb10351cbc52974a88e24f6fc9b076 F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 1aefd6607106659a87dbce9f4766616c91e790ea84b9fa42e65096b7c99a132e +F ext/fts5/test/fts5misc.test a5b53328b5b79275915de8f67ae85905eb2133d8dbcc808411f67c094b1bd347 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -636,7 +636,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test b2004ac589207fed7e19877bc3f1ad65142be482f269c176ee407e3b4a65f1a0 F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test c755ef31f8a61911331b46d71e43f6f3ef94af05c56314b168e47520355fa18e +F test/altertab3.test f40013d333e273da57e329fac6c2268a58aa09d17c3575936b343eeb2fa09180 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b @@ -959,7 +959,7 @@ F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11e F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3misc.test a418198b2c3c56bddcaf657f41644715f6ad27ffa72a8ba8f542e93030517744 +F test/fts3misc.test c47d2c1ea1351c51c32c688545b02c8180a3f22156d1aedc206a8c09b9d95905 F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a1e1ba9145049491c593ac70d9e05149662d34770129c270d702f284cd19a481 -R 46f7afb441998f472c7c4a0add076940 -U drh -Z c81acde55a3e6239d1de172d83220668 +P f4285297e1e7ebef90bfc0f71402a4e1726d31bc15b69fec13a1f0d98fed1f08 +R 8abceba5a0dfdc4677637a0d05950f72 +U dan +Z a8a3e4a1d3565d1476bd7ac5bdf0dc35 diff --git a/manifest.uuid b/manifest.uuid index c872093d77..acce49bd0f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f4285297e1e7ebef90bfc0f71402a4e1726d31bc15b69fec13a1f0d98fed1f08 \ No newline at end of file +0b0a3048f9df88bbc8979f2ac5247bee7d7bc1e585faca252610d2fcbe36d51d \ No newline at end of file diff --git a/test/altertab3.test b/test/altertab3.test index 948a351e70..def2f7b780 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -20,7 +20,6 @@ ifcapable !altertable { return } - ifcapable windowfunc { do_execsql_test 1.0 { CREATE TABLE t1(a, b); @@ -381,5 +380,36 @@ do_execsql_test 17.2 { END} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 18.1 { + CREATE TABLE t1(a,b); + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN + SELECT a, b FROM t1 + INTERSECT SELECT b,a FROM t1 + ORDER BY b IN ( + SELECT a UNION SELECT b + FROM t1 + ORDER BY b COLLATE nocase + ) + ; + END; +} + +do_catchsql_test 18.2 { + SELECT a, b FROM t1 + INTERSECT + SELECT b,a FROM t1 + ORDER BY b IN ( + SELECT a UNION SELECT b + FROM t1 + ORDER BY b COLLATE nocase + ); +} {1 {1st ORDER BY term does not match any column in the result set}} + +do_catchsql_test 18.3 { + ALTER TABLE t1 RENAME TO t1x; +} {1 {error in trigger r1: 1st ORDER BY term does not match any column in the result set}} + finish_test diff --git a/test/fts3misc.test b/test/fts3misc.test index 4532a79f05..92b93d033d 100644 --- a/test/fts3misc.test +++ b/test/fts3misc.test @@ -283,4 +283,24 @@ do_execsql_test 8.3 { INSERT INTO vt0(vt0) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 9.0 { + CREATE VIRTUAL TABLE t1 using fts4(mailcontent); + insert into t1(rowid, mailcontent) values + (-4764623217061966105, 'we are going to upgrade'), + (8324454597464624651, 'we are going to upgrade'); +} + +do_execsql_test 9.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} + +do_execsql_test 9.2 { + SELECT rowid FROM t1 WHERE t1 MATCH 'upgrade'; +} { + -4764623217061966105 8324454597464624651 +} + finish_test From 2c40a3eb354f2fac4b3d8f24aa6fb459eb4b2d06 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Oct 2019 01:26:24 +0000 Subject: [PATCH 100/476] Disallow tables that have only virtual columns. FossilOrigin-Name: 591973217f1caf24cde91dc15b7edca2edda05dac8ae2b2cd8d71e7aa072f7d1 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 8 ++++++-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c7c280add7..f8e9e7ea21 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sfts3\scausing\sit\sto\sreport\scorruption\sif\sa\sdoclist\scontains\sconsectutive\srowid\sentries\sthat\sdiffer\sby\smore\sthan\s2^63. -D 2019-10-28T13:54:59.510 +C Disallow\stables\sthat\shave\sonly\svirtual\scolumns. +D 2019-10-29T01:26:24.071 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -470,7 +470,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 8563e54761426053e60eeeed524c0dfce18aec444788c281262289133d96d2ba +F src/build.c c0f279e9ef04cbd5f5b97628f7f8dd76cf30db36927fe566e82f2fc695ffc19c F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f4285297e1e7ebef90bfc0f71402a4e1726d31bc15b69fec13a1f0d98fed1f08 -R 8abceba5a0dfdc4677637a0d05950f72 -U dan -Z a8a3e4a1d3565d1476bd7ac5bdf0dc35 +P 0b0a3048f9df88bbc8979f2ac5247bee7d7bc1e585faca252610d2fcbe36d51d +R b4c27cbc6097f72a61ec6b82e9ea7ae9 +U drh +Z 4276087abce170d1b1843b56d4d084ed diff --git a/manifest.uuid b/manifest.uuid index acce49bd0f..cd3e1f59ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b0a3048f9df88bbc8979f2ac5247bee7d7bc1e585faca252610d2fcbe36d51d \ No newline at end of file +591973217f1caf24cde91dc15b7edca2edda05dac8ae2b2cd8d71e7aa072f7d1 \ No newline at end of file diff --git a/src/build.c b/src/build.c index fa0a9d91fa..8c26715b17 100644 --- a/src/build.c +++ b/src/build.c @@ -2242,7 +2242,7 @@ void sqlite3EndTable( #endif /* !defined(SQLITE_OMIT_CHECK) */ #ifndef SQLITE_OMIT_GENERATED_COLUMNS if( p->tabFlags & TF_HasGenerated ){ - int ii; + int ii, nNV = 0; testcase( p->tabFlags & TF_HasVirtual ); testcase( p->tabFlags & TF_HasStored ); for(ii=0; iinCol; ii++){ @@ -2253,6 +2253,11 @@ void sqlite3EndTable( sqlite3ResolveSelfReference(pParse, p, NC_GenCol, p->aCol[ii].pDflt, 0); } + if( (colFlags & COLFLAG_VIRTUAL)==0 ) nNV++; + } + if( nNV==0 ){ + sqlite3ErrorMsg(pParse, "must have at least one non-VIRTUAL column"); + return; } } #endif @@ -2405,7 +2410,6 @@ void sqlite3EndTable( sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName)); } - /* Add the table to the in-memory representation of the database. */ if( db->init.busy ){ From b6d861e523f7b34a6c9f4603a5bfe18fe323d00a Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Oct 2019 03:30:26 +0000 Subject: [PATCH 101/476] Add a missing translation from table column numbers to storage table numbers while processing constraints on an UPDATE statement. Ticket [9621dd78a024d07a] FossilOrigin-Name: 361ea81ae8a13e7d2ec4c2412f30e049bb6ee320980d502c86bedc315cdd3bc0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index f8e9e7ea21..d0d6397ee6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disallow\stables\sthat\shave\sonly\svirtual\scolumns. -D 2019-10-29T01:26:24.071 +C Add\sa\smissing\stranslation\sfrom\stable\scolumn\snumbers\sto\sstorage\stable\snumbers\nwhile\sprocessing\sconstraints\son\san\sUPDATE\sstatement.\nTicket\s[9621dd78a024d07a] +D 2019-10-29T03:30:26.054 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c dfb4a734327097ee8e61c2668227e6dc57b35018a24da07d2c19efef573a4b80 +F src/insert.c eb81303edba6d2e9cbead33260db01c6c6fcf3f21e6c83f454b6807254bf0186 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0b0a3048f9df88bbc8979f2ac5247bee7d7bc1e585faca252610d2fcbe36d51d -R b4c27cbc6097f72a61ec6b82e9ea7ae9 +P 591973217f1caf24cde91dc15b7edca2edda05dac8ae2b2cd8d71e7aa072f7d1 +R 24e97e0296b21647315af04b485f5143 U drh -Z 4276087abce170d1b1843b56d4d084ed +Z 5b847cd00fe978f8703699f99d27a61c diff --git a/manifest.uuid b/manifest.uuid index cd3e1f59ce..0b78352e11 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -591973217f1caf24cde91dc15b7edca2edda05dac8ae2b2cd8d71e7aa072f7d1 \ No newline at end of file +361ea81ae8a13e7d2ec4c2412f30e049bb6ee320980d502c86bedc315cdd3bc0 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 8d53bafe72..0711930fb4 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1982,6 +1982,7 @@ void sqlite3GenerateConstraintChecks( addrJump = addrUniqueOk; op = OP_Eq; } + x = sqlite3TableColumnToStorage(pTab, x); sqlite3VdbeAddOp4(v, op, regOldData+1+x, addrJump, regCmp+i, p4, P4_COLLSEQ ); From f4658b68fa906229797f6411e92a4cf15598528b Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Oct 2019 03:39:17 +0000 Subject: [PATCH 102/476] Tighten the generated column requirement such that every table must have at least one non-generated column. Ticket [166347c6fc994155]. FossilOrigin-Name: 4fba090e678ef184736277c9ec9a9374c8bd4df4d41f51a3dc6818e2efcc103b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 9 +++++---- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index d0d6397ee6..305f14180f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smissing\stranslation\sfrom\stable\scolumn\snumbers\sto\sstorage\stable\snumbers\nwhile\sprocessing\sconstraints\son\san\sUPDATE\sstatement.\nTicket\s[9621dd78a024d07a] -D 2019-10-29T03:30:26.054 +C Tighten\sthe\sgenerated\scolumn\srequirement\ssuch\sthat\severy\stable\smust\shave\nat\sleast\sone\snon-generated\scolumn.\s\sTicket\s[166347c6fc994155]. +D 2019-10-29T03:39:17.714 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -470,7 +470,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c c0f279e9ef04cbd5f5b97628f7f8dd76cf30db36927fe566e82f2fc695ffc19c +F src/build.c 7afa8336eb6e154a9d687a57d6784d8f0ddcdb38ff5c266f7b595f8e737edd89 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 591973217f1caf24cde91dc15b7edca2edda05dac8ae2b2cd8d71e7aa072f7d1 -R 24e97e0296b21647315af04b485f5143 +P 361ea81ae8a13e7d2ec4c2412f30e049bb6ee320980d502c86bedc315cdd3bc0 +R f38e4bc770b0e4cac1c1d7cd5ea27795 U drh -Z 5b847cd00fe978f8703699f99d27a61c +Z f0fd4433a459345a3d1e230e95f7dbc0 diff --git a/manifest.uuid b/manifest.uuid index 0b78352e11..f0d63945b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -361ea81ae8a13e7d2ec4c2412f30e049bb6ee320980d502c86bedc315cdd3bc0 \ No newline at end of file +4fba090e678ef184736277c9ec9a9374c8bd4df4d41f51a3dc6818e2efcc103b \ No newline at end of file diff --git a/src/build.c b/src/build.c index 8c26715b17..56798e3591 100644 --- a/src/build.c +++ b/src/build.c @@ -2242,7 +2242,7 @@ void sqlite3EndTable( #endif /* !defined(SQLITE_OMIT_CHECK) */ #ifndef SQLITE_OMIT_GENERATED_COLUMNS if( p->tabFlags & TF_HasGenerated ){ - int ii, nNV = 0; + int ii, nNG = 0; testcase( p->tabFlags & TF_HasVirtual ); testcase( p->tabFlags & TF_HasStored ); for(ii=0; iinCol; ii++){ @@ -2252,11 +2252,12 @@ void sqlite3EndTable( testcase( colFlags & COLFLAG_STORED ); sqlite3ResolveSelfReference(pParse, p, NC_GenCol, p->aCol[ii].pDflt, 0); + }else{ + nNG++; } - if( (colFlags & COLFLAG_VIRTUAL)==0 ) nNV++; } - if( nNV==0 ){ - sqlite3ErrorMsg(pParse, "must have at least one non-VIRTUAL column"); + if( nNG==0 ){ + sqlite3ErrorMsg(pParse, "must have at least one non-generated column"); return; } } From 66c48907a2abc90a78760f7281acb1f720adc1c7 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Oct 2019 16:18:45 +0000 Subject: [PATCH 103/476] Remove the legacy_file_format PRAGMA. In its place, provide the SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option to sqlite3_db_config(). Fix for ticket [6484e6ce678fffab] FossilOrigin-Name: 4d424f3047b48fc441475137f30a719d2f079390c86fe2617710ddfb05c5e240 --- manifest | 66 +++++++++++++++++++++--------------------- manifest.uuid | 2 +- src/main.c | 1 + src/pragma.h | 7 +---- src/shell.c.in | 1 + src/sqlite.h.in | 25 +++++++++++++++- src/test1.c | 13 ++++++--- test/alter3.test | 4 +-- test/alter4.test | 2 +- test/conflict3.test | 1 - test/corruptC.test | 2 +- test/corruptE.test | 2 +- test/descidx1.test | 17 ++++++----- test/descidx2.test | 3 +- test/descidx3.test | 3 +- test/distinct2.test | 1 - test/filter1.test | 1 - test/format4.test | 3 +- test/indexexpr2.test | 1 - test/insert4.test | 2 +- test/join.test | 1 - test/minmax2.test | 2 +- test/nulls1.test | 2 -- test/pragma4.test | 1 - test/rowvaluevtab.test | 1 - test/tkt-18458b1a.test | 1 - test/tkt-a7debbe0.test | 1 - test/tkt3292.test | 2 +- test/window9.test | 1 - tool/mkpragmatab.tcl | 5 ---- 30 files changed, 93 insertions(+), 81 deletions(-) diff --git a/manifest b/manifest index 305f14180f..41bdcbc256 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Tighten\sthe\sgenerated\scolumn\srequirement\ssuch\sthat\severy\stable\smust\shave\nat\sleast\sone\snon-generated\scolumn.\s\sTicket\s[166347c6fc994155]. -D 2019-10-29T03:39:17.714 +C Remove\sthe\slegacy_file_format\sPRAGMA.\s\sIn\sits\splace,\sprovide\sthe\nSQLITE_DBCONFIG_LEGACY_FILE_FORMAT\soption\sto\ssqlite3_db_config().\nFix\sfor\sticket\s[6484e6ce678fffab] +D 2019-10-29T16:18:45.173 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c eb81303edba6d2e9cbead33260db01c6c6fcf3f21e6c83f454b6807254bf0186 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d -F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66 +F src/main.c 20c6325c581123b8771ecb938f60d7e31c8152be01b4bf8e5eefbb74671ea86f F src/malloc.c b7640bcf8992cf2e98447da0d27e372abdc4621a6760418bad6d1470f041ada9 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -520,15 +520,15 @@ F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 F src/pragma.c 986fdd27f1ddb712eaf7af4ac5c4d7e0ad97ce9c5d2f069e02f89bb7e7d06496 -F src/pragma.h 40962d65b645bb3f08c1f4c456effd01c6e7f073f68ea25177e0c95e181cff75 +F src/pragma.h b45328f0946307b2e08f320abbb68e5352d94e45ce0a5c6d61ceb2f25a55b353 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 9d6a3bdca1ebc759c4616fee0d7dd4cf62741f53db3a6b0117600f27c5b1406a F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 3395765ea3749341deb4c25e8339c3d626a8ac641a52c216e9632e48e620ba68 -F src/shell.c.in 01d14c1e0a4dc45b6029baf1aa560de92b6b12c05a87e2270c1e4fc41ca0fd1e -F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab +F src/shell.c.in a17d143f186966ef24927b6b083f985ffdb95a01aa1bebaba7dcc706289bf7d2 +F src/sqlite.h.in 5ba20664cede7f4e6861541fad1f17bac50f7bf576b40a8784c54f9126a9edd4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 F src/sqliteInt.h 5b2d25ba23135ece06886d82f60d9a16869506592e5950f3c09257b3b5d28d5c @@ -536,7 +536,7 @@ F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6 F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 50c93be3e1c03b4e6cf6756e5197afcfe7f5cd0497d83a7ac317cde09e19b290 -F src/test1.c 17e1395cbddeb9226b756d723a7566b45b43b99a5f9f55afb4ff70888de6ad6f +F src/test1.c 95c7af53c4761c57b5dbfeb5da154de31a7dae0246da8976b0bdaee1062f0826 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -626,8 +626,8 @@ F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 F test/alter.test 16ed8d2470193f34bc711e51506ff1211ebfab8025ca3b9510ff2aef139874cb F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 -F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3 -F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433 +F test/alter3.test 9351a9f0c59ff9dddecccaaa2f777ffee5369870c63d30d3a74add815254ec0f +F test/alter4.test 74b22251c5e9c48093cfc4921ed9c11b59df84634aeeb00e501773320beb8424 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1a31ad @@ -748,7 +748,7 @@ F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e F test/conflict.test c7cc007e2af151516ddf38f7412fe10d473a694f55e3df437e2c7b31c2590e8d F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c -F test/conflict3.test 56d18aedfa521a7ebffadb8254cfff10caf4e49cd8659cb54da39513aed478ba +F test/conflict3.test f62a2d0cad9162a60e6458fc913dff3a2208feca924120c21737cfee65a6a74a F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 F test/corrupt2.test bb50042cf9a1f1023d73af325d47eb02a6bb11e3c52f8812644b220c5d4bca35 @@ -761,9 +761,9 @@ F test/corrupt8.test 2399dfe40d2c0c63af86706e30f3e6302a8d0516 F test/corrupt9.test 730a3db08d4ab9aa43392ea30d9c2b4879cbff85 F test/corruptA.test 112f4b2ae0b95ebf3ea63718642fb969a93acea557ace3a307234d19c245989b F test/corruptB.test 73a8d6c0b9833697ecf16b63e3c5c05c945b5dec -F test/corruptC.test 776f43eb7df750f6d00b8b59c36c3b690822b2880ddbd80d22bf44e9f66acf5c +F test/corruptC.test 74d4498fd25759618b393f1e9cde111de828b88c1848ab320f6c179fd52b5a60 F test/corruptD.test 33a37ce3ed56a20093ceee778cd2d7109c7085a59f3213d2baede11d952e8e50 -F test/corruptE.test 82ccf4f8f543fdbedd4aa42c709cb077f7374c62 +F test/corruptE.test 4143791f2dfb443aec5b7fabfa5821e6063eccc3b49b06f212c2f014715fd476 F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 F test/corruptG.test adf79b669cbfd19e28c8191a610d083ae53a6d51 F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 @@ -809,12 +809,12 @@ F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab F test/delete4.test 6aa279f459f4aa792cc251435c3809415c1ecaf9f27dce91675e26f05b503db3 F test/delete_db.test 096d828493c7907f9ea11a7098ea6a0f73edba89406487d5d6cc2228dc4ab8b0 -F test/descidx1.test 6d03b44c8538fe0eb4924e19fba10cdd8f3c9240 -F test/descidx2.test 9f1a0c83fd57f8667c82310ca21b30a350888b5d -F test/descidx3.test 09ddbe3f5295f482d2f8b687cf6db8bad7acd9a2 +F test/descidx1.test edc8adee58d491b06c7157c50364eaf1c3605c9c19f8093cb1ea2b6184f3ac13 +F test/descidx2.test a0ba347037ff3b811f4c6ceca5fd0f9d5d72e74e59f2d9de346a9d2f6ad78298 +F test/descidx3.test 953c831df7ea219c73826dfbf2f6ee02d95040725aa88ccb4fa43d1a1999b926 F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e F test/distinct.test a1783b960ad8c15a77cd9f207be072898db1026c -F test/distinct2.test b854b442111bf362328981f55d39d0df13140383b112057f6e046e311f14e5c3 +F test/distinct2.test 11b0594c932098e969d084ba45ab81d5040f4d4e766db65d49146705a305ed98 F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d @@ -860,7 +860,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test edd797ab2ef38de16064c9e3945efd941cba72d27e8f070c349501ff95d2727d +F test/filter1.test fe7fcfeff48ca399fbc9577f55b60c8be8ccfdffc5e3b4ace21dc3c3e59f0f6a F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b @@ -874,7 +874,7 @@ F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d0 F test/fkey8.test 48ef829d63f5f7b37aabd4df9363ac05f65539d1da8c4a44251631769d920579 F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 F test/fordelete.test eb93a2f34137bb87bdab88fcab06c0bd92719aff -F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb +F test/format4.test eeae341953db8b6bda7f549044797c3278a6cc345d11ada81471671b654f8ef4 F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7 F test/fts1b.test 5d8a01aefbecc8b7442b36c94c05eb7a845462d5 @@ -1058,13 +1058,13 @@ F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test c26c8b352311c1deb30642cd0379e5cb94e416c7e9e0885e92d9e01554df2db9 -F test/indexexpr2.test b580f378423bca443ffab47ada677203cfcf8a60f48a8aa20065f27c8f7739b5 +F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 -F test/insert4.test 7802ada6ba8738661b9f6c0e26858d3375b40cc7180289fd350644cd7a08fec9 +F test/insert4.test fb9e0f752c75f453555990250b449f6d123ae6a3ebf054d14e4470de4498dce3 F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 F test/instr.test 107df2b9b74a4b59315916b575590a08f2a714de0754abe541f10a0971d0a2a4 @@ -1082,7 +1082,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test b515753842b739f8310e718ff5a1581d0f80fd7c731c7e642c5af4310d8db94d +F test/join.test 832f7c7550a7c59a71c5e2886979a0770ba3b184f021387712680f804fae1df0 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1153,7 +1153,7 @@ F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 -F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063 +F test/minmax2.test 1edf66901ddfab26ae1e04165e8da834c8d3284e2b20aefb26b80ef217962eab F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87 F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 @@ -1187,7 +1187,7 @@ F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 725fb4d99db2ddcce59ca6bf847cd92db8f1af861785918892f84ac3bcd4223d +F test/nulls1.test a325e2f2148fb5c82cd5f734e7b60f5fa28f9394c318edf3140f36f57d39930a F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 @@ -1227,7 +1227,7 @@ F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac9416 F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c0df9 -F test/pragma4.test 1cb4b32f1a304ed9e291d7c4d49c91c2c8dc1b9450e6d2c1198b2cc895d40d77 +F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17c00b F test/pragma5.test 2be6a44c91e8585ccb4c71c5f221ccebe0692a49557215a912916ed391188959 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 @@ -1271,7 +1271,7 @@ F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 -F test/rowvaluevtab.test 751a224b86d5c66d1d0bfa9887da9d6ab9a1c09e1268b5abe0ffdfdd418f122f +F test/rowvaluevtab.test d166df5b666662de1ebf40d6f3849f8a76b34e17183a6cc7f81b420c462ce447 F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 F test/savepoint.test 1f8a6b1aea9a0d05837adc463d4bf47bd9d0f1c842f1c2a9caccd639baf34bf9 @@ -1419,7 +1419,7 @@ F test/threadtest3.c 38a612ea62854349ed66372f330a40d73c5cf956 F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90 F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c -F test/tkt-18458b1a.test c543c4b8e8c7c2200579a635e72c15bc374a92d44eddb1d588d4fdeca9cca532 +F test/tkt-18458b1a.test 6a62cb1ee50fa3c620da59e3a6f531eb38fceaf7e2166203816b724524e6f1d6 F test/tkt-26ff0c2d1e.test c15bec890c4d226c0da2f35ff30f9e84c169cfef90e73a8cb5cec11d723dfa96 F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2 F test/tkt-2d1a5c67d.test be1326f3061caec85085f4c9ee4490561ca037c0 @@ -1455,7 +1455,7 @@ F test/tkt-9a8b09f8e6.test b2ef151d0984b2ebf237760dbeaa50724e5a0667 F test/tkt-9d68c883.test 16f7cb96781ba579bc2e19bb14b4ad609d9774b6 F test/tkt-9f2eb3abac.test cb6123ac695a08b4454c3792fbe85108f67fabf8 F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 -F test/tkt-a7debbe0.test 65a647034e3416d068f81e7d86fffc07edfae371c70b8761714edb56ec1c7521 +F test/tkt-a7debbe0.test e295fa83cd4416a8ca37b354eb5fadefc5e81fb55253db538d35261fe9c95067 F test/tkt-a8a0d2996a.test 002e1cde8fc30c39611b52cf981c88200b858765748556822da72e0d32fac73e F test/tkt-b1d3a2e531.test 8f7576e41ca179289ee1a8fee28386fd8e4b0550 F test/tkt-b351d95f9.test d14a503c414c5c58fdde3e80f9a3cfef986498c0 @@ -1519,7 +1519,7 @@ F test/tkt3080.test 1bca7579260920a66b4dd7e196e807c0f25ff804 F test/tkt3093.test fbdbc5b4969244ad11f540759003e361fcaf391f F test/tkt3121.test 536df66a02838c26a12fe98639354ca1290ca68b F test/tkt3201.test f1500ccecc0d578dc4cde7d3242008297c4d59b3 -F test/tkt3292.test 962465a0984a3b8c757efe59c2c59144871ee1dd +F test/tkt3292.test 7bad4423cf5eb075dbb58511d66d46fe816744754c9f0050ae60157f71a4fca7 F test/tkt3298.test 20fd8773b825cb602e033aa04f8602e1ebdcd93c F test/tkt3334.test 9756631e3c4aa3c416362c279e3c0953a83b7ca8274cb81a13264bb56296d8b0 F test/tkt3346.test 6f67c3ed7db94dfc5df4f5f0b63809a1f611e01a @@ -1722,7 +1722,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2 F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b -F test/window9.test ae8be07be05a5a4c8ead1818ac5d45f278b8dd456e589d67f24270b0070c35a0 +F test/window9.test b63f6f74d730547e63e78946f951f5d1a7d4e99f91f6d5906305469043d92a15 F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 @@ -1781,7 +1781,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl f115d63ada8171f9da28dc8e34e043a1a159692d46b89f66b6e681140bc4683d +F tool/mkpragmatab.tcl faf48e2962d820ffe4d793f5076dd64aa5179665e4e481188c0ba7f48ace3bbb F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 361ea81ae8a13e7d2ec4c2412f30e049bb6ee320980d502c86bedc315cdd3bc0 -R f38e4bc770b0e4cac1c1d7cd5ea27795 +P 4fba090e678ef184736277c9ec9a9374c8bd4df4d41f51a3dc6818e2efcc103b +R 52efea3d4f86047597328a59c66d53fe U drh -Z f0fd4433a459345a3d1e230e95f7dbc0 +Z bd25b0a08ac9600a5f8efd599cb395b8 diff --git a/manifest.uuid b/manifest.uuid index f0d63945b5..d5ded283c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4fba090e678ef184736277c9ec9a9374c8bd4df4d41f51a3dc6818e2efcc103b \ No newline at end of file +4d424f3047b48fc441475137f30a719d2f079390c86fe2617710ddfb05c5e240 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 39ab4a8fee..1172188821 100644 --- a/src/main.c +++ b/src/main.c @@ -851,6 +851,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, SQLITE_LegacyAlter }, { SQLITE_DBCONFIG_DQS_DDL, SQLITE_DqsDDL }, { SQLITE_DBCONFIG_DQS_DML, SQLITE_DqsDML }, + { SQLITE_DBCONFIG_LEGACY_FILE_FORMAT, SQLITE_LegacyFileFmt }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ diff --git a/src/pragma.h b/src/pragma.h index b7f3282ded..bfd6a3618e 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -396,11 +396,6 @@ static const PragmaName aPragmaName[] = { /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, /* iArg: */ SQLITE_LegacyAlter }, - {/* zName: */ "legacy_file_format", - /* ePragTyp: */ PragTyp_FLAG, - /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, - /* ColNames: */ 0, 0, - /* iArg: */ SQLITE_LegacyFileFmt }, #endif #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && SQLITE_ENABLE_LOCKING_STYLE {/* zName: */ "lock_proxy_file", @@ -668,4 +663,4 @@ static const PragmaName aPragmaName[] = { /* iArg: */ SQLITE_WriteSchema|SQLITE_NoSchemaError }, #endif }; -/* Number of pragmas: 65 on by default, 81 total. */ +/* Number of pragmas: 64 on by default, 80 total. */ diff --git a/src/shell.c.in b/src/shell.c.in index 86856b3354..09fc5870fc 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7171,6 +7171,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "legacy_alter_table", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, + { "legacy_file_format", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, }; int ii, v; open_db(p, 0); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9dbc80764f..5c3827e2d4 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2259,6 +2259,28 @@ struct sqlite3_mem_methods { ** default value of this setting is determined by the [-DSQLITE_DQS] ** compile-time option. ** +** +** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]] +**

SQLITE_DBCONFIG_LEGACY_FILE_FORMAT +**
The SQLITE_DBCONFIG_LEGACY_FILE_FORMAT option activates or deactivates +** the legacy file format flag. When activated, this flag causes all newly +** created database file to have a schema format version number (the 4-byte +** integer found at offset 44 into the database header) of 1. This in turn +** means that the resulting database file will be readable and writable by +** any SQLite version back to 3.0.0 ([dateof:3.0.0]). Without this setting, +** newly created databases are generally not understandable by SQLite versions +** prior to 3.3.0 ([dateof:3.3.0]). As these words are written, there +** is now scarcely any need to generated database files that are compatible +** all the way back to version 3.0.0, and so this setting is of little +** practical use, but is provided so that SQLite can continue to claim the +** ability to generate new database files that are compatible with version +** 3.0.0. +**

Note that when the SQLITE_DBCONFIG_LEGACY_FILE_FORMAT setting is on, +** the [VACUUM] command will fail with an obscure error when attempting to +** process a table with generated columns and a descending index. This is +** not considered a bug since SQLite versions 3.3.0 and earlier do not support +** either generated columns or decending indexes. +**

** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -2277,7 +2299,8 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_DQS_DML 1013 /* int int* */ #define SQLITE_DBCONFIG_DQS_DDL 1014 /* int int* */ #define SQLITE_DBCONFIG_ENABLE_VIEW 1015 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1015 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1016 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes diff --git a/src/test1.c b/src/test1.c index ffd6091fa3..b25873bbd4 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7682,14 +7682,15 @@ static int SQLITE_TCLAPI test_sqlite3_db_config( { "LEGACY_ALTER_TABLE", SQLITE_DBCONFIG_LEGACY_ALTER_TABLE }, { "DQS_DML", SQLITE_DBCONFIG_DQS_DML }, { "DQS_DDL", SQLITE_DBCONFIG_DQS_DDL }, + { "LEGACY_FILE_FORMAT", SQLITE_DBCONFIG_LEGACY_FILE_FORMAT }, }; int i; - int v; + int v = 0; const char *zSetting; sqlite3 *db; - if( objc!=4 ){ - Tcl_WrongNumArgs(interp, 1, objv, "DB SETTING VALUE"); + if( objc!=4 && objc!=3 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB SETTING [VALUE]"); return TCL_ERROR; } if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR; @@ -7705,7 +7706,11 @@ static int SQLITE_TCLAPI test_sqlite3_db_config( Tcl_NewStringObj("unknown sqlite3_db_config setting", -1)); return TCL_ERROR; } - if( Tcl_GetIntFromObj(interp, objv[3], &v) ) return TCL_ERROR; + if( objc==4 ){ + if( Tcl_GetIntFromObj(interp, objv[3], &v) ) return TCL_ERROR; + }else{ + v = -1; + } sqlite3_db_config(db, aSetting[i].eVal, v, &v); Tcl_SetObjResult(interp, Tcl_NewIntObj(v)); return TCL_OK; diff --git a/test/alter3.test b/test/alter3.test index 44b31c9833..b16a7f305b 100644 --- a/test/alter3.test +++ b/test/alter3.test @@ -54,8 +54,8 @@ proc get_file_format {{fname test.db}} { } do_test alter3-1.1 { + sqlite3_db_config db LEGACY_FILE_FORMAT 1 execsql { - PRAGMA legacy_file_format=ON; CREATE TABLE abc(a, b, c); SELECT sql FROM sqlite_master; } @@ -198,8 +198,8 @@ do_test alter3-4.1 { db close forcedelete test.db set ::DB [sqlite3 db test.db] + sqlite3_db_config db LEGACY_FILE_FORMAT 1 execsql { - PRAGMA legacy_file_format=ON; CREATE TABLE t1(a, b); INSERT INTO t1 VALUES(1, 100); INSERT INTO t1 VALUES(2, 300); diff --git a/test/alter4.test b/test/alter4.test index ca9175959b..92f33e7a36 100644 --- a/test/alter4.test +++ b/test/alter4.test @@ -383,8 +383,8 @@ do_execsql_test alter4-9.3 { do_test alter4-10.1 { db close sqlite3 db :memory: + sqlite3_db_config db LEGACY_FILE_FORMAT 1 db eval { - PRAGMA legacy_file_format=on; CREATE TABLE t1(a,b,c); CREATE INDEX t1a ON t1(a DESC); INSERT INTO t1 VALUES(1,2,3); diff --git a/test/conflict3.test b/test/conflict3.test index 413e8241fe..cc3a51b850 100644 --- a/test/conflict3.test +++ b/test/conflict3.test @@ -435,4 +435,3 @@ ifcapable trigger { } finish_test - diff --git a/test/corruptC.test b/test/corruptC.test index d151a27304..a56abeec72 100644 --- a/test/corruptC.test +++ b/test/corruptC.test @@ -34,9 +34,9 @@ database_may_be_corrupt # Construct a compact, dense database for testing. # do_test corruptC-1.1 { + sqlite3_db_config db LEGACY_FILE_FORMAT 1 execsql { PRAGMA auto_vacuum = 0; - PRAGMA legacy_file_format=1; BEGIN; CREATE TABLE t1(x,y); INSERT INTO t1 VALUES(1,1); diff --git a/test/corruptE.test b/test/corruptE.test index 54aa420f43..8c55623ea4 100644 --- a/test/corruptE.test +++ b/test/corruptE.test @@ -36,9 +36,9 @@ ifcapable oversize_cell_check { # Construct a compact, dense database for testing. # do_test corruptE-1.1 { + sqlite3_db_config db LEGACY_FILE_FORMAT 1 execsql { PRAGMA auto_vacuum = 0; - PRAGMA legacy_file_format=1; BEGIN; CREATE TABLE t1(x,y); INSERT INTO t1 VALUES(1,1); diff --git a/test/descidx1.test b/test/descidx1.test index a223664ff3..14be6f84e8 100644 --- a/test/descidx1.test +++ b/test/descidx1.test @@ -22,7 +22,8 @@ source $testdir/tester.tcl # do_not_use_codec -db eval {PRAGMA legacy_file_format=OFF} +#db eval {PRAGMA legacy_file_format=OFF} +sqlite3_db_config db LEGACY_FILE_FORMAT 0 # This procedure sets the value of the file-format in file 'test.db' # to $newval. Also, the schema cookie is incremented. @@ -299,19 +300,19 @@ ifcapable legacyformat { db close forcedelete test.db test.db-journal sqlite3 db test.db - execsql {PRAGMA legacy_file_format} + sqlite3_db_config db LEGACY_FILE_FORMAT } {1} } else { do_test descidx1-6.1 { db close forcedelete test.db test.db-journal sqlite3 db test.db - execsql {PRAGMA legacy_file_format} + sqlite3_db_config db LEGACY_FILE_FORMAT } {0} } do_test descidx1-6.2 { - execsql {PRAGMA legacy_file_format=YES} - execsql {PRAGMA legacy_file_format} + sqlite3_db_config db LEGACY_FILE_FORMAT 1 + sqlite3_db_config db LEGACY_FILE_FORMAT } {1} do_test descidx1-6.3 { execsql { @@ -330,8 +331,8 @@ do_test descidx1-6.4 { db close forcedelete test.db test.db-journal sqlite3 db test.db - execsql {PRAGMA legacy_file_format=NO} - execsql {PRAGMA legacy_file_format} + sqlite3_db_config db LEGACY_FILE_FORMAT 0 + sqlite3_db_config db LEGACY_FILE_FORMAT } {0} do_test descidx1-6.5 { execsql { @@ -351,8 +352,8 @@ ifcapable vacuum { get_file_format } {4} do_test descidx1-6.7 { + sqlite3_db_config db LEGACY_FILE_FORMAT 1 execsql { - PRAGMA legacy_file_format=ON; VACUUM; } get_file_format diff --git a/test/descidx2.test b/test/descidx2.test index fdc3eb0794..5aefc598ed 100644 --- a/test/descidx2.test +++ b/test/descidx2.test @@ -23,7 +23,8 @@ source $testdir/tester.tcl do_not_use_codec -db eval {PRAGMA legacy_file_format=OFF} +#db eval {PRAGMA legacy_file_format=OFF} +sqlite3_db_config db LEGACY_FILE_FORMAT 0 # This procedure sets the value of the file-format in file 'test.db' # to $newval. Also, the schema cookie is incremented. diff --git a/test/descidx3.test b/test/descidx3.test index c375acc705..30dd8f895c 100644 --- a/test/descidx3.test +++ b/test/descidx3.test @@ -26,7 +26,8 @@ ifcapable !bloblit { finish_test return } -db eval {PRAGMA legacy_file_format=OFF} +#db eval {PRAGMA legacy_file_format=OFF} +sqlite3_db_config db LEGACY_FILE_FORMAT 0 # This procedure sets the value of the file-format in file 'test.db' # to $newval. Also, the schema cookie is incremented. diff --git a/test/distinct2.test b/test/distinct2.test index c42a1c971a..98c6d64a62 100644 --- a/test/distinct2.test +++ b/test/distinct2.test @@ -302,4 +302,3 @@ do_execsql_test 3030 { } finish_test - diff --git a/test/filter1.test b/test/filter1.test index 9309b744b1..eb50963470 100644 --- a/test/filter1.test +++ b/test/filter1.test @@ -185,4 +185,3 @@ do_execsql_test 5.3 { } {0 1} finish_test - diff --git a/test/format4.test b/test/format4.test index 14d794709b..a850ce2e42 100644 --- a/test/format4.test +++ b/test/format4.test @@ -17,7 +17,8 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -db eval {PRAGMA legacy_file_format=OFF} +#db eval {PRAGMA legacy_file_format=OFF} +sqlite3_db_config db LEGACY_FILE_FORMAT 0 # The size of the database depends on whether or not autovacuum # is enabled. diff --git a/test/indexexpr2.test b/test/indexexpr2.test index 5d387c7523..35caef3c24 100644 --- a/test/indexexpr2.test +++ b/test/indexexpr2.test @@ -373,4 +373,3 @@ foreach {tn expr} { } finish_test - diff --git a/test/insert4.test b/test/insert4.test index c819b80832..4c6a6d4a6c 100644 --- a/test/insert4.test +++ b/test/insert4.test @@ -34,8 +34,8 @@ proc xferopt_test {testname N} { # Create tables used for testing. # +sqlite3_db_config db LEGACY_FILE_FORMAT 0 execsql { - PRAGMA legacy_file_format = 0; CREATE TABLE t1(a int, b int, check(b>a)); CREATE TABLE t2(x int, y int); CREATE VIEW v2 AS SELECT y, x FROM t2; diff --git a/test/join.test b/test/join.test index 1689a85e3f..7d7524508d 100644 --- a/test/join.test +++ b/test/join.test @@ -936,4 +936,3 @@ do_execsql_test join-19.5 { } {0 {}} finish_test - diff --git a/test/minmax2.test b/test/minmax2.test index b6114f2e51..5129146259 100644 --- a/test/minmax2.test +++ b/test/minmax2.test @@ -21,8 +21,8 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl do_test minmax2-1.0 { + sqlite3_db_config db LEGACY_FILE_FORMAT 0 execsql { - PRAGMA legacy_file_format=0; BEGIN; CREATE TABLE t1(x, y); INSERT INTO t1 VALUES(1,1); diff --git a/test/nulls1.test b/test/nulls1.test index 98fc6ab37d..fb059a674b 100644 --- a/test/nulls1.test +++ b/test/nulls1.test @@ -249,5 +249,3 @@ do_execsql_test 7.0 { } finish_test - - diff --git a/test/pragma4.test b/test/pragma4.test index bceb4b84f4..2eef060b6c 100644 --- a/test/pragma4.test +++ b/test/pragma4.test @@ -44,7 +44,6 @@ foreach {tn sql} { 14 "PRAGMA full_column_names = 1" 15 "PRAGMA fullfsync = 1" 16 "PRAGMA ignore_check_constraints = 1" - 17 "PRAGMA legacy_file_format = 1" 18 "PRAGMA page_size = 511" 19 "PRAGMA page_size = 512" 20 "PRAGMA query_only = false" diff --git a/test/rowvaluevtab.test b/test/rowvaluevtab.test index 7d5dc52651..aa834657b8 100644 --- a/test/rowvaluevtab.test +++ b/test/rowvaluevtab.test @@ -88,4 +88,3 @@ do_vfilter4_test 1.4f { } {{SELECT rowid, a, b, c FROM 't1' WHERE b = ?}} finish_test - diff --git a/test/tkt-18458b1a.test b/test/tkt-18458b1a.test index 996ca88451..4a61274859 100644 --- a/test/tkt-18458b1a.test +++ b/test/tkt-18458b1a.test @@ -50,4 +50,3 @@ foreach tn {1 2} { } finish_test - diff --git a/test/tkt-a7debbe0.test b/test/tkt-a7debbe0.test index 974f6d66b0..cc72eb7b5e 100644 --- a/test/tkt-a7debbe0.test +++ b/test/tkt-a7debbe0.test @@ -100,4 +100,3 @@ foreach tn {1 2} { } finish_test - diff --git a/test/tkt3292.test b/test/tkt3292.test index 0f95244643..717a29c9a0 100644 --- a/test/tkt3292.test +++ b/test/tkt3292.test @@ -20,8 +20,8 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl do_test tkt3292-1.1 { + sqlite3_db_config db LEGACY_FILE_FORMAT 0 execsql { - PRAGMA legacy_file_format=OFF; CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); INSERT INTO t1 VALUES(0, 1); INSERT INTO t1 VALUES(1, 1); diff --git a/test/window9.test b/test/window9.test index 6f2f2d9526..adfeaba356 100644 --- a/test/window9.test +++ b/test/window9.test @@ -233,4 +233,3 @@ do_execsql_test 7.4 { } finish_test - diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 832153916e..82176dc3c6 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -41,11 +41,6 @@ set pragma_def { ARG: SQLITE_NullCallback IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) - NAME: legacy_file_format - TYPE: FLAG - ARG: SQLITE_LegacyFileFmt - IF: !defined(SQLITE_OMIT_FLAG_PRAGMAS) - NAME: fullfsync TYPE: FLAG ARG: SQLITE_FullFSync From 9ee94147f086fc9cd4bcf2bcdbb1fab6d1d1f921 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Oct 2019 13:00:23 +0000 Subject: [PATCH 104/476] New tokens ALWAYS, GENERATED, and STORED used by generated columns should all be fallback tokens. FossilOrigin-Name: 13fe6978b7de208d2e27460d824f7fc778cf6ea0aabfe566b32bb410b8816f63 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 41bdcbc256..22e2cedd30 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sthe\slegacy_file_format\sPRAGMA.\s\sIn\sits\splace,\sprovide\sthe\nSQLITE_DBCONFIG_LEGACY_FILE_FORMAT\soption\sto\ssqlite3_db_config().\nFix\sfor\sticket\s[6484e6ce678fffab] -D 2019-10-29T16:18:45.173 +C New\stokens\sALWAYS,\sGENERATED,\sand\sSTORED\sused\sby\sgenerated\scolumns\sshould\nall\sbe\sfallback\stokens. +D 2019-10-30T13:00:23.625 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 5f09d382d55ae7832d4975d71d851ea0cffa89c3803ff59cc4802220a0e3a476 +F src/parse.y ea567d2ada3d5a8647bf55b3ebb8ede223bc15e69f349a6144348787b95895da F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4fba090e678ef184736277c9ec9a9374c8bd4df4d41f51a3dc6818e2efcc103b -R 52efea3d4f86047597328a59c66d53fe +P 4d424f3047b48fc441475137f30a719d2f079390c86fe2617710ddfb05c5e240 +R d27d4fff3c6fbce4f9267adc4b31de94 U drh -Z bd25b0a08ac9600a5f8efd599cb395b8 +Z c4c731d7baeb139e7fe1ba09d543039c diff --git a/manifest.uuid b/manifest.uuid index d5ded283c8..4bef0df2af 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d424f3047b48fc441475137f30a719d2f079390c86fe2617710ddfb05c5e240 \ No newline at end of file +13fe6978b7de208d2e27460d824f7fc778cf6ea0aabfe566b32bb410b8816f63 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 79b9da7a4a..86dfc928ea 100644 --- a/src/parse.y +++ b/src/parse.y @@ -220,6 +220,9 @@ columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);} CURRENT FOLLOWING PARTITION PRECEDING RANGE UNBOUNDED EXCLUDE GROUPS OTHERS TIES %endif SQLITE_OMIT_WINDOWFUNC +%ifndef SQLITE_OMIT_GENERATED_COLUMNS + GENERATED ALWAYS STORED +%endif REINDEX RENAME CTIME_KW IF . %wildcard ANY. From 920cf596e67ecccecb497cfa60cc65945048f866 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Oct 2019 16:29:02 +0000 Subject: [PATCH 105/476] Simplify the bytecode generation for SQL function calls such that the OP_Function or OP_PureFunc opcodes are coded directly, rather than using the intermediate OP_Function0 or OP_PureFunc0 - opcodes that are now removed. FossilOrigin-Name: 84e02d773d60cffe619104991d21d7f0c68616c0f6bb99686bf54f5306c756d0 --- manifest | 22 ++++++------- manifest.uuid | 2 +- src/analyze.c | 31 ++++++++---------- src/attach.c | 7 ++-- src/expr.c | 5 ++- src/vdbe.c | 88 ++++++++++++++++++++------------------------------- src/vdbe.h | 1 + src/vdbeaux.c | 60 ++++++++++++++++++++++++++++++++--- 8 files changed, 121 insertions(+), 95 deletions(-) diff --git a/manifest b/manifest index 22e2cedd30..5f1f7568dd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stokens\sALWAYS,\sGENERATED,\sand\sSTORED\sused\sby\sgenerated\scolumns\sshould\nall\sbe\sfallback\stokens. -D 2019-10-30T13:00:23.625 +C Simplify\sthe\sbytecode\sgeneration\sfor\sSQL\sfunction\scalls\ssuch\sthat\sthe\nOP_Function\sor\sOP_PureFunc\sopcodes\sare\scoded\sdirectly,\srather\sthan\susing\nthe\sintermediate\sOP_Function0\sor\sOP_PureFunc0\s-\sopcodes\sthat\sare\snow\sremoved. +D 2019-10-30T16:29:02.506 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -461,8 +461,8 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 0fdf14a1d1c61315a6d727252c579bc8cbfe62de195df6979dd784374e22032b -F src/analyze.c fd70b9c7a683230a7f7936af64dd25308e93d7c9819a3168493a7c7703481f80 -F src/attach.c 3ca19504849c2d9be10fc5899d6811f9d6e848665d1a41ffb53df0cd6e7c13ed +F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c +F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 @@ -478,7 +478,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c c158710c5de9452fb3f82f038ed96026f1ce1a2a1fcd9bbdb2172f33bfe9fd72 +F src/expr.c 23d5f9e491921a57fe6d59b75c461d45777470d8b1653180ebb3e83ea658f889 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c ac56f02ffe7a3dff311654f86e3c2fd1ff2eb38862b0c07fd908d8cc0fb4a9a2 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -598,11 +598,11 @@ F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 9e4ba6bb8e5b827b9ae771ba62a92f3099adaacd36838d54042eb2499cd7f6f5 -F src/vdbe.h 2a49df699f305afa94f338f14bf6e1bfbca8112ce9c4d522abffd9493fc22a25 +F src/vdbe.c b67d6af853e03c3dd6d1116351567f62d8a2c10d3bd6db5f7f366e75d11c6653 +F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c e3ed5475d4611f28f3cad06c0454a354148f3bb0ce21c75659ce737dc13f7968 +F src/vdbeaux.c aeba258bb045c583bd85ae1e0b218c3542897baf522da1f1ab7da4259a7394ce F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4d424f3047b48fc441475137f30a719d2f079390c86fe2617710ddfb05c5e240 -R d27d4fff3c6fbce4f9267adc4b31de94 +P 13fe6978b7de208d2e27460d824f7fc778cf6ea0aabfe566b32bb410b8816f63 +R 2b5ad42e3fc6b49f0350688afce0bf63 U drh -Z c4c731d7baeb139e7fe1ba09d543039c +Z 8fbcb7ba95c29435c7309e57f3022596 diff --git a/manifest.uuid b/manifest.uuid index 4bef0df2af..924a8fc5ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -13fe6978b7de208d2e27460d824f7fc778cf6ea0aabfe566b32bb410b8816f63 \ No newline at end of file +84e02d773d60cffe619104991d21d7f0c68616c0f6bb99686bf54f5306c756d0 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index 6df6e7a6ec..2a071ef126 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -916,18 +916,17 @@ static const FuncDef statGetFuncdef = { {0} }; -static void callStatGet(Vdbe *v, int regStat4, int iParam, int regOut){ - assert( regOut!=regStat4 && regOut!=regStat4+1 ); +static void callStatGet(Parse *pParse, int regStat4, int iParam, int regOut){ #ifdef SQLITE_ENABLE_STAT4 - sqlite3VdbeAddOp2(v, OP_Integer, iParam, regStat4+1); + sqlite3VdbeAddOp2(pParse->pVdbe, OP_Integer, iParam, regStat4+1); #elif SQLITE_DEBUG assert( iParam==STAT_GET_STAT1 ); #else UNUSED_PARAMETER( iParam ); #endif - sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4, regOut, - (char*)&statGetFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 1 + IsStat4); + assert( regOut!=regStat4 && regOut!=regStat4+1 ); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat4, regOut, 1+IsStat4, + &statGetFuncdef, 0); } /* @@ -1095,9 +1094,8 @@ static void analyzeOneTable( #endif sqlite3VdbeAddOp2(v, OP_Integer, nCol, regStat4+1); sqlite3VdbeAddOp2(v, OP_Integer, pIdx->nKeyCol, regStat4+2); - sqlite3VdbeAddOp4(v, OP_Function0, 0, regStat4+1, regStat4, - (char*)&statInitFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 2+IsStat4); + sqlite3VdbeAddFunctionCall(pParse, 0, regStat4+1, regStat4, 2+IsStat4, + &statInitFuncdef, 0); /* Implementation of the following: ** @@ -1192,13 +1190,12 @@ static void analyzeOneTable( } #endif assert( regChng==(regStat4+1) ); - sqlite3VdbeAddOp4(v, OP_Function0, 1, regStat4, regTemp, - (char*)&statPushFuncdef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, 2+IsStat4); + sqlite3VdbeAddFunctionCall(pParse, 1, regStat4, regTemp, 2+IsStat4, + &statPushFuncdef, 0); sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, addrNextRow); VdbeCoverage(v); /* Add the entry to the stat1 table. */ - callStatGet(v, regStat4, STAT_GET_STAT1, regStat1); + callStatGet(pParse, regStat4, STAT_GET_STAT1, regStat1); assert( "BBB"[0]==SQLITE_AFF_TEXT ); sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regTemp, "BBB", 0); sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid); @@ -1224,12 +1221,12 @@ static void analyzeOneTable( pParse->nMem = MAX(pParse->nMem, regCol+nCol); addrNext = sqlite3VdbeCurrentAddr(v); - callStatGet(v, regStat4, STAT_GET_ROWID, regSampleRowid); + callStatGet(pParse, regStat4, STAT_GET_ROWID, regSampleRowid); addrIsNull = sqlite3VdbeAddOp1(v, OP_IsNull, regSampleRowid); VdbeCoverage(v); - callStatGet(v, regStat4, STAT_GET_NEQ, regEq); - callStatGet(v, regStat4, STAT_GET_NLT, regLt); - callStatGet(v, regStat4, STAT_GET_NDLT, regDLt); + callStatGet(pParse, regStat4, STAT_GET_NEQ, regEq); + callStatGet(pParse, regStat4, STAT_GET_NLT, regLt); + callStatGet(pParse, regStat4, STAT_GET_NDLT, regDLt); sqlite3VdbeAddOp4Int(v, seekOp, iTabCur, addrNext, regSampleRowid, 0); VdbeCoverage(v); for(i=0; imallocFailed ); if( v ){ - sqlite3VdbeAddOp4(v, OP_Function0, 0, regArgs+3-pFunc->nArg, regArgs+3, - (char *)pFunc, P4_FUNCDEF); - assert( pFunc->nArg==-1 || (pFunc->nArg&0xff)==pFunc->nArg ); - sqlite3VdbeChangeP5(v, (u8)(pFunc->nArg)); - + sqlite3VdbeAddFunctionCall(pParse, 0, regArgs+3-pFunc->nArg, regArgs+3, + pFunc->nArg, pFunc, 0); /* Code an OP_Expire. For an ATTACH statement, set P1 to true (expire this ** statement only). For DETACH, set it to false (expire all existing ** statements). diff --git a/src/expr.c b/src/expr.c index 7dd5577364..36ab7c795a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4032,9 +4032,8 @@ expr_code_doover: }else #endif { - sqlite3VdbeAddOp4(v, pParse->iSelfTab ? OP_PureFunc0 : OP_Function0, - constMask, r1, target, (char*)pDef, P4_FUNCDEF); - sqlite3VdbeChangeP5(v, (u8)nFarg); + sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, + pDef, pParse->iSelfTab); } if( nFarg && constMask==0 ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); diff --git a/src/vdbe.c b/src/vdbe.c index 7c8d2a4ef7..dbfa18a5e2 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7442,29 +7442,14 @@ case OP_MaxPgcnt: { /* out2 */ } #endif -/* Opcode: Function0 P1 P2 P3 P4 P5 -** Synopsis: r[P3]=func(r[P2@P5]) -** -** Invoke a user function (P4 is a pointer to a FuncDef object that -** defines the function) with P5 arguments taken from register P2 and -** successors. The result of the function is stored in register P3. -** Register P3 must not be one of the function inputs. -** -** P1 is a 32-bit bitmask indicating whether or not each argument to the -** function was determined to be constant at compile time. If the first -** argument was constant then bit 0 of P1 is set. This is used to determine -** whether meta data associated with a user function argument using the -** sqlite3_set_auxdata() API may be safely retained until the next -** invocation of this opcode. -** -** See also: Function, AggStep, AggFinal -*/ -/* Opcode: Function P1 P2 P3 P4 P5 +/* Opcode: Function P1 P2 P3 P4 * ** Synopsis: r[P3]=func(r[P2@P5]) ** ** Invoke a user function (P4 is a pointer to an sqlite3_context object that -** contains a pointer to the function to be run) with P5 arguments taken -** from register P2 and successors. The result of the function is stored +** contains a pointer to the function to be run) with arguments taken +** from register P2 and successors. The number of arguments is in +** the sqlite3_context object that P4 points to. +** The result of the function is stored ** in register P3. Register P3 must not be one of the function inputs. ** ** P1 is a 32-bit bitmask indicating whether or not each argument to the @@ -7474,40 +7459,35 @@ case OP_MaxPgcnt: { /* out2 */ ** sqlite3_set_auxdata() API may be safely retained until the next ** invocation of this opcode. ** -** SQL functions are initially coded as OP_Function0 with P4 pointing -** to a FuncDef object. But on first evaluation, the P4 operand is -** automatically converted into an sqlite3_context object and the operation -** changed to this OP_Function opcode. In this way, the initialization of -** the sqlite3_context object occurs only once, rather than once for each -** evaluation of the function. -** -** See also: Function0, AggStep, AggFinal +** See also: AggStep, AggFinal, PureFunc +*/ +/* Opcode: PureFunc P1 P2 P3 P4 * +** Synopsis: r[P3]=func(r[P2@P5]) +** +** Invoke a user function (P4 is a pointer to an sqlite3_context object that +** contains a pointer to the function to be run) with arguments taken +** from register P2 and successors. The number of arguments is in +** the sqlite3_context object that P4 points to. +** The result of the function is stored +** in register P3. Register P3 must not be one of the function inputs. +** +** P1 is a 32-bit bitmask indicating whether or not each argument to the +** function was determined to be constant at compile time. If the first +** argument was constant then bit 0 of P1 is set. This is used to determine +** whether meta data associated with a user function argument using the +** sqlite3_set_auxdata() API may be safely retained until the next +** invocation of this opcode. +** +** This opcode works exactly like OP_Function. The only difference is in +** its name. This opcode is used in places where the function must be +** purely non-deterministic. Some built-in date/time functions can be +** either determinitic of non-deterministic, depending on their arguments. +** When those function are used in a non-deterministic way, they will check +** to see if they were called using OP_PureFunc instead of OP_Function, and +** if they were, they throw an error. +** +** See also: AggStep, AggFinal, Function */ -case OP_PureFunc0: /* group */ -case OP_Function0: { /* group */ - int n; - sqlite3_context *pCtx; - - assert( pOp->p4type==P4_FUNCDEF ); - n = pOp->p5; - assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); - assert( n==0 || (pOp->p2>0 && pOp->p2+n<=(p->nMem+1 - p->nCursor)+1) ); - assert( pOp->p3p2 || pOp->p3>=pOp->p2+n ); - pCtx = sqlite3DbMallocRawNN(db, sizeof(*pCtx) + (n-1)*sizeof(sqlite3_value*)); - if( pCtx==0 ) goto no_mem; - pCtx->pOut = 0; - pCtx->pFunc = pOp->p4.pFunc; - pCtx->iOp = (int)(pOp - aOp); - pCtx->pVdbe = p; - pCtx->isError = 0; - pCtx->argc = n; - pOp->p4type = P4_FUNCCTX; - pOp->p4.pCtx = pCtx; - assert( OP_PureFunc == OP_PureFunc0+2 ); - assert( OP_Function == OP_Function0+2 ); - pOp->opcode += 2; - /* Fall through into OP_Function */ -} case OP_PureFunc: /* group */ case OP_Function: { /* group */ int i; @@ -7522,9 +7502,11 @@ case OP_Function: { /* group */ ** reinitializes the relavant parts of the sqlite3_context object */ pOut = &aMem[pOp->p3]; if( pCtx->pOut != pOut ){ + pCtx->pVdbe = p; pCtx->pOut = pOut; for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; } + assert( pCtx->pVdbe==p ); memAboutToChange(p, pOut); #ifdef SQLITE_DEBUG diff --git a/src/vdbe.h b/src/vdbe.h index b5c2f02de8..3214d5bce3 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -190,6 +190,7 @@ int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int); int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int); int sqlite3VdbeAddOp4Dup8(Vdbe*,int,int,int,int,const u8*,int); int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int); +int sqlite3VdbeAddFunctionCall(Parse*,int,int,int,int,const FuncDef*,int); void sqlite3VdbeEndCoroutine(Vdbe*,int); #if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index c83292fa43..de6575cd51 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -15,6 +15,10 @@ #include "sqliteInt.h" #include "vdbeInt.h" +/* Forward references */ +static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef); +static void vdbeFreeOpArray(sqlite3 *, Op *, int); + /* ** Create a new virtual database engine. */ @@ -328,6 +332,48 @@ int sqlite3VdbeAddOp4( return addr; } +/* +** Add an OP_Function or OP_PureFunc opcode. +** +** The eCallCtx argument is information (typically taken from Expr.op2) +** that describes the calling context of the function. 0 means a general +** function call. NC_IsCheck means called by a check constraint, +** NC_IdxExpr means called as part of an index expression. NC_PartIdx +** means in the WHERE clause of a partial index. NC_GenCol means called +** while computing a generated column value. 0 is the usual case. +*/ +int sqlite3VdbeAddFunctionCall( + Parse *pParse, /* Parsing context */ + int p1, /* Constant argument mask */ + int p2, /* First argument register */ + int p3, /* Register into which results are written */ + int nArg, /* Number of argument */ + const FuncDef *pFunc, /* The function to be invoked */ + int eCallCtx /* Calling context */ +){ + Vdbe *v = pParse->pVdbe; + int nByte; + int addr; + sqlite3_context *pCtx; + assert( v ); + nByte = sizeof(*pCtx) + (nArg-1)*sizeof(sqlite3_value*); + pCtx = sqlite3DbMallocRawNN(pParse->db, nByte); + if( pCtx==0 ){ + assert( pParse->db->mallocFailed ); + freeEphemeralFunction(pParse->db, (FuncDef*)pFunc); + return 0; + } + pCtx->pOut = 0; + pCtx->pFunc = (FuncDef*)pFunc; + pCtx->pVdbe = v; + pCtx->isError = 0; + pCtx->argc = nArg; + addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, + p1, p2, p3, (char*)pCtx, P4_FUNCCTX); + pCtx->iOp = addr; + return addr; +} + /* ** Add an opcode that includes the p4 value with a P4_INT64 or ** P4_REAL type. @@ -1020,8 +1066,6 @@ static void freeEphemeralFunction(sqlite3 *db, FuncDef *pDef){ } } -static void vdbeFreeOpArray(sqlite3 *, Op *, int); - /* ** Delete a P4 value if necessary. */ @@ -1031,7 +1075,7 @@ static SQLITE_NOINLINE void freeP4Mem(sqlite3 *db, Mem *p){ } static SQLITE_NOINLINE void freeP4FuncCtx(sqlite3 *db, sqlite3_context *p){ freeEphemeralFunction(db, p->pFunc); - sqlite3DbFreeNN(db, p); + sqlite3DbFreeNN(db, p); } static void freeP4(sqlite3 *db, int p4type, void *p4){ assert( db ); @@ -1537,13 +1581,11 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){ sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); break; } -#if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) case P4_FUNCCTX: { FuncDef *pDef = pOp->p4.pCtx->pFunc; sqlite3_str_appendf(&x, "%s(%d)", pDef->zName, pDef->nArg); break; } -#endif case P4_INT64: { sqlite3_str_appendf(&x, "%lld", *pOp->p4.pI64); break; @@ -4961,9 +5003,17 @@ int sqlite3NotPureFunc(sqlite3_context *pCtx){ if( pCtx->pVdbe==0 ) return 1; #endif if( pCtx->pVdbe->aOp[pCtx->iOp].opcode==OP_PureFunc ){ +#if 0 + char *zMsg = sqlite3_mprintf( + "non-deterministic use of %s() in an index, CHECK constraint, " + "or generated column", pCtx->pFunc->zName); + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); +#else sqlite3_result_error(pCtx, "non-deterministic function in index expression or CHECK constraint", -1); +#endif return 0; } return 1; From 20cee7d0bb8f627c3952f24a5c4772f8fbb4d720 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Oct 2019 18:50:08 +0000 Subject: [PATCH 106/476] Always disallow the use of non-deterministic functions in CHECK constraints, even date/time functions that use the 'now' or similar keywords. Provide improved error messages when this requirement is not met. Ticket [830277d9db6c3ba1] FossilOrigin-Name: 2978b65ebe25eeabe543b67cb266308cceb20082a4ae71565d6d083d7c08bc9f --- ext/misc/totype.c | 10 +++++---- manifest | 26 +++++++++++----------- manifest.uuid | 2 +- src/expr.c | 4 ++-- src/resolve.c | 21 +++++++++++------- src/sqliteInt.h | 12 +++++----- src/vdbeaux.c | 27 +++++++++++++--------- test/check.test | 2 +- test/date2.test | 53 ++++++++++++++++++++++++++++++++++++-------- test/indexexpr1.test | 2 +- 10 files changed, 104 insertions(+), 55 deletions(-) diff --git a/ext/misc/totype.c b/ext/misc/totype.c index 5dc99f3d7d..c9655c3dbf 100644 --- a/ext/misc/totype.c +++ b/ext/misc/totype.c @@ -502,11 +502,13 @@ int sqlite3_totype_init( int rc = SQLITE_OK; SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ - rc = sqlite3_create_function(db, "tointeger", 1, SQLITE_UTF8, 0, - tointegerFunc, 0, 0); + rc = sqlite3_create_function(db, "tointeger", 1, + SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0, + tointegerFunc, 0, 0); if( rc==SQLITE_OK ){ - rc = sqlite3_create_function(db, "toreal", 1, SQLITE_UTF8, 0, - torealFunc, 0, 0); + rc = sqlite3_create_function(db, "toreal", 1, + SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0, + torealFunc, 0, 0); } return rc; } diff --git a/manifest b/manifest index 5f1f7568dd..8a8bf3650b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplify\sthe\sbytecode\sgeneration\sfor\sSQL\sfunction\scalls\ssuch\sthat\sthe\nOP_Function\sor\sOP_PureFunc\sopcodes\sare\scoded\sdirectly,\srather\sthan\susing\nthe\sintermediate\sOP_Function0\sor\sOP_PureFunc0\s-\sopcodes\sthat\sare\snow\sremoved. -D 2019-10-30T16:29:02.506 +C Always\sdisallow\sthe\suse\sof\snon-deterministic\sfunctions\sin\sCHECK\sconstraints,\neven\sdate/time\sfunctions\sthat\suse\sthe\s'now'\sor\ssimilar\skeywords.\s\sProvide\nimproved\serror\smessages\swhen\sthis\srequirement\sis\snot\smet.\nTicket\s[830277d9db6c3ba1] +D 2019-10-30T18:50:08.069 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -316,7 +316,7 @@ F ext/misc/spellfix.c f88ecb2c0294453ce8b7704b211f5350c41b085b38c8e056852e3a08b0 F ext/misc/sqlar.c 57d5bc45cd5492208e451f697404be88f8612527d64c9d42f96b325b64983d74 F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da93d F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 -F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 +F ext/misc/totype.c 5b6b1eafaa993e29f8df843319b3292b029f1b5cbbbf11c8a88e05d3f714159f F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061ef1625f9 F ext/misc/uuid.c db4db81e8c6a92ad6176ebd9f81dcb6870e331e1a286d0452f4319e3ba3df812 F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 @@ -478,7 +478,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 23d5f9e491921a57fe6d59b75c461d45777470d8b1653180ebb3e83ea658f889 +F src/expr.c 90c774b399e5df80e963fe23d18b36e0affe2949291a3ddf5555e14ef08e251e F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c ac56f02ffe7a3dff311654f86e3c2fd1ff2eb38862b0c07fd908d8cc0fb4a9a2 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -524,14 +524,14 @@ F src/pragma.h b45328f0946307b2e08f320abbb68e5352d94e45ce0a5c6d61ceb2f25a55b353 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 9d6a3bdca1ebc759c4616fee0d7dd4cf62741f53db3a6b0117600f27c5b1406a +F src/resolve.c cf2391c93d425455388389e7a47674b9da107d2ed69ebf49979044d70dbeb045 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 3395765ea3749341deb4c25e8339c3d626a8ac641a52c216e9632e48e620ba68 F src/shell.c.in a17d143f186966ef24927b6b083f985ffdb95a01aa1bebaba7dcc706289bf7d2 F src/sqlite.h.in 5ba20664cede7f4e6861541fad1f17bac50f7bf576b40a8784c54f9126a9edd4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 5b2d25ba23135ece06886d82f60d9a16869506592e5950f3c09257b3b5d28d5c +F src/sqliteInt.h 3ab4cce57fcda91b6b5377ba7d56dfb011d55b6a4a7d643c31dbefa06e00828a F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -602,7 +602,7 @@ F src/vdbe.c b67d6af853e03c3dd6d1116351567f62d8a2c10d3bd6db5f7f366e75d11c6653 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c aeba258bb045c583bd85ae1e0b218c3542897baf522da1f1ab7da4259a7394ce +F src/vdbeaux.c ab10ec13e61cffacf26024aa10053e66285d175b3d88d87966674b6b9b8820c4 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -727,7 +727,7 @@ F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bc F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 3619f0c58c2e4b2a94aa86e75607e497d34ef40ab74418e71aef7b4ca5155895 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test 4b57ecbbb300336382ca21ef983dfa70b291a70ae430690494d13f1629f45a38 +F test/check.test 25c6035302c846c7ff8e681cf8284473f6f01be94d327de60a688ad84ab01f8b F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c @@ -794,7 +794,7 @@ F test/cursorhint.test 7bc346788390475e77a345da2b92270d04d35856 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 -F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b10 +F test/date2.test 5ef8265c71460cda6b1698bf18f4bb0ffb40ac08c5092f6afe84d398c2feb5be F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 42aad1dcef6219fbee86a9b7d08832c9bbb2e41508f6f128ae91745927276292 @@ -1057,7 +1057,7 @@ F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e -F test/indexexpr1.test c26c8b352311c1deb30642cd0379e5cb94e416c7e9e0885e92d9e01554df2db9 +F test/indexexpr1.test 284e119999d132cc8bf37735a928c9859b28e8e295d02b7a6a4f93977c7f9ba5 F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 13fe6978b7de208d2e27460d824f7fc778cf6ea0aabfe566b32bb410b8816f63 -R 2b5ad42e3fc6b49f0350688afce0bf63 +P 84e02d773d60cffe619104991d21d7f0c68616c0f6bb99686bf54f5306c756d0 +R a5809c36248fb2412cd83c239c6f50ff U drh -Z 8fbcb7ba95c29435c7309e57f3022596 +Z 0ef46baeb11e85e5dfc62c1770da0b94 diff --git a/manifest.uuid b/manifest.uuid index 924a8fc5ec..7163f2adf6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -84e02d773d60cffe619104991d21d7f0c68616c0f6bb99686bf54f5306c756d0 \ No newline at end of file +2978b65ebe25eeabe543b67cb266308cceb20082a4ae71565d6d083d7c08bc9f \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 36ab7c795a..b0c61f00f8 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4033,7 +4033,7 @@ expr_code_doover: #endif { sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, - pDef, pParse->iSelfTab); + pDef, pExpr->op2); } if( nFarg && constMask==0 ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); @@ -5028,7 +5028,7 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ && (combinedFlags & EP_Reduced)==0 ){ if( pA->iColumn!=pB->iColumn ) return 2; - if( pA->op2!=pB->op2 ) return 2; + if( pA->op2!=pB->op2 && (pA->op!=TK_FUNCTION || iTab<0) ) return 2; if( pA->op!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){ return 2; } diff --git a/src/resolve.c b/src/resolve.c index a9c20b1016..9be62c0902 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -815,15 +815,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){ /* For the purposes of the EP_ConstFunc flag, date and time ** functions and other functions that change slowly are considered - ** constant because they are constant for the duration of one query */ + ** constant because they are constant for the duration of one query. + ** This allows them to be factored out of inner loops. */ ExprSetProperty(pExpr,EP_ConstFunc); } if( (pDef->funcFlags & SQLITE_FUNC_CONSTANT)==0 ){ /* Date/time functions that use 'now', and other functions like ** sqlite_version() that might change over time cannot be used ** in an index. */ - notValid(pParse, pNC, "non-deterministic functions", - NC_IdxExpr|NC_PartIdx|NC_GenCol); + notValid(pParse, pNC, "non-deterministic functions", NC_SelfRef); + }else{ + assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */ + pExpr->op2 = pNC->ncFlags & NC_SelfRef; } if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 && pParse->nested==0 @@ -1789,11 +1792,13 @@ void sqlite3ResolveSelectNames( ** Resolve names in expressions that can only reference a single table ** or which cannot reference any tables at all. Examples: ** -** (1) CHECK constraints -** (2) WHERE clauses on partial indices -** (3) Expressions in indexes on expressions -** (4) Expression arguments to VACUUM INTO. -** (5) GENERATED ALWAYS as expressions +** "type" flag +** ------------ +** (1) CHECK constraints NC_IsCheck +** (2) WHERE clauses on partial indices NC_PartIdx +** (3) Expressions in indexes on expressions NC_IdxExpr +** (4) Expression arguments to VACUUM INTO. 0 +** (5) GENERATED ALWAYS as expressions NC_GenCol ** ** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN ** nodes of the expression is set to -1 and the Expr.iColumn value is diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d8668a278f..cf7abfe66c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2487,6 +2487,10 @@ typedef int ynVar; struct Expr { u8 op; /* Operation performed by this node */ char affExpr; /* affinity, or RAISE type */ + u8 op2; /* TK_REGISTER/TK_TRUTH: original value of Expr.op + ** TK_COLUMN: the value of p5 for OP_Column + ** TK_AGG_FUNCTION: nesting depth + ** TK_FUNCTION: NC_SelfRef flag if needs OP_PureFunc */ u32 flags; /* Various flags. EP_* See below */ union { char *zToken; /* Token value. Zero terminated and dequoted */ @@ -2525,9 +2529,6 @@ struct Expr { ** TK_SELECT_COLUMN: column of the result vector */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ i16 iRightJoinTable; /* If EP_FromJoin, the right table of the join */ - u8 op2; /* TK_REGISTER/TK_TRUTH: original value of Expr.op - ** TK_COLUMN: the value of p5 for OP_Column - ** TK_AGG_FUNCTION: nesting depth */ AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ union { Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL @@ -2840,9 +2841,10 @@ struct NameContext { #define NC_AllowAgg 0x00001 /* Aggregate functions are allowed here */ #define NC_PartIdx 0x00002 /* True if resolving a partial index WHERE */ #define NC_IsCheck 0x00004 /* True if resolving a CHECK constraint */ -#define NC_InAggFunc 0x00008 /* True if analyzing arguments to an agg func */ +#define NC_GenCol 0x00008 /* True for a GENERATED ALWAYS AS clause */ #define NC_HasAgg 0x00010 /* One or more aggregate functions seen */ #define NC_IdxExpr 0x00020 /* True if resolving columns of CREATE INDEX */ +#define NC_SelfRef 0x0002e /* Combo: PartIdx, isCheck, GenCol, and IdxExpr */ #define NC_VarSelect 0x00040 /* A correlated subquery has been seen */ #define NC_UEList 0x00080 /* True if uNC.pEList is used */ #define NC_UAggInfo 0x00100 /* True if uNC.pAggInfo is used */ @@ -2852,7 +2854,7 @@ struct NameContext { #define NC_AllowWin 0x04000 /* Window functions are allowed here */ #define NC_HasWin 0x08000 /* One or more window functions seen */ #define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */ -#define NC_GenCol 0x20000 /* True for a GENERATED ALWAYS AS clause */ +#define NC_InAggFunc 0x20000 /* True if analyzing arguments to an agg func */ /* ** An instance of the following object describes a single ON CONFLICT diff --git a/src/vdbeaux.c b/src/vdbeaux.c index de6575cd51..9596e163b0 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -365,11 +365,12 @@ int sqlite3VdbeAddFunctionCall( } pCtx->pOut = 0; pCtx->pFunc = (FuncDef*)pFunc; - pCtx->pVdbe = v; + pCtx->pVdbe = 0; pCtx->isError = 0; pCtx->argc = nArg; addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, p1, p2, p3, (char*)pCtx, P4_FUNCCTX); + sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef); pCtx->iOp = addr; return addr; } @@ -4999,21 +5000,25 @@ void sqlite3VdbeSetVarmask(Vdbe *v, int iVar){ ** features such as 'now'. */ int sqlite3NotPureFunc(sqlite3_context *pCtx){ + const VdbeOp *pOp; #ifdef SQLITE_ENABLE_STAT4 if( pCtx->pVdbe==0 ) return 1; #endif - if( pCtx->pVdbe->aOp[pCtx->iOp].opcode==OP_PureFunc ){ -#if 0 - char *zMsg = sqlite3_mprintf( - "non-deterministic use of %s() in an index, CHECK constraint, " - "or generated column", pCtx->pFunc->zName); + pOp = pCtx->pVdbe->aOp + pCtx->iOp; + if( pOp->opcode==OP_PureFunc ){ + const char *zContext; + char *zMsg; + if( pOp->p5 & NC_IsCheck ){ + zContext = "a CHECK constraint"; + }else if( pOp->p5 & NC_GenCol ){ + zContext = "a generated column"; + }else{ + zContext = "an index"; + } + zMsg = sqlite3_mprintf("non-deterministic use of %s() in %s", + pCtx->pFunc->zName, zContext); sqlite3_result_error(pCtx, zMsg, -1); sqlite3_free(zMsg); -#else - sqlite3_result_error(pCtx, - "non-deterministic function in index expression or CHECK constraint", - -1); -#endif return 0; } return 1; diff --git a/test/check.test b/test/check.test index e23043eb04..ac0a9ac6ba 100644 --- a/test/check.test +++ b/test/check.test @@ -442,7 +442,7 @@ do_test check-6.15 { # reset_db proc myfunc {x} {expr $x < 10} -db func myfunc myfunc +db func myfunc -deterministic myfunc do_execsql_test 7.1 { CREATE TABLE t6(a CHECK (myfunc(a))) } do_execsql_test 7.2 { INSERT INTO t6 VALUES(9) } diff --git a/test/date2.test b/test/date2.test index 2815df5ec7..820420ccf5 100644 --- a/test/date2.test +++ b/test/date2.test @@ -30,7 +30,7 @@ do_execsql_test date2-100 { } {} do_catchsql_test date2-110 { INSERT INTO t1(x,y) VALUES('now','two'); -} {1 {non-deterministic function in index expression or CHECK constraint}} +} {1 {non-deterministic use of date() in a CHECK constraint}} do_execsql_test date2-120 { SELECT * FROM t1; } {2017-07-20 one} @@ -45,7 +45,7 @@ do_execsql_test date2-200 { } do_catchsql_test date2-210 { INSERT INTO t2(x,y) VALUES(3, 'now'); -} {1 {non-deterministic function in index expression or CHECK constraint}} +} {1 {non-deterministic use of date() in an index}} do_execsql_test date2-220 { SELECT x, y FROM t2 ORDER BY x; } {1 2017-07-20 2 xyzzy} @@ -58,7 +58,7 @@ do_execsql_test date2-300 { } do_catchsql_test date2-310 { CREATE INDEX t3b1 ON t3(datetime(b)); -} {1 {non-deterministic function in index expression or CHECK constraint}} +} {1 {non-deterministic use of datetime() in an index}} do_catchsql_test date2-320 { CREATE INDEX t3b1 ON t3(datetime(b)) WHERE typeof(b)='real'; } {0 {}} @@ -84,7 +84,7 @@ do_execsql_test date2-400 { do_catchsql_test date2-410 { CREATE INDEX t4b1 ON t4(b) WHERE date(b) BETWEEN '2017-06-01' AND '2017-08-31'; -} {1 {non-deterministic function in index expression or CHECK constraint}} +} {1 {non-deterministic use of date() in an index}} do_execsql_test date2-420 { DELETE FROM t4 WHERE a=500; CREATE INDEX t4b1 ON t4(b) @@ -92,7 +92,7 @@ do_execsql_test date2-420 { } do_catchsql_test date2-430 { INSERT INTO t4(a,b) VALUES(9999,'now'); -} {1 {non-deterministic function in index expression or CHECK constraint}} +} {1 {non-deterministic use of date() in an index}} do_execsql_test date2-500 { CREATE TABLE mods(x); @@ -121,14 +121,49 @@ do_execsql_test date2-500 { } do_catchsql_test date2-510 { INSERT INTO t5(y,m) VALUES('2017-07-20','localtime'); -} {1 {non-deterministic function in index expression or CHECK constraint}} +} {1 {non-deterministic use of datetime() in an index}} do_catchsql_test date2-520 { INSERT INTO t5(y,m) VALUES('2017-07-20','utc'); -} {1 {non-deterministic function in index expression or CHECK constraint}} +} {1 {non-deterministic use of datetime() in an index}} + +# 2019-10-30 Ticket 830277d9db6c3ba1 +# +do_catchsql_test date2-600 { + CREATE TABLE t600(a REAL CHECK( a Date: Thu, 31 Oct 2019 12:30:38 +0000 Subject: [PATCH 107/476] Enhance the TreeView logic to show information about Expr.op2 for FUNCTION and COLUMN nodes. FossilOrigin-Name: aceeaf9e28767a0880a16872867a1f57bff163acd0f10d19d5688068077590fa --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 20 +++++++++++++++++++- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 8a8bf3650b..b306ef6835 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\sdisallow\sthe\suse\sof\snon-deterministic\sfunctions\sin\sCHECK\sconstraints,\neven\sdate/time\sfunctions\sthat\suse\sthe\s'now'\sor\ssimilar\skeywords.\s\sProvide\nimproved\serror\smessages\swhen\sthis\srequirement\sis\snot\smet.\nTicket\s[830277d9db6c3ba1] -D 2019-10-30T18:50:08.069 +C Enhance\sthe\sTreeView\slogic\sto\sshow\sinformation\sabout\sExpr.op2\sfor\nFUNCTION\sand\sCOLUMN\snodes. +D 2019-10-31T12:30:38.799 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -591,7 +591,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d -F src/treeview.c 19e660b3a4ff8ae7dda426795020f0d2e1b349fa8cad19af9c9bf2a9063f2ef9 +F src/treeview.c 1de448df044dd9f011010b62966fb9b1bdde6e0a21173c686c9b2064227f6119 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e F src/update.c ae657f0db6a255011759ab9345ded7b54b828329a9dba04f94b4d4fa6e70e1ad F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 @@ -1848,7 +1848,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 84e02d773d60cffe619104991d21d7f0c68616c0f6bb99686bf54f5306c756d0 -R a5809c36248fb2412cd83c239c6f50ff +P 2978b65ebe25eeabe543b67cb266308cceb20082a4ae71565d6d083d7c08bc9f +R 696f26c3d4df9f022744939ac820b098 U drh -Z 0ef46baeb11e85e5dfc62c1770da0b94 +Z 1444c17552814a38105629c0a0fc2502 diff --git a/manifest.uuid b/manifest.uuid index 7163f2adf6..900afc6260 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2978b65ebe25eeabe543b67cb266308cceb20082a4ae71565d6d083d7c08bc9f \ No newline at end of file +aceeaf9e28767a0880a16872867a1f57bff163acd0f10d19d5688068077590fa \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 47d885aaa1..9d92cd603a 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -423,7 +423,14 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ case TK_COLUMN: { if( pExpr->iTable<0 ){ /* This only happens when coding check constraints */ - sqlite3TreeViewLine(pView, "COLUMN(%d)%s", pExpr->iColumn, zFlgs); + char zOp2[16]; + if( pExpr->op2 ){ + sqlite3_snprintf(sizeof(zOp2),zOp2," op2=0x%02x",pExpr->op2); + }else{ + zOp2[0] = 0; + } + sqlite3TreeViewLine(pView, "COLUMN(%d)%s%s", + pExpr->iColumn, zFlgs, zOp2); }else{ sqlite3TreeViewLine(pView, "{%d:%d}%s", pExpr->iTable, pExpr->iColumn, zFlgs); @@ -566,6 +573,17 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ if( pExpr->op==TK_AGG_FUNCTION ){ sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s", pExpr->op2, pExpr->u.zToken, zFlgs); + }else if( pExpr->op2!=0 ){ + const char *zOp2; + char zBuf[8]; + sqlite3_snprintf(sizeof(zBuf),zBuf,"0x%02x",pExpr->op2); + zOp2 = zBuf; + if( pExpr->op2==NC_IsCheck ) zOp2 = "NC_IsCheck"; + if( pExpr->op2==NC_IdxExpr ) zOp2 = "NC_IdxExpr"; + if( pExpr->op2==NC_PartIdx ) zOp2 = "NC_PartIdx"; + if( pExpr->op2==NC_GenCol ) zOp2 = "NC_GenCol"; + sqlite3TreeViewLine(pView, "FUNCTION %Q%s op2=%s", + pExpr->u.zToken, zFlgs, zOp2); }else{ sqlite3TreeViewLine(pView, "FUNCTION %Q%s", pExpr->u.zToken, zFlgs); } From 04307c8a3f457760348fd56f474cedc940fd7dc3 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 31 Oct 2019 13:16:26 +0000 Subject: [PATCH 108/476] Ignore differences in Expr.op2 in sqlite3ExprCompare() in cases where it does matter. Ticket [1d2a8efc6c3a595a]. FossilOrigin-Name: 329820673a12ff6a6c8759f40989d4ccf272441064b0366a5f491695b55ad0e9 --- manifest | 13 +++++++------ manifest.uuid | 2 +- src/expr.c | 16 +++++++++++++++- test/gencol1.test | 27 +++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 test/gencol1.test diff --git a/manifest b/manifest index b306ef6835..7280981d19 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sTreeView\slogic\sto\sshow\sinformation\sabout\sExpr.op2\sfor\nFUNCTION\sand\sCOLUMN\snodes. -D 2019-10-31T12:30:38.799 +C Ignore\sdifferences\sin\sExpr.op2\sin\ssqlite3ExprCompare()\sin\scases\swhere\sit\ndoes\smatter.\s\sTicket\s[1d2a8efc6c3a595a]. +D 2019-10-31T13:16:26.169 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 90c774b399e5df80e963fe23d18b36e0affe2949291a3ddf5555e14ef08e251e +F src/expr.c a02db128337ca28c34fc3574a640f247881bc4d14c1debf5adc3ecf25dd74992 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c ac56f02ffe7a3dff311654f86e3c2fd1ff2eb38862b0c07fd908d8cc0fb4a9a2 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1021,6 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c +F test/gencol1.test 27f80efa9047c8db10794d689e086d2d3ecbb0e1dfe8b8293e8c250e6015add3 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1848,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2978b65ebe25eeabe543b67cb266308cceb20082a4ae71565d6d083d7c08bc9f -R 696f26c3d4df9f022744939ac820b098 +P aceeaf9e28767a0880a16872867a1f57bff163acd0f10d19d5688068077590fa +R 4e0fef27b2755ee02a88ef863369c111 U drh -Z 1444c17552814a38105629c0a0fc2502 +Z 4d89f413d1dc6ce2106075b4c9bb6a03 diff --git a/manifest.uuid b/manifest.uuid index 900afc6260..c379184ac2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aceeaf9e28767a0880a16872867a1f57bff163acd0f10d19d5688068077590fa \ No newline at end of file +329820673a12ff6a6c8759f40989d4ccf272441064b0366a5f491695b55ad0e9 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b0c61f00f8..a4407f4a84 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5028,7 +5028,21 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ && (combinedFlags & EP_Reduced)==0 ){ if( pA->iColumn!=pB->iColumn ) return 2; - if( pA->op2!=pB->op2 && (pA->op!=TK_FUNCTION || iTab<0) ) return 2; + if( pA->op2!=pB->op2 ){ + if( pA->op==TK_TRUTH ) return 2; + if( pA->op==TK_FUNCTION && iTab<0 ){ + /* Ex: CREATE TABLE t1(a CHECK( aop!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){ return 2; } diff --git a/test/gencol1.test b/test/gencol1.test new file mode 100644 index 0000000000..4902b5abf4 --- /dev/null +++ b/test/gencol1.test @@ -0,0 +1,27 @@ +# 2019-10-31 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Test cases for generated columns. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +# ticket 830277d9db6c3ba1 on 2019-10-31 +do_execsql_test gencol1-100 { + CREATE TABLE t0(c0 AS(TYPEOF(c1)), c1); + INSERT INTO t0(c1) VALUES(0); + CREATE TABLE t1(x AS (typeof(y)), y); + INSERT INTO t1 SELECT * FROM t0; + SELECT * FROM t1; +} {integer 0} + +finish_test From 29974f7b91417afa9eb237ac5dd37f2219cd5a0f Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 31 Oct 2019 17:13:17 +0000 Subject: [PATCH 109/476] Add a few simple TCL test cases for generated columns. (Full test coverage of the generated column logic is provided separately by TH3.) FossilOrigin-Name: acedb5c7f7dc1d68bef62098d42ca59e1be7a5083bb03dc07c03b9f9d817158b --- manifest | 12 ++--- manifest.uuid | 2 +- test/gencol1.test | 121 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 7280981d19..7dd006225a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ignore\sdifferences\sin\sExpr.op2\sin\ssqlite3ExprCompare()\sin\scases\swhere\sit\ndoes\smatter.\s\sTicket\s[1d2a8efc6c3a595a]. -D 2019-10-31T13:16:26.169 +C Add\sa\sfew\ssimple\sTCL\stest\scases\sfor\sgenerated\scolumns.\s\s(Full\stest\scoverage\nof\sthe\sgenerated\scolumn\slogic\sis\sprovided\sseparately\sby\sTH3.) +D 2019-10-31T17:13:17.010 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 27f80efa9047c8db10794d689e086d2d3ecbb0e1dfe8b8293e8c250e6015add3 +F test/gencol1.test 6dd63ec525059f2235e494148bfa8c1ab506eb46e403a8d5bf13004f3b165631 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P aceeaf9e28767a0880a16872867a1f57bff163acd0f10d19d5688068077590fa -R 4e0fef27b2755ee02a88ef863369c111 +P 329820673a12ff6a6c8759f40989d4ccf272441064b0366a5f491695b55ad0e9 +R e7170d3b73879549c652c7bfb423787f U drh -Z 4d89f413d1dc6ce2106075b4c9bb6a03 +Z b826a93b8f760fe88872664a0ccdde39 diff --git a/manifest.uuid b/manifest.uuid index c379184ac2..e59896f02e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -329820673a12ff6a6c8759f40989d4ccf272441064b0366a5f491695b55ad0e9 \ No newline at end of file +acedb5c7f7dc1d68bef62098d42ca59e1be7a5083bb03dc07c03b9f9d817158b \ No newline at end of file diff --git a/test/gencol1.test b/test/gencol1.test index 4902b5abf4..63e397b218 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -24,4 +24,125 @@ do_execsql_test gencol1-100 { SELECT * FROM t1; } {integer 0} +foreach {tn schema} { +1 { + CREATE TABLE t1( + a INT, + b TEXT, + c ANY, + w INT GENERATED ALWAYS AS (a*10), + x TEXT AS (typeof(c)), + y TEXT AS (substr(b,a,a+2)) + ); + } +2 { + CREATE TABLE t1( + w INT GENERATED ALWAYS AS (a*10), + x TEXT AS (typeof(c)), + y TEXT AS (substr(b,a,a+2)), + a INT, + b TEXT, + c ANY + ); + } +3 { + CREATE TABLE t1( + w INT GENERATED ALWAYS AS (a*10), + a INT, + x TEXT AS (typeof(c)) STORED, + b TEXT, + y TEXT AS (substr(b,a,a+2)), + c ANY + ); + } +4 { + CREATE TABLE t1( + a INTEGER PRIMARY KEY, + w INT GENERATED ALWAYS AS (a*10), + b TEXT, + x TEXT AS (typeof(c)), + y TEXT AS (substr(b,a,a+2)) STORED, + c ANY + ); + } +5 { + CREATE TABLE t1( + w INT GENERATED ALWAYS AS (a*10), + a INT, + x TEXT AS (typeof(c)), + b TEXT, + y TEXT AS (substr(b,a,a+2)) STORED, + c ANY, + PRIMARY KEY(a,b) + ) WITHOUT ROWID; + } +6 { + CREATE TABLE t1( + w INT GENERATED ALWAYS AS (m*5), + m INT AS (a*2) STORED, + a INT, + x TEXT AS (typeof(c)), + b TEXT, + y TEXT AS (substr(b,m/2,m/2+2)) STORED, + c ANY, + PRIMARY KEY(a,b) + ); + } +7 { + CREATE TABLE t1( + w INT GENERATED ALWAYS AS (m*5), + m INT AS (a*2) NOT NULL, + a INT, + x TEXT AS (typeof(c)) CHECK (x<>'blank'), + b TEXT, + y TEXT AS (substr(b,m/2,m/2+2)) STORED, + c ANY, + PRIMARY KEY(b,a) + ) WITHOUT ROWID; + } +} { + catch {db close} + sqlite3 db :memory: + db eval $schema + do_execsql_test gencol1-2.$tn.100 { + INSERT INTO t1(a,b,c) VALUES(1,'abcdef',5.5),(3,'cantaloupe',NULL); + SELECT w, x, y, '|' FROM t1 ORDER BY a; + } {10 real abc | 30 null ntalo |} + do_execsql_test gencol1-2.$tn.101 { + SELECT w, x, y, '|' FROM t1 ORDER BY w; + } {10 real abc | 30 null ntalo |} + do_execsql_test gencol1-2.$tn.102 { + SELECT a FROM t1 WHERE w=30; + } {3} + do_execsql_test gencol1-2.$tn.103 { + SELECT a FROM t1 WHERE x='real'; + } {1} + do_execsql_test gencol1-2.$tn.104 { + SELECT a FROM t1 WHERE y LIKE '%tal%' OR x='real' ORDER BY b; + } {1 3} + do_execsql_test gencol1-2.$tn.110 { + CREATE INDEX t1w ON t1(w); + SELECT a FROM t1 WHERE w=10; + } {1} + do_execsql_test gencol1-2.$tn.120 { + CREATE INDEX t1x ON t1(x) WHERE w BETWEEN 20 AND 40; + SELECT a FROM t1 WHERE x='null' AND w BETWEEN 20 AND 40; + } {3} + do_execsql_test gencol1-2.$tn.121 { + SELECT a FROM t1 WHERE x='real'; + } {1} + do_execsql_test gencol1-2.$tn.130 { + VACUUM; + PRAGMA integrity_check; + } {ok} + do_execsql_test gencol1-2.$tn.140 { + UPDATE t1 SET a=a+100 WHERE w<20; + SELECT a, w, '|' FROM t1 ORDER BY w; + } {3 30 | 101 1010 |} + do_execsql_test gencol1-2.$tn.150 { + INSERT INTO t1 VALUES(4,'jambalaya','Chef John'),(15,87719874135,0); + SELECT w, x, y, '|' FROM t1 ORDER BY w; + } {30 null ntalo | 40 text balaya | 150 integer {} | 1010 real {} |} +} + finish_test From ff37c4078729e5d24fa80aa803a1e2c7baf1b25d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 31 Oct 2019 20:54:20 +0000 Subject: [PATCH 110/476] Correctly generate pre-UPDATE content for virtual columns that are used by foreign key constraints. Ticket [b9befa4b83a660cc] FossilOrigin-Name: 40d3282ec285d9f724f6548283f48b601510cf5284da17485723fd650a68f436 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/update.c | 7 ++----- test/gencol1.test | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 7dd006225a..c837271d2d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\sfew\ssimple\sTCL\stest\scases\sfor\sgenerated\scolumns.\s\s(Full\stest\scoverage\nof\sthe\sgenerated\scolumn\slogic\sis\sprovided\sseparately\sby\sTH3.) -D 2019-10-31T17:13:17.010 +C Correctly\sgenerate\spre-UPDATE\scontent\sfor\svirtual\scolumns\sthat\sare\sused\nby\sforeign\skey\sconstraints.\s\sTicket\s[b9befa4b83a660cc] +D 2019-10-31T20:54:20.920 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -593,7 +593,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d F src/treeview.c 1de448df044dd9f011010b62966fb9b1bdde6e0a21173c686c9b2064227f6119 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e -F src/update.c ae657f0db6a255011759ab9345ded7b54b828329a9dba04f94b4d4fa6e70e1ad +F src/update.c 07a50767f7d3e26d4c887c31cd66448d700d3215caea6023acf7269336097df7 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 6dd63ec525059f2235e494148bfa8c1ab506eb46e403a8d5bf13004f3b165631 +F test/gencol1.test 159b28fa98f256ba7ea272dce8449b9a8218ce58591ce25da5df5cc4b61a147a F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 329820673a12ff6a6c8759f40989d4ccf272441064b0366a5f491695b55ad0e9 -R e7170d3b73879549c652c7bfb423787f +P acedb5c7f7dc1d68bef62098d42ca59e1be7a5083bb03dc07c03b9f9d817158b +R 1be119fb445ff01fe8cfe5427a3a8828 U drh -Z b826a93b8f760fe88872664a0ccdde39 +Z 669096ece6f155f81405fdaa75b25c9a diff --git a/manifest.uuid b/manifest.uuid index e59896f02e..50038f8e4f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -acedb5c7f7dc1d68bef62098d42ca59e1be7a5083bb03dc07c03b9f9d817158b \ No newline at end of file +40d3282ec285d9f724f6548283f48b601510cf5284da17485723fd650a68f436 \ No newline at end of file diff --git a/src/update.c b/src/update.c index 816a6818be..935e1d9377 100644 --- a/src/update.c +++ b/src/update.c @@ -661,12 +661,9 @@ void sqlite3Update( oldmask |= sqlite3TriggerColmask(pParse, pTrigger, pChanges, 0, TRIGGER_BEFORE|TRIGGER_AFTER, pTab, onError ); - for(i=0, k=regOld; inCol; i++, k++){ + for(i=0; inCol; i++){ u32 colFlags = pTab->aCol[i].colFlags; - if( colFlags & COLFLAG_VIRTUAL ){ - k--; - continue; - } + k = sqlite3TableColumnToStorage(pTab, i) + regOld; if( oldmask==0xffffffff || (i<32 && (oldmask & MASKBIT32(i))!=0) || (colFlags & COLFLAG_PRIMKEY)!=0 diff --git a/test/gencol1.test b/test/gencol1.test index 63e397b218..653513929b 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -145,4 +145,18 @@ foreach {tn schema} { } {30 null ntalo | 40 text balaya | 150 integer {} | 1010 real {} |} } +# 2019-10-31 ticket b9befa4b83a660cc +db close +sqlite3 db :memory: +do_execsql_test gencol1-3.100 { + PRAGMA foreign_keys = true; + CREATE TABLE t0(c0 PRIMARY KEY, c1, c2 AS (c0+c1-c3) REFERENCES t0, c3); + INSERT INTO t0 VALUES (0, 0, 0), (11, 5, 5); + UPDATE t0 SET c1 = c0, c3 = c0; + SELECT *, '|' FROM t0 ORDER BY +c0; +} {0 0 0 0 | 11 11 11 11 |} +do_catchsql_test gencol1-3.110 { + UPDATE t0 SET c1 = c0, c3 = c0+1; +} {1 {FOREIGN KEY constraint failed}} + finish_test From bd0f0eb0374bbad12328507ab213d7a2bc53b056 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Nov 2019 02:30:54 +0000 Subject: [PATCH 111/476] Slightly faster keyword hash table. FossilOrigin-Name: f12e743e19a04ecbf7eb69b675082f2e4dda05b38cd81f6588a1ce95dfc57ada --- manifest | 12 +- manifest.uuid | 2 +- tool/mkkeywordhash.c | 319 +++++++++++++++++++++++-------------------- 3 files changed, 181 insertions(+), 152 deletions(-) diff --git a/manifest b/manifest index c837271d2d..aef50dc085 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correctly\sgenerate\spre-UPDATE\scontent\sfor\svirtual\scolumns\sthat\sare\sused\nby\sforeign\skey\sconstraints.\s\sTicket\s[b9befa4b83a660cc] -D 2019-10-31T20:54:20.920 +C Slightly\sfaster\skeyword\shash\stable. +D 2019-11-01T02:30:54.247 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1777,7 +1777,7 @@ F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 -F tool/mkkeywordhash.c 8973d556c5ee984b510269623c316ce0767f61dbd789075a05f213f3a576d840 +F tool/mkkeywordhash.c 1d4626fecd48b32a84963b663b34f3a42ee77691a21614bdacdc71d9412d5da4 F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6a13ea F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P acedb5c7f7dc1d68bef62098d42ca59e1be7a5083bb03dc07c03b9f9d817158b -R 1be119fb445ff01fe8cfe5427a3a8828 +P 40d3282ec285d9f724f6548283f48b601510cf5284da17485723fd650a68f436 +R c292184f9e256f8778bc51749362a73d U drh -Z 669096ece6f155f81405fdaa75b25c9a +Z f600eb4b341234df9d684e7b16c76669 diff --git a/manifest.uuid b/manifest.uuid index 50038f8e4f..166b2dd41a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -40d3282ec285d9f724f6548283f48b601510cf5284da17485723fd650a68f436 \ No newline at end of file +f12e743e19a04ecbf7eb69b675082f2e4dda05b38cd81f6588a1ce95dfc57ada \ No newline at end of file diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index b5784fdecd..ef7684270a 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -36,6 +36,7 @@ struct Keyword { char *zName; /* The keyword name */ char *zTokenType; /* Token value for this keyword */ int mask; /* Code this keyword if non-zero */ + int priority; /* Put higher priorities earlier in the hash chain */ int id; /* Unique ID for this record */ int hash; /* Hash on the keyword */ int offset; /* Offset to start of name string */ @@ -158,151 +159,151 @@ struct Keyword { ** These are the keywords */ static Keyword aKeywordTable[] = { - { "ABORT", "TK_ABORT", CONFLICT|TRIGGER }, - { "ACTION", "TK_ACTION", FKEY }, - { "ADD", "TK_ADD", ALTER }, - { "AFTER", "TK_AFTER", TRIGGER }, - { "ALL", "TK_ALL", ALWAYS }, - { "ALTER", "TK_ALTER", ALTER }, - { "ALWAYS", "TK_ALWAYS", ALWAYS }, - { "ANALYZE", "TK_ANALYZE", ANALYZE }, - { "AND", "TK_AND", ALWAYS }, - { "AS", "TK_AS", ALWAYS }, - { "ASC", "TK_ASC", ALWAYS }, - { "ATTACH", "TK_ATTACH", ATTACH }, - { "AUTOINCREMENT", "TK_AUTOINCR", AUTOINCR }, - { "BEFORE", "TK_BEFORE", TRIGGER }, - { "BEGIN", "TK_BEGIN", ALWAYS }, - { "BETWEEN", "TK_BETWEEN", ALWAYS }, - { "BY", "TK_BY", ALWAYS }, - { "CASCADE", "TK_CASCADE", FKEY }, - { "CASE", "TK_CASE", ALWAYS }, - { "CAST", "TK_CAST", CAST }, - { "CHECK", "TK_CHECK", ALWAYS }, - { "COLLATE", "TK_COLLATE", ALWAYS }, - { "COLUMN", "TK_COLUMNKW", ALTER }, - { "COMMIT", "TK_COMMIT", ALWAYS }, - { "CONFLICT", "TK_CONFLICT", CONFLICT }, - { "CONSTRAINT", "TK_CONSTRAINT", ALWAYS }, - { "CREATE", "TK_CREATE", ALWAYS }, - { "CROSS", "TK_JOIN_KW", ALWAYS }, - { "CURRENT", "TK_CURRENT", WINDOWFUNC }, - { "CURRENT_DATE", "TK_CTIME_KW", ALWAYS }, - { "CURRENT_TIME", "TK_CTIME_KW", ALWAYS }, - { "CURRENT_TIMESTAMP","TK_CTIME_KW", ALWAYS }, - { "DATABASE", "TK_DATABASE", ATTACH }, - { "DEFAULT", "TK_DEFAULT", ALWAYS }, - { "DEFERRED", "TK_DEFERRED", ALWAYS }, - { "DEFERRABLE", "TK_DEFERRABLE", FKEY }, - { "DELETE", "TK_DELETE", ALWAYS }, - { "DESC", "TK_DESC", ALWAYS }, - { "DETACH", "TK_DETACH", ATTACH }, - { "DISTINCT", "TK_DISTINCT", ALWAYS }, - { "DO", "TK_DO", UPSERT }, - { "DROP", "TK_DROP", ALWAYS }, - { "END", "TK_END", ALWAYS }, - { "EACH", "TK_EACH", TRIGGER }, - { "ELSE", "TK_ELSE", ALWAYS }, - { "ESCAPE", "TK_ESCAPE", ALWAYS }, - { "EXCEPT", "TK_EXCEPT", COMPOUND }, - { "EXCLUSIVE", "TK_EXCLUSIVE", ALWAYS }, - { "EXCLUDE", "TK_EXCLUDE", WINDOWFUNC }, - { "EXISTS", "TK_EXISTS", ALWAYS }, - { "EXPLAIN", "TK_EXPLAIN", EXPLAIN }, - { "FAIL", "TK_FAIL", CONFLICT|TRIGGER }, - { "FILTER", "TK_FILTER", WINDOWFUNC }, - { "FIRST", "TK_FIRST", ALWAYS }, - { "FOLLOWING", "TK_FOLLOWING", WINDOWFUNC }, - { "FOR", "TK_FOR", TRIGGER }, - { "FOREIGN", "TK_FOREIGN", FKEY }, - { "FROM", "TK_FROM", ALWAYS }, - { "FULL", "TK_JOIN_KW", ALWAYS }, - { "GENERATED", "TK_GENERATED", ALWAYS }, - { "GLOB", "TK_LIKE_KW", ALWAYS }, - { "GROUP", "TK_GROUP", ALWAYS }, - { "GROUPS", "TK_GROUPS", WINDOWFUNC }, - { "HAVING", "TK_HAVING", ALWAYS }, - { "IF", "TK_IF", ALWAYS }, - { "IGNORE", "TK_IGNORE", CONFLICT|TRIGGER }, - { "IMMEDIATE", "TK_IMMEDIATE", ALWAYS }, - { "IN", "TK_IN", ALWAYS }, - { "INDEX", "TK_INDEX", ALWAYS }, - { "INDEXED", "TK_INDEXED", ALWAYS }, - { "INITIALLY", "TK_INITIALLY", FKEY }, - { "INNER", "TK_JOIN_KW", ALWAYS }, - { "INSERT", "TK_INSERT", ALWAYS }, - { "INSTEAD", "TK_INSTEAD", TRIGGER }, - { "INTERSECT", "TK_INTERSECT", COMPOUND }, - { "INTO", "TK_INTO", ALWAYS }, - { "IS", "TK_IS", ALWAYS }, - { "ISNULL", "TK_ISNULL", ALWAYS }, - { "JOIN", "TK_JOIN", ALWAYS }, - { "KEY", "TK_KEY", ALWAYS }, - { "LAST", "TK_LAST", ALWAYS }, - { "LEFT", "TK_JOIN_KW", ALWAYS }, - { "LIKE", "TK_LIKE_KW", ALWAYS }, - { "LIMIT", "TK_LIMIT", ALWAYS }, - { "MATCH", "TK_MATCH", ALWAYS }, - { "NATURAL", "TK_JOIN_KW", ALWAYS }, - { "NO", "TK_NO", FKEY|WINDOWFUNC }, - { "NOT", "TK_NOT", ALWAYS }, - { "NOTHING", "TK_NOTHING", UPSERT }, - { "NOTNULL", "TK_NOTNULL", ALWAYS }, - { "NULL", "TK_NULL", ALWAYS }, - { "NULLS", "TK_NULLS", ALWAYS }, - { "OF", "TK_OF", ALWAYS }, - { "OFFSET", "TK_OFFSET", ALWAYS }, - { "ON", "TK_ON", ALWAYS }, - { "OR", "TK_OR", ALWAYS }, - { "ORDER", "TK_ORDER", ALWAYS }, - { "OTHERS", "TK_OTHERS", WINDOWFUNC }, - { "OUTER", "TK_JOIN_KW", ALWAYS }, - { "OVER", "TK_OVER", WINDOWFUNC }, - { "PARTITION", "TK_PARTITION", WINDOWFUNC }, - { "PLAN", "TK_PLAN", EXPLAIN }, - { "PRAGMA", "TK_PRAGMA", PRAGMA }, - { "PRECEDING", "TK_PRECEDING", WINDOWFUNC }, - { "PRIMARY", "TK_PRIMARY", ALWAYS }, - { "QUERY", "TK_QUERY", EXPLAIN }, - { "RAISE", "TK_RAISE", TRIGGER }, - { "RANGE", "TK_RANGE", WINDOWFUNC }, - { "RECURSIVE", "TK_RECURSIVE", CTE }, - { "REFERENCES", "TK_REFERENCES", FKEY }, - { "REGEXP", "TK_LIKE_KW", ALWAYS }, - { "REINDEX", "TK_REINDEX", REINDEX }, - { "RELEASE", "TK_RELEASE", ALWAYS }, - { "RENAME", "TK_RENAME", ALTER }, - { "REPLACE", "TK_REPLACE", CONFLICT }, - { "RESTRICT", "TK_RESTRICT", FKEY }, - { "RIGHT", "TK_JOIN_KW", ALWAYS }, - { "ROLLBACK", "TK_ROLLBACK", ALWAYS }, - { "ROW", "TK_ROW", TRIGGER }, - { "ROWS", "TK_ROWS", ALWAYS }, - { "SAVEPOINT", "TK_SAVEPOINT", ALWAYS }, - { "SELECT", "TK_SELECT", ALWAYS }, - { "SET", "TK_SET", ALWAYS }, - { "TABLE", "TK_TABLE", ALWAYS }, - { "TEMP", "TK_TEMP", ALWAYS }, - { "TEMPORARY", "TK_TEMP", ALWAYS }, - { "THEN", "TK_THEN", ALWAYS }, - { "TIES", "TK_TIES", WINDOWFUNC }, - { "TO", "TK_TO", ALWAYS }, - { "TRANSACTION", "TK_TRANSACTION", ALWAYS }, - { "TRIGGER", "TK_TRIGGER", TRIGGER }, - { "UNBOUNDED", "TK_UNBOUNDED", WINDOWFUNC }, - { "UNION", "TK_UNION", COMPOUND }, - { "UNIQUE", "TK_UNIQUE", ALWAYS }, - { "UPDATE", "TK_UPDATE", ALWAYS }, - { "USING", "TK_USING", ALWAYS }, - { "VACUUM", "TK_VACUUM", VACUUM }, - { "VALUES", "TK_VALUES", ALWAYS }, - { "VIEW", "TK_VIEW", VIEW }, - { "VIRTUAL", "TK_VIRTUAL", VTAB }, - { "WHEN", "TK_WHEN", ALWAYS }, - { "WHERE", "TK_WHERE", ALWAYS }, - { "WINDOW", "TK_WINDOW", WINDOWFUNC }, - { "WITH", "TK_WITH", CTE }, - { "WITHOUT", "TK_WITHOUT", ALWAYS }, + { "ABORT", "TK_ABORT", CONFLICT|TRIGGER, 0 }, + { "ACTION", "TK_ACTION", FKEY, 0 }, + { "ADD", "TK_ADD", ALTER, 1 }, + { "AFTER", "TK_AFTER", TRIGGER, 0 }, + { "ALL", "TK_ALL", ALWAYS, 0 }, + { "ALTER", "TK_ALTER", ALTER, 0 }, + { "ALWAYS", "TK_ALWAYS", ALWAYS, 0 }, + { "ANALYZE", "TK_ANALYZE", ANALYZE, 0 }, + { "AND", "TK_AND", ALWAYS, 10 }, + { "AS", "TK_AS", ALWAYS, 10 }, + { "ASC", "TK_ASC", ALWAYS, 0 }, + { "ATTACH", "TK_ATTACH", ATTACH, 1 }, + { "AUTOINCREMENT", "TK_AUTOINCR", AUTOINCR, 0 }, + { "BEFORE", "TK_BEFORE", TRIGGER, 0 }, + { "BEGIN", "TK_BEGIN", ALWAYS, 1 }, + { "BETWEEN", "TK_BETWEEN", ALWAYS, 5 }, + { "BY", "TK_BY", ALWAYS, 10 }, + { "CASCADE", "TK_CASCADE", FKEY, 1 }, + { "CASE", "TK_CASE", ALWAYS, 5 }, + { "CAST", "TK_CAST", CAST, 5 }, + { "CHECK", "TK_CHECK", ALWAYS, 1 }, + { "COLLATE", "TK_COLLATE", ALWAYS, 1 }, + { "COLUMN", "TK_COLUMNKW", ALTER, 1 }, + { "COMMIT", "TK_COMMIT", ALWAYS, 1 }, + { "CONFLICT", "TK_CONFLICT", CONFLICT, 0 }, + { "CONSTRAINT", "TK_CONSTRAINT", ALWAYS, 1 }, + { "CREATE", "TK_CREATE", ALWAYS, 2 }, + { "CROSS", "TK_JOIN_KW", ALWAYS, 3 }, + { "CURRENT", "TK_CURRENT", WINDOWFUNC, 1 }, + { "CURRENT_DATE", "TK_CTIME_KW", ALWAYS, 1 }, + { "CURRENT_TIME", "TK_CTIME_KW", ALWAYS, 1 }, + { "CURRENT_TIMESTAMP","TK_CTIME_KW", ALWAYS, 1 }, + { "DATABASE", "TK_DATABASE", ATTACH, 0 }, + { "DEFAULT", "TK_DEFAULT", ALWAYS, 1 }, + { "DEFERRED", "TK_DEFERRED", ALWAYS, 1 }, + { "DEFERRABLE", "TK_DEFERRABLE", FKEY, 1 }, + { "DELETE", "TK_DELETE", ALWAYS, 10 }, + { "DESC", "TK_DESC", ALWAYS, 3 }, + { "DETACH", "TK_DETACH", ATTACH, 0 }, + { "DISTINCT", "TK_DISTINCT", ALWAYS, 5 }, + { "DO", "TK_DO", UPSERT, 2 }, + { "DROP", "TK_DROP", ALWAYS, 1 }, + { "END", "TK_END", ALWAYS, 1 }, + { "EACH", "TK_EACH", TRIGGER, 1 }, + { "ELSE", "TK_ELSE", ALWAYS, 2 }, + { "ESCAPE", "TK_ESCAPE", ALWAYS, 4 }, + { "EXCEPT", "TK_EXCEPT", COMPOUND, 4 }, + { "EXCLUSIVE", "TK_EXCLUSIVE", ALWAYS, 1 }, + { "EXCLUDE", "TK_EXCLUDE", WINDOWFUNC, 1 }, + { "EXISTS", "TK_EXISTS", ALWAYS, 4 }, + { "EXPLAIN", "TK_EXPLAIN", EXPLAIN, 1 }, + { "FAIL", "TK_FAIL", CONFLICT|TRIGGER, 1 }, + { "FILTER", "TK_FILTER", WINDOWFUNC, 4 }, + { "FIRST", "TK_FIRST", ALWAYS, 4 }, + { "FOLLOWING", "TK_FOLLOWING", WINDOWFUNC, 4 }, + { "FOR", "TK_FOR", TRIGGER, 2 }, + { "FOREIGN", "TK_FOREIGN", FKEY, 1 }, + { "FROM", "TK_FROM", ALWAYS, 10 }, + { "FULL", "TK_JOIN_KW", ALWAYS, 3 }, + { "GENERATED", "TK_GENERATED", ALWAYS, 1 }, + { "GLOB", "TK_LIKE_KW", ALWAYS, 3 }, + { "GROUP", "TK_GROUP", ALWAYS, 5 }, + { "GROUPS", "TK_GROUPS", WINDOWFUNC, 2 }, + { "HAVING", "TK_HAVING", ALWAYS, 5 }, + { "IF", "TK_IF", ALWAYS, 2 }, + { "IGNORE", "TK_IGNORE", CONFLICT|TRIGGER, 1 }, + { "IMMEDIATE", "TK_IMMEDIATE", ALWAYS, 1 }, + { "IN", "TK_IN", ALWAYS, 10 }, + { "INDEX", "TK_INDEX", ALWAYS, 1 }, + { "INDEXED", "TK_INDEXED", ALWAYS, 0 }, + { "INITIALLY", "TK_INITIALLY", FKEY, 1 }, + { "INNER", "TK_JOIN_KW", ALWAYS, 1 }, + { "INSERT", "TK_INSERT", ALWAYS, 10 }, + { "INSTEAD", "TK_INSTEAD", TRIGGER, 1 }, + { "INTERSECT", "TK_INTERSECT", COMPOUND, 5 }, + { "INTO", "TK_INTO", ALWAYS, 10 }, + { "IS", "TK_IS", ALWAYS, 5 }, + { "ISNULL", "TK_ISNULL", ALWAYS, 5 }, + { "JOIN", "TK_JOIN", ALWAYS, 5 }, + { "KEY", "TK_KEY", ALWAYS, 1 }, + { "LAST", "TK_LAST", ALWAYS, 4 }, + { "LEFT", "TK_JOIN_KW", ALWAYS, 5 }, + { "LIKE", "TK_LIKE_KW", ALWAYS, 5 }, + { "LIMIT", "TK_LIMIT", ALWAYS, 3 }, + { "MATCH", "TK_MATCH", ALWAYS, 2 }, + { "NATURAL", "TK_JOIN_KW", ALWAYS, 3 }, + { "NO", "TK_NO", FKEY|WINDOWFUNC, 2 }, + { "NOT", "TK_NOT", ALWAYS, 10 }, + { "NOTHING", "TK_NOTHING", UPSERT, 1 }, + { "NOTNULL", "TK_NOTNULL", ALWAYS, 3 }, + { "NULL", "TK_NULL", ALWAYS, 10 }, + { "NULLS", "TK_NULLS", ALWAYS, 3 }, + { "OF", "TK_OF", ALWAYS, 3 }, + { "OFFSET", "TK_OFFSET", ALWAYS, 1 }, + { "ON", "TK_ON", ALWAYS, 1 }, + { "OR", "TK_OR", ALWAYS, 9 }, + { "ORDER", "TK_ORDER", ALWAYS, 10 }, + { "OTHERS", "TK_OTHERS", WINDOWFUNC, 3 }, + { "OUTER", "TK_JOIN_KW", ALWAYS, 5 }, + { "OVER", "TK_OVER", WINDOWFUNC, 3 }, + { "PARTITION", "TK_PARTITION", WINDOWFUNC, 3 }, + { "PLAN", "TK_PLAN", EXPLAIN, 0 }, + { "PRAGMA", "TK_PRAGMA", PRAGMA, 0 }, + { "PRECEDING", "TK_PRECEDING", WINDOWFUNC, 3 }, + { "PRIMARY", "TK_PRIMARY", ALWAYS, 1 }, + { "QUERY", "TK_QUERY", EXPLAIN, 0 }, + { "RAISE", "TK_RAISE", TRIGGER, 1 }, + { "RANGE", "TK_RANGE", WINDOWFUNC, 3 }, + { "RECURSIVE", "TK_RECURSIVE", CTE, 3 }, + { "REFERENCES", "TK_REFERENCES", FKEY, 1 }, + { "REGEXP", "TK_LIKE_KW", ALWAYS, 3 }, + { "REINDEX", "TK_REINDEX", REINDEX, 1 }, + { "RELEASE", "TK_RELEASE", ALWAYS, 1 }, + { "RENAME", "TK_RENAME", ALTER, 1 }, + { "REPLACE", "TK_REPLACE", CONFLICT, 10 }, + { "RESTRICT", "TK_RESTRICT", FKEY, 1 }, + { "RIGHT", "TK_JOIN_KW", ALWAYS, 0 }, + { "ROLLBACK", "TK_ROLLBACK", ALWAYS, 1 }, + { "ROW", "TK_ROW", TRIGGER, 1 }, + { "ROWS", "TK_ROWS", ALWAYS, 1 }, + { "SAVEPOINT", "TK_SAVEPOINT", ALWAYS, 1 }, + { "SELECT", "TK_SELECT", ALWAYS, 10 }, + { "SET", "TK_SET", ALWAYS, 10 }, + { "TABLE", "TK_TABLE", ALWAYS, 1 }, + { "TEMP", "TK_TEMP", ALWAYS, 1 }, + { "TEMPORARY", "TK_TEMP", ALWAYS, 1 }, + { "THEN", "TK_THEN", ALWAYS, 3 }, + { "TIES", "TK_TIES", WINDOWFUNC, 3 }, + { "TO", "TK_TO", ALWAYS, 3 }, + { "TRANSACTION", "TK_TRANSACTION", ALWAYS, 1 }, + { "TRIGGER", "TK_TRIGGER", TRIGGER, 1 }, + { "UNBOUNDED", "TK_UNBOUNDED", WINDOWFUNC, 3 }, + { "UNION", "TK_UNION", COMPOUND, 3 }, + { "UNIQUE", "TK_UNIQUE", ALWAYS, 1 }, + { "UPDATE", "TK_UPDATE", ALWAYS, 10 }, + { "USING", "TK_USING", ALWAYS, 8 }, + { "VACUUM", "TK_VACUUM", VACUUM, 1 }, + { "VALUES", "TK_VALUES", ALWAYS, 10 }, + { "VIEW", "TK_VIEW", VIEW, 1 }, + { "VIRTUAL", "TK_VIRTUAL", VTAB, 1 }, + { "WHEN", "TK_WHEN", ALWAYS, 1 }, + { "WHERE", "TK_WHERE", ALWAYS, 10 }, + { "WINDOW", "TK_WINDOW", WINDOWFUNC, 3 }, + { "WITH", "TK_WITH", CTE, 4 }, + { "WITHOUT", "TK_WITHOUT", ALWAYS, 1 }, }; /* Number of keywords */ @@ -357,6 +358,22 @@ static Keyword *findById(int id){ return &aKeywordTable[i]; } +/* +** If aKeyword[*pFrom-1].iNext has a higher priority that aKeyword[*pFrom-1] +** itself, then swap them. +*/ +static void reorder(int *pFrom){ + int i = *pFrom - 1; + int j = aKeywordTable[i].iNext; + if( j==0 ) return; + j--; + if( aKeywordTable[i].priority >= aKeywordTable[j].priority ) return; + aKeywordTable[i].iNext = aKeywordTable[j].iNext; + aKeywordTable[j].iNext = i+1; + *pFrom = j+1; + reorder(&aKeywordTable[i].iNext); +} + /* ** This routine does the work. The generated code is printed on standard ** output. @@ -491,6 +508,7 @@ int main(int argc, char **argv){ h = aKeywordTable[i].hash % bestSize; aKeywordTable[i].iNext = aKWHash[h]; aKWHash[h] = i+1; + reorder(&aKWHash[h]); } /* Begin generating code */ @@ -605,6 +623,17 @@ int main(int argc, char **argv){ } } printf("%s};\n", j==0 ? "" : "\n"); + printf("/* Hash table decoded:\n"); + for(i=0; i Date: Fri, 1 Nov 2019 10:49:15 +0000 Subject: [PATCH 112/476] Fix a potential array bounds overflow in the mkkeywordhash.c code generator. Also add marks to omit keywords specific to generated columns when building with -DSQLITE_OMIT_GENERATED_COLUMNS. FossilOrigin-Name: cc6a40818387f78f89499f09e3f1c4655c7396af1cba2596c7fb2f23f3e9755f --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/mkkeywordhash.c | 13 ++++++++++--- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index aef50dc085..b70e3b01ee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Slightly\sfaster\skeyword\shash\stable. -D 2019-11-01T02:30:54.247 +C Fix\sa\spotential\sarray\sbounds\soverflow\sin\sthe\smkkeywordhash.c\scode\sgenerator.\nAlso\sadd\smarks\sto\somit\skeywords\sspecific\sto\sgenerated\scolumns\swhen\sbuilding\nwith\s-DSQLITE_OMIT_GENERATED_COLUMNS. +D 2019-11-01T10:49:15.808 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1777,7 +1777,7 @@ F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 -F tool/mkkeywordhash.c 1d4626fecd48b32a84963b663b34f3a42ee77691a21614bdacdc71d9412d5da4 +F tool/mkkeywordhash.c 27ffc6f6e7e3ecbfc5bca1f1f11a09fc5badf6d67557a5fb2d3b069dbed90617 F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6a13ea F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 40d3282ec285d9f724f6548283f48b601510cf5284da17485723fd650a68f436 -R c292184f9e256f8778bc51749362a73d +P f12e743e19a04ecbf7eb69b675082f2e4dda05b38cd81f6588a1ce95dfc57ada +R a19e7b395a0485b418d66f725ce1e9ee U drh -Z f600eb4b341234df9d684e7b16c76669 +Z 60eb5202ef4aac4c6596aee0e04e6735 diff --git a/manifest.uuid b/manifest.uuid index 166b2dd41a..f0de16cbea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f12e743e19a04ecbf7eb69b675082f2e4dda05b38cd81f6588a1ce95dfc57ada \ No newline at end of file +cc6a40818387f78f89499f09e3f1c4655c7396af1cba2596c7fb2f23f3e9755f \ No newline at end of file diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index ef7684270a..e4393e8a5a 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -154,6 +154,11 @@ struct Keyword { #else # define WINDOWFUNC 0x00100000 #endif +#ifdef SQLITE_OMIT_GENERATED_COLUMNS +# define GENCOL 0 +#else +# define GENCOL 0x00200000 +#endif /* ** These are the keywords @@ -165,7 +170,7 @@ static Keyword aKeywordTable[] = { { "AFTER", "TK_AFTER", TRIGGER, 0 }, { "ALL", "TK_ALL", ALWAYS, 0 }, { "ALTER", "TK_ALTER", ALTER, 0 }, - { "ALWAYS", "TK_ALWAYS", ALWAYS, 0 }, + { "ALWAYS", "TK_ALWAYS", GENCOL, 0 }, { "ANALYZE", "TK_ANALYZE", ANALYZE, 0 }, { "AND", "TK_AND", ALWAYS, 10 }, { "AS", "TK_AS", ALWAYS, 10 }, @@ -218,7 +223,7 @@ static Keyword aKeywordTable[] = { { "FOREIGN", "TK_FOREIGN", FKEY, 1 }, { "FROM", "TK_FROM", ALWAYS, 10 }, { "FULL", "TK_JOIN_KW", ALWAYS, 3 }, - { "GENERATED", "TK_GENERATED", ALWAYS, 1 }, + { "GENERATED", "TK_GENERATED", GENCOL, 1 }, { "GLOB", "TK_LIKE_KW", ALWAYS, 3 }, { "GROUP", "TK_GROUP", ALWAYS, 5 }, { "GROUPS", "TK_GROUPS", WINDOWFUNC, 2 }, @@ -364,7 +369,9 @@ static Keyword *findById(int id){ */ static void reorder(int *pFrom){ int i = *pFrom - 1; - int j = aKeywordTable[i].iNext; + int j; + if( i<0 ) return; + j = aKeywordTable[i].iNext; if( j==0 ) return; j--; if( aKeywordTable[i].priority >= aKeywordTable[j].priority ) return; From f09a14fbc34a130a9508707e435e24318ae07364 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Nov 2019 12:14:30 +0000 Subject: [PATCH 113/476] Add missing column translations to foreign key logic. Ticket [c28a01da72f8957c] FossilOrigin-Name: bc6a43e7ee6353b9ef3dea4309c77e170a1c798eefcfaa7636bf5a93e51c47ee --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/delete.c | 3 ++- src/fkey.c | 2 +- test/gencol1.test | 17 +++++++++++++++++ 5 files changed, 29 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index b70e3b01ee..d0a9210fc2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sarray\sbounds\soverflow\sin\sthe\smkkeywordhash.c\scode\sgenerator.\nAlso\sadd\smarks\sto\somit\skeywords\sspecific\sto\sgenerated\scolumns\swhen\sbuilding\nwith\s-DSQLITE_OMIT_GENERATED_COLUMNS. -D 2019-11-01T10:49:15.808 +C Add\smissing\scolumn\stranslations\sto\sforeign\skey\slogic.\nTicket\s[c28a01da72f8957c] +D 2019-11-01T12:14:30.508 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,10 +477,10 @@ F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 -F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf +F src/delete.c fbe8a2978a35201624ecaaabdaf83917c101e31cf451a7be0cf06d9049fad54e F src/expr.c a02db128337ca28c34fc3574a640f247881bc4d14c1debf5adc3ecf25dd74992 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c ac56f02ffe7a3dff311654f86e3c2fd1ff2eb38862b0c07fd908d8cc0fb4a9a2 +F src/fkey.c 3c177deff52d6d62eac09700866293e193aa92e9866d00c6eb45a37bdae354a1 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 159b28fa98f256ba7ea272dce8449b9a8218ce58591ce25da5df5cc4b61a147a +F test/gencol1.test 987474537c4e871a7ca7bcdb7113005abe2577f29a7a204325a8cbb819cd3079 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f12e743e19a04ecbf7eb69b675082f2e4dda05b38cd81f6588a1ce95dfc57ada -R a19e7b395a0485b418d66f725ce1e9ee +P cc6a40818387f78f89499f09e3f1c4655c7396af1cba2596c7fb2f23f3e9755f +R 820f9a4caca1b4851fd8f80b80fa0910 U drh -Z 60eb5202ef4aac4c6596aee0e04e6735 +Z 7c3a3f1de9ace471607f207972976d3d diff --git a/manifest.uuid b/manifest.uuid index f0de16cbea..c419d1a1e6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc6a40818387f78f89499f09e3f1c4655c7396af1cba2596c7fb2f23f3e9755f \ No newline at end of file +bc6a43e7ee6353b9ef3dea4309c77e170a1c798eefcfaa7636bf5a93e51c47ee \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index e3a0abc2c0..3f9f398c41 100644 --- a/src/delete.c +++ b/src/delete.c @@ -737,7 +737,8 @@ void sqlite3GenerateRowDelete( testcase( mask!=0xffffffff && iCol==31 ); testcase( mask!=0xffffffff && iCol==32 ); if( mask==0xffffffff || (iCol<=31 && (mask & MASKBIT32(iCol))!=0) ){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+iCol+1); + int kk = sqlite3TableColumnToStorage(pTab, iCol); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, iCol, iOld+kk+1); } } diff --git a/src/fkey.c b/src/fkey.c index c57fb14657..7647cf323c 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -483,7 +483,7 @@ static Expr *exprTableRegister( if( pExpr ){ if( iCol>=0 && iCol!=pTab->iPKey ){ pCol = &pTab->aCol[iCol]; - pExpr->iTable = regBase + iCol + 1; + pExpr->iTable = regBase + sqlite3TableColumnToStorage(pTab,iCol) + 1; pExpr->affExpr = pCol->affinity; zColl = pCol->zColl; if( zColl==0 ) zColl = db->pDfltColl->zName; diff --git a/test/gencol1.test b/test/gencol1.test index 653513929b..8b1c65be61 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -159,4 +159,21 @@ do_catchsql_test gencol1-3.110 { UPDATE t0 SET c1 = c0, c3 = c0+1; } {1 {FOREIGN KEY constraint failed}} +# 2019-11-01 ticket c28a01da72f8957c +db close +sqlite3 db :memory: +do_execsql_test gencol1-4.100 { + CREATE TABLE t0 ( + c0, + c1 a UNIQUE AS (1), + c2, + c3 REFERENCES t0(c1) + ); + PRAGMA foreign_keys = true; + INSERT INTO t0(c0,c2,c3) VALUES(0,0,1); +} {} +do_catchsql_test gencol1-4.110 { + REPLACE INTO t0(c0,c2,c3) VALUES(0,0,0),(0,0,0); +} {1 {FOREIGN KEY constraint failed}} + finish_test From b1c479b61d5ae2d675f3ea6521a8abb6515e52af Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 1 Nov 2019 13:37:26 +0000 Subject: [PATCH 114/476] Fix an fts3 assert() that could fail when operating on a database containing corrupt records. FossilOrigin-Name: 7c52f5478f9ecf5c078208759143ae9de43c1bf191dfcd74acb8bd169d4dc883 --- ext/fts3/fts3.c | 5 +++-- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts3corrupt4.test | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 2e19d6889f..0481ecdb1a 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2480,15 +2480,16 @@ static void fts3PutDeltaVarint3( int *pbFirst, /* IN/OUT: True after first int written */ sqlite3_int64 iVal /* Write this value to the list */ ){ - sqlite3_int64 iWrite; + sqlite3_uint64 iWrite; if( bDescIdx==0 || *pbFirst==0 ){ + assert_fts3_nc( *pbFirst==0 || iVal>=*piPrev ); iWrite = iVal - *piPrev; }else{ + assert_fts3_nc( *piPrev>=iVal ); iWrite = *piPrev - iVal; } assert( *pbFirst || *piPrev==0 ); assert_fts3_nc( *pbFirst==0 || iWrite>0 ); - assert( *pbFirst==0 || iWrite>=0 ); *pp += sqlite3Fts3PutVarint(*pp, iWrite); *piPrev = iVal; *pbFirst = 1; diff --git a/manifest b/manifest index d0a9210fc2..68067c7f82 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\smissing\scolumn\stranslations\sto\sforeign\skey\slogic.\nTicket\s[c28a01da72f8957c] -D 2019-11-01T12:14:30.508 +C Fix\san\sfts3\sassert()\sthat\scould\sfail\swhen\soperating\son\sa\sdatabase\scontaining\scorrupt\srecords. +D 2019-11-01T13:37:26.323 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -81,7 +81,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c a01da95e840a6ddb14d0a14b35c9017a8b034b08511ca97af716f00df102fb3f +F ext/fts3/fts3.c c75aa32b230bf4950d2a16a749eb893beab81abbdd2975383e19325715bf1e31 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 @@ -938,7 +938,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test 545c50e70d1fe922b6efef12019a92829832f52993c5421086489ce72bde2251 +F test/fts3corrupt4.test 7194a07e30b2fb8a5bea1c30753cc08b4e15b774dd5c308ca5eb21a33a13c7e9 F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cc6a40818387f78f89499f09e3f1c4655c7396af1cba2596c7fb2f23f3e9755f -R 820f9a4caca1b4851fd8f80b80fa0910 -U drh -Z 7c3a3f1de9ace471607f207972976d3d +P bc6a43e7ee6353b9ef3dea4309c77e170a1c798eefcfaa7636bf5a93e51c47ee +R 08bfd00a4a308a822d5c7274429702cd +U dan +Z 10a49602cb0df3dab591019d1c6a5499 diff --git a/manifest.uuid b/manifest.uuid index c419d1a1e6..d11ba01516 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc6a43e7ee6353b9ef3dea4309c77e170a1c798eefcfaa7636bf5a93e51c47ee \ No newline at end of file +7c52f5478f9ecf5c078208759143ae9de43c1bf191dfcd74acb8bd169d4dc883 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 3aecc2963b..ce9ce519e3 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -5546,4 +5546,19 @@ do_catchsql_test 30.2 { SELECT (matchinfo(null)) FROM t1 WHERE t1 MATCH 'ee*e*e*e*e*e*e*Re*e*e*e**' } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 31.0 { +CREATE VIRTUAL TABLE t1 USING fts3(a,b,c); +INSERT INTO t1_segdir VALUES(0,0,0,0,'0 592',X'00016dcb048ce6fbd3b2d68bfebf0101020200808080808080808020010202008080808080808080100102020080808080808080800801020200808080808080808004010202008080808080808080020102020080808080808080800101020200808080808080804001020200808080808080802001020200808080808080801001020200808080808080800801020200808080808080800401020200808080808080800201020200808080808080800101020200808080808080400102020080808080808020010202008080808080801001020200808080808080080102020080808080808004010202008080808080800201020200808080808080010102020080808080804001020200808080808020010202008080808080100102020080808080800801020200808080808004010202008080808080020102020080808080800101020200808080804001020200808080802001020200808080801001020200808080800801020200808080800401020200808080800201020200808080800101020200808080400102020080808020010202008080801001020200808080080102020080808004010202008080800201020200808080010102020080804001020200808020010202008080100102020080800801020200808004010202008080020102020080800101020200804001020200802001020200801001020200800801020200800401020200800201020200800101020200400102020020010202001001020200080102020004010202000201020200010102020001010202008080808080808080800101020200'); +INSERT INTO t1_segdir VALUES(0,1,0,0,'0 18',X'00026d6d0d8ee6fbd3b2d68bfe7f01020200'); +} + +do_catchsql_test 31.1 { + SELECT (matchinfo(t1, c ) ) FROM t1 WHERE t1 MATCH 'M*M*M*M*'; +} {1 {database disk image is malformed}} + + + finish_test From 1a9082f6d773fad00926f64650601104827bd319 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Nov 2019 15:19:24 +0000 Subject: [PATCH 115/476] Omit the optimization that reduces the column-count on rowid-table cursors when the table has generated columns, because we do not know what columns the generator expressions might try to access. FossilOrigin-Name: e6c96ed91e7a96d2bd30ea9df132644ac02d5a321a62f81f8f3984a8e49ed94b --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 8 +++++++- test/gencol1.test | 29 +++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 68067c7f82..78abe4df4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sfts3\sassert()\sthat\scould\sfail\swhen\soperating\son\sa\sdatabase\scontaining\scorrupt\srecords. -D 2019-11-01T13:37:26.323 +C Omit\sthe\soptimization\sthat\sreduces\sthe\scolumn-count\son\srowid-table\scursors\nwhen\sthe\stable\shas\sgenerated\scolumns,\sbecause\swe\sdo\snot\sknow\swhat\scolumns\sthe\ngenerator\sexpressions\smight\stry\sto\saccess. +D 2019-11-01T15:19:24.070 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -612,7 +612,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 6ff3ef076485dd71efbbabcc7ddc0473c04a9bdcb524128939757b002466f2d1 +F src/where.c 6e56bef94dc1e2d4461fca49604602312dc620333572aad9511e5ca2120aff31 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 28a3f27b44165e05bac3031f9a9ee9901305647b6c9dfc0214544578066ab097 F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 987474537c4e871a7ca7bcdb7113005abe2577f29a7a204325a8cbb819cd3079 +F test/gencol1.test eb649c915fb1e6db28c61c59b0dcfd8e24186e6c02a20f9bac2bd92fa0ba2e87 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P bc6a43e7ee6353b9ef3dea4309c77e170a1c798eefcfaa7636bf5a93e51c47ee -R 08bfd00a4a308a822d5c7274429702cd -U dan -Z 10a49602cb0df3dab591019d1c6a5499 +P 7c52f5478f9ecf5c078208759143ae9de43c1bf191dfcd74acb8bd169d4dc883 +R ff1afc2247f6244c5d8f4fed7821c04a +U drh +Z f38954f84a7e77d1295bd9b5032a5d87 diff --git a/manifest.uuid b/manifest.uuid index d11ba01516..bcb9430750 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c52f5478f9ecf5c078208759143ae9de43c1bf191dfcd74acb8bd169d4dc883 \ No newline at end of file +e6c96ed91e7a96d2bd30ea9df132644ac02d5a321a62f81f8f3984a8e49ed94b \ No newline at end of file diff --git a/src/where.c b/src/where.c index fcb9c7cccd..ffae7a6f4f 100644 --- a/src/where.c +++ b/src/where.c @@ -5014,7 +5014,13 @@ WhereInfo *sqlite3WhereBegin( assert( pTabItem->iCursor==pLevel->iTabCur ); testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS-1 ); testcase( pWInfo->eOnePass==ONEPASS_OFF && pTab->nCol==BMS ); - if( pWInfo->eOnePass==ONEPASS_OFF && pTab->nColeOnePass==ONEPASS_OFF + && pTab->nColtabFlags & (TF_HasGenerated|TF_WithoutRowid))==0 + ){ + /* If we know that only a prefix of the record will be used, + ** it is advantageous to reduce the "column count" field in + ** the P4 operand of the OP_OpenRead/Write opcode. */ Bitmask b = pTabItem->colUsed; int n = 0; for(; b; b=b>>1, n++){} diff --git a/test/gencol1.test b/test/gencol1.test index 8b1c65be61..206de16b80 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -176,4 +176,33 @@ do_catchsql_test gencol1-4.110 { REPLACE INTO t0(c0,c2,c3) VALUES(0,0,0),(0,0,0); } {1 {FOREIGN KEY constraint failed}} +# 2019-11-01 Problem found while adding new foreign key test cases in TH3. +db close +sqlite3 db :memory: +do_execsql_test gencol1-5.100 { + PRAGMA foreign_keys=ON; + CREATE TABLE t1( + gcb AS (b*1), + a INTEGER PRIMARY KEY, + gcc AS (c+0), + b UNIQUE, + gca AS (1*a+0), + c UNIQUE + ) WITHOUT ROWID; + INSERT INTO t1 VALUES(1,2,3); + INSERT INTO t1 VALUES(4,5,6); + INSERT INTO t1 VALUES(7,8,9); + CREATE TABLE t1a( + gcx AS (x+0) REFERENCES t1(a) ON DELETE CASCADE, + id, + x, + gcid AS (1*id) + ); + INSERT INTO t1a VALUES(1, 1); + INSERT INTO t1a VALUES(2, 4); + INSERT INTO t1a VALUES(3, 7); + DELETE FROM t1 WHERE b=5; + SELECT id,x,'|' FROM t1a ORDER BY id; +} {1 1 | 3 7 |} + finish_test From dc2e331ab2b469a6b950a5456b830ade8238e9a8 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Nov 2019 16:08:20 +0000 Subject: [PATCH 116/476] Add another missing column number translation to the foreign key logic. FossilOrigin-Name: 32df5edcfef2605009f45d6ef1b97c63a99df07c7b4e00dc70f93001cfb8d81f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/fkey.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 78abe4df4f..35b6c2896f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\soptimization\sthat\sreduces\sthe\scolumn-count\son\srowid-table\scursors\nwhen\sthe\stable\shas\sgenerated\scolumns,\sbecause\swe\sdo\snot\sknow\swhat\scolumns\sthe\ngenerator\sexpressions\smight\stry\sto\saccess. -D 2019-11-01T15:19:24.070 +C Add\sanother\smissing\scolumn\snumber\stranslation\sto\sthe\sforeign\skey\slogic. +D 2019-11-01T16:08:20.952 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c fbe8a2978a35201624ecaaabdaf83917c101e31cf451a7be0cf06d9049fad54e F src/expr.c a02db128337ca28c34fc3574a640f247881bc4d14c1debf5adc3ecf25dd74992 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 3c177deff52d6d62eac09700866293e193aa92e9866d00c6eb45a37bdae354a1 +F src/fkey.c 171e54112157be60ce75fa644a98a36088edd8ba9b2c6db7736268c738c45760 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7c52f5478f9ecf5c078208759143ae9de43c1bf191dfcd74acb8bd169d4dc883 -R ff1afc2247f6244c5d8f4fed7821c04a +P e6c96ed91e7a96d2bd30ea9df132644ac02d5a321a62f81f8f3984a8e49ed94b +R 3ab52f0e710580b54aac492242a1edc3 U drh -Z f38954f84a7e77d1295bd9b5032a5d87 +Z 4e3a2664d2b976593cf31430f3790c9d diff --git a/manifest.uuid b/manifest.uuid index bcb9430750..6d269be404 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e6c96ed91e7a96d2bd30ea9df132644ac02d5a321a62f81f8f3984a8e49ed94b \ No newline at end of file +32df5edcfef2605009f45d6ef1b97c63a99df07c7b4e00dc70f93001cfb8d81f \ No newline at end of file diff --git a/src/fkey.c b/src/fkey.c index 7647cf323c..b1dc1b71dd 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -932,7 +932,9 @@ void sqlite3FkCheck( Vdbe *v = sqlite3GetVdbe(pParse); int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1; for(i=0; inCol; i++){ - int iReg = pFKey->aCol[i].iFrom + regOld + 1; + int iCol, iReg; + iCol = pFKey->aCol[i].iFrom; + iReg = sqlite3TableColumnToStorage(pFKey->pFrom,iCol) + regOld + 1; sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, -1); From f2b9d7c60502581bfd2908fbdb0dd00017d26cb0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Nov 2019 16:37:53 +0000 Subject: [PATCH 117/476] Fix a potential use-after-free bug that follows an OOM error in code added two days ago by check-in [84e02d773d60cffe]. Problem discovered by OSSFuzz. FossilOrigin-Name: 0a2eb949f8a759e5745d9468c8183d3c0b4b30e0fa2a14b3062620eb9e1d5c1d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 35b6c2896f..17570b187e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sanother\smissing\scolumn\snumber\stranslation\sto\sthe\sforeign\skey\slogic. -D 2019-11-01T16:08:20.952 +C Fix\sa\spotential\suse-after-free\sbug\sthat\sfollows\san\sOOM\serror\sin\scode\nadded\stwo\sdays\sago\sby\scheck-in\s[84e02d773d60cffe].\s\sProblem\sdiscovered\nby\sOSSFuzz. +D 2019-11-01T16:37:53.191 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -602,7 +602,7 @@ F src/vdbe.c b67d6af853e03c3dd6d1116351567f62d8a2c10d3bd6db5f7f366e75d11c6653 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c ab10ec13e61cffacf26024aa10053e66285d175b3d88d87966674b6b9b8820c4 +F src/vdbeaux.c 75fa4792b6bc327751018ecd1516c189184d7224b8f3dfeda20c09112ef31a68 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e6c96ed91e7a96d2bd30ea9df132644ac02d5a321a62f81f8f3984a8e49ed94b -R 3ab52f0e710580b54aac492242a1edc3 +P 32df5edcfef2605009f45d6ef1b97c63a99df07c7b4e00dc70f93001cfb8d81f +R d43c58ef1fe087aa7eb409f8964655f5 U drh -Z 4e3a2664d2b976593cf31430f3790c9d +Z 51a0b480453b8134aa91c2e503e48e63 diff --git a/manifest.uuid b/manifest.uuid index 6d269be404..5a5634c037 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32df5edcfef2605009f45d6ef1b97c63a99df07c7b4e00dc70f93001cfb8d81f \ No newline at end of file +0a2eb949f8a759e5745d9468c8183d3c0b4b30e0fa2a14b3062620eb9e1d5c1d \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9596e163b0..21b396b364 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -368,10 +368,10 @@ int sqlite3VdbeAddFunctionCall( pCtx->pVdbe = 0; pCtx->isError = 0; pCtx->argc = nArg; + pCtx->iOp = sqlite3VdbeCurrentAddr(v); addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, p1, p2, p3, (char*)pCtx, P4_FUNCCTX); sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef); - pCtx->iOp = addr; return addr; } From bc4974c81bd4cda9900185a655b577f19a894e03 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Nov 2019 17:31:27 +0000 Subject: [PATCH 118/476] The SET DEFAULT and SET NULL conflict resolution actions for foreign key constraints should cause an error when they appear on a generated column. FossilOrigin-Name: b47513d2b32b61ba42c1e9b59287d28f6fee231e6c65de2a3aa19effbbaf1e7f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/fkey.c | 10 +++++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 17570b187e..f8990fa431 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\suse-after-free\sbug\sthat\sfollows\san\sOOM\serror\sin\scode\nadded\stwo\sdays\sago\sby\scheck-in\s[84e02d773d60cffe].\s\sProblem\sdiscovered\nby\sOSSFuzz. -D 2019-11-01T16:37:53.191 +C The\sSET\sDEFAULT\sand\sSET\sNULL\sconflict\sresolution\sactions\sfor\sforeign\skey\nconstraints\sshould\scause\san\serror\swhen\sthey\sappear\son\sa\sgenerated\scolumn. +D 2019-11-01T17:31:27.506 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c fbe8a2978a35201624ecaaabdaf83917c101e31cf451a7be0cf06d9049fad54e F src/expr.c a02db128337ca28c34fc3574a640f247881bc4d14c1debf5adc3ecf25dd74992 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 171e54112157be60ce75fa644a98a36088edd8ba9b2c6db7736268c738c45760 +F src/fkey.c 89a727204b6bb0143d9ab7534a8846f21647cb9a3f50537ce149a1e82d01dce4 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 32df5edcfef2605009f45d6ef1b97c63a99df07c7b4e00dc70f93001cfb8d81f -R d43c58ef1fe087aa7eb409f8964655f5 +P 0a2eb949f8a759e5745d9468c8183d3c0b4b30e0fa2a14b3062620eb9e1d5c1d +R 833ca282d33075c076d8697ea10dad1a U drh -Z 51a0b480453b8134aa91c2e503e48e63 +Z aaf384525ea1343453e8aadc28179232 diff --git a/manifest.uuid b/manifest.uuid index 5a5634c037..46aee4865f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0a2eb949f8a759e5745d9468c8183d3c0b4b30e0fa2a14b3062620eb9e1d5c1d \ No newline at end of file +b47513d2b32b61ba42c1e9b59287d28f6fee231e6c65de2a3aa19effbbaf1e7f \ No newline at end of file diff --git a/src/fkey.c b/src/fkey.c index b1dc1b71dd..ddee8f4bbb 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -1269,7 +1269,15 @@ static Trigger *fkActionTrigger( sqlite3ExprAlloc(db, TK_ID, &tNew, 0), sqlite3ExprAlloc(db, TK_ID, &tToCol, 0)); }else if( action==OE_SetDflt ){ - Expr *pDflt = pFKey->pFrom->aCol[iFromCol].pDflt; + Column *pCol = pFKey->pFrom->aCol + iFromCol; + Expr *pDflt; + if( pCol->colFlags & COLFLAG_GENERATED ){ + testcase( pCol->colFlags & COLFLAG_VIRTUAL ); + testcase( pCol->colFlags & COLFLAG_STORED ); + pDflt = 0; + }else{ + pDflt = pCol->pDflt; + } if( pDflt ){ pNew = sqlite3ExprDup(db, pDflt, 0); }else{ From 9c6a92982ff68cdbace6527e817adbe5a0628ea0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 1 Nov 2019 18:52:09 +0000 Subject: [PATCH 119/476] Fix a harmless compiler warning. FossilOrigin-Name: f0ebea35d9d6b69a7bb4242fb79ff3db4267e429855fa6969f9f52ffee1c7a99 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/fkey.c | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f8990fa431..4f559c85fe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sSET\sDEFAULT\sand\sSET\sNULL\sconflict\sresolution\sactions\sfor\sforeign\skey\nconstraints\sshould\scause\san\serror\swhen\sthey\sappear\son\sa\sgenerated\scolumn. -D 2019-11-01T17:31:27.506 +C Fix\sa\sharmless\scompiler\swarning. +D 2019-11-01T18:52:09.874 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c fbe8a2978a35201624ecaaabdaf83917c101e31cf451a7be0cf06d9049fad54e F src/expr.c a02db128337ca28c34fc3574a640f247881bc4d14c1debf5adc3ecf25dd74992 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 89a727204b6bb0143d9ab7534a8846f21647cb9a3f50537ce149a1e82d01dce4 +F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0a2eb949f8a759e5745d9468c8183d3c0b4b30e0fa2a14b3062620eb9e1d5c1d -R 833ca282d33075c076d8697ea10dad1a +P b47513d2b32b61ba42c1e9b59287d28f6fee231e6c65de2a3aa19effbbaf1e7f +R 9e3d2107d32c72e319286df31770e0b6 U drh -Z aaf384525ea1343453e8aadc28179232 +Z c4f517c0931673ac6eefe915d1bbfedb diff --git a/manifest.uuid b/manifest.uuid index 46aee4865f..de6af5e49a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b47513d2b32b61ba42c1e9b59287d28f6fee231e6c65de2a3aa19effbbaf1e7f \ No newline at end of file +f0ebea35d9d6b69a7bb4242fb79ff3db4267e429855fa6969f9f52ffee1c7a99 \ No newline at end of file diff --git a/src/fkey.c b/src/fkey.c index ddee8f4bbb..9698d343ce 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -932,9 +932,9 @@ void sqlite3FkCheck( Vdbe *v = sqlite3GetVdbe(pParse); int iJump = sqlite3VdbeCurrentAddr(v) + pFKey->nCol + 1; for(i=0; inCol; i++){ - int iCol, iReg; - iCol = pFKey->aCol[i].iFrom; - iReg = sqlite3TableColumnToStorage(pFKey->pFrom,iCol) + regOld + 1; + int iFromCol, iReg; + iFromCol = pFKey->aCol[i].iFrom; + iReg = sqlite3TableColumnToStorage(pFKey->pFrom,iFromCol) + regOld+1; sqlite3VdbeAddOp2(v, OP_IsNull, iReg, iJump); VdbeCoverage(v); } sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, -1); From 978256f3d8dc66152825fe4d4175994750b0fd68 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Nov 2019 00:00:14 +0000 Subject: [PATCH 120/476] Restore the on-line ".help" for the ".explain" command in the CLI. FossilOrigin-Name: 28b8f1036d569bccce56b4e7042348024b5dd1ffa04850cbeddab1e35c49e5b7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 4f559c85fe..71e34a1011 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning. -D 2019-11-01T18:52:09.874 +C Restore\sthe\son-line\s".help"\sfor\sthe\s".explain"\scommand\sin\sthe\sCLI. +D 2019-11-02T00:00:14.956 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,7 +527,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c cf2391c93d425455388389e7a47674b9da107d2ed69ebf49979044d70dbeb045 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 3395765ea3749341deb4c25e8339c3d626a8ac641a52c216e9632e48e620ba68 -F src/shell.c.in a17d143f186966ef24927b6b083f985ffdb95a01aa1bebaba7dcc706289bf7d2 +F src/shell.c.in c06961f202f3cc50b819744b7331d3caea3d79d958402f4900b0668248557468 F src/sqlite.h.in 5ba20664cede7f4e6861541fad1f17bac50f7bf576b40a8784c54f9126a9edd4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b47513d2b32b61ba42c1e9b59287d28f6fee231e6c65de2a3aa19effbbaf1e7f -R 9e3d2107d32c72e319286df31770e0b6 +P f0ebea35d9d6b69a7bb4242fb79ff3db4267e429855fa6969f9f52ffee1c7a99 +R dd0ad84e2261a2b2882eb0334a888497 U drh -Z c4f517c0931673ac6eefe915d1bbfedb +Z 9ba7e5973ff9e00cea7e79d70e4ff8aa diff --git a/manifest.uuid b/manifest.uuid index de6af5e49a..20b43331b7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f0ebea35d9d6b69a7bb4242fb79ff3db4267e429855fa6969f9f52ffee1c7a99 \ No newline at end of file +28b8f1036d569bccce56b4e7042348024b5dd1ffa04850cbeddab1e35c49e5b7 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 09fc5870fc..105cab6e5e 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3511,9 +3511,7 @@ static const char *(azHelp[]) = { ".excel Display the output of next command in spreadsheet", ".exit ?CODE? Exit this program with return-code CODE", ".expert EXPERIMENTAL. Suggest indexes for queries", -/* Because explain mode comes on automatically now, the ".explain" mode -** is removed from the help screen. It is still supported for legacy, however */ -/*".explain ?on|off|auto? Turn EXPLAIN output mode on or off",*/ + ".explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto", ".filectrl CMD ... Run various sqlite3_file_control() operations", " Run \".filectrl\" with no arguments for details", ".fullschema ?--indent? Show schema and the content of sqlite_stat tables", From 39b30a7d6bfcf46cd24688006b1106c6ea313da2 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Nov 2019 13:32:50 +0000 Subject: [PATCH 121/476] In sqlite3GenerateIndexKey(), do not attempt to reuse column values from the previous index if the current index is a partial index as the partial index test may have corrupted those values. Ticket [a9efb42811fa41ee] FossilOrigin-Name: 17e9f65814264de9c35bc5ba94e0a66fbbf1200c00d33ab9a19a0b6f92bc685a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/delete.c | 2 ++ test/index6.test | 21 +++++++++++++++++++-- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 71e34a1011..a3dd1ee90e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Restore\sthe\son-line\s".help"\sfor\sthe\s".explain"\scommand\sin\sthe\sCLI. -D 2019-11-02T00:00:14.956 +C In\ssqlite3GenerateIndexKey(),\sdo\snot\sattempt\sto\sreuse\scolumn\svalues\sfrom\nthe\sprevious\sindex\sif\sthe\scurrent\sindex\sis\sa\spartial\sindex\sas\sthe\spartial\nindex\stest\smay\shave\scorrupted\sthose\svalues.\s\sTicket\s[a9efb42811fa41ee] +D 2019-11-02T13:32:50.778 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 -F src/delete.c fbe8a2978a35201624ecaaabdaf83917c101e31cf451a7be0cf06d9049fad54e +F src/delete.c c371a9f3517a4dd6a0b56ebab9588408eddf1eac0277b67b09e030bff99ee1fa F src/expr.c a02db128337ca28c34fc3574a640f247881bc4d14c1debf5adc3ecf25dd74992 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 @@ -1053,7 +1053,7 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test 4d1dd3cab97fba2ddf30bb70afc82eab35bd6e61788b3ac941e55263f81ef7e9 +F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a47e7 F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f0ebea35d9d6b69a7bb4242fb79ff3db4267e429855fa6969f9f52ffee1c7a99 -R dd0ad84e2261a2b2882eb0334a888497 +P 28b8f1036d569bccce56b4e7042348024b5dd1ffa04850cbeddab1e35c49e5b7 +R 4c891fd72579455e0ca4b0344f871148 U drh -Z 9ba7e5973ff9e00cea7e79d70e4ff8aa +Z 0e202d8d694c8e918ce5f60538776752 diff --git a/manifest.uuid b/manifest.uuid index 20b43331b7..350ea4de36 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28b8f1036d569bccce56b4e7042348024b5dd1ffa04850cbeddab1e35c49e5b7 \ No newline at end of file +17e9f65814264de9c35bc5ba94e0a66fbbf1200c00d33ab9a19a0b6f92bc685a \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 3f9f398c41..a18026712f 100644 --- a/src/delete.c +++ b/src/delete.c @@ -918,6 +918,8 @@ int sqlite3GenerateIndexKey( sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, SQLITE_JUMPIFNULL); pParse->iSelfTab = 0; + pPrior = 0; /* Ticket a9efb42811fa41ee 2019-11-02; + ** pPartIdxWhere may have corrupted regPrior registers */ }else{ *piPartIdxLabel = 0; } diff --git a/test/index6.test b/test/index6.test index 976c49fb86..d385692584 100644 --- a/test/index6.test +++ b/test/index6.test @@ -478,7 +478,24 @@ do_execsql_test index6-16.3 { SELECT 3 FROM t0 WHERE c1 <= c0; } {3} - - +# 2019-11-02 +# Ticket https://sqlite.org/src/tktview/a9efb42811fa41ee286e8 +db close +sqlite3 db :memory: +do_execsql_test index6-17.1 { + CREATE TABLE t0(c0); + CREATE INDEX i0 ON t0(0) WHERE c0 GLOB c0; + INSERT INTO t0 VALUES (0); + CREATE UNIQUE INDEX i1 ON t0(0); + PRAGMA integrity_check; +} {ok} +do_execsql_test index6-17.2 { + CREATE UNIQUE INDEX i2 ON t0(0); + REPLACE INTO t0 VALUES(0); + PRAGMA integrity_check; +} {ok} +do_execsql_test index6-17.3 { + SELECT COUNT(*) FROM t0 WHERE t0.c0 GLOB t0.c0; +} {1} finish_test From 089c4bc2e2b51502644845dd5c27e2565fc1efc5 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Nov 2019 13:45:03 +0000 Subject: [PATCH 122/476] "STORED" is not actually a keyword. The parser looks for STORED as an ordinary identifier. FossilOrigin-Name: 167cd574d6a1d4fe2253f5bc5aaa7b031cbc82853e4d33b8d9b72eaf049003d4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a3dd1ee90e..1a667a08a9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\ssqlite3GenerateIndexKey(),\sdo\snot\sattempt\sto\sreuse\scolumn\svalues\sfrom\nthe\sprevious\sindex\sif\sthe\scurrent\sindex\sis\sa\spartial\sindex\sas\sthe\spartial\nindex\stest\smay\shave\scorrupted\sthose\svalues.\s\sTicket\s[a9efb42811fa41ee] -D 2019-11-02T13:32:50.778 +C "STORED"\sis\snot\sactually\sa\skeyword.\s\sThe\sparser\slooks\sfor\sSTORED\sas\san\nordinary\sidentifier. +D 2019-11-02T13:45:03.983 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y ea567d2ada3d5a8647bf55b3ebb8ede223bc15e69f349a6144348787b95895da +F src/parse.y 17c1ae265e1b92cb1f3f1661b020e3eb31f2d8b9588322d2b6f2b22f25b674c9 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 62714cbd1b7299a6e6a27a587b66b4fd3a836a84e1181e7f96f5c34a50917848 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 28b8f1036d569bccce56b4e7042348024b5dd1ffa04850cbeddab1e35c49e5b7 -R 4c891fd72579455e0ca4b0344f871148 +P 17e9f65814264de9c35bc5ba94e0a66fbbf1200c00d33ab9a19a0b6f92bc685a +R 859d886250160583161fe272329158d1 U drh -Z 0e202d8d694c8e918ce5f60538776752 +Z bd1f5e3871f2cd3e6943e58f0dd8ace6 diff --git a/manifest.uuid b/manifest.uuid index 350ea4de36..60c65b432e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -17e9f65814264de9c35bc5ba94e0a66fbbf1200c00d33ab9a19a0b6f92bc685a \ No newline at end of file +167cd574d6a1d4fe2253f5bc5aaa7b031cbc82853e4d33b8d9b72eaf049003d4 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 86dfc928ea..d1535e55f7 100644 --- a/src/parse.y +++ b/src/parse.y @@ -221,7 +221,7 @@ columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);} EXCLUDE GROUPS OTHERS TIES %endif SQLITE_OMIT_WINDOWFUNC %ifndef SQLITE_OMIT_GENERATED_COLUMNS - GENERATED ALWAYS STORED + GENERATED ALWAYS %endif REINDEX RENAME CTIME_KW IF . From 03836614148488e8ea5539743b796d557451d630 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 2 Nov 2019 17:59:10 +0000 Subject: [PATCH 123/476] Fix a problem in VIEW creation that was introduced by the generated columns feature. FossilOrigin-Name: 9c795c4d2b042d2932774bd1274fa0167ca2dc9838e127e0cf31eb9273a32f2c --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 3 ++- test/e_expr.test | 3 --- test/trigger2.test | 17 ++++++++++++++++- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 1a667a08a9..8cbd2dbb62 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C "STORED"\sis\snot\sactually\sa\skeyword.\s\sThe\sparser\slooks\sfor\sSTORED\sas\san\nordinary\sidentifier. -D 2019-11-02T13:45:03.983 +C Fix\sa\sproblem\sin\sVIEW\screation\sthat\swas\sintroduced\sby\sthe\sgenerated\scolumns\nfeature. +D 2019-11-02T17:59:10.372 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -470,7 +470,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22 F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 7afa8336eb6e154a9d687a57d6784d8f0ddcdb38ff5c266f7b595f8e737edd89 +F src/build.c 572d85d338189e48904b059d28cfc2f9099abfdc4f746142286fa1c0f1778a71 F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -825,7 +825,7 @@ F test/e_createtable.test 1c602347e73ab80b11b9fa083f47155861aaafcff8054aac9e0b76 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 F test/e_dropview.test 21ce09c361227ddbc9819a5608ee2700c276bdd5 -F test/e_expr.test e6048fe3901241799c4315bdd625f39dae790ff089c454979ca85f03b644dc6f +F test/e_expr.test 3513cb7041192174c81a5078f89a20992b8b9c12b4ee5e287683f9fdd4484847 F test/e_fkey.test 2febb2084aef9b0186782421c07bc9d377abf067c9cb4efd49d9647ae31f5afe F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e @@ -1572,7 +1572,7 @@ F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 F test/transitive1.test 293300f46916569f08875cdb2fe2134be2c27677 F test/trigger1.test 746dc327e2a0817a22bfc6f5a5e423483d3e77b3733ac20a8fe939e6541b5e53 -F test/trigger2.test 5cd7d69a7ba1143ee045e4ae2963ff32ae4c87a6 +F test/trigger2.test d15da46f7012832faf3e0c536b47024409d5fb1722d2bb77e29c06d96d704bb1 F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 17e9f65814264de9c35bc5ba94e0a66fbbf1200c00d33ab9a19a0b6f92bc685a -R 859d886250160583161fe272329158d1 +P 167cd574d6a1d4fe2253f5bc5aaa7b031cbc82853e4d33b8d9b72eaf049003d4 +R 794e59eee68ad1454caf01bc0c6b2777 U drh -Z bd1f5e3871f2cd3e6943e58f0dd8ace6 +Z 3ce02ac4b8e69a52ea025b6134fd1022 diff --git a/manifest.uuid b/manifest.uuid index 60c65b432e..91fbc9e7f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -167cd574d6a1d4fe2253f5bc5aaa7b031cbc82853e4d33b8d9b72eaf049003d4 \ No newline at end of file +9c795c4d2b042d2932774bd1274fa0167ca2dc9838e127e0cf31eb9273a32f2c \ No newline at end of file diff --git a/src/build.c b/src/build.c index 56798e3591..ecec4a3741 100644 --- a/src/build.c +++ b/src/build.c @@ -2625,7 +2625,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ ** the column names from the SELECT statement that defines the view. */ assert( pTable->aCol==0 ); - pTable->nCol = pTable->nNVCol = pSelTab->nCol; + pTable->nCol = pSelTab->nCol; pTable->aCol = pSelTab->aCol; pSelTab->nCol = 0; pSelTab->aCol = 0; @@ -2634,6 +2634,7 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pTable->nCol = 0; nErr++; } + pTable->nNVCol = pTable->nCol; sqlite3DeleteTable(db, pSelTab); sqlite3SelectDelete(db, pSel); EnableLookaside; diff --git a/test/e_expr.test b/test/e_expr.test index b8445c273e..44192cf472 100644 --- a/test/e_expr.test +++ b/test/e_expr.test @@ -1909,9 +1909,6 @@ foreach {tn sql} { # EVIDENCE-OF: R-18318-14995 The value of a subquery expression is the # first row of the result from the enclosed SELECT statement. # -# EVIDENCE-OF: R-15900-52156 In other words, an implied "LIMIT 1" is -# added to the subquery, overriding an explicitly coded LIMIT. -# do_execsql_test e_expr-36.3.1 { CREATE TABLE t4(x, y); INSERT INTO t4 VALUES(1, 'one'); diff --git a/test/trigger2.test b/test/trigger2.test index 7b939bdab7..1be72131f7 100644 --- a/test/trigger2.test +++ b/test/trigger2.test @@ -752,8 +752,23 @@ do_test trigger2-9.1 { } } {} +integrity_check trigger2-9.99 + +# 2019-11-02 Problem found by TH3, related to generated column support. +db close +sqlite3 db :memory: +do_execsql_test trigger2-10.1 { + CREATE TABLE t1(a,b,c,d); + CREATE VIEW v2(a,b,c,d) AS SELECT * FROM t1; + CREATE TRIGGER v2ins INSTEAD OF INSERT ON v2 BEGIN + INSERT INTO t1(a,b,c,d) VALUES(new.a, new.b, new.c, new.d); + END; + INSERT INTO v2(a,d) VALUES(11,14); + SELECT * FROM t1; +} {11 {} {} 14} + } ;# ifcapable view -integrity_check trigger2-9.9 +integrity_check trigger2-999 finish_test From db535390dbe2506858a781e8250e3e51a3270f10 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 3 Nov 2019 00:07:41 +0000 Subject: [PATCH 124/476] The optimization of check-in [9b2879629c34fc0a] is incorrectly reasoned. The WHERE clause of the partial index might not be true if the table of the partial index is the right table of a left join. So disable the optimization in that case. Ticket [623eff57e76d45f6] FossilOrigin-Name: 3be19e1151af1850b65991edb82420f9412a7798dd756c86eaa9ffdde573263a --- manifest | 14 +++++------ manifest.uuid | 2 +- src/wherecode.c | 64 +++++++++++++++++++++++++++---------------------- test/join.test | 18 ++++++++++++++ 4 files changed, 62 insertions(+), 36 deletions(-) diff --git a/manifest b/manifest index 8cbd2dbb62..d9d313e82e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sVIEW\screation\sthat\swas\sintroduced\sby\sthe\sgenerated\scolumns\nfeature. -D 2019-11-02T17:59:10.372 +C The\soptimization\sof\scheck-in\s[9b2879629c34fc0a]\sis\sincorrectly\sreasoned.\nThe\sWHERE\sclause\sof\sthe\spartial\sindex\smight\snot\sbe\strue\sif\sthe\stable\sof\nthe\spartial\sindex\sis\sthe\sright\stable\sof\sa\sleft\sjoin.\s\sSo\sdisable\sthe\noptimization\sin\sthat\scase.\s\sTicket\s[623eff57e76d45f6] +D 2019-11-03T00:07:41.595 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 6e56bef94dc1e2d4461fca49604602312dc620333572aad9511e5ca2120aff31 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 28a3f27b44165e05bac3031f9a9ee9901305647b6c9dfc0214544578066ab097 +F src/wherecode.c 123cd05eae51dd2d9e9e0483680298c3a62529a6ed3ec29ce217a2834427cabb F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1083,7 +1083,7 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test 832f7c7550a7c59a71c5e2886979a0770ba3b184f021387712680f804fae1df0 +F test/join.test debdadab636bb35c73084902c12ce4d2012bfa7a5f8a2c693bb3ba13059f2224 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 167cd574d6a1d4fe2253f5bc5aaa7b031cbc82853e4d33b8d9b72eaf049003d4 -R 794e59eee68ad1454caf01bc0c6b2777 +P 9c795c4d2b042d2932774bd1274fa0167ca2dc9838e127e0cf31eb9273a32f2c +R 5e53c74cccd75d696adb47595d7bc2ca U drh -Z 3ce02ac4b8e69a52ea025b6134fd1022 +Z 9c91bb1be2f76e50e900200e5b535282 diff --git a/manifest.uuid b/manifest.uuid index 91fbc9e7f6..367204177c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9c795c4d2b042d2932774bd1274fa0167ca2dc9838e127e0cf31eb9273a32f2c \ No newline at end of file +3be19e1151af1850b65991edb82420f9412a7798dd756c86eaa9ffdde573263a \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 351af766e6..7447fafb5a 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1870,35 +1870,43 @@ Bitmask sqlite3WhereCodeOneLoopStart( iRowidReg, pPk->nKeyCol); VdbeCoverage(v); } - /* If pIdx is an index on one or more expressions, then look through - ** all the expressions in pWInfo and try to transform matching expressions - ** into reference to index columns. Also attempt to translate references - ** to virtual columns in the table into references to (stored) columns - ** of the index. - ** - ** Do not do this for the RHS of a LEFT JOIN. This is because the - ** expression may be evaluated after OP_NullRow has been executed on - ** the cursor. In this case it is important to do the full evaluation, - ** as the result of the expression may not be NULL, even if all table - ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a - ** - ** Also, do not do this when processing one index an a multi-index - ** OR clause, since the transformation will become invalid once we - ** move forward to the next index. - ** https://sqlite.org/src/info/4e8e4857d32d401f - */ - if( pLevel->iLeftJoin==0 && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ - whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); + if( pLevel->iLeftJoin==0 ){ + /* If pIdx is an index on one or more expressions, then look through + ** all the expressions in pWInfo and try to transform matching expressions + ** into reference to index columns. Also attempt to translate references + ** to virtual columns in the table into references to (stored) columns + ** of the index. + ** + ** Do not do this for the RHS of a LEFT JOIN. This is because the + ** expression may be evaluated after OP_NullRow has been executed on + ** the cursor. In this case it is important to do the full evaluation, + ** as the result of the expression may not be NULL, even if all table + ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + ** + ** Also, do not do this when processing one index an a multi-index + ** OR clause, since the transformation will become invalid once we + ** move forward to the next index. + ** https://sqlite.org/src/info/4e8e4857d32d401f + */ + if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); + } + + /* If a partial index is driving the loop, try to eliminate WHERE clause + ** terms from the query that must be true due to the WHERE clause of + ** the partial index. + ** + ** 2019-11-02 ticket 623eff57e76d45f6: This optimization does not work + ** for a LEFT JOIN. + */ + if( pIdx->pPartIdxWhere ){ + whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); + } + }else{ + testcase( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ); + testcase( pIdx->pPartIdxWhere ); } - - /* If a partial index is driving the loop, try to eliminate WHERE clause - ** terms from the query that must be true due to the WHERE clause of - ** the partial index - */ - if( pIdx->pPartIdxWhere ){ - whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); - } - + /* Record the instruction used to terminate the loop. */ if( pLoop->wsFlags & WHERE_ONEROW ){ pLevel->op = OP_Noop; diff --git a/test/join.test b/test/join.test index 7d7524508d..0edfe0d84b 100644 --- a/test/join.test +++ b/test/join.test @@ -935,4 +935,22 @@ do_execsql_test join-19.5 { (b IS NOT NULL AND b IS NOT NULL) IS NOT NULL; } {0 {}} +# 2019-11-02 ticket 623eff57e76d45f6 +# The optimization of exclusing the WHERE expression of a partial index +# from the WHERE clause of the query if the index is used does not work +# of the table of the index is the right-hand table of a LEFT JOIN. +# +db close +sqlite3 db :memory: +do_execsql_test join-20.1 { + CREATE TABLE t1(c1); + CREATE TABLE t0(c0); + INSERT INTO t0(c0) VALUES (0); + SELECT * FROM t0 LEFT JOIN t1 WHERE NULL IN (c1); +} {} +do_execsql_test join-20.2 { + CREATE INDEX t1x ON t1(0) WHERE NULL IN (c1); + SELECT * FROM t0 LEFT JOIN t1 WHERE NULL IN (c1); +} {} + finish_test From 6c68d7592faa8cc59d5f81f3ba4d506ea4db71ca Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Nov 2019 02:05:52 +0000 Subject: [PATCH 125/476] Fix a false-postive in the sqlite3ExprImpliesNonNullRow() decision routine, that resulted in an incorrect LEFT JOIN strength reduction when the WHERE clause contained a row-value comparison. Ticket [02aa2bd02f97d0f2] FossilOrigin-Name: ea20068e6d97c9349ebcc7d0a01e99ebf08c6f44363f71a0218a1abea209adc5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 4 +++- test/rowvalue.test | 22 ++++++++++++++++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d9d313e82e..a33e9dff2b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\soptimization\sof\scheck-in\s[9b2879629c34fc0a]\sis\sincorrectly\sreasoned.\nThe\sWHERE\sclause\sof\sthe\spartial\sindex\smight\snot\sbe\strue\sif\sthe\stable\sof\nthe\spartial\sindex\sis\sthe\sright\stable\sof\sa\sleft\sjoin.\s\sSo\sdisable\sthe\noptimization\sin\sthat\scase.\s\sTicket\s[623eff57e76d45f6] -D 2019-11-03T00:07:41.595 +C Fix\sa\sfalse-postive\sin\sthe\ssqlite3ExprImpliesNonNullRow()\sdecision\sroutine,\nthat\sresulted\sin\san\sincorrect\sLEFT\sJOIN\sstrength\sreduction\swhen\sthe\nWHERE\sclause\scontained\sa\srow-value\scomparison.\nTicket\s[02aa2bd02f97d0f2] +D 2019-11-04T02:05:52.518 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c c371a9f3517a4dd6a0b56ebab9588408eddf1eac0277b67b09e030bff99ee1fa -F src/expr.c a02db128337ca28c34fc3574a640f247881bc4d14c1debf5adc3ecf25dd74992 +F src/expr.c 254238a94328ab88b473dcce4b656afd488cb03fced627ad90fb4676c5fe417f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1262,7 +1262,7 @@ F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 -F test/rowvalue.test 92dc2c5fad808d6764c8e5fa14360b89dacb3cb33ba1498a52f226f89a04a868 +F test/rowvalue.test c39cc0be5e33f5294fc9224216198d6709d713ea948fdf8f42d89568e97912c9 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9c795c4d2b042d2932774bd1274fa0167ca2dc9838e127e0cf31eb9273a32f2c -R 5e53c74cccd75d696adb47595d7bc2ca +P 3be19e1151af1850b65991edb82420f9412a7798dd756c86eaa9ffdde573263a +R a30fee6557c8c0c73b7fe40e3d78c678 U drh -Z 9c91bb1be2f76e50e900200e5b535282 +Z 03f3426d008bb8fbab5050ae611b4dd0 diff --git a/manifest.uuid b/manifest.uuid index 367204177c..b921ad9c0d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3be19e1151af1850b65991edb82420f9412a7798dd756c86eaa9ffdde573263a \ No newline at end of file +ea20068e6d97c9349ebcc7d0a01e99ebf08c6f44363f71a0218a1abea209adc5 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index a4407f4a84..093736f39f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5212,7 +5212,7 @@ int sqlite3ExprImpliesExpr(Parse *pParse, Expr *pE1, Expr *pE2, int iTab){ } /* -** This is the Expr node callback for sqlite3ExprImpliesNotNullRow(). +** This is the Expr node callback for sqlite3ExprImpliesNonNullRow(). ** If the expression node requires that the table at pWalker->iCur ** have one or more non-NULL column, then set pWalker->eCode to 1 and abort. ** @@ -5230,6 +5230,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ case TK_NOTNULL: case TK_IS: case TK_OR: + case TK_VECTOR: case TK_CASE: case TK_IN: case TK_FUNCTION: @@ -5239,6 +5240,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_NOTNULL ); testcase( pExpr->op==TK_IS ); testcase( pExpr->op==TK_OR ); + testcase( pExpr->op==TK_VECTOR ); testcase( pExpr->op==TK_CASE ); testcase( pExpr->op==TK_IN ); testcase( pExpr->op==TK_FUNCTION ); diff --git a/test/rowvalue.test b/test/rowvalue.test index 746b137168..f0a32b18c7 100644 --- a/test/rowvalue.test +++ b/test/rowvalue.test @@ -616,5 +616,27 @@ do_execsql_test 25.40 { SELECT 2 FROM t0 WHERE (t0.c0 COLLATE nocase, 0) < ('B', 0); } {1 2} +# 2019-11-04 Ticket 02aa2bd02f97d0f2 +# The TK_VECTOR operator messes up sqlite3ExprImpliesNonNull() which +# causes incorrect LEFT JOIN strength reduction. TK_VECTOR should be +# treated the same as TK_OR. +# +db close +sqlite3 db :memory: +do_execsql_test 26.10 { + CREATE TABLE t0(c0); + CREATE TABLE t1(c1); + INSERT INTO t1(c1) VALUES (0); + SELECT (c0, x'') != (NULL, 0) FROM t1 LEFT JOIN t0; +} {1} +do_execsql_test 26.20 { + SELECT 2 FROM t1 LEFT JOIN t0 ON (c0, x'') != (NULL, 0); +} {2} +do_execsql_test 26.30 { + SELECT 3 FROM t1 LEFT JOIN t0 WHERE (c0, x'') != (NULL, 0); +} {3} + + + finish_test From 06fc24555fd7fc826c68de4b85f2326ada87ea90 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 4 Nov 2019 12:49:15 +0000 Subject: [PATCH 126/476] Changes an unreachable testcase() into an assert(). FossilOrigin-Name: 5710845b6314f924b490434b4446169f4bb50576aaa940472af68150db16e127 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a33e9dff2b..339c917f7c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sfalse-postive\sin\sthe\ssqlite3ExprImpliesNonNullRow()\sdecision\sroutine,\nthat\sresulted\sin\san\sincorrect\sLEFT\sJOIN\sstrength\sreduction\swhen\sthe\nWHERE\sclause\scontained\sa\srow-value\scomparison.\nTicket\s[02aa2bd02f97d0f2] -D 2019-11-04T02:05:52.518 +C Changes\san\sunreachable\stestcase()\sinto\san\sassert(). +D 2019-11-04T12:49:15.714 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 6e56bef94dc1e2d4461fca49604602312dc620333572aad9511e5ca2120aff31 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 123cd05eae51dd2d9e9e0483680298c3a62529a6ed3ec29ce217a2834427cabb +F src/wherecode.c 4b6517752f9a4b6d005ff339515a94666e01d10d70a8e7468845a68fcb91d6f4 F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3be19e1151af1850b65991edb82420f9412a7798dd756c86eaa9ffdde573263a -R a30fee6557c8c0c73b7fe40e3d78c678 +P ea20068e6d97c9349ebcc7d0a01e99ebf08c6f44363f71a0218a1abea209adc5 +R 522274fac7018c4024e93ec3a1293bef U drh -Z 03f3426d008bb8fbab5050ae611b4dd0 +Z aee10eb2e9b1cf05ea78fe90a73aaf4a diff --git a/manifest.uuid b/manifest.uuid index b921ad9c0d..f20d6b7ae7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ea20068e6d97c9349ebcc7d0a01e99ebf08c6f44363f71a0218a1abea209adc5 \ No newline at end of file +5710845b6314f924b490434b4446169f4bb50576aaa940472af68150db16e127 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 7447fafb5a..b9801407bb 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1903,8 +1903,11 @@ Bitmask sqlite3WhereCodeOneLoopStart( whereApplyPartialIndexConstraints(pIdx->pPartIdxWhere, iCur, pWC); } }else{ - testcase( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ); testcase( pIdx->pPartIdxWhere ); + /* The following assert() is not a requirement, merely an observation: + ** The OR-optimization doesn't work for the right hand table of + ** a LEFT JOIN: */ + assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ); } /* Record the instruction used to terminate the loop. */ From b1129c423f0cda7c76a3664dd91e84701f431cc5 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 Nov 2019 14:49:43 +0000 Subject: [PATCH 127/476] Fix the handling of NOT NULL constraint violations for generated columns in a REPLACE statement. Ticket [2399f5986134f79c] FossilOrigin-Name: 77b1c90add514050fe62f22751362fecacd99f9775346cffc60e09c326e64e10 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 8 +++++--- test/gencol1.test | 6 ++++++ 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 339c917f7c..d266884860 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\san\sunreachable\stestcase()\sinto\san\sassert(). -D 2019-11-04T12:49:15.714 +C Fix\sthe\shandling\sof\sNOT\sNULL\sconstraint\sviolations\sfor\sgenerated\scolumns\sin\na\sREPLACE\sstatement.\s\sTicket\s[2399f5986134f79c] +D 2019-11-06T14:49:43.545 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c eb81303edba6d2e9cbead33260db01c6c6fcf3f21e6c83f454b6807254bf0186 +F src/insert.c 4da4e4f8a0e0ae8ff57a5e26bf04448649702a5ad123119afab80dfb9a5e06c0 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 20c6325c581123b8771ecb938f60d7e31c8152be01b4bf8e5eefbb74671ea86f @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test eb649c915fb1e6db28c61c59b0dcfd8e24186e6c02a20f9bac2bd92fa0ba2e87 +F test/gencol1.test 1f7cd0500d29a05e2f60bae5eb1f01e4ed019d2088edccbd085daf73012c5c70 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ea20068e6d97c9349ebcc7d0a01e99ebf08c6f44363f71a0218a1abea209adc5 -R 522274fac7018c4024e93ec3a1293bef +P 5710845b6314f924b490434b4446169f4bb50576aaa940472af68150db16e127 +R 9d5a13a521cda561890c0d46d5d0c074 U drh -Z aee10eb2e9b1cf05ea78fe90a73aaf4a +Z 7fe961ad8c3263abc2ab5dcf97eb34bb diff --git a/manifest.uuid b/manifest.uuid index f20d6b7ae7..080ec628a5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5710845b6314f924b490434b4446169f4bb50576aaa940472af68150db16e127 \ No newline at end of file +77b1c90add514050fe62f22751362fecacd99f9775346cffc60e09c326e64e10 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 0711930fb4..77edc5ea65 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1518,9 +1518,11 @@ void sqlite3GenerateConstraintChecks( addr1 = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1); VdbeCoverage(v); - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1); - VdbeCoverage(v); + if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ){ + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); + sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1); + VdbeCoverage(v); + } onError = OE_Abort; /* Fall through into the OE_Abort case to generate code that runs ** if both the input and the default value are NULL */ diff --git a/test/gencol1.test b/test/gencol1.test index 206de16b80..bae9521459 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -205,4 +205,10 @@ do_execsql_test gencol1-5.100 { SELECT id,x,'|' FROM t1a ORDER BY id; } {1 1 | 3 7 |} +do_catchsql_test gencol1-6.10 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 NOT NULL AS(c1), c1); + REPLACE INTO t0(c1) VALUES(NULL); +} {1 {NOT NULL constraint failed: t0.c0}} + finish_test From 4fb24c82cd6bedf39e8c536eb3d1563eca11544a Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 Nov 2019 17:31:18 +0000 Subject: [PATCH 128/476] Fix the OP_DeferredSeek index-to-table column map in P4 so that it works with generated columns. Ticket [ce22a07731530118] FossilOrigin-Name: 36c11ad51fe9ab1bde0b98d0ea9b8588e07d168cd8027486749372894941ad93 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 6 +++++- test/gencol1.test | 11 +++++++++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d266884860..9b30e97b2e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\shandling\sof\sNOT\sNULL\sconstraint\sviolations\sfor\sgenerated\scolumns\sin\na\sREPLACE\sstatement.\s\sTicket\s[2399f5986134f79c] -D 2019-11-06T14:49:43.545 +C Fix\sthe\sOP_DeferredSeek\sindex-to-table\scolumn\smap\sin\sP4\sso\sthat\sit\sworks\nwith\sgenerated\scolumns.\s\sTicket\s[ce22a07731530118] +D 2019-11-06T17:31:18.390 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 6e56bef94dc1e2d4461fca49604602312dc620333572aad9511e5ca2120aff31 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 4b6517752f9a4b6d005ff339515a94666e01d10d70a8e7468845a68fcb91d6f4 +F src/wherecode.c d1b6cfac960357ba1f8be38b3c55c18749e7e45f110b92a19e1f70bc09e4d27d F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 1f7cd0500d29a05e2f60bae5eb1f01e4ed019d2088edccbd085daf73012c5c70 +F test/gencol1.test 9b0da1c019e6081c7d4862ed05afb56bf4fef0d0311ee88123147af635626546 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5710845b6314f924b490434b4446169f4bb50576aaa940472af68150db16e127 -R 9d5a13a521cda561890c0d46d5d0c074 +P 77b1c90add514050fe62f22751362fecacd99f9775346cffc60e09c326e64e10 +R 7a18ae7215710ad0ad38860a85c99b1d U drh -Z 7fe961ad8c3263abc2ab5dcf97eb34bb +Z e05c3cf6f4094669a51e4d666c32e777 diff --git a/manifest.uuid b/manifest.uuid index 080ec628a5..685c7ba711 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -77b1c90add514050fe62f22751362fecacd99f9775346cffc60e09c326e64e10 \ No newline at end of file +36c11ad51fe9ab1bde0b98d0ea9b8588e07d168cd8027486749372894941ad93 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index b9801407bb..4d125fdb6f 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1054,8 +1054,12 @@ static void codeDeferredSeek( if( ai ){ ai[0] = pTab->nCol; for(i=0; inColumn-1; i++){ + int x1, x2; assert( pIdx->aiColumn[i]nCol ); - if( pIdx->aiColumn[i]>=0 ) ai[pIdx->aiColumn[i]+1] = i+1; + x1 = pIdx->aiColumn[i]; + x2 = sqlite3TableColumnToStorage(pTab, x1); + testcase( x1!=x2 ); + if( pIdx->aiColumn[i]>=0 ) ai[x2+1] = i+1; } sqlite3VdbeChangeP4(v, -1, (char*)ai, P4_INTARRAY); } diff --git a/test/gencol1.test b/test/gencol1.test index bae9521459..e7bd2e8b6c 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -211,4 +211,15 @@ do_catchsql_test gencol1-6.10 { REPLACE INTO t0(c1) VALUES(NULL); } {1 {NOT NULL constraint failed: t0.c0}} +# 2019-11-06 ticket b13b7dce76e9352b34e7 +do_execsql_test gencol1-7.10 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0 (c0 GENERATED ALWAYS AS (1), c1 UNIQUE, c2 UNIQUE); + INSERT INTO t0(c1) VALUES (1); + SELECT quote(0 = t0.c2 OR t0.c1 BETWEEN t0.c2 AND 1) FROM t0; +} {NULL} +do_execsql_test gencol1-7.20 { + SELECT 99 FROM t0 WHERE 0 = t0.c2 OR t0.c1 BETWEEN t0.c2 AND 1; +} {} + finish_test From bde3a4f680b7c99ae918aa0477e81541ebdafbe5 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 6 Nov 2019 19:25:45 +0000 Subject: [PATCH 129/476] Minor simplification to the changes from check-in [36c11ad51f]. FossilOrigin-Name: 7bc8205dd9c1657c736a9c6a1a90dd9dad442accfbb77d296eaae2c09ab46bd1 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9b30e97b2e..bf3938168a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_DeferredSeek\sindex-to-table\scolumn\smap\sin\sP4\sso\sthat\sit\sworks\nwith\sgenerated\scolumns.\s\sTicket\s[ce22a07731530118] -D 2019-11-06T17:31:18.390 +C Minor\ssimplification\sto\sthe\schanges\sfrom\scheck-in\s[36c11ad51f]. +D 2019-11-06T19:25:45.811 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -614,7 +614,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c 6e56bef94dc1e2d4461fca49604602312dc620333572aad9511e5ca2120aff31 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c d1b6cfac960357ba1f8be38b3c55c18749e7e45f110b92a19e1f70bc09e4d27d +F src/wherecode.c 9b84737fd68134249a439813d27b1c61de17a01e121eb98949548d1e7f8e400a F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 77b1c90add514050fe62f22751362fecacd99f9775346cffc60e09c326e64e10 -R 7a18ae7215710ad0ad38860a85c99b1d -U drh -Z e05c3cf6f4094669a51e4d666c32e777 +P 36c11ad51fe9ab1bde0b98d0ea9b8588e07d168cd8027486749372894941ad93 +R 80e9f354c0a8ad398e848628e32a33df +U mistachkin +Z c30d3c02879affde565b3a131605c576 diff --git a/manifest.uuid b/manifest.uuid index 685c7ba711..c45b036a1d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36c11ad51fe9ab1bde0b98d0ea9b8588e07d168cd8027486749372894941ad93 \ No newline at end of file +7bc8205dd9c1657c736a9c6a1a90dd9dad442accfbb77d296eaae2c09ab46bd1 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 4d125fdb6f..d34912eb7b 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1059,7 +1059,7 @@ static void codeDeferredSeek( x1 = pIdx->aiColumn[i]; x2 = sqlite3TableColumnToStorage(pTab, x1); testcase( x1!=x2 ); - if( pIdx->aiColumn[i]>=0 ) ai[x2+1] = i+1; + if( x1>=0 ) ai[x2+1] = i+1; } sqlite3VdbeChangeP4(v, -1, (char*)ai, P4_INTARRAY); } From dfa15270c4108fedd817a99751fc73d43d7fb29d Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 6 Nov 2019 22:19:07 +0000 Subject: [PATCH 130/476] Change the way generated columns are computed so that no column is computed inside branch code that might not be taken. Ticket [4fc08501f4e56692] FossilOrigin-Name: 9e07b48934e9a972dcf62e3538b3b21ffa044c553feba0441675ac0bbe13bcb2 --- manifest | 20 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 11 +-------- src/insert.c | 59 ++++++++++++++++++++++++++++++++++------------- src/sqliteInt.h | 3 ++- test/gencol1.test | 12 ++++++++++ 6 files changed, 69 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index bf3938168a..4c6a543e24 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\ssimplification\sto\sthe\schanges\sfrom\scheck-in\s[36c11ad51f]. -D 2019-11-06T19:25:45.811 +C Change\sthe\sway\sgenerated\scolumns\sare\scomputed\sso\sthat\sno\scolumn\sis\scomputed\ninside\sbranch\scode\sthat\smight\snot\sbe\staken.\s\sTicket\s[4fc08501f4e56692] +D 2019-11-06T22:19:07.236 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c c371a9f3517a4dd6a0b56ebab9588408eddf1eac0277b67b09e030bff99ee1fa -F src/expr.c 254238a94328ab88b473dcce4b656afd488cb03fced627ad90fb4676c5fe417f +F src/expr.c fad49e282d0aaa899becf5b2c4ed405aae1c872f0e952903c221adbf83b370b5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 4da4e4f8a0e0ae8ff57a5e26bf04448649702a5ad123119afab80dfb9a5e06c0 +F src/insert.c 6e40e8aaa3840255614c7f39c061ab2d0f1f46095d5f8ce63650e9c17425a3e4 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 20c6325c581123b8771ecb938f60d7e31c8152be01b4bf8e5eefbb74671ea86f @@ -531,7 +531,7 @@ F src/shell.c.in c06961f202f3cc50b819744b7331d3caea3d79d958402f4900b066824855746 F src/sqlite.h.in 5ba20664cede7f4e6861541fad1f17bac50f7bf576b40a8784c54f9126a9edd4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 3ab4cce57fcda91b6b5377ba7d56dfb011d55b6a4a7d643c31dbefa06e00828a +F src/sqliteInt.h a9afee1875df1784bf2fb5d02aece62a6a93dfd082b43bb4d5d2b5295a0042ae F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 9b0da1c019e6081c7d4862ed05afb56bf4fef0d0311ee88123147af635626546 +F test/gencol1.test 963d951f228b5f588bde3f6ed484fba517fd404d0b126d5ba9ed2334ea8f34d1 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 36c11ad51fe9ab1bde0b98d0ea9b8588e07d168cd8027486749372894941ad93 -R 80e9f354c0a8ad398e848628e32a33df -U mistachkin -Z c30d3c02879affde565b3a131605c576 +P 7bc8205dd9c1657c736a9c6a1a90dd9dad442accfbb77d296eaae2c09ab46bd1 +R f50edf50f4c4c65865633f57ab8f6227 +U drh +Z d609942b70a972c6842c87e626766609 diff --git a/manifest.uuid b/manifest.uuid index c45b036a1d..da1580bc21 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7bc8205dd9c1657c736a9c6a1a90dd9dad442accfbb77d296eaae2c09ab46bd1 \ No newline at end of file +9e07b48934e9a972dcf62e3538b3b21ffa044c553feba0441675ac0bbe13bcb2 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 093736f39f..330e057a00 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3645,16 +3645,7 @@ expr_code_doover: iSrc = sqlite3TableColumnToStorage(pTab, iCol) - pParse->iSelfTab; #ifndef SQLITE_OMIT_GENERATED_COLUMNS if( pCol->colFlags & COLFLAG_GENERATED ){ - if( pCol->colFlags & COLFLAG_BUSY ){ - sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", - pCol->zName); - return 0; - } - pCol->colFlags |= COLFLAG_BUSY; - if( pCol->colFlags & COLFLAG_NOTAVAIL ){ - sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc); - } - pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); + sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc); return iSrc; }else #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ diff --git a/src/insert.c b/src/insert.c index 77edc5ea65..d8d369529e 100644 --- a/src/insert.c +++ b/src/insert.c @@ -201,6 +201,16 @@ static int readsTable(Parse *p, int iDb, Table *pTab){ return 0; } +/* This walker callback will compute the union of colFlags flags for all +** references columns in a CHECK constraint or generated column expression. +*/ +static int exprColumnFlagUnion(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_COLUMN ){ + pWalker->eCode |= pWalker->u.pTab->aCol[pExpr->iColumn].colFlags; + } + return WRC_Continue; +} + #ifndef SQLITE_OMIT_GENERATED_COLUMNS /* ** All regular columns for table pTab have been puts into registers @@ -215,7 +225,10 @@ void sqlite3ComputeGeneratedColumns( Table *pTab /* The table */ ){ int i; - int nv; + Walker w; + Column *pRedo; + int eProgress; + /* Because there can be multiple generated columns that refer to one another, ** this is a two-pass algorithm. On the first pass, mark all generated ** columns as "not available". @@ -227,29 +240,43 @@ void sqlite3ComputeGeneratedColumns( pTab->aCol[i].colFlags |= COLFLAG_NOTAVAIL; } } + + w.u.pTab = pTab; + w.xExprCallback = exprColumnFlagUnion; + w.xSelectCallback = 0; + w.xSelectCallback2 = 0; + /* On the second pass, compute the value of each NOT-AVAILABLE column. ** Companion code in the TK_COLUMN case of sqlite3ExprCodeTarget() will ** compute dependencies and mark remove the COLSPAN_NOTAVAIL mark, as ** they are needed. */ pParse->iSelfTab = -iRegStore; - for(i=nv=0; inCol; i++){ - u32 colFlags = pTab->aCol[i].colFlags; - if( (colFlags & COLFLAG_NOTAVAIL)!=0 ){ - assert( colFlags & COLFLAG_GENERATED ); - if( colFlags & COLFLAG_VIRTUAL ){ - /* Virtual columns go at the end */ - assert( pTab->nNVCol+nv == sqlite3TableColumnToStorage(pTab,i) ); - sqlite3ExprCodeGeneratedColumn(pParse, &pTab->aCol[i], - iRegStore+pTab->nNVCol+nv); - }else{ - /* Stored columns go in column order */ - assert( i-nv == sqlite3TableColumnToStorage(pTab,i) ); - sqlite3ExprCodeGeneratedColumn(pParse, &pTab->aCol[i], iRegStore+i-nv); + do{ + eProgress = 0; + pRedo = 0; + for(i=0; inCol; i++){ + Column *pCol = pTab->aCol + i; + if( (pCol->colFlags & COLFLAG_NOTAVAIL)!=0 ){ + int x; + pCol->colFlags |= COLFLAG_BUSY; + w.eCode = 0; + sqlite3WalkExpr(&w, pCol->pDflt); + pCol->colFlags &= ~COLFLAG_BUSY; + if( w.eCode & COLFLAG_NOTAVAIL ){ + pRedo = pCol; + continue; + } + eProgress = 1; + assert( pCol->colFlags & COLFLAG_GENERATED ); + x = sqlite3TableColumnToStorage(pTab, i) + iRegStore; + sqlite3ExprCodeGeneratedColumn(pParse, pCol, x); + pCol->colFlags &= ~COLFLAG_NOTAVAIL; } - pTab->aCol[i].colFlags &= ~COLFLAG_NOTAVAIL; } - if( (colFlags & COLFLAG_VIRTUAL)!=0 ) nv++; + }while( pRedo && eProgress ); + if( pRedo ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pRedo->zName); } pParse->iSelfTab = 0; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index cf7abfe66c..b12391a3ed 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3546,7 +3546,7 @@ struct Walker { int (*xSelectCallback)(Walker*,Select*); /* Callback for SELECTs */ void (*xSelectCallback2)(Walker*,Select*);/* Second callback for SELECTs */ int walkerDepth; /* Number of subqueries */ - u8 eCode; /* A small processing code */ + u16 eCode; /* A small processing code */ union { /* Extra data for callback */ NameContext *pNC; /* Naming context */ int n; /* A counter */ @@ -3562,6 +3562,7 @@ struct Walker { struct WindowRewrite *pRewrite; /* Window rewrite context */ struct WhereConst *pConst; /* WHERE clause constants */ struct RenameCtx *pRename; /* RENAME COLUMN context */ + struct Table *pTab; /* Table of generated column */ } u; }; diff --git a/test/gencol1.test b/test/gencol1.test index e7bd2e8b6c..a8cc8e4366 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -222,4 +222,16 @@ do_execsql_test gencol1-7.20 { SELECT 99 FROM t0 WHERE 0 = t0.c2 OR t0.c1 BETWEEN t0.c2 AND 1; } {} +# 2019-11-06 ticket 4fc08501f4e56692 +do_execsql_test gencol1-8.10 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0( + c0 AS (('a', 9) < ('b', c1)), + c1 AS (1), + c2 CHECK (1 = c1) + ); + INSERT INTO t0 VALUES (0),(99); + SELECT * FROM t0; +} {1 1 0 1 1 99} + finish_test From 4e8e533bf7ee9afd7f6a4d8899b891bbdbf9ac53 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 7 Nov 2019 02:32:54 +0000 Subject: [PATCH 131/476] Restore generated column loop detection logic that was incorrectly removed from the previous check-in [9e07b48934e9a972]. This fixes ticket [299b50ba812d8e54] FossilOrigin-Name: 104a2beb57037f9353ffa77096aae0eb64e4682e667f31623bfd3d064dd8d881 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 11 ++++++++++- test/gencol1.test | 10 ++++++++++ 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4c6a543e24..e3af4a5312 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sway\sgenerated\scolumns\sare\scomputed\sso\sthat\sno\scolumn\sis\scomputed\ninside\sbranch\scode\sthat\smight\snot\sbe\staken.\s\sTicket\s[4fc08501f4e56692] -D 2019-11-06T22:19:07.236 +C Restore\sgenerated\scolumn\sloop\sdetection\slogic\sthat\swas\sincorrectly\sremoved\nfrom\sthe\sprevious\scheck-in\s[9e07b48934e9a972].\s\sThis\sfixes\sticket\n[299b50ba812d8e54] +D 2019-11-07T02:32:54.155 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c c371a9f3517a4dd6a0b56ebab9588408eddf1eac0277b67b09e030bff99ee1fa -F src/expr.c fad49e282d0aaa899becf5b2c4ed405aae1c872f0e952903c221adbf83b370b5 +F src/expr.c 254238a94328ab88b473dcce4b656afd488cb03fced627ad90fb4676c5fe417f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1021,7 +1021,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 963d951f228b5f588bde3f6ed484fba517fd404d0b126d5ba9ed2334ea8f34d1 +F test/gencol1.test 82b8fc6953a6ff8560249c01f448a5fa8e8b633ec4dbdb3fc4f6632dc9ad9ea8 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7bc8205dd9c1657c736a9c6a1a90dd9dad442accfbb77d296eaae2c09ab46bd1 -R f50edf50f4c4c65865633f57ab8f6227 +P 9e07b48934e9a972dcf62e3538b3b21ffa044c553feba0441675ac0bbe13bcb2 +R 419dd03cd73a69d8a754bdd126fa0e44 U drh -Z d609942b70a972c6842c87e626766609 +Z 8725622db40a81117b469b3688d6172b diff --git a/manifest.uuid b/manifest.uuid index da1580bc21..7be2068bc8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e07b48934e9a972dcf62e3538b3b21ffa044c553feba0441675ac0bbe13bcb2 \ No newline at end of file +104a2beb57037f9353ffa77096aae0eb64e4682e667f31623bfd3d064dd8d881 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 330e057a00..093736f39f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3645,7 +3645,16 @@ expr_code_doover: iSrc = sqlite3TableColumnToStorage(pTab, iCol) - pParse->iSelfTab; #ifndef SQLITE_OMIT_GENERATED_COLUMNS if( pCol->colFlags & COLFLAG_GENERATED ){ - sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc); + if( pCol->colFlags & COLFLAG_BUSY ){ + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", + pCol->zName); + return 0; + } + pCol->colFlags |= COLFLAG_BUSY; + if( pCol->colFlags & COLFLAG_NOTAVAIL ){ + sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc); + } + pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); return iSrc; }else #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ diff --git a/test/gencol1.test b/test/gencol1.test index a8cc8e4366..98906efdff 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -233,5 +233,15 @@ do_execsql_test gencol1-8.10 { INSERT INTO t0 VALUES (0),(99); SELECT * FROM t0; } {1 1 0 1 1 99} +do_catchsql_test gencol1-8.20 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0( + c0, + c1 AS(c0 + c2), + c2 AS(c1) CHECK(c2) + ); + UPDATE t0 SET c0 = NULL; +} {1 {generated column loop on "c2"}} + finish_test From 1e7c00e695ff7fe8ab92e34e5793636b6cf3f420 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 7 Nov 2019 14:51:24 +0000 Subject: [PATCH 132/476] Fix the xferCompatibleIndex() function so that it recognizes that a PRIMARY KEY index for a WITHOUT ROWID table is different from a UNIQUE constraint index on the primary key. Ticket [302027baf1374498] FossilOrigin-Name: 34f64f11ca481996b1ff1686bdc5e278946635b6856cd1fe2355fce8e298e0f8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 2 +- test/without_rowid1.test | 22 ++++++++++++++++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e3af4a5312..465b28edbb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Restore\sgenerated\scolumn\sloop\sdetection\slogic\sthat\swas\sincorrectly\sremoved\nfrom\sthe\sprevious\scheck-in\s[9e07b48934e9a972].\s\sThis\sfixes\sticket\n[299b50ba812d8e54] -D 2019-11-07T02:32:54.155 +C Fix\sthe\sxferCompatibleIndex()\sfunction\sso\sthat\sit\srecognizes\sthat\sa\sPRIMARY\sKEY\nindex\sfor\sa\sWITHOUT\sROWID\stable\sis\sdifferent\sfrom\sa\sUNIQUE\sconstraint\sindex\non\sthe\sprimary\skey.\s\sTicket\s[302027baf1374498] +D 2019-11-07T14:51:24.956 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -487,7 +487,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 6e40e8aaa3840255614c7f39c061ab2d0f1f46095d5f8ce63650e9c17425a3e4 +F src/insert.c 8701d80b3cecd47f0375483c1ef35dfcdc777f3c67e2d3581dd7841b980910a3 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d F src/main.c 20c6325c581123b8771ecb938f60d7e31c8152be01b4bf8e5eefbb74671ea86f @@ -1734,7 +1734,7 @@ F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1 F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 0abe18762b74714580c1d4d00a8e540e58966d3e46aae41ddb1a1d2c88c9277d +F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591dba765a3691 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9e07b48934e9a972dcf62e3538b3b21ffa044c553feba0441675ac0bbe13bcb2 -R 419dd03cd73a69d8a754bdd126fa0e44 +P 104a2beb57037f9353ffa77096aae0eb64e4682e667f31623bfd3d064dd8d881 +R c8b53b705fa0400a6763ef7952da070a U drh -Z 8725622db40a81117b469b3688d6172b +Z 1a2695a1ff301ea728b819cbcc928cab diff --git a/manifest.uuid b/manifest.uuid index 7be2068bc8..59ba873211 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -104a2beb57037f9353ffa77096aae0eb64e4682e667f31623bfd3d064dd8d881 \ No newline at end of file +34f64f11ca481996b1ff1686bdc5e278946635b6856cd1fe2355fce8e298e0f8 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index d8d369529e..73f6bdb3e2 100644 --- a/src/insert.c +++ b/src/insert.c @@ -2367,7 +2367,7 @@ static int xferCompatibleIndex(Index *pDest, Index *pSrc){ int i; assert( pDest && pSrc ); assert( pDest->pTable!=pSrc->pTable ); - if( pDest->nKeyCol!=pSrc->nKeyCol ){ + if( pDest->nKeyCol!=pSrc->nKeyCol || pDest->nColumn!=pSrc->nColumn ){ return 0; /* Different number of columns */ } if( pDest->onError!=pSrc->onError ){ diff --git a/test/without_rowid1.test b/test/without_rowid1.test index 23fae118e4..3497ca0ccc 100644 --- a/test/without_rowid1.test +++ b/test/without_rowid1.test @@ -430,5 +430,27 @@ do_execsql_test 12.1 { PRAGMA integrity_check; } {ok} +# 2019-11-07 ticket https://www.sqlite.org/src/info/302027baf1374498 +# The xferCompatibleIndex() function confuses a PRIMARY KEY index +# with a UNIQUE index. +# +do_execsql_test 13.10 { + DROP TABLE IF EXISTS t0; + DROP TABLE IF EXISTS t1; + CREATE TABLE t0( + c0, + c1 UNIQUE, + PRIMARY KEY(c1, c1) + ) WITHOUT ROWID; + INSERT INTO t0(c0,c1) VALUES('abc','xyz'); + CREATE TABLE t1( + c0, + c1 UNIQUE, + PRIMARY KEY(c1, c1) + ) WITHOUT ROWID; + INSERT INTO t1 SELECT * FROM t0; + PRAGMA integrity_check; + SELECT * FROM t0, t1; +} {ok abc xyz abc xyz} finish_test From ff1032e5c24c56a108715033dcca5e1efd507bd9 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 8 Nov 2019 20:13:44 +0000 Subject: [PATCH 133/476] When a virtual table reports orderByConsumed, that tells us nothing about whether or not the SQLITE_DISTINCTBY constraint is met. Fix for ticket [7e59041f9c4e5102]. Test cases in TH3. FossilOrigin-Name: b59f94e4da9b1653f2004b214407a50340dd476b27e6ec7e29e501a95db9c963 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 465b28edbb..ced639718b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sxferCompatibleIndex()\sfunction\sso\sthat\sit\srecognizes\sthat\sa\sPRIMARY\sKEY\nindex\sfor\sa\sWITHOUT\sROWID\stable\sis\sdifferent\sfrom\sa\sUNIQUE\sconstraint\sindex\non\sthe\sprimary\skey.\s\sTicket\s[302027baf1374498] -D 2019-11-07T14:51:24.956 +C When\sa\svirtual\stable\sreports\sorderByConsumed,\sthat\stells\sus\snothing\sabout\nwhether\sor\snot\sthe\sSQLITE_DISTINCTBY\sconstraint\sis\smet.\nFix\sfor\sticket\s[7e59041f9c4e5102].\nTest\scases\sin\sTH3. +D 2019-11-08T20:13:44.344 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -612,7 +612,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c bbd6838bd79c0a32144d482fb0b6a9d2d1a252fb3b16d5005ec30f2f80413b0d F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd -F src/where.c 6e56bef94dc1e2d4461fca49604602312dc620333572aad9511e5ca2120aff31 +F src/where.c 874845fb5d93b3bc07123df8fee805e9650bd091e3ed62988273c7e2141ab8bd F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 9b84737fd68134249a439813d27b1c61de17a01e121eb98949548d1e7f8e400a F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 104a2beb57037f9353ffa77096aae0eb64e4682e667f31623bfd3d064dd8d881 -R c8b53b705fa0400a6763ef7952da070a +P 34f64f11ca481996b1ff1686bdc5e278946635b6856cd1fe2355fce8e298e0f8 +R 31de4c083b648ffd51f71fd6244bffef U drh -Z 1a2695a1ff301ea728b819cbcc928cab +Z 28abf6e2f78150740c50123f02de8e33 diff --git a/manifest.uuid b/manifest.uuid index 59ba873211..f175b311ea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -34f64f11ca481996b1ff1686bdc5e278946635b6856cd1fe2355fce8e298e0f8 \ No newline at end of file +b59f94e4da9b1653f2004b214407a50340dd476b27e6ec7e29e501a95db9c963 \ No newline at end of file diff --git a/src/where.c b/src/where.c index ffae7a6f4f..2a32d54edd 100644 --- a/src/where.c +++ b/src/where.c @@ -3696,7 +3696,9 @@ static i8 wherePathSatisfiesOrderBy( pLoop = pLast; } if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ - if( pLoop->u.vtab.isOrdered ) obSat = obDone; + if( pLoop->u.vtab.isOrdered && (wctrlFlags & WHERE_DISTINCTBY)==0 ){ + obSat = obDone; + } break; }else if( wctrlFlags & WHERE_DISTINCTBY ){ pLoop->u.btree.nDistinctCol = 0; From 46a31cdf6b7c1197e01627f91af601479cd99940 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 9 Nov 2019 14:38:58 +0000 Subject: [PATCH 134/476] Make sure the WITH stack in the Parse object is disabled following an error. FossilOrigin-Name: de6e6d6846d6a41c4821454dfdc042096234df753be08c5567b79fe535d9b6ea --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 3 +++ src/util.c | 1 + test/with3.test | 10 +++++++++- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index ced639718b..a37efd0e09 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sa\svirtual\stable\sreports\sorderByConsumed,\sthat\stells\sus\snothing\sabout\nwhether\sor\snot\sthe\sSQLITE_DISTINCTBY\sconstraint\sis\smet.\nFix\sfor\sticket\s[7e59041f9c4e5102].\nTest\scases\sin\sTH3. -D 2019-11-08T20:13:44.344 +C Make\ssure\sthe\sWITH\sstack\sin\sthe\sParse\sobject\sis\sdisabled\sfollowing\san\serror. +D 2019-11-09T14:38:58.070 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -526,7 +526,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c cf2391c93d425455388389e7a47674b9da107d2ed69ebf49979044d70dbeb045 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 3395765ea3749341deb4c25e8339c3d626a8ac641a52c216e9632e48e620ba68 +F src/select.c 887c3096566e22d28c6cc1a09ac0f6eb9636e5f38eb55e296e39e282c56fda65 F src/shell.c.in c06961f202f3cc50b819744b7331d3caea3d79d958402f4900b0668248557468 F src/sqlite.h.in 5ba20664cede7f4e6861541fad1f17bac50f7bf576b40a8784c54f9126a9edd4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -596,7 +596,7 @@ F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e F src/update.c 07a50767f7d3e26d4c887c31cd66448d700d3215caea6023acf7269336097df7 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 -F src/util.c 10d910e04a4f3842042485e0df01a484f57f912c10b60b3a09ccddd5019bd138 +F src/util.c 66b22af7b359ce6493c34fef28c87d5c2d1765f212d6e4cd5e08d99ac30b89bb F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c b67d6af853e03c3dd6d1116351567f62d8a2c10d3bd6db5f7f366e75d11c6653 F src/vdbe.h fdbc0a11e5768a702b46ce63286f60e22e71351a29bd98b3666405e1fccc7802 @@ -1731,7 +1731,7 @@ F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3c F test/windowfault.test a90b397837209f15e54afa62e8be39b2759a0101fae04e05a08bcc50e243a452 F test/with1.test d32792084dcb5f6c047d77bb8a032822ef9fe050ade07d0aeffa37753a05e3c9 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab -F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45 +F test/with3.test 7de8dff2891aca0f9453463e4a2d6eb995baf137827d5596116fee53e22a4e29 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 34f64f11ca481996b1ff1686bdc5e278946635b6856cd1fe2355fce8e298e0f8 -R 31de4c083b648ffd51f71fd6244bffef +P b59f94e4da9b1653f2004b214407a50340dd476b27e6ec7e29e501a95db9c963 +R 895ed8b37daa70e59944b1a121e85596 U drh -Z 28abf6e2f78150740c50123f02de8e33 +Z bce644ebcb3df09f16a3af5cdce2d123 diff --git a/manifest.uuid b/manifest.uuid index f175b311ea..e864040912 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b59f94e4da9b1653f2004b214407a50340dd476b27e6ec7e29e501a95db9c963 \ No newline at end of file +de6e6d6846d6a41c4821454dfdc042096234df753be08c5567b79fe535d9b6ea \ No newline at end of file diff --git a/src/select.c b/src/select.c index b21effc0a0..269469485f 100644 --- a/src/select.c +++ b/src/select.c @@ -4668,6 +4668,9 @@ static int withExpand( With *pWith; /* WITH clause that pCte belongs to */ assert( pFrom->pTab==0 ); + if( pParse->nErr ){ + return SQLITE_ERROR; + } pCte = searchWith(pParse->pWith, pFrom, &pWith); if( pCte ){ diff --git a/src/util.c b/src/util.c index d28950d266..2c14911b6f 100644 --- a/src/util.c +++ b/src/util.c @@ -192,6 +192,7 @@ void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ sqlite3DbFree(db, pParse->zErrMsg); pParse->zErrMsg = zMsg; pParse->rc = SQLITE_ERROR; + pParse->pWith = 0; } } diff --git a/test/with3.test b/test/with3.test index 360d37f9b9..eebb9d6546 100644 --- a/test/with3.test +++ b/test/with3.test @@ -30,7 +30,15 @@ do_catchsql_test 1.0 { SELECT 5 FROM t0 UNION SELECT 8 FROM m ) SELECT * FROM i; -} {1 {no such table: m}} +} {1 {no such table: t0}} + +# 2019-11-09 dbfuzzcheck find +do_catchsql_test 1.1 { + CREATE VIEW v1(x,y) AS + WITH t1(a,b) AS (VALUES(1,2)) + SELECT * FROM nosuchtable JOIN t1; + SELECT * FROM v1; +} {1 {no such table: main.nosuchtable}} # Additional test cases that came out of the work to # fix for Kostya's problem. From 675f73bcabad39a517c8e6e370d10f20ce41f172 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 9 Nov 2019 14:44:18 +0000 Subject: [PATCH 135/476] New dbsqlfuzz test cases added. FossilOrigin-Name: 18c3a17dc8c07b12427e372ff86668d5bcb6b34d653c46c48561ed576acefa5b --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1371136 -> 1381376 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index a37efd0e09..644ab6918f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sthe\sWITH\sstack\sin\sthe\sParse\sobject\sis\sdisabled\sfollowing\san\serror. -D 2019-11-09T14:38:58.070 +C New\sdbsqlfuzz\stest\scases\sadded. +D 2019-11-09T14:44:18.505 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1016,7 +1016,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 7a8baf778cbaf9c9744c9dd9b7aa66c4365d96c0ef8e1900e99a48a48f19778c +F test/fuzzdata8.db cf39ca20612c9ae25bfd1219242f554d4cbfbfdb2bdece0a3cb99915f68f7c28 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b59f94e4da9b1653f2004b214407a50340dd476b27e6ec7e29e501a95db9c963 -R 895ed8b37daa70e59944b1a121e85596 +P de6e6d6846d6a41c4821454dfdc042096234df753be08c5567b79fe535d9b6ea +R 76ecc95c7b41f7e7ebee60570e288157 U drh -Z bce644ebcb3df09f16a3af5cdce2d123 +Z d1f94f6d48aa33cd22fa2fe07862f6e9 diff --git a/manifest.uuid b/manifest.uuid index e864040912..cf229faf92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de6e6d6846d6a41c4821454dfdc042096234df753be08c5567b79fe535d9b6ea \ No newline at end of file +18c3a17dc8c07b12427e372ff86668d5bcb6b34d653c46c48561ed576acefa5b \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index e024e6d627e997f393089741f9a34ccc5fded452..35f386ec1f4072d6e94ef39fb2ba2f4694033adb 100644 GIT binary patch delta 27024 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 delta 23784 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 Bs6qe$ From 12bf7127073c26905ef40ae2cf972ffe95d01b6b Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 9 Nov 2019 15:31:34 +0000 Subject: [PATCH 136/476] Change the COLFLAG_NOTAVAIL bitmask so that it fits in the single-byte Walker.eCode field. FossilOrigin-Name: 53847f5c28bdecfbc7b08685d4dcd0565526f6191491b4827c3c966a4b8d4a85 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 644ab6918f..e96c0a1059 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sdbsqlfuzz\stest\scases\sadded. -D 2019-11-09T14:44:18.505 +C Change\sthe\sCOLFLAG_NOTAVAIL\sbitmask\sso\sthat\sit\sfits\sin\sthe\ssingle-byte\nWalker.eCode\sfield. +D 2019-11-09T15:31:34.029 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -531,7 +531,7 @@ F src/shell.c.in c06961f202f3cc50b819744b7331d3caea3d79d958402f4900b066824855746 F src/sqlite.h.in 5ba20664cede7f4e6861541fad1f17bac50f7bf576b40a8784c54f9126a9edd4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h a9afee1875df1784bf2fb5d02aece62a6a93dfd082b43bb4d5d2b5295a0042ae +F src/sqliteInt.h 4edb543eea01329566c4050b238757b7ab70dc934ec4b26119aa20931eacc486 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P de6e6d6846d6a41c4821454dfdc042096234df753be08c5567b79fe535d9b6ea -R 76ecc95c7b41f7e7ebee60570e288157 +P 18c3a17dc8c07b12427e372ff86668d5bcb6b34d653c46c48561ed576acefa5b +R c9b53d63533ff0e226c2576b2a9fe6e8 U drh -Z d1f94f6d48aa33cd22fa2fe07862f6e9 +Z 10a116f8fda26704cbc95112c3e19d89 diff --git a/manifest.uuid b/manifest.uuid index cf229faf92..9d6fd7c182 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -18c3a17dc8c07b12427e372ff86668d5bcb6b34d653c46c48561ed576acefa5b \ No newline at end of file +53847f5c28bdecfbc7b08685d4dcd0565526f6191491b4827c3c966a4b8d4a85 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b12391a3ed..bd47e2053c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1853,8 +1853,8 @@ struct Column { #define COLFLAG_SORTERREF 0x0010 /* Use sorter-refs with this column */ #define COLFLAG_VIRTUAL 0x0020 /* GENERATED ALWAYS AS ... VIRTUAL */ #define COLFLAG_STORED 0x0040 /* GENERATED ALWAYS AS ... STORED */ -#define COLFLAG_BUSY 0x0080 /* Blocks recursion on GENERATED columns */ -#define COLFLAG_NOTAVAIL 0x0100 /* STORED column not yet calculated */ +#define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */ +#define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */ #define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ #define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ From 9576802dbae4501cbec42947ce01286376d2fc10 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 10 Nov 2019 10:08:03 +0000 Subject: [PATCH 137/476] Remove an incorrect ALWAYS() macro. FossilOrigin-Name: f7a74f89dbd58b47bbcb58ea2af71fbe1eb5ec2dbe36d90685c39cb28ecf5250 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 5 +---- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index e96c0a1059..b317ba65a7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sCOLFLAG_NOTAVAIL\sbitmask\sso\sthat\sit\sfits\sin\sthe\ssingle-byte\nWalker.eCode\sfield. -D 2019-11-09T15:31:34.029 +C Remove\san\sincorrect\sALWAYS()\smacro. +D 2019-11-10T10:08:03.079 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c c371a9f3517a4dd6a0b56ebab9588408eddf1eac0277b67b09e030bff99ee1fa -F src/expr.c 254238a94328ab88b473dcce4b656afd488cb03fced627ad90fb4676c5fe417f +F src/expr.c a138de8ae79628a73da2597617dbeafb0f083172be81d93ffa1cafa45161ee8c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 18c3a17dc8c07b12427e372ff86668d5bcb6b34d653c46c48561ed576acefa5b -R c9b53d63533ff0e226c2576b2a9fe6e8 +P 53847f5c28bdecfbc7b08685d4dcd0565526f6191491b4827c3c966a4b8d4a85 +R 32ff259c4c31eae195be4b193547ceca U drh -Z 10a116f8fda26704cbc95112c3e19d89 +Z d4f922e0aea15d13aa4d8771cf77d1fd diff --git a/manifest.uuid b/manifest.uuid index 9d6fd7c182..589efc1e31 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -53847f5c28bdecfbc7b08685d4dcd0565526f6191491b4827c3c966a4b8d4a85 \ No newline at end of file +f7a74f89dbd58b47bbcb58ea2af71fbe1eb5ec2dbe36d90685c39cb28ecf5250 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 093736f39f..45c053a8c3 100644 --- a/src/expr.c +++ b/src/expr.c @@ -190,15 +190,12 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ Expr *pNext = p->pRight; /* The Expr.x union is never used at the same time as Expr.pRight */ assert( p->x.pList==0 || p->pRight==0 ); - /* p->flags holds EP_Collate and p->pLeft->flags does not. And - ** p->x.pSelect cannot. So if p->x.pLeft exists, it must hold at - ** least one EP_Collate. Thus the following two ALWAYS. */ if( p->x.pList!=0 && !db->mallocFailed && ALWAYS(!ExprHasProperty(p, EP_xIsSelect)) ){ int i; - for(i=0; ALWAYS(ix.pList->nExpr); i++){ + for(i=0; ix.pList->nExpr; i++){ if( ExprHasProperty(p->x.pList->a[i].pExpr, EP_Collate) ){ pNext = p->x.pList->a[i].pExpr; break; From 48eb03bd0e3c36565b639306f21d05b52d8f6c6c Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 10 Nov 2019 11:09:06 +0000 Subject: [PATCH 138/476] Proper surrogate pair decoding added to JSON functions. See the mailing list bug report and [https://bugs.python.org/issue38749]. More test cases needed here, but it seems to work so far. FossilOrigin-Name: 51027f08c0478f1bf9d7545d9e268c772c0a5cd5dda4b03d78f16c7d94f2f50d --- ext/misc/json1.c | 64 ++++++++++++++++++++++++++++++++++++++--------- manifest | 14 +++++------ manifest.uuid | 2 +- test/json101.test | 15 +++++++++++ 4 files changed, 75 insertions(+), 20 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 2827d72212..82bffe874a 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -522,6 +522,37 @@ static void jsonReturnJson( sqlite3_result_subtype(pCtx, JSON_SUBTYPE); } +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +static u8 jsonHexToInt(int h){ + assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') ); +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); +#else + h += 9*(1&(h>>6)); +#endif + return (u8)(h & 0xf); +} + +/* +** Convert a 4-byte hex string into an integer +*/ +static u32 jsonHexToInt4(const char *z){ + u32 v; + assert( safe_isxdigit(z[0]) ); + assert( safe_isxdigit(z[1]) ); + assert( safe_isxdigit(z[2]) ); + assert( safe_isxdigit(z[3]) ); + v = (jsonHexToInt(z[0])<<12) + + (jsonHexToInt(z[1])<<8) + + (jsonHexToInt(z[2])<<4) + + jsonHexToInt(z[3]); + return v; +} + /* ** Make the JsonNode the return value of the function. */ @@ -615,15 +646,8 @@ static void jsonReturn( }else{ c = z[++i]; if( c=='u' ){ - u32 v = 0, k; - for(k=0; k<4; i++, k++){ - assert( i>6)); zOut[j++] = 0x80 | (v&0x3f); }else{ - zOut[j++] = (char)(0xe0 | (v>>12)); - zOut[j++] = 0x80 | ((v>>6)&0x3f); - zOut[j++] = 0x80 | (v&0x3f); + u32 vlo; + if( (v&0xfc00)==0xd800 + && i>18); + zOut[j++] = 0x80 | ((v>>12)&0x3f); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + }else{ + zOut[j++] = 0xe0 | (v>>12); + zOut[j++] = 0x80 | ((v>>6)&0x3f); + zOut[j++] = 0x80 | (v&0x3f); + } } }else{ if( c=='b' ){ diff --git a/manifest b/manifest index b317ba65a7..809d7cd248 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sincorrect\sALWAYS()\smacro. -D 2019-11-10T10:08:03.079 +C Proper\ssurrogate\spair\sdecoding\sadded\sto\sJSON\sfunctions.\s\sSee\sthe\smailing\slist\nbug\sreport\sand\s[https://bugs.python.org/issue38749].\s\sMore\stest\scases\nneeded\shere,\sbut\sit\sseems\sto\swork\sso\sfar. +D 2019-11-10T11:09:06.218 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -295,7 +295,7 @@ F ext/misc/fileio.c 288e7230e0fe464d71b0694e2d8bdd3a353118ac2e31da3964b95f460f09 F ext/misc/fossildelta.c 7708651072eb5620ab21bbfb518d184f27b2c29c0131b09b9a2d8852a8016430 F ext/misc/fuzzer.c c4e27daf41433a64cad5265cd27dbcb891147e9994d0422200ce81ce9a54b625 F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c 66ccdfa63283adb2c015019b431eeee1f5af40a78d9aad10afd22c2c6db0e3b0 +F ext/misc/json1.c b4a8074e5a126379dd3af81b8595118c9c472b06f3fd508bd2ea579a75e3a1b1 F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 @@ -1095,7 +1095,7 @@ F test/journal3.test 939a3578396dffa0cdaa9b2685088c5a1a644db90d61aca08bd7e19d339 F test/jrnlmode.test 9b5bc01dac22223cb60ec2d5f97acf568d73820794386de5634dcadbea9e1946 F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test 8f8977b00ba02f9a26c1d1f52f29f540f6d5eb162cbd5eb78bb805366d4ab26d +F test/json101.test bb71538005f2d9e18620bdd3b76839a93ca0be61903eb8d751a64e78cf99b8fb F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b F test/json104.test 317f4ec4b2d87afbba4d2460cf5be297aea76f2285eb618d276dbcd40a50950f @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 53847f5c28bdecfbc7b08685d4dcd0565526f6191491b4827c3c966a4b8d4a85 -R 32ff259c4c31eae195be4b193547ceca +P f7a74f89dbd58b47bbcb58ea2af71fbe1eb5ec2dbe36d90685c39cb28ecf5250 +R 6fb2b1fad0ae8e685de462fe3c846bed U drh -Z d4f922e0aea15d13aa4d8771cf77d1fd +Z 7d3a83b9ad359923df321c8bbbecf807 diff --git a/manifest.uuid b/manifest.uuid index 589efc1e31..181053f466 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f7a74f89dbd58b47bbcb58ea2af71fbe1eb5ec2dbe36d90685c39cb28ecf5250 \ No newline at end of file +51027f08c0478f1bf9d7545d9e268c772c0a5cd5dda4b03d78f16c7d94f2f50d \ No newline at end of file diff --git a/test/json101.test b/test/json101.test index 534478df93..0d59f2e83d 100644 --- a/test/json101.test +++ b/test/json101.test @@ -832,4 +832,19 @@ do_execsql_test json-15.130 { SELECT xyz.* FROM (JSON_EACH('{"a":1, "b":2}')) AS xyz; } {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} +# 2019-11-10 +# Mailing list bug report on the handling of surrogate pairs +# in JSON. +# +do_execsql_test json-16.10 { + SELECT length(json_extract('"abc\uD834\uDD1Exyz"','$')); +} {7} +do_execsql_test json-16.20 { + SELECT length(json_extract('"\uD834\uDD1E"','$')); +} {1} +do_execsql_test json-16.30 { + SELECT unicode(json_extract('"\uD834\uDD1E"','$')); +} {119070} + + finish_test From a3b75e982a2299d37b8bccab234b866f13420021 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 11 Nov 2019 15:13:11 +0000 Subject: [PATCH 139/476] Remove an asm() block from build tool mksourceid.c, as it causes build failures on some systems and performance is not important at build-time. FossilOrigin-Name: 8e100e6c35c30e0d7e4014b9435f81f9f61ddab2386dfe9a4218d8190a6da3be --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/mksourceid.c | 18 ------------------ 3 files changed, 8 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index 809d7cd248..a2b2514d5c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Proper\ssurrogate\spair\sdecoding\sadded\sto\sJSON\sfunctions.\s\sSee\sthe\smailing\slist\nbug\sreport\sand\s[https://bugs.python.org/issue38749].\s\sMore\stest\scases\nneeded\shere,\sbut\sit\sseems\sto\swork\sso\sfar. -D 2019-11-10T11:09:06.218 +C Remove\san\sasm()\sblock\sfrom\sbuild\stool\smksourceid.c,\sas\sit\scauses\sbuild\sfailures\son\ssome\ssystems\sand\sperformance\sis\snot\simportant\sat\sbuild-time. +D 2019-11-11T15:13:11.385 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1784,7 +1784,7 @@ F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe9993 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa F tool/mkpragmatab.tcl faf48e2962d820ffe4d793f5076dd64aa5179665e4e481188c0ba7f48ace3bbb F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 -F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b +F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f F tool/mksqlite3c.tcl 5fed3d75069d8f66f202d3b5200b0cea4aa7108481acd06732a06fdd42eb83a2 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f7a74f89dbd58b47bbcb58ea2af71fbe1eb5ec2dbe36d90685c39cb28ecf5250 -R 6fb2b1fad0ae8e685de462fe3c846bed -U drh -Z 7d3a83b9ad359923df321c8bbbecf807 +P 51027f08c0478f1bf9d7545d9e268c772c0a5cd5dda4b03d78f16c7d94f2f50d +R eab1ed7a93fa2cd9fa8dfa539b30b758 +U dan +Z 9def5e764cd81c68b410948184cd40be diff --git a/manifest.uuid b/manifest.uuid index 181053f466..1e36b1ad4b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -51027f08c0478f1bf9d7545d9e268c772c0a5cd5dda4b03d78f16c7d94f2f50d \ No newline at end of file +8e100e6c35c30e0d7e4014b9435f81f9f61ddab2386dfe9a4218d8190a6da3be \ No newline at end of file diff --git a/tool/mksourceid.c b/tool/mksourceid.c index 282f5c4414..dd153997df 100644 --- a/tool/mksourceid.c +++ b/tool/mksourceid.c @@ -540,27 +540,9 @@ struct SHA1Context { * * blk0le() for little-endian and blk0be() for big-endian. */ -#if __GNUC__ && (defined(__i386__) || defined(__x86_64__)) -/* - * GCC by itself only generates left rotates. Use right rotates if - * possible to be kinder to dinky implementations with iterative rotate - * instructions. - */ -#define SHA_ROT(op, x, k) \ - ({ unsigned int y; asm(op " %1,%0" : "=r" (y) : "I" (k), "0" (x)); y; }) -#define rol(x,k) SHA_ROT("roll", x, k) -#define ror(x,k) SHA_ROT("rorl", x, k) - -#else -/* Generic C equivalent */ #define SHA_ROT(x,l,r) ((x) << (l) | (x) >> (r)) #define rol(x,k) SHA_ROT(x,k,32-(k)) #define ror(x,k) SHA_ROT(x,32-(k),k) -#endif - - - - #define blk0le(i) (block[i] = (ror(block[i],8)&0xFF00FF00) \ |(rol(block[i],8)&0x00FF00FF)) From 4c8056079ffdafae82b7f42fe4917af2f583cf51 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Nov 2019 03:45:23 +0000 Subject: [PATCH 140/476] Remove a harmless unused variable. FossilOrigin-Name: 28091a48aa6994f8d7c142b5851bcd6b4e9a93a7bbef6c927a6182d24f3245b4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbemem.c | 4 ---- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index a2b2514d5c..aea5a40486 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sasm()\sblock\sfrom\sbuild\stool\smksourceid.c,\sas\sit\scauses\sbuild\sfailures\son\ssome\ssystems\sand\sperformance\sis\snot\simportant\sat\sbuild-time. -D 2019-11-11T15:13:11.385 +C Remove\sa\sharmless\sunused\svariable. +D 2019-11-12T03:45:23.554 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -604,7 +604,7 @@ F src/vdbeInt.h bd589b8b7273286858950717e0e1ec5c88b18af45079a3366dc1371865cea704 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 75fa4792b6bc327751018ecd1516c189184d7224b8f3dfeda20c09112ef31a68 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c d8e10d1773806105e62094c4ede0a4684f46caaf07667a45e6d461e94306b530 +F src/vdbemem.c a17144a7a0d025de3e8433af1edaada7eea76dd157f73bab05c50b8f33ab777b F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c 108f79166d4a232a8bfb9d46e2fbec191f83a87fe97f7b93fc4de976c3fa3434 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 51027f08c0478f1bf9d7545d9e268c772c0a5cd5dda4b03d78f16c7d94f2f50d -R eab1ed7a93fa2cd9fa8dfa539b30b758 -U dan -Z 9def5e764cd81c68b410948184cd40be +P 8e100e6c35c30e0d7e4014b9435f81f9f61ddab2386dfe9a4218d8190a6da3be +R 025998a1c2a58ed56e4d9b964b304926 +U drh +Z 3ed8d6a5cf92887ef89b728e90a08c3f diff --git a/manifest.uuid b/manifest.uuid index 1e36b1ad4b..b13eed1597 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8e100e6c35c30e0d7e4014b9435f81f9f61ddab2386dfe9a4218d8190a6da3be \ No newline at end of file +28091a48aa6994f8d7c142b5851bcd6b4e9a93a7bbef6c927a6182d24f3245b4 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 820789fb8c..1137011ba6 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -460,15 +460,11 @@ int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ #ifndef SQLITE_OMIT_WINDOWFUNC int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc){ sqlite3_context ctx; - Mem t; assert( pFunc!=0 ); assert( pFunc->xValue!=0 ); assert( (pAccum->flags & MEM_Null)!=0 || pFunc==pAccum->u.pDef ); assert( pAccum->db==0 || sqlite3_mutex_held(pAccum->db->mutex) ); memset(&ctx, 0, sizeof(ctx)); - memset(&t, 0, sizeof(t)); - t.flags = MEM_Null; - t.db = pAccum->db; sqlite3VdbeMemSetNull(pOut); ctx.pOut = pOut; ctx.pMem = pAccum; From 746461f1b81fc952a2793f5f0b19099dc06e9510 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Nov 2019 14:43:47 +0000 Subject: [PATCH 141/476] Ensure that the main filename and the journal filenames in the pager object are all correctly double-zero terminated. FossilOrigin-Name: df51ae19c1aa4c26f2dcd427eddc1c9cc24b698e1ab0a948b198a57432e25e1e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 19 +++++++++++++++++++ src/pager.c | 31 ++++++++++++++++++++----------- src/sqliteInt.h | 3 +++ 5 files changed, 51 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index aea5a40486..57b773943d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sharmless\sunused\svariable. -D 2019-11-12T03:45:23.554 +C Ensure\sthat\sthe\smain\sfilename\sand\sthe\sjournal\sfilenames\sin\sthe\spager\nobject\sare\sall\scorrectly\sdouble-zero\sterminated. +D 2019-11-12T14:43:47.100 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -490,7 +490,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 8701d80b3cecd47f0375483c1ef35dfcdc777f3c67e2d3581dd7841b980910a3 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d -F src/main.c 20c6325c581123b8771ecb938f60d7e31c8152be01b4bf8e5eefbb74671ea86f +F src/main.c 1505735106a694a6a62f28d912de74c5fe3dfbacdd3aa78a63eb97d0754f8b49 F src/malloc.c b7640bcf8992cf2e98447da0d27e372abdc4621a6760418bad6d1470f041ada9 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -513,7 +513,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c a76a75f179cb233d54e505c3e0c84832224cfe5dfb3ee470bdcaf1ed29da57ab F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 422fd8cfa59fb9173eff36a95878904a0eeb0dcc62ba49350acc8b1e51c4dc7b +F src/pager.c 122d1e3e79424166d27a3a2768260bc613ac5acf99ea523f6127292636a589ed F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 17c1ae265e1b92cb1f3f1661b020e3eb31f2d8b9588322d2b6f2b22f25b674c9 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 @@ -531,7 +531,7 @@ F src/shell.c.in c06961f202f3cc50b819744b7331d3caea3d79d958402f4900b066824855746 F src/sqlite.h.in 5ba20664cede7f4e6861541fad1f17bac50f7bf576b40a8784c54f9126a9edd4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 4edb543eea01329566c4050b238757b7ab70dc934ec4b26119aa20931eacc486 +F src/sqliteInt.h 7015c75411f4df4cc5f694ce68feab6ec32a42189517aacc692f4757d54d2008 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8e100e6c35c30e0d7e4014b9435f81f9f61ddab2386dfe9a4218d8190a6da3be -R 025998a1c2a58ed56e4d9b964b304926 +P 28091a48aa6994f8d7c142b5851bcd6b4e9a93a7bbef6c927a6182d24f3245b4 +R 0451857d71a08492adf8df03311a6e2f U drh -Z 3ed8d6a5cf92887ef89b728e90a08c3f +Z 43dce68710a14946b20ee1369e8095d5 diff --git a/manifest.uuid b/manifest.uuid index b13eed1597..1ebd6a545f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28091a48aa6994f8d7c142b5851bcd6b4e9a93a7bbef6c927a6182d24f3245b4 \ No newline at end of file +df51ae19c1aa4c26f2dcd427eddc1c9cc24b698e1ab0a948b198a57432e25e1e \ No newline at end of file diff --git a/src/main.c b/src/main.c index 1172188821..ca5289986e 100644 --- a/src/main.c +++ b/src/main.c @@ -4187,6 +4187,25 @@ int sqlite3_test_control(int op, ...){ return rc; } +#ifdef SQLITE_DEBUG +/* +** This routine appears inside assert() statements only. +** +** Return the number of URI parameters that follow the filename. +*/ +int sqlite3UriCount(const char *z){ + int n = 0; + if( z==0 ) return 0; + z += strlen(z)+1; + while( z[0] ){ + z += strlen(z)+1; + z += strlen(z)+1; + n++; + } + return n; +} +#endif /* SQLITE_DEBUG */ + /* ** This is a utility routine, useful to VFS implementations, that checks ** to see if a database file was a URI that contained a specific query diff --git a/src/pager.c b/src/pager.c index 24c7a2d569..8e1fff7b1b 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4760,7 +4760,10 @@ int sqlite3PagerOpen( int pcacheSize = sqlite3PcacheSize(); /* Bytes to allocate for PCache */ u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */ const char *zUri = 0; /* URI args to copy */ - int nUri = 0; /* Number of bytes of URI args at *zUri */ + int nUriByte = 1; /* Number of bytes of URI args at *zUri */ +#ifdef SQLITE_DEBUG + int nUri = 0; /* Number of URI parameters */ +#endif /* Figure out how much space is required for each journal file-handle ** (there are two of them, the main journal and the sub-journal). */ @@ -4797,11 +4800,14 @@ int sqlite3PagerOpen( nPathname = sqlite3Strlen30(zPathname); z = zUri = &zFilename[sqlite3Strlen30(zFilename)+1]; while( *z ){ - z += sqlite3Strlen30(z)+1; - z += sqlite3Strlen30(z)+1; + z += strlen(z)+1; + z += strlen(z)+1; +#ifdef SQLITE_DEBUG + nUri++; +#endif } - nUri = (int)(&z[1] - zUri); - assert( nUri>=0 ); + nUriByte = (int)(&z[2] - zUri); + assert( nUriByte>=1 ); if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ /* This branch is taken when the journal path required by ** the database being opened will be more than pVfs->mxPathname @@ -4834,7 +4840,7 @@ int sqlite3PagerOpen( ROUND8(pcacheSize) + /* PCache object */ ROUND8(pVfs->szOsFile) + /* The main db file */ journalFileSize * 2 + /* The two journal files */ - nPathname + 1 + nUri + /* zFilename */ + nPathname + 1 + nUriByte + /* zFilename */ nPathname + 8 + 2 /* zJournal */ #ifndef SQLITE_OMIT_WAL + nPathname + 4 + 2 /* zWal */ @@ -4856,18 +4862,21 @@ int sqlite3PagerOpen( /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */ if( zPathname ){ assert( nPathname>0 ); - pPager->zJournal = (char*)(pPtr += nPathname + 1 + nUri); memcpy(pPager->zFilename, zPathname, nPathname); - if( nUri ) memcpy(&pPager->zFilename[nPathname+1], zUri, nUri); + if( nUri ) memcpy(&pPager->zFilename[nPathname+1], zUri, nUriByte); + pPager->zJournal = (char*)(pPtr += nPathname + 1 + nUriByte); memcpy(pPager->zJournal, zPathname, nPathname); - memcpy(&pPager->zJournal[nPathname], "-journal\000", 8+2); + memcpy(&pPager->zJournal[nPathname], "-journal", 8); sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal); #ifndef SQLITE_OMIT_WAL - pPager->zWal = &pPager->zJournal[nPathname+8+1]; + pPager->zWal = (char*)(pPtr += nPathname + 8 + 2); memcpy(pPager->zWal, zPathname, nPathname); - memcpy(&pPager->zWal[nPathname], "-wal\000", 4+1); + memcpy(&pPager->zWal[nPathname], "-wal", 4); sqlite3FileSuffix3(pPager->zFilename, pPager->zWal); + assert( sqlite3UriCount(pPager->zWal)==0 ); #endif + assert( sqlite3UriCount(pPager->zFilename)==nUri ); + assert( sqlite3UriCount(pPager->zJournal)==0 ); sqlite3DbFree(0, zPathname); } pPager->pVfs = pVfs; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index bd47e2053c..0862c1153b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3992,6 +3992,9 @@ void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); void sqlite3AddCollateType(Parse*, Token*); void sqlite3AddGenerated(Parse*,Expr*,Token*); void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); +#ifdef SQLITE_DEBUG + int sqlite3UriCount(const char*); +#endif int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); #ifdef SQLITE_HAS_CODEC From d2c40e931083dba2367a46ba4b6f2e460d62cf07 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 12 Nov 2019 16:21:27 +0000 Subject: [PATCH 142/476] For for the previous check-in: Always enable the nUri variable, even when debugging is turned off. FossilOrigin-Name: f84a15394c369cbdb6fba87c603a609722cf1f499626c7f20699060273ab5081 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 4 ---- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 57b773943d..2291a5ff71 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\smain\sfilename\sand\sthe\sjournal\sfilenames\sin\sthe\spager\nobject\sare\sall\scorrectly\sdouble-zero\sterminated. -D 2019-11-12T14:43:47.100 +C For\sfor\sthe\sprevious\scheck-in:\s\sAlways\senable\sthe\snUri\svariable,\seven\nwhen\sdebugging\sis\sturned\soff. +D 2019-11-12T16:21:27.628 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -513,7 +513,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c a76a75f179cb233d54e505c3e0c84832224cfe5dfb3ee470bdcaf1ed29da57ab F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 122d1e3e79424166d27a3a2768260bc613ac5acf99ea523f6127292636a589ed +F src/pager.c f975b274d552dbb397bcf2907f9a6d9b97edb68ea1f7c7ec04d6d13087bbf71f F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 F src/parse.y 17c1ae265e1b92cb1f3f1661b020e3eb31f2d8b9588322d2b6f2b22f25b674c9 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 28091a48aa6994f8d7c142b5851bcd6b4e9a93a7bbef6c927a6182d24f3245b4 -R 0451857d71a08492adf8df03311a6e2f +P df51ae19c1aa4c26f2dcd427eddc1c9cc24b698e1ab0a948b198a57432e25e1e +R ecb7ca7248fc1fb124610fe41fc163c3 U drh -Z 43dce68710a14946b20ee1369e8095d5 +Z 9a1bd82043aef075ed04780f43f196e5 diff --git a/manifest.uuid b/manifest.uuid index 1ebd6a545f..f287f557e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -df51ae19c1aa4c26f2dcd427eddc1c9cc24b698e1ab0a948b198a57432e25e1e \ No newline at end of file +f84a15394c369cbdb6fba87c603a609722cf1f499626c7f20699060273ab5081 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 8e1fff7b1b..9ec8f58df9 100644 --- a/src/pager.c +++ b/src/pager.c @@ -4761,9 +4761,7 @@ int sqlite3PagerOpen( u32 szPageDflt = SQLITE_DEFAULT_PAGE_SIZE; /* Default page size */ const char *zUri = 0; /* URI args to copy */ int nUriByte = 1; /* Number of bytes of URI args at *zUri */ -#ifdef SQLITE_DEBUG int nUri = 0; /* Number of URI parameters */ -#endif /* Figure out how much space is required for each journal file-handle ** (there are two of them, the main journal and the sub-journal). */ @@ -4802,9 +4800,7 @@ int sqlite3PagerOpen( while( *z ){ z += strlen(z)+1; z += strlen(z)+1; -#ifdef SQLITE_DEBUG nUri++; -#endif } nUriByte = (int)(&z[2] - zUri); assert( nUriByte>=1 ); From dbf1c4ba8ab563a3e54db8fc5e21058c1f427b89 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 13 Nov 2019 16:50:06 +0000 Subject: [PATCH 143/476] Fix the sqlite3TreeView() output to consistently use a colon and not a comma after the table number in the AST dumps. FossilOrigin-Name: fa2416f623d83fe93253137302a74fcd6cdd041da337a0756df344d7d09a19f5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2291a5ff71..980cb766c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sfor\sthe\sprevious\scheck-in:\s\sAlways\senable\sthe\snUri\svariable,\seven\nwhen\sdebugging\sis\sturned\soff. -D 2019-11-12T16:21:27.628 +C Fix\sthe\ssqlite3TreeView()\soutput\sto\sconsistently\suse\sa\scolon\sand\snot\sa\ncomma\safter\sthe\stable\snumber\sin\sthe\sAST\sdumps. +D 2019-11-13T16:50:06.637 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -591,7 +591,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d -F src/treeview.c 1de448df044dd9f011010b62966fb9b1bdde6e0a21173c686c9b2064227f6119 +F src/treeview.c 5b1ecf70a66b4216c9b93b5e79d5d5e2771f04d9669a0313b3bba82a9b195ec4 F src/trigger.c 845ccc08f60716c58aa28fe6470385c18ef8c4e1d88c93dcf449bc13d464eb2e F src/update.c 07a50767f7d3e26d4c887c31cd66448d700d3215caea6023acf7269336097df7 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P df51ae19c1aa4c26f2dcd427eddc1c9cc24b698e1ab0a948b198a57432e25e1e -R ecb7ca7248fc1fb124610fe41fc163c3 +P f84a15394c369cbdb6fba87c603a609722cf1f499626c7f20699060273ab5081 +R 3ac1026749502e7aa78a7c61f191a8fa U drh -Z 9a1bd82043aef075ed04780f43f196e5 +Z 8a5fb22e7eb772a21cf3517df8cfce7a diff --git a/manifest.uuid b/manifest.uuid index f287f557e0..52ee2a808a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f84a15394c369cbdb6fba87c603a609722cf1f499626c7f20699060273ab5081 \ No newline at end of file +fa2416f623d83fe93253137302a74fcd6cdd041da337a0756df344d7d09a19f5 \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 9d92cd603a..294c10fbf9 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -131,7 +131,7 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ StrAccum x; char zLine[100]; sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); - sqlite3_str_appendf(&x, "{%d,*}", pItem->iCursor); + sqlite3_str_appendf(&x, "{%d:*}", pItem->iCursor); if( pItem->zDatabase ){ sqlite3_str_appendf(&x, " %s.%s", pItem->zDatabase, pItem->zName); }else if( pItem->zName ){ From b88eaf1619cf1be8c8cf2a0ffb9a2767a840b27e Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 13 Nov 2019 18:50:36 +0000 Subject: [PATCH 144/476] Add header guard to the expert extension. FossilOrigin-Name: 7e3151855fd4370fb7d4fff20516c2c2d1980134620df924106e6989bc130583 --- ext/expert/sqlite3expert.h | 6 +++--- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ext/expert/sqlite3expert.h b/ext/expert/sqlite3expert.h index 39135dc274..6048137237 100644 --- a/ext/expert/sqlite3expert.h +++ b/ext/expert/sqlite3expert.h @@ -10,8 +10,8 @@ ** ************************************************************************* */ - - +#if !defined(SQLITEEXPERT_H) +#define SQLITEEXPERT_H 1 #include "sqlite3.h" typedef struct sqlite3expert sqlite3expert; @@ -165,4 +165,4 @@ const char *sqlite3_expert_report(sqlite3expert*, int iStmt, int eReport); */ void sqlite3_expert_destroy(sqlite3expert*); - +#endif /* !defined(SQLITEEXPERT_H) */ diff --git a/manifest b/manifest index 980cb766c4..e0cff0e5fa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\ssqlite3TreeView()\soutput\sto\sconsistently\suse\sa\scolon\sand\snot\sa\ncomma\safter\sthe\stable\snumber\sin\sthe\sAST\sdumps. -D 2019-11-13T16:50:06.637 +C Add\sheader\sguard\sto\sthe\sexpert\sextension. +D 2019-11-13T18:50:36.270 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -49,7 +49,7 @@ F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633ca F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 F ext/expert/expert1.test e2afc53a27610e8251e44c7f961806607a5490ff204b3db342740d558e052662 F ext/expert/sqlite3expert.c 3da865f2286433588260f41e796422c611bceaca3a0bbf9139a619cf7d062c19 -F ext/expert/sqlite3expert.h af6354f8ee5c9e025024e63fec3bd640a802afcc3099a44d804752cf0791d811 +F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f84a15394c369cbdb6fba87c603a609722cf1f499626c7f20699060273ab5081 -R 3ac1026749502e7aa78a7c61f191a8fa -U drh -Z 8a5fb22e7eb772a21cf3517df8cfce7a +P fa2416f623d83fe93253137302a74fcd6cdd041da337a0756df344d7d09a19f5 +R 71e615eaf7cbedece06ae5e725ee8ced +U mistachkin +Z 68d73206bf0b68f1bcc64ac4698faaf5 diff --git a/manifest.uuid b/manifest.uuid index 52ee2a808a..392e3a0d17 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa2416f623d83fe93253137302a74fcd6cdd041da337a0756df344d7d09a19f5 \ No newline at end of file +7e3151855fd4370fb7d4fff20516c2c2d1980134620df924106e6989bc130583 \ No newline at end of file From ba01634cd393040ade90cf5449e3642663e80699 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 14 Nov 2019 13:24:04 +0000 Subject: [PATCH 145/476] Ensure that the same subquery does not go through the window-function rewrite more than once, even when that subquery is part of a virtual table constraint that lacks the omit flag. FossilOrigin-Name: d0bc7db6b0a53edc04815622c46250d26f526f56e59f14875f4e18c75b49000d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqliteInt.h | 41 +++++++++++++++++++++-------------------- src/window.c | 3 ++- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index e0cff0e5fa..f22d04e2ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sheader\sguard\sto\sthe\sexpert\sextension. -D 2019-11-13T18:50:36.270 +C Ensure\sthat\sthe\ssame\ssubquery\sdoes\snot\sgo\sthrough\sthe\swindow-function\srewrite\nmore\sthan\sonce,\seven\swhen\sthat\ssubquery\sis\spart\sof\sa\svirtual\stable\sconstraint\nthat\slacks\sthe\somit\sflag. +D 2019-11-14T13:24:04.275 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -531,7 +531,7 @@ F src/shell.c.in c06961f202f3cc50b819744b7331d3caea3d79d958402f4900b066824855746 F src/sqlite.h.in 5ba20664cede7f4e6861541fad1f17bac50f7bf576b40a8784c54f9126a9edd4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31 -F src/sqliteInt.h 7015c75411f4df4cc5f694ce68feab6ec32a42189517aacc692f4757d54d2008 +F src/sqliteInt.h 3a1d168099ceff8565702ac302d99b377db52ce95d57ff59286d4959ff66399a F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -616,7 +616,7 @@ F src/where.c 874845fb5d93b3bc07123df8fee805e9650bd091e3ed62988273c7e2141ab8bd F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 F src/wherecode.c 9b84737fd68134249a439813d27b1c61de17a01e121eb98949548d1e7f8e400a F src/whereexpr.c 0705f608f6dbbd4e95d440528d6c760b91b6f402ba4eb8b8d964c110e2010780 -F src/window.c 064f251451c8e2a1c76b6269229d911a651e119c6a5f522b6eaebf8dc8714041 +F src/window.c ea53cef29a5c32aa37ea22e87c247cf8e999fa3b70c6268d266af84608cb77f4 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fa2416f623d83fe93253137302a74fcd6cdd041da337a0756df344d7d09a19f5 -R 71e615eaf7cbedece06ae5e725ee8ced -U mistachkin -Z 68d73206bf0b68f1bcc64ac4698faaf5 +P 7e3151855fd4370fb7d4fff20516c2c2d1980134620df924106e6989bc130583 +R c6e1b03c396590f81a466e94769e9c21 +U drh +Z 558c0de79db81d5f1a59e8d57b1accf4 diff --git a/manifest.uuid b/manifest.uuid index 392e3a0d17..8bf452d895 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7e3151855fd4370fb7d4fff20516c2c2d1980134620df924106e6989bc130583 \ No newline at end of file +d0bc7db6b0a53edc04815622c46250d26f526f56e59f14875f4e18c75b49000d \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0862c1153b..666b8a827d 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2935,26 +2935,27 @@ struct Select { ** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX ** SF_FixedLimit == WHERE_USE_LIMIT */ -#define SF_Distinct 0x00001 /* Output should be DISTINCT */ -#define SF_All 0x00002 /* Includes the ALL keyword */ -#define SF_Resolved 0x00004 /* Identifiers have been resolved */ -#define SF_Aggregate 0x00008 /* Contains agg functions or a GROUP BY */ -#define SF_HasAgg 0x00010 /* Contains aggregate functions */ -#define SF_UsesEphemeral 0x00020 /* Uses the OpenEphemeral opcode */ -#define SF_Expanded 0x00040 /* sqlite3SelectExpand() called on this */ -#define SF_HasTypeInfo 0x00080 /* FROM subqueries have Table metadata */ -#define SF_Compound 0x00100 /* Part of a compound query */ -#define SF_Values 0x00200 /* Synthesized from VALUES clause */ -#define SF_MultiValue 0x00400 /* Single VALUES term with multiple rows */ -#define SF_NestedFrom 0x00800 /* Part of a parenthesized FROM clause */ -#define SF_MinMaxAgg 0x01000 /* Aggregate containing min() or max() */ -#define SF_Recursive 0x02000 /* The recursive part of a recursive CTE */ -#define SF_FixedLimit 0x04000 /* nSelectRow set by a constant LIMIT */ -#define SF_MaybeConvert 0x08000 /* Need convertCompoundSelectToSubquery() */ -#define SF_Converted 0x10000 /* By convertCompoundSelectToSubquery() */ -#define SF_IncludeHidden 0x20000 /* Include hidden columns in output */ -#define SF_ComplexResult 0x40000 /* Result contains subquery or function */ -#define SF_WhereBegin 0x80000 /* Really a WhereBegin() call. Debug Only */ +#define SF_Distinct 0x0000001 /* Output should be DISTINCT */ +#define SF_All 0x0000002 /* Includes the ALL keyword */ +#define SF_Resolved 0x0000004 /* Identifiers have been resolved */ +#define SF_Aggregate 0x0000008 /* Contains agg functions or a GROUP BY */ +#define SF_HasAgg 0x0000010 /* Contains aggregate functions */ +#define SF_UsesEphemeral 0x0000020 /* Uses the OpenEphemeral opcode */ +#define SF_Expanded 0x0000040 /* sqlite3SelectExpand() called on this */ +#define SF_HasTypeInfo 0x0000080 /* FROM subqueries have Table metadata */ +#define SF_Compound 0x0000100 /* Part of a compound query */ +#define SF_Values 0x0000200 /* Synthesized from VALUES clause */ +#define SF_MultiValue 0x0000400 /* Single VALUES term with multiple rows */ +#define SF_NestedFrom 0x0000800 /* Part of a parenthesized FROM clause */ +#define SF_MinMaxAgg 0x0001000 /* Aggregate containing min() or max() */ +#define SF_Recursive 0x0002000 /* The recursive part of a recursive CTE */ +#define SF_FixedLimit 0x0004000 /* nSelectRow set by a constant LIMIT */ +#define SF_MaybeConvert 0x0008000 /* Need convertCompoundSelectToSubquery() */ +#define SF_Converted 0x0010000 /* By convertCompoundSelectToSubquery() */ +#define SF_IncludeHidden 0x0020000 /* Include hidden columns in output */ +#define SF_ComplexResult 0x0040000 /* Result contains subquery or function */ +#define SF_WhereBegin 0x0080000 /* Really a WhereBegin() call. Debug Only */ +#define SF_WinRewrite 0x0100000 /* Window function rewrite accomplished */ /* ** The results of a SELECT can be distributed in several ways, as defined diff --git a/src/window.c b/src/window.c index e8dfa6c3ef..fb806a506b 100644 --- a/src/window.c +++ b/src/window.c @@ -903,7 +903,7 @@ static ExprList *exprListAppendList( */ int sqlite3WindowRewrite(Parse *pParse, Select *p){ int rc = SQLITE_OK; - if( p->pWin && p->pPrior==0 ){ + if( p->pWin && p->pPrior==0 && (p->selFlags & SF_WinRewrite)==0 ){ Vdbe *v = sqlite3GetVdbe(pParse); sqlite3 *db = pParse->db; Select *pSub = 0; /* The subquery */ @@ -928,6 +928,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pGroupBy = 0; p->pHaving = 0; p->selFlags &= ~SF_Aggregate; + p->selFlags |= SF_WinRewrite; /* Create the ORDER BY clause for the sub-select. This is the concatenation ** of the window PARTITION and ORDER BY clauses. Then, if this makes it From 01d1801cab06d9ea35f07a530868cb79391a49a8 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 14 Nov 2019 13:57:15 +0000 Subject: [PATCH 146/476] New test cases added to fuzzdata8.db. FossilOrigin-Name: 5baffcda7d5a42a99fa905faa834f14b94b1e2a26b5221f15d8ae8f1f5e3236a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1381376 -> 1388544 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index f22d04e2ea..aa4b9b9b28 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\ssame\ssubquery\sdoes\snot\sgo\sthrough\sthe\swindow-function\srewrite\nmore\sthan\sonce,\seven\swhen\sthat\ssubquery\sis\spart\sof\sa\svirtual\stable\sconstraint\nthat\slacks\sthe\somit\sflag. -D 2019-11-14T13:24:04.275 +C New\stest\scases\sadded\sto\sfuzzdata8.db. +D 2019-11-14T13:57:15.453 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1016,7 +1016,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db cf39ca20612c9ae25bfd1219242f554d4cbfbfdb2bdece0a3cb99915f68f7c28 +F test/fuzzdata8.db 84471dfe9c85fc00a85bff47eb9876e4282964385587a62eb9711e4be8f4dd3f F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1849,7 +1849,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7e3151855fd4370fb7d4fff20516c2c2d1980134620df924106e6989bc130583 -R c6e1b03c396590f81a466e94769e9c21 +P d0bc7db6b0a53edc04815622c46250d26f526f56e59f14875f4e18c75b49000d +R ea129243c3758476eafb35c19dd0088b U drh -Z 558c0de79db81d5f1a59e8d57b1accf4 +Z fefdc677a3117d521ac878acd56ec4f2 diff --git a/manifest.uuid b/manifest.uuid index 8bf452d895..2bfa2e34c9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d0bc7db6b0a53edc04815622c46250d26f526f56e59f14875f4e18c75b49000d \ No newline at end of file +5baffcda7d5a42a99fa905faa834f14b94b1e2a26b5221f15d8ae8f1f5e3236a \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 35f386ec1f4072d6e94ef39fb2ba2f4694033adb..419a4ce6c855a8671ee7d6aeecca83c0ba30d181 100644 GIT binary patch delta 25561 zcmeFZcUV-{*DpT%>~rRvGjpb#K~!uE_Rb6)E7-eWj|~tdcEJ`+EKKatD2TGsR7i|9 zDp*(=8^jom6;ezy5fe>}F)GF+Cb8Ug#z@Nheedr+&+k6>{&VFy3pr)iwbx$zvp#!g zZW)kSJ|L^6zQJUYdYS(E7nR*SoNXvf-Y&CFIht}93KczQKD)q5*(vreJHqy}-Rv#4 ziRH0Z*c!HyEoINMIcz3NXXDvuHj)it{a7#7g~hQ}EP}OUjagkIb+MJNGs%{|P9z)n zI*_dCiz8Xh*N&va*OsK&*V<&_k9@HtfAz(Xyyc4~Isck3ihh0OizHd*3n%%$FO1~d zJ}=4LzEF~H`dX6A_BAK@g0Bh51-`~4=lB|tobGE#atLrCX?`^FOcNr`92r@`rPLv`H{~-@~qEJ@`%qya=T9>xzVSPT>EmA?^7fShLG4fn8cQWBsTUZ@oGO3FC~zGJ|wbxQ-RrX(h|0)CyDtzNX+g| zVp=y6le&@^)rG_`>RUFjBZNxV-zYdS$4YkG(J)pV3P)O5H$ ziMOd!O?#gHkn~1`L+L_Zw|#g-Y{cjY`XDkk%o8yxA~G_To_WJk!#q)8eiqa$MJ z!?_n8!=`r-Vfq55l~ju!vMo41FKwNsA7r55gaRK=-j zb@XQtW{rr7h>G@%@mf4#kW}Pq47U!8*6!i%uD$wpaHox%I&FH=%#?{U#xzcKckJ7% zSNwp^?y1wKj+@lP-FHyue(q<+O%8AC^}18t&8N+n)HwBTxBW>#$PqC}aHm4qHdj!C z6nEEteFrA=cX#MKU~uQoeT>h;+zI_UckJA$d!MfE_&%NJ)rsh8TBUElPLzCyr`##- zUfp|kc2Ax$aU#q`F&Mr;R~1;c-Q|FZ2SuAms<8)Byh>Lb`9MC$Fz6lOfh2{9rdJ{> z6{IN?9G4ZieMYoGf>&v=x#*-IDEnV-<`zx6hgH6|NZFS)Cs;J)&#k=G6n;FbG$7kx z+D%sxWFJ!|Kwhy>6JIzZ%;pTiGgE1aVWq+bmsC$QWe+w!je)*9T^6YRjnGs%xGb!$ zXj(n)agxt{BP?VGimnJZ6;>Z_-4L9d9V)slw2)W>Z27ZLCP+spqY@}g&`a?6J>h~P zHlh+iNV?4nrHn_($8yFu6iu6fy-C_ncbwQq;Dt;ortjVbc2uYbPtCPffjGNh!OkK- zBD43v`I6EG<1{W<#Kxj&6XaJ>{2$wKQC0pdW5XmzzK^lf5k zf!WEtSe9Cdrmy~Ni}_W#8R|4qv#|a+{)HfYLOFbe;zX(#y95GVIaYkH z>I?&C@S6g=j1@nskql#J^HT!*8Y(K(s#s$V4^gC0>YVxVPmlDf!37?QKO*bcV3T;M(=TM zVTQ5z*~nrDgs&8Jm|VbRt7TZ&sEC*mG2ZYo;7iaNRgX-Gq(+D!`n4 zA(h}6uv3;~c={m^huiNvtSk)lVB27bd&DhpHcPAq?(cXFSTkIzAzC6mG2mOv2MS?n zaJilTx#ny~R&@FFG zu{!fW;!s;lAuSCm_VOW&lvuK*)33Ndd!P^#0VUt_cp)+h3g_88I!%?Hh?L0ih_r|? z;oe9uy;i6V7QCb3au$bOkuh0sh}3bj*q zrfmedTc%$ry@-e~nu8-D|D4vycrWBf?F}I+4MKt(!BDQ+;^oMQC~E9*2uZRHhw~e3 zbtF$@xMdimo5e+xfv<)=idrncku3>U-r})BN(2h`G(C#^-VdXMbIxpt&L9(YBiwz6)hI#9<$YCF_6;TR*$~O zIG}mN$Y_rjl9t#4;mAgtkxs#ATWtt_)ApK?z{jLoUbx-E)>rUGLVQnK)2eB)q%
SQLITE_DBCONFIG_TRUSTED_SCHEMA -**
The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells the SQLite to -** assume that database schemas are untainted by malicious content. +**
The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to +** assume that database schemas (the contents of the [sqlite_master] tables) +** are untainted by malicious content. ** When the SQLITE_DBCONFIG_TRUSTED_SCHEMA option is disabled, SQLite ** takes additional defensive steps to protect the application from harm -** including, but not limited to, the following: +** including: **
    **
  • Prohibit the use of SQL functions inside triggers, views, ** CHECK constraints, DEFAULT clauses, expression indexes, ** partial indexes, or generated columns ** unless those functions are tagged with [SQLITE_INNOCUOUS]. -**
  • Pohibit the use of virtual tables inside of triggers or views +**
  • Prohibit the use of virtual tables inside of triggers or views ** unless those virtual tables are tagged with [SQLITE_VTAB_INNOCUOUS]. **
** This setting defaults to "on" for legacy compatibility, however -** all applications are advised to turn it off if possible. +** all applications are advised to turn it off if possible. This setting +** can also be controlled using the [PRAGMA trusted_schema] statement. **
** ** [[SQLITE_DBCONFIG_LEGACY_FILE_FORMAT]] @@ -5071,24 +5073,6 @@ int sqlite3_create_window_function( ** [CHECK constraints] or [generated columns]. SQLite might also optimize ** deterministic functions by factoring them out of inner loops. ** -** -** [[SQLITE_INNOCUOUS]]
SQLITE_INNOCUOUS
-** The SQLITE_INNOCUOUS flag means that the new function is unlikely -** to cause problems even if misused. An innocuous function should have -** no side effects and consume few resources. The [abs|abs() function] -** is an example of an innocuous function. -** The [load_extension() SQL function] is not innocuous because of its -** side effects. Some heightened security settings -** ([SQLITE_DBCONFIG_TRUSTED_SCHEMA] and [PRAGMA trusted_schema=OFF]) -** disable the use of SQL functions inside views and triggers and in -** schema structures such as [CHECK constraints], [DEFAULT clauses], -** [expression indexes], [partial indexes], and [generated columns] unless -** the function is tagged with SQLITE_INNOCUOUS. Most built-in functions -** are innocuous. Developers are advised to avoid using the -** SQLITE_INNOCUOUS flag for application-defined functions unless the -** function has been carefully audited and found to be free of potentially -** security-adverse side-effects and information-leaks. -**
** ** [[SQLITE_DIRECTONLY]]
SQLITE_DIRECTONLY
** The SQLITE_DIRECTONLY flag means that the function may only be invoked @@ -5100,6 +5084,29 @@ int sqlite3_create_window_function( ** could potentially leak sensitive information. **
** +** [[SQLITE_INNOCUOUS]]
SQLITE_INNOCUOUS
+** The SQLITE_INNOCUOUS flag means that the function is unlikely +** to cause problems even if misused. An innocuous function should have +** no side effects and should not depend on any values other than its +** input parameters. The [abs|abs() function] is an example of an +** innocuous function. +** The [load_extension() SQL function] is not innocuous because of its +** side effects. +**

SQLITE_INNOCUOUS is similar to SQLITE_DETERMINISTIC, but is not +** exactly the same. The [random|random() function] is an example of a +** function that is innocuous but not deterministic. +**

Some heightened security settings +** ([SQLITE_DBCONFIG_TRUSTED_SCHEMA] and [PRAGMA trusted_schema=OFF]) +** disable the use of SQL functions inside views and triggers and in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], and [generated columns] unless +** the function is tagged with SQLITE_INNOCUOUS. Most built-in functions +** are innocuous. Developers are advised to avoid using the +** SQLITE_INNOCUOUS flag for application-defined functions unless the +** function has been carefully audited and found to be free of potentially +** security-adverse side-effects and information-leaks. +**

+** ** [[SQLITE_SUBTYPE]]
SQLITE_SUBTYPE
** The SQLITE_SUBTYPE flag indicates to SQLite that a function may call ** [sqlite3_value_subtype()] to inspect the sub-types of its arguments. @@ -9005,6 +9012,14 @@ int sqlite3_vtab_config(sqlite3*, int op, ...); ** constraint handling. **
** +** [[SQLITE_VTAB_DIRECTONLY]]
SQLITE_VTAB_DIRECTONLY
+**
Calls of the form +** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the +** the [xConnect] or [xCreate] methods of a [virtual table] implmentation +** prohibits that virtual table from being used from within triggers and +** views. +**
+** ** [[SQLITE_VTAB_INNOCUOUS]]
SQLITE_VTAB_INNOCUOUS
**
Calls of the form ** [sqlite3_vtab_config](db,SQLITE_VTAB_INNOCUOUS) from within the @@ -9015,14 +9030,6 @@ int sqlite3_vtab_config(sqlite3*, int op, ...); ** malicious hacker. Developers should avoid setting the SQLITE_VTAB_INNOCUOUS ** flag unless absolutely necessary. **
-** -** [[SQLITE_VTAB_DIRECTONLY]]
SQLITE_VTAB_DIRECTONLY
-**
Calls of the form -** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the -** the [xConnect] or [xCreate] methods of a [virtual table] implmentation -** prohibits that virtual table from being used from within triggers and -** views. -**
** */ #define SQLITE_VTAB_CONSTRAINT_SUPPORT 1 From c6b2f9e323e2eb4c1141fa6ba004a235f7a13a20 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 13 Jan 2020 15:25:43 +0000 Subject: [PATCH 470/476] More documentation updates. No code changes. FossilOrigin-Name: a684d4ef08a48962c632b598242f5e34c9b2fa3ad6339023fbce8ac91582b5e3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e87db48560..56aa555f56 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Documentation\supdates.\s\sNo\schanges\sto\scode. -D 2020-01-13T13:33:08.672 +C More\sdocumentation\supdates.\s\sNo\scode\schanges. +D 2020-01-13T15:25:43.226 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 924b61cef57033a8ca1ed3dcffd02445a7dd0c837cc849b2e4117251cac831f5 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f -F src/sqlite.h.in 97c0691ec8fb1e61ae220f9d987644c43ff33302fe720b7da6cae0420b62bde4 +F src/sqlite.h.in a7d84cae65a920b76d0f712834acd0487424f6fdf91eec591d233721d4c9a0ff F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h b0f776a0d042b23b6bcbb6b0943e8a3768c7f0b438a275e7168f0204e223a4db F src/sqliteInt.h 7a29ba700a51eeb925731749a570cf3859f6a58ed94797ecf47508875b0ba279 @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3e3c60d8124672ff72a57dfa2e51276316bcac8c8ae8a5739da358f26924b0fb -R 709f470e25c71e3d846b00e7bb20cc66 +P cc0e0aa3a7d534b806cdf63200b32ab3b7f0e08dde717f043a36d2f91c8a046c +R 4f2d0e64554cb63b58c073ff643cc7cb U drh -Z 666e5887aeab5b35d8b57b54fe64a2ad +Z 413fd559c609f52cbe1090b0e86afa5c diff --git a/manifest.uuid b/manifest.uuid index aec613b957..1da89f4533 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc0e0aa3a7d534b806cdf63200b32ab3b7f0e08dde717f043a36d2f91c8a046c \ No newline at end of file +a684d4ef08a48962c632b598242f5e34c9b2fa3ad6339023fbce8ac91582b5e3 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 168d3f46c2..1e8cb4896f 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4885,8 +4885,6 @@ int sqlite3_reset(sqlite3_stmt *pStmt); /* ** CAPI3REF: Create Or Redefine SQL Functions ** KEYWORDS: {function creation routines} -** KEYWORDS: {application-defined SQL function} -** KEYWORDS: {application-defined SQL functions} ** METHOD: sqlite3 ** ** ^These functions (collectively known as "function creation routines") From a14de9136722f3a4dd17c4071785f34f68549806 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 14 Jan 2020 00:52:56 +0000 Subject: [PATCH 471/476] Improvements to sqlite3_open_v2() documentation. FossilOrigin-Name: 4c4fd62a092b8db6398c64a92c9ff35915eedcce1079a77aeda81811d94096c4 --- manifest | 12 +++++----- manifest.uuid | 2 +- src/sqlite.h.in | 60 +++++++++++++++++++++++++++++++++++-------------- 3 files changed, 50 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 56aa555f56..952c2a7d37 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C More\sdocumentation\supdates.\s\sNo\scode\schanges. -D 2020-01-13T15:25:43.226 +C Improvements\sto\ssqlite3_open_v2()\sdocumentation. +D 2020-01-14T00:52:56.673 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 924b61cef57033a8ca1ed3dcffd02445a7dd0c837cc849b2e4117251cac831f5 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f -F src/sqlite.h.in a7d84cae65a920b76d0f712834acd0487424f6fdf91eec591d233721d4c9a0ff +F src/sqlite.h.in cedb3737511a45ae35fba6e4d6c250ae36f6b82da0de38113efa1a3bc83ee105 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h b0f776a0d042b23b6bcbb6b0943e8a3768c7f0b438a275e7168f0204e223a4db F src/sqliteInt.h 7a29ba700a51eeb925731749a570cf3859f6a58ed94797ecf47508875b0ba279 @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cc0e0aa3a7d534b806cdf63200b32ab3b7f0e08dde717f043a36d2f91c8a046c -R 4f2d0e64554cb63b58c073ff643cc7cb +P a684d4ef08a48962c632b598242f5e34c9b2fa3ad6339023fbce8ac91582b5e3 +R 6bd82814ebfa6d5e8503b9cc96d4cf3d U drh -Z 413fd559c609f52cbe1090b0e86afa5c +Z bb294088030e59d8c60052ef40715f6c diff --git a/manifest.uuid b/manifest.uuid index 1da89f4533..482241225a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a684d4ef08a48962c632b598242f5e34c9b2fa3ad6339023fbce8ac91582b5e3 \ No newline at end of file +4c4fd62a092b8db6398c64a92c9ff35915eedcce1079a77aeda81811d94096c4 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 1e8cb4896f..c61c0e8b31 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3279,10 +3279,8 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** The sqlite3_open_v2() interface works like sqlite3_open() ** except that it accepts two additional parameters for additional control ** over the new database connection. ^(The flags parameter to -** sqlite3_open_v2() can take one of -** the following three values, optionally combined with the -** [SQLITE_OPEN_NOMUTEX], [SQLITE_OPEN_FULLMUTEX], [SQLITE_OPEN_SHAREDCACHE], -** [SQLITE_OPEN_PRIVATECACHE], and/or [SQLITE_OPEN_URI] flags:)^ +** sqlite3_open_v2() must include, at a minimum, one of the following +** three flag combinations:)^ ** **
** ^(
[SQLITE_OPEN_READONLY]
@@ -3300,23 +3298,51 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** sqlite3_open() and sqlite3_open16().)^ **
** +** In addition to the required flags, the following optional flags are +** also supported: +** +**
+** ^(
[SQLITE_OPEN_URI]
+**
The filename can be interpreted as a URI if this flag is set.
)^ +** +** ^(
[SQLITE_OPEN_MEMORY]
+**
The database will be opened as an in-memory database. The database +** is named by the "filename" argument for the purposes of cache-sharing, +** if shared cache mode is enabled, but the "filename" is otherwise ignored. +**
)^ +** +** ^(
[SQLITE_OPEN_NOMUTEX]
+**
The new database connection will use the "multi-thread" +** [threading mode].)^ This means that separate threads are allowed +** to use SQLite at the same time, as long as each thread is using +** a different [database connection]. +** +** ^(
[SQLITE_OPEN_FULLMUTEX]
+**
The new database connection will use the "serialized" +** [threading mode].)^ This means the multiple threads can safely +** attempt to use the same database connection at the same time. +** (Mutexes will block any actual concurrency, but in this mode +** there is no harm in trying.) +** +** ^(
[SQLITE_OPEN_SHAREDCACHE]
+**
The database is opened [shared cache] enabled, overriding +** the default shared cache setting provided by +** [sqlite3_enable_shared_cache()].)^ +** +** ^(
[SQLITE_OPEN_PRIVATECACHE]
+**
The database is opened [shared cache] disabled, overriding +** the default shared cache setting provided by +** [sqlite3_enable_shared_cache()].)^ +** +** [[OPEN_NOFOLLOW]] ^(
[SQLITE_OPEN_NOFOLLOW]
+**
The database filename is not allowed to be a symbolic link
+**
)^ +** ** If the 3rd parameter to sqlite3_open_v2() is not one of the -** combinations shown above optionally combined with other +** required combinations shown above optionally combined with other ** [SQLITE_OPEN_READONLY | SQLITE_OPEN_* bits] ** then the behavior is undefined. ** -** ^If the [SQLITE_OPEN_NOMUTEX] flag is set, then the database connection -** opens in the multi-thread [threading mode] as long as the single-thread -** mode has not been set at compile-time or start-time. ^If the -** [SQLITE_OPEN_FULLMUTEX] flag is set then the database connection opens -** in the serialized [threading mode] unless single-thread was -** previously selected at compile-time or start-time. -** ^The [SQLITE_OPEN_SHAREDCACHE] flag causes the database connection to be -** eligible to use [shared cache mode], regardless of whether or not shared -** cache is enabled using [sqlite3_enable_shared_cache()]. ^The -** [SQLITE_OPEN_PRIVATECACHE] flag causes the database connection to not -** participate in [shared cache mode] even if it is enabled. -** ** ^The fourth parameter to sqlite3_open_v2() is the name of the ** [sqlite3_vfs] object that defines the operating system interface that ** the new database connection should use. ^If the fourth parameter is From 76c12068451688425352394b23afd326beffe768 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 14 Jan 2020 13:13:19 +0000 Subject: [PATCH 472/476] Fix a minor typo on a comment in the CLI implementation. FossilOrigin-Name: db4fb3503c4e1e40d7bd140187014e8f0cc186c441a0c7462987c77e2c83136a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 952c2a7d37..b151fc9a7d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\ssqlite3_open_v2()\sdocumentation. -D 2020-01-14T00:52:56.673 +C Fix\sa\sminor\stypo\son\sa\scomment\sin\sthe\sCLI\simplementation. +D 2020-01-14T13:13:19.291 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -532,7 +532,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 924b61cef57033a8ca1ed3dcffd02445a7dd0c837cc849b2e4117251cac831f5 -F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f +F src/shell.c.in 1b2a636ba5b676f844a2af2a5f719b5c4ace7c6825d56270e2ae912b2a5fc840 F src/sqlite.h.in cedb3737511a45ae35fba6e4d6c250ae36f6b82da0de38113efa1a3bc83ee105 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h b0f776a0d042b23b6bcbb6b0943e8a3768c7f0b438a275e7168f0204e223a4db @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a684d4ef08a48962c632b598242f5e34c9b2fa3ad6339023fbce8ac91582b5e3 -R 6bd82814ebfa6d5e8503b9cc96d4cf3d +P 4c4fd62a092b8db6398c64a92c9ff35915eedcce1079a77aeda81811d94096c4 +R b33633203bda8df3a38c38c3b197ef0b U drh -Z bb294088030e59d8c60052ef40715f6c +Z 5fb9a211e1a604a87bf30307a2d3e966 diff --git a/manifest.uuid b/manifest.uuid index 482241225a..67330bf2dc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4c4fd62a092b8db6398c64a92c9ff35915eedcce1079a77aeda81811d94096c4 \ No newline at end of file +db4fb3503c4e1e40d7bd140187014e8f0cc186c441a0c7462987c77e2c83136a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 118205532c..f355737f59 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4922,7 +4922,7 @@ static unsigned int get4byteInt(unsigned char *a){ } /* -** Implementation of the ".info" command. +** Implementation of the ".dbinfo" command. ** ** Return 1 on error, 2 to exit, and 0 otherwise. */ From c1f73e29bface8ad10820274ce37b79fc581b1fe Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 14 Jan 2020 13:24:14 +0000 Subject: [PATCH 473/476] For the showdb utility program, more accurate detection of when the database is in autovacuum mode for the "pgidx" subcommand. FossilOrigin-Name: 9ce2192b81a81bb8928e3184664694ed2f863ce41c2777cdc35e6b61486aea46 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/showdb.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b151fc9a7d..10d5ae7486 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\stypo\son\sa\scomment\sin\sthe\sCLI\simplementation. -D 2020-01-14T13:13:19.291 +C For\sthe\sshowdb\sutility\sprogram,\smore\saccurate\sdetection\sof\swhen\sthe\sdatabase\nis\sin\sautovacuum\smode\sfor\sthe\s"pgidx"\ssubcommand. +D 2020-01-14T13:24:14.758 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1807,7 +1807,7 @@ F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 -F tool/showdb.c 97d14a1ce32d5edda84081a5c939bd8975abd89568a773b288940e67e4c7e3ad +F tool/showdb.c 9b2dbb4b7a00afaf8fc1719f0d775775effa5b135ac1a2c23f1c3f5d670c4e15 F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809 @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4c4fd62a092b8db6398c64a92c9ff35915eedcce1079a77aeda81811d94096c4 -R b33633203bda8df3a38c38c3b197ef0b +P db4fb3503c4e1e40d7bd140187014e8f0cc186c441a0c7462987c77e2c83136a +R bd47075c72e6d7f4272abf291c06f0d8 U drh -Z 5fb9a211e1a604a87bf30307a2d3e966 +Z daac81cc3ba25859a5b76fea47da2fb6 diff --git a/manifest.uuid b/manifest.uuid index 67330bf2dc..257e3f0f55 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db4fb3503c4e1e40d7bd140187014e8f0cc186c441a0c7462987c77e2c83136a \ No newline at end of file +9ce2192b81a81bb8928e3184664694ed2f863ce41c2777cdc35e6b61486aea46 \ No newline at end of file diff --git a/tool/showdb.c b/tool/showdb.c index a28656b3ea..fe4e9aca01 100644 --- a/tool/showdb.c +++ b/tool/showdb.c @@ -956,7 +956,7 @@ static void page_usage_freelist(int pgno){ ** Determine pages used as PTRMAP pages */ static void page_usage_ptrmap(unsigned char *a){ - if( a[55] ){ + if( decodeInt32(a+52) ){ int usable = g.pagesize - a[20]; int pgno = 2; int perPage = usable/5; From 299b102b93f229f152a3f0751f99d9dd8e7da120 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 14 Jan 2020 16:33:07 +0000 Subject: [PATCH 474/476] Add the new noop_nd() debugging function to the noop.c extension. FossilOrigin-Name: 72911fb1b010ae093a161b9c0d21cbdedcbc1f924a55f12227fbe342bd978e08 --- ext/misc/noop.c | 11 +++++++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/ext/misc/noop.c b/ext/misc/noop.c index 99091fbb8e..d3a58670c4 100644 --- a/ext/misc/noop.c +++ b/ext/misc/noop.c @@ -11,6 +11,13 @@ ****************************************************************************** ** ** This SQLite extension implements a noop() function used for testing. +** +** Variants: +** +** noop(X) The default. Deterministic. +** noop_i(X) Deterministic and innocuous. +** noop_do(X) Deterministic and direct-only. +** noop_nd(X) Non-deterministic. */ #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 @@ -53,5 +60,9 @@ int sqlite3_noop_init( rc = sqlite3_create_function(db, "noop_do", 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_DIRECTONLY, 0, noopfunc, 0, 0); + if( rc ) return rc; + rc = sqlite3_create_function(db, "noop_nd", 1, + SQLITE_UTF8, + 0, noopfunc, 0, 0); return rc; } diff --git a/manifest b/manifest index 10d5ae7486..0f4f8c637e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sthe\sshowdb\sutility\sprogram,\smore\saccurate\sdetection\sof\swhen\sthe\sdatabase\nis\sin\sautovacuum\smode\sfor\sthe\s"pgidx"\ssubcommand. -D 2020-01-14T13:24:14.758 +C Add\sthe\snew\snoop_nd()\sdebugging\sfunction\sto\sthe\snoop.c\sextension. +D 2020-01-14T16:33:07.991 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -303,7 +303,7 @@ F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2 F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 F ext/misc/nextchar.c 7877914c2a80c2f181dd04c3dbef550dfb54c93495dc03da2403b5dd58f34edd -F ext/misc/noop.c 05e8263fb9998d675b5714a3d280b284b19ffe65256d6856fec807948485f6f0 +F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1ab F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P db4fb3503c4e1e40d7bd140187014e8f0cc186c441a0c7462987c77e2c83136a -R bd47075c72e6d7f4272abf291c06f0d8 +P 9ce2192b81a81bb8928e3184664694ed2f863ce41c2777cdc35e6b61486aea46 +R 73abdccaa3b4b3bfc8d9b17374783df8 U drh -Z daac81cc3ba25859a5b76fea47da2fb6 +Z 526da08fbb1bfa4a7cd4a8e449cd134a diff --git a/manifest.uuid b/manifest.uuid index 257e3f0f55..02ee03a9d7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ce2192b81a81bb8928e3184664694ed2f863ce41c2777cdc35e6b61486aea46 \ No newline at end of file +72911fb1b010ae093a161b9c0d21cbdedcbc1f924a55f12227fbe342bd978e08 \ No newline at end of file From 05e8c5407f5d774c7c7947936a3a44f332fdcf81 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 14 Jan 2020 16:39:54 +0000 Subject: [PATCH 475/476] Remove an ALWAYS on a branch for improved database corruption detection in btree.c:freeSpace(). Test case found by dbsqlfuzz. FossilOrigin-Name: 54bf04811951db6c894f272f870e3e41f8f5e05a25c1115efbbdbd0d8bba54be --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 1738752 -> 1741824 bytes 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0f4f8c637e..0a231134a2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\snew\snoop_nd()\sdebugging\sfunction\sto\sthe\snoop.c\sextension. -D 2020-01-14T16:33:07.991 +C Remove\san\sALWAYS\son\sa\sbranch\sfor\simproved\sdatabase\scorruption\sdetection\s\nin\sbtree.c:freeSpace().\s\sTest\scase\sfound\sby\sdbsqlfuzz. +D 2020-01-14T16:39:54.639 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -472,7 +472,7 @@ F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c d70000b51523138582663b578b7f8a13e5d03c73c7c7ef18fdeafe1c234bbc3c +F src/btree.c 7af5ff0f88ba856c2681f6eeb457590b24f787e994f18cbdb44c2de2d33f757e F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 F src/btreeInt.h 6794084fad08c9750b45145743c0e3e5c27c94dee89f26dd8df7073314934fd2 F src/build.c bd2f382562b08f14748d54402220be1082c2f8ff8973fad47e45a381c438f9bf @@ -1021,7 +1021,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db e7a86fd83dda151d160445d542e32e5c6019c541b3a74c2a525b6ac640639711 -F test/fuzzdata8.db 7816165a0e5d5deec593a519cd1f527a2a9efd0a3f7d00c232d8e9f29a2c0acd +F test/fuzzdata8.db 8bd41f8e1b9c61af011bf5cf16a85fb7f718fdd3348e476b78ba36adab872653 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9ce2192b81a81bb8928e3184664694ed2f863ce41c2777cdc35e6b61486aea46 -R 73abdccaa3b4b3bfc8d9b17374783df8 +P 72911fb1b010ae093a161b9c0d21cbdedcbc1f924a55f12227fbe342bd978e08 +R 2396ea5cb54c667d853921c6ec996dd6 U drh -Z 526da08fbb1bfa4a7cd4a8e449cd134a +Z 190afd1fe5730a422de834b7bdd5d831 diff --git a/manifest.uuid b/manifest.uuid index 02ee03a9d7..e10fd712ef 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -72911fb1b010ae093a161b9c0d21cbdedcbc1f924a55f12227fbe342bd978e08 \ No newline at end of file +54bf04811951db6c894f272f870e3e41f8f5e05a25c1115efbbdbd0d8bba54be \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 8b229ed5eb..be5d639baa 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1731,7 +1731,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ }else{ while( (iFreeBlk = get2byte(&data[iPtr])) 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�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 O<(y{oz0BW#?f(H_Cp8xU From be22a85406137a112851006c3cf329f190a41597 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 14 Jan 2020 16:50:09 +0000 Subject: [PATCH 476/476] Fix the urifuncs.c extension (used for testing and debugging only) so that the sqlite3_filename_database() SQL function and its siblings correctly handle an invalid schema name passed in as the argument. FossilOrigin-Name: 3d7434a9d85dae9135473d1c58c22ac01a282e654807aa10be9b39f127291594 --- ext/misc/urifuncs.c | 8 +++++--- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ext/misc/urifuncs.c b/ext/misc/urifuncs.c index 5fc520a1bf..9697b724cb 100644 --- a/ext/misc/urifuncs.c +++ b/ext/misc/urifuncs.c @@ -23,6 +23,8 @@ ** sqlite3_db_filename() ** ** These SQL functions are for testing and demonstration purposes only. +** +** */ #include "sqlite3ext.h" SQLITE_EXTENSION_INIT1 @@ -134,7 +136,7 @@ static void func_filename_database( const char *zSchema = (const char*)sqlite3_value_text(argv[0]); sqlite3 *db = sqlite3_context_db_handle(context); const char *zFile = sqlite3_db_filename(db, zSchema); - const char *zRes = sqlite3_filename_database(zFile); + const char *zRes = zFile ? sqlite3_filename_database(zFile) : 0; sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); } @@ -151,7 +153,7 @@ static void func_filename_journal( const char *zSchema = (const char*)sqlite3_value_text(argv[0]); sqlite3 *db = sqlite3_context_db_handle(context); const char *zFile = sqlite3_db_filename(db, zSchema); - const char *zRes = sqlite3_filename_journal(zFile); + const char *zRes = zFile ? sqlite3_filename_journal(zFile) : 0; sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); } @@ -168,7 +170,7 @@ static void func_filename_wal( const char *zSchema = (const char*)sqlite3_value_text(argv[0]); sqlite3 *db = sqlite3_context_db_handle(context); const char *zFile = sqlite3_db_filename(db, zSchema); - const char *zRes = sqlite3_filename_wal(zFile); + const char *zRes = zFile ? sqlite3_filename_wal(zFile) : 0; sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); } diff --git a/manifest b/manifest index 0a231134a2..db3464521a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sALWAYS\son\sa\sbranch\sfor\simproved\sdatabase\scorruption\sdetection\s\nin\sbtree.c:freeSpace().\s\sTest\scase\sfound\sby\sdbsqlfuzz. -D 2020-01-14T16:39:54.639 +C Fix\sthe\surifuncs.c\sextension\s(used\sfor\stesting\sand\sdebugging\sonly)\sso\sthat\nthe\ssqlite3_filename_database()\sSQL\sfunction\sand\sits\ssiblings\scorrectly\shandle\nan\sinvalid\sschema\sname\spassed\sin\sas\sthe\sargument. +D 2020-01-14T16:50:09.276 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -321,7 +321,7 @@ F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da9 F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c fa4aedeb07f66169005dffa8de3b0a2b621779fd44f85c103228a42afa71853b F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061ef1625f9 -F ext/misc/urifuncs.c a0b02a607b4170552deeff26812bb2f09eed1cc72d1056a4296ae6be0c19d100 +F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917b9c751 F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057b1cdb @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 72911fb1b010ae093a161b9c0d21cbdedcbc1f924a55f12227fbe342bd978e08 -R 2396ea5cb54c667d853921c6ec996dd6 +P 54bf04811951db6c894f272f870e3e41f8f5e05a25c1115efbbdbd0d8bba54be +R ef60df967e796bd9bfc273160d5104d4 U drh -Z 190afd1fe5730a422de834b7bdd5d831 +Z 6fa8f0dab0c264087d10e9adb2b33207 diff --git a/manifest.uuid b/manifest.uuid index e10fd712ef..cea784779f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -54bf04811951db6c894f272f870e3e41f8f5e05a25c1115efbbdbd0d8bba54be \ No newline at end of file +3d7434a9d85dae9135473d1c58c22ac01a282e654807aa10be9b39f127291594 \ No newline at end of file
n8jx9o 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 Date: Thu, 14 Nov 2019 15:10:48 +0000 Subject: [PATCH 147/476] Minor documentation enhancements. No changes to code. FossilOrigin-Name: 6153f3aada0cc9c5e773753797892ee78b518b0d76568382f5fbc9ee960f814c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 962b0734d4..3ce1ce6e0c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bring\sthe\shard-heap-limit\sbranch\sup-to-date\swith\strunk. -D 2019-08-20T17:14:21.963 +C Minor\sdocumentation\senhancements.\s\sNo\schanges\sto\scode. +D 2019-11-14T15:10:48.812 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -525,7 +525,7 @@ F src/resolve.c b2733d39a22f5023ab489b8535ca6854b51ff8667ca975815d004bb7388b0e41 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 80b8b4c857db2f20d98f80b71ef3bb0d70cdd17bd6b00217dcff803e9b989bd8 F src/shell.c.in e0f0758b6ab506d8ab12502fd2b8c55546bb9e4bb772374344a5a1b73f5bc2b9 -F src/sqlite.h.in 28429eea13de6fdce4d2cb03364faa58efe08f2f1cddd644548beb2b26d0efa4 +F src/sqlite.h.in b2f76b3dbe7cd825a0d302e87bf6c1393c5d0d5aeebff13b9e169d884515668b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 F src/sqliteInt.h b7d612d9c63abc8a8a7dcf7fbec5326b1770f40c81502c56f508e272154e7615 @@ -1836,7 +1836,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3a4751a9f2784131f81071305b838caa63410a76533fb879627e1849d626f893 75aec4fc886c04fe098828cc03bc72c197cbf40f0a1890fe5bbb98d4fd5c3c7e -R c7c33fc0cf57bfd645b58e89a6e2b6fd +P 9b14eb77548d3f65f5a4c9b16cecdbce8a3fb663692aa8315fbd21aab3e89f0d +R 222453043027948de14f8700204cd004 U drh -Z ec606df4fceac7b5710831077f6b5b02 +Z ceae2037ac6e96ad487df8d3b0f1b9fa diff --git a/manifest.uuid b/manifest.uuid index 82b956e699..323830121e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9b14eb77548d3f65f5a4c9b16cecdbce8a3fb663692aa8315fbd21aab3e89f0d \ No newline at end of file +6153f3aada0cc9c5e773753797892ee78b518b0d76568382f5fbc9ee960f814c \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f4a6cd8e32..c3784c06d4 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -1742,6 +1742,7 @@ struct sqlite3_mem_methods { ** memory allocation statistics. ^(When memory allocation statistics are ** disabled, the following SQLite interfaces become non-operational: ** )^ ** ^The eTextRep argument determines the encoding of strings passed -** to the collating function callback, xCallback. +** to the collating function callback, xCompare. ** ^The [SQLITE_UTF16] and [SQLITE_UTF16_ALIGNED] values for eTextRep ** force strings to be UTF16 with native byte order. ** ^The [SQLITE_UTF16_ALIGNED] value for eTextRep forces strings to begin @@ -5561,18 +5561,19 @@ void sqlite3_result_subtype(sqlite3_context*,unsigned int); ** ^The fourth argument, pArg, is an application data pointer that is passed ** through as the first argument to the collating function callback. ** -** ^The fifth argument, xCallback, is a pointer to the collating function. +** ^The fifth argument, xCompare, is a pointer to the collating function. ** ^Multiple collating functions can be registered using the same name but ** with different eTextRep parameters and SQLite will use whichever ** function requires the least amount of data transformation. -** ^If the xCallback argument is NULL then the collating function is +** ^If the xCompare argument is NULL then the collating function is ** deleted. ^When all collating functions having the same name are deleted, ** that collation is no longer usable. ** ** ^The collating function callback is invoked with a copy of the pArg ** application data pointer and with two strings in the encoding specified -** by the eTextRep argument. The collating function must return an -** integer that is negative, zero, or positive +** by the eTextRep argument. The two integer parameters to the collating +** function callback are the length of the two strings, in bytes. The collating +** function must return an integer that is negative, zero, or positive ** if the first string is less than, equal to, or greater than the second, ** respectively. A collating function must always return the same answer ** given the same inputs. If two or more collating functions are registered From ded33ccea4203e0b3c7519c9c60063632bf4eccf Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 8 Jan 2020 11:36:30 +0000 Subject: [PATCH 443/476] Fix a minor formatting error in the display of BLOB values during VDBE tracing. FossilOrigin-Name: 295442887a3cd5868df26c5be244649ffb3bae8367f5cf02fe513424a1c9f6a7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c33c543f9b..9950bda48b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sdocumentation\sof\ssqlite3_create_collation(). -D 2020-01-08T10:57:27.234 +C Fix\sa\sminor\sformatting\serror\sin\sthe\sdisplay\sof\sBLOB\svalues\sduring\sVDBE\ntracing. +D 2020-01-08T11:36:30.537 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,7 +600,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 736ff76753236ffbc8b5b939f5e0607f28aeaa7c780b3a56b419228f0a81c87b F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c b557ecd97f5a27e46240d0a6ea886341386689b39c75370f6141bd5e6849c359 +F src/vdbe.c 35dcc7d43c2635853773d994b052061283a4e5b0e60e799cef83e410d90f3145 F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h 30d3e8b991547cdf39025e416a0a737b0416d46747af70ae058f60e2e0466fe7 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1c3e5c20a9e6f501befa2bf6241a1b5190872bd83b765dac67065d252d04ea4f -R f8f6e015cbee0709d3024aa38c2bae8d +P fa866aec56deca8cc1b70814215bbdc683f41bc0826da0f8804d952de429820c +R 17d7c20026c82c44945aa08b93d68dfb U drh -Z 2e45dbcb0f64d56dfc8c6496a2fa9306 +Z 1e5efc8d32a46b031eabd796b5d1581a diff --git a/manifest.uuid b/manifest.uuid index 6f5aaaac78..28c8823c25 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fa866aec56deca8cc1b70814215bbdc683f41bc0826da0f8804d952de429820c \ No newline at end of file +295442887a3cd5868df26c5be244649ffb3bae8367f5cf02fe513424a1c9f6a7 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 06a6d32306..14c83bd1f8 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -499,7 +499,7 @@ void sqlite3VdbeMemPrettyPrint(Mem *pMem, StrAccum *pStr){ }else{ c = 's'; } - sqlite3_str_appendf(pStr, "%cx", c); + sqlite3_str_appendf(pStr, "%cx[", c); for(i=0; i<25 && in; i++){ sqlite3_str_appendf(pStr, "%02X", ((int)pMem->z[i] & 0xFF)); } From 87969b2a1190584c09f8676e3a17c2acaa99227c Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 8 Jan 2020 12:17:46 +0000 Subject: [PATCH 444/476] When doing a test-to-double conversion on a BLOB with an odd number of bytes and assuming a UTF16 encoding, ignore the last byte. Ticket [9eda2697f5cc1aba]. FossilOrigin-Name: 1c76f1d8ec0937a2d2e4ce75f98494c953e9621db31945d7e44f45d90d1c3892 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/util.c | 1 + test/atof1.test | 24 ++++++++++++++++++++++++ 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9950bda48b..f4dd7639e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\sformatting\serror\sin\sthe\sdisplay\sof\sBLOB\svalues\sduring\sVDBE\ntracing. -D 2020-01-08T11:36:30.537 +C When\sdoing\sa\stest-to-double\sconversion\son\sa\sBLOB\swith\san\sodd\snumber\sof\sbytes\nand\sassuming\sa\sUTF16\sencoding,\signore\sthe\slast\sbyte.\nTicket\s[9eda2697f5cc1aba]. +D 2020-01-08T12:17:46.451 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -598,7 +598,7 @@ F src/trigger.c a40d50e88bd3355f1d2a73f0a3b2d6b42eae26ca4219001b82ef0d064439badc F src/update.c 9ad19af96aff95dc02a923a99f97c1bc0b909009a29a2914b796f786b9ac0c60 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 736ff76753236ffbc8b5b939f5e0607f28aeaa7c780b3a56b419228f0a81c87b -F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 +F src/util.c e5f3971160154e5c9b660fd119b02ec4890e87cd18a5bc4d45ee60cddbb9e6a2 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf F src/vdbe.c 35dcc7d43c2635853773d994b052061283a4e5b0e60e799cef83e410d90f3145 F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 @@ -658,7 +658,7 @@ F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0 -F test/atof1.test ff0b0156fd705b67c506e1f2bfe9e26102bea9bd +F test/atof1.test 1ccfc96a6888566597b83d882c81b3c04258dc39317e8c1cec89ba481eaa2fba F test/atomic.test 065a453dde33c77ff586d91ccaa6ed419829d492dbb1a5694b8a09f3f9d7d061 F test/atomic2.test b6863b4aa552543874f80b42fb3063f1c8c2e3d8e56b6562f00a3cc347b5c1da F test/atrc.c ec92d56d8fbed9eb3e11aaf1ab98cf7dd59e69dae31f128013f1d97e54e7dfed @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fa866aec56deca8cc1b70814215bbdc683f41bc0826da0f8804d952de429820c -R 17d7c20026c82c44945aa08b93d68dfb +P 295442887a3cd5868df26c5be244649ffb3bae8367f5cf02fe513424a1c9f6a7 +R 9275f44076e39841a96fb22faa964c5a U drh -Z 1e5efc8d32a46b031eabd796b5d1581a +Z ac500ac229baf04846641aa2e74b4140 diff --git a/manifest.uuid b/manifest.uuid index 28c8823c25..a31a5968eb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -295442887a3cd5868df26c5be244649ffb3bae8367f5cf02fe513424a1c9f6a7 \ No newline at end of file +1c76f1d8ec0937a2d2e4ce75f98494c953e9621db31945d7e44f45d90d1c3892 \ No newline at end of file diff --git a/src/util.c b/src/util.c index f7a993a766..88ac6d39f8 100644 --- a/src/util.c +++ b/src/util.c @@ -411,6 +411,7 @@ int sqlite3AtoF(const char *z, double *pResult, int length, u8 enc){ }else{ int i; incr = 2; + length &= ~1; assert( SQLITE_UTF16LE==2 && SQLITE_UTF16BE==3 ); testcase( enc==SQLITE_UTF16LE ); testcase( enc==SQLITE_UTF16BE ); diff --git a/test/atof1.test b/test/atof1.test index 55f5e44d96..34e69c12f8 100644 --- a/test/atof1.test +++ b/test/atof1.test @@ -56,5 +56,29 @@ for {set i 1} {$i<20000} {incr i} { } {1} } +# 2020-01-08 ticket 9eda2697f5cc1aba +# When running sqlite3AtoF() on a blob with an odd number of bytes using +# UTF16, ignore the last byte so that the string has an integer number of +# UTF16 code points. +# +reset_db +do_execsql_test atof1-2.10 { + PRAGMA encoding = 'UTF16be'; + CREATE TABLE t1(a, b); + INSERT INTO t1(rowid,a) VALUES (1,x'00'),(2,3); + SELECT substr(a,',') is true FROM t1 ORDER BY rowid; +} {0 1} +do_execsql_test atof1-2.20 { + SELECT substr(a,',') is true FROM t1 ORDER BY rowid DESC; +} {1 0} +do_execsql_test atof1-2.30 { + CREATE INDEX i1 ON t1(a); + SELECT count(*) FROM t1 WHERE substr(a,','); +} {1} + + + + + finish_test From b7e519956a3a38f4a5b0c1c52a654d47b199f070 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 8 Jan 2020 14:39:57 +0000 Subject: [PATCH 445/476] In the TreeView debugging output, show a "DDL" mark on SrcList and Expr nodes that derive from a non-TEMP schema. FossilOrigin-Name: fe7472fd2a70b4df6cb62041b72ed1638ba27ed1e6ceb8aaf56d1c8a82d91889 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 18 ++++++++++++------ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 1fe31e4a6c..c3f7bec0f7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\srecent\schanges\sfrom\strunk. -D 2020-01-08T13:08:52.289 +C In\sthe\sTreeView\sdebugging\soutput,\sshow\sa\s"DDL"\smark\son\sSrcList\sand\sExpr\snodes\nthat\sderive\sfrom\sa\snon-TEMP\sschema. +D 2020-01-08T14:39:57.767 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -593,7 +593,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d -F src/treeview.c 2f712c821748dccced8977c33de83146e75a193afd17da3da8ad64e0225fee20 +F src/treeview.c f51bdcac260ed3eafd8880e857c56e086e28340a1d7b49b487893610d71a2325 F src/trigger.c a40d50e88bd3355f1d2a73f0a3b2d6b42eae26ca4219001b82ef0d064439badc F src/update.c 9ad19af96aff95dc02a923a99f97c1bc0b909009a29a2914b796f786b9ac0c60 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4c21373c21c9b17b222ae65297a039a035e6ec6b505c00c33704e3c03f94f834 1c76f1d8ec0937a2d2e4ce75f98494c953e9621db31945d7e44f45d90d1c3892 -R 11f59f8982210d84b12dbd1c2e27ec48 +P 5962921fceaf2ec645379a5f1d18e2c2c13abbf92cf64606caee69f45a21c500 +R 93a7c1674ece8353922d12da4e1fe3fc U drh -Z ba42883755b74cbe63cf9689f020b123 +Z 848f5182d2c3a0564e6132972f60b9ae diff --git a/manifest.uuid b/manifest.uuid index cbec142043..545d38920a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5962921fceaf2ec645379a5f1d18e2c2c13abbf92cf64606caee69f45a21c500 \ No newline at end of file +fe7472fd2a70b4df6cb62041b72ed1638ba27ed1e6ceb8aaf56d1c8a82d91889 \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 938c1f1a1f..1ea2f24f2f 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -147,6 +147,9 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ if( pItem->fg.jointype & JT_LEFT ){ sqlite3_str_appendf(&x, " LEFT-JOIN"); } + if( pItem->fg.fromDDL ){ + sqlite3_str_appendf(&x, " DDL"); + } sqlite3StrAccumFinish(&x); sqlite3TreeViewItem(pView, zLine, inSrc-1); if( pItem->pSelect ){ @@ -403,14 +406,17 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ return; } if( pExpr->flags || pExpr->affExpr ){ + StrAccum x; + sqlite3StrAccumInit(&x, 0, zFlgs, sizeof(zFlgs), 0); + sqlite3_str_appendf(&x, " fg.af=%x.%c", + pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); if( ExprHasProperty(pExpr, EP_FromJoin) ){ - sqlite3_snprintf(sizeof(zFlgs),zFlgs," fg.af=%x.%c iRJT=%d", - pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n', - pExpr->iRightJoinTable); - }else{ - sqlite3_snprintf(sizeof(zFlgs),zFlgs," fg.af=%x.%c", - pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); + sqlite3_str_appendf(&x, " iRJT=%d", pExpr->iRightJoinTable); } + if( ExprHasProperty(pExpr, EP_FromDDL) ){ + sqlite3_str_appendf(&x, " DDL"); + } + sqlite3StrAccumFinish(&x); }else{ zFlgs[0] = 0; } From 6d35956c86834f53da7743b922e4a688643a3467 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 8 Jan 2020 15:43:29 +0000 Subject: [PATCH 446/476] Fix the rot13.c extension to be deterministic. Add the noop.c extension. FossilOrigin-Name: a679122ca8ec95d5c8afba3a1a50170db9dd519a3810e56877b8f56e858d0175 --- ext/misc/noop.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ ext/misc/rot13.c | 5 +++-- manifest | 13 ++++++----- manifest.uuid | 2 +- 4 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 ext/misc/noop.c diff --git a/ext/misc/noop.c b/ext/misc/noop.c new file mode 100644 index 0000000000..99091fbb8e --- /dev/null +++ b/ext/misc/noop.c @@ -0,0 +1,57 @@ +/* +** 2020-01-08 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This SQLite extension implements a noop() function used for testing. +*/ +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 +#include +#include + +/* +** Implementation of the noop() function. +** +** The function returns its argument, unchanged. +*/ +static void noopfunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + assert( argc==1 ); + sqlite3_result_value(context, argv[0]); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_noop_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + int rc = SQLITE_OK; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + rc = sqlite3_create_function(db, "noop", 1, + SQLITE_UTF8 | SQLITE_DETERMINISTIC, + 0, noopfunc, 0, 0); + if( rc ) return rc; + rc = sqlite3_create_function(db, "noop_i", 1, + SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS, + 0, noopfunc, 0, 0); + if( rc ) return rc; + rc = sqlite3_create_function(db, "noop_do", 1, + SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_DIRECTONLY, + 0, noopfunc, 0, 0); + return rc; +} diff --git a/ext/misc/rot13.c b/ext/misc/rot13.c index 8bde54700e..05b4a18801 100644 --- a/ext/misc/rot13.c +++ b/ext/misc/rot13.c @@ -105,8 +105,9 @@ int sqlite3_rot_init( int rc = SQLITE_OK; SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ - rc = sqlite3_create_function(db, "rot13", 1, SQLITE_UTF8|SQLITE_INNOCUOUS, 0, - rot13func, 0, 0); + rc = sqlite3_create_function(db, "rot13", 1, + SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC, + 0, rot13func, 0, 0); if( rc==SQLITE_OK ){ rc = sqlite3_create_collation(db, "rot13", SQLITE_UTF8, 0, rot13CollFunc); } diff --git a/manifest b/manifest index c3f7bec0f7..d090866118 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sTreeView\sdebugging\soutput,\sshow\sa\s"DDL"\smark\son\sSrcList\sand\sExpr\snodes\nthat\sderive\sfrom\sa\snon-TEMP\sschema. -D 2020-01-08T14:39:57.767 +C Fix\sthe\srot13.c\sextension\sto\sbe\sdeterministic.\s\sAdd\sthe\snoop.c\sextension. +D 2020-01-08T15:43:29.452 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -302,12 +302,13 @@ F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2 F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 F ext/misc/nextchar.c 7877914c2a80c2f181dd04c3dbef550dfb54c93495dc03da2403b5dd58f34edd +F ext/misc/noop.c 05e8263fb9998d675b5714a3d280b284b19ffe65256d6856fec807948485f6f0 F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 F ext/misc/regexp.c 246244c714267f303df76acf73dcf110cf2eaf076896aaaba8db6d6d21a129db F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c -F ext/misc/rot13.c 4a57b830f8cf23b96156e1e3cbd1115186243feae25010bf9b02af88a343ae1f +F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad F ext/misc/series.c a733a77d152983cc5d337c9df7b358ad17cfb44965476843cd03e2f571054914 F ext/misc/sha1.c 1190aec0d9d886d9f5ffdf891142a626812327d11472c0cade3489db3b7b140a @@ -1853,7 +1854,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5962921fceaf2ec645379a5f1d18e2c2c13abbf92cf64606caee69f45a21c500 -R 93a7c1674ece8353922d12da4e1fe3fc +P fe7472fd2a70b4df6cb62041b72ed1638ba27ed1e6ceb8aaf56d1c8a82d91889 +R ac5937459d1f32e763d72ee868f7675e U drh -Z 848f5182d2c3a0564e6132972f60b9ae +Z 35839f6156af9b997f99a45283c98dee diff --git a/manifest.uuid b/manifest.uuid index 545d38920a..bbd4914395 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fe7472fd2a70b4df6cb62041b72ed1638ba27ed1e6ceb8aaf56d1c8a82d91889 \ No newline at end of file +a679122ca8ec95d5c8afba3a1a50170db9dd519a3810e56877b8f56e858d0175 \ No newline at end of file From 15f3eacfc0e9cfe6ebd4e71a342fab18c6d5eee0 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 8 Jan 2020 15:44:10 +0000 Subject: [PATCH 447/476] Provide the -innocuous option to the "db func" method in the TCL interface. FossilOrigin-Name: 0138652b6c2f21fd67e59a23a396a5b9d6a16ee9b44701cddfc49b23fddfce5b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d090866118..1a81415783 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\srot13.c\sextension\sto\sbe\sdeterministic.\s\sAdd\sthe\snoop.c\sextension. -D 2020-01-08T15:43:29.452 +C Provide\sthe\s-innocuous\soption\sto\sthe\s"db\sfunc"\smethod\sin\sthe\sTCL\sinterface. +D 2020-01-08T15:44:10.295 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -538,7 +538,7 @@ F src/sqliteInt.h 8c1fcdad7418c87cd482d2868610ed299e0201091e247598495e92e9c5d8e8 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c 8cd2600e8de23dff6cdf84d39f46ca57139b061b28f6f80b166bace17d52ab1c +F src/tclsqlite.c f2dae14bfe7a35c94b6d515df88071014678ec39dafebdcf8e6bde91d62516c1 F src/test1.c 4d0ab2f67053a4fff87d1d3586ecc0e5322a1fc45dd4119ab11dc96de44f17a1 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -1854,7 +1854,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fe7472fd2a70b4df6cb62041b72ed1638ba27ed1e6ceb8aaf56d1c8a82d91889 -R ac5937459d1f32e763d72ee868f7675e +P a679122ca8ec95d5c8afba3a1a50170db9dd519a3810e56877b8f56e858d0175 +R 9fbba3111d220dbea3ef9c5770ac6cef U drh -Z 35839f6156af9b997f99a45283c98dee +Z fc531ff60387ab6488432d4541dd29bf diff --git a/manifest.uuid b/manifest.uuid index bbd4914395..0381fd8065 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a679122ca8ec95d5c8afba3a1a50170db9dd519a3810e56877b8f56e858d0175 \ No newline at end of file +0138652b6c2f21fd67e59a23a396a5b9d6a16ee9b44701cddfc49b23fddfce5b \ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index a691898dc3..6a8b52b6bc 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -2818,6 +2818,7 @@ deserialize_error: ** --argcount N Function has exactly N arguments ** --deterministic The function is pure ** --directonly Prohibit use inside triggers and views + ** --innocuous Has no side effects or information leaks ** --returntype TYPE Specify the return type of the function */ case DB_FUNCTION: { @@ -2854,6 +2855,9 @@ deserialize_error: if( n>1 && strncmp(z, "-directonly",n)==0 ){ flags |= SQLITE_DIRECTONLY; }else + if( n>1 && strncmp(z, "-innocuous",n)==0 ){ + flags |= SQLITE_INNOCUOUS; + }else if( n>1 && strncmp(z, "-returntype", n)==0 ){ const char *azType[] = {"integer", "real", "text", "blob", "any", 0}; assert( SQLITE_INTEGER==1 && SQLITE_FLOAT==2 && SQLITE_TEXT==3 ); @@ -2870,7 +2874,7 @@ deserialize_error: }else{ Tcl_AppendResult(interp, "bad option \"", z, "\": must be -argcount, -deterministic, -directonly," - " or -returntype", (char*)0 + " -innocuous, or -returntype", (char*)0 ); return TCL_ERROR; } From 0dfa5255bc012a1991809e23ad2ac1a4089e1261 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 8 Jan 2020 17:28:19 +0000 Subject: [PATCH 448/476] Check for whether or not it is safe to use non-innocuous functions as the function is being coded, not when its name is resolved. FossilOrigin-Name: 1da802d54b689a462e1fe899c6ffa08ef14d34f36728b14b055b5a76b1edc274 --- manifest | 21 ++++++++++---------- manifest.uuid | 2 +- src/expr.c | 39 +++++++++++++++++++++++++++++++++++++ src/resolve.c | 23 ++++------------------ src/sqliteInt.h | 1 + test/fts3atoken.test | 4 ++-- test/func.test | 6 +++--- test/trustschema1.test | 44 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 105 insertions(+), 35 deletions(-) create mode 100644 test/trustschema1.test diff --git a/manifest b/manifest index 1a81415783..dd4d4bcc90 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\sthe\s-innocuous\soption\sto\sthe\s"db\sfunc"\smethod\sin\sthe\sTCL\sinterface. -D 2020-01-08T15:44:10.295 +C Check\sfor\swhether\sor\snot\sit\sis\ssafe\sto\suse\snon-innocuous\sfunctions\sas\sthe\nfunction\sis\sbeing\scoded,\snot\swhen\sits\sname\sis\sresolved. +D 2020-01-08T17:28:19.750 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -481,7 +481,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 0f55297469d4244ab7df395849e1af98eb5e95816af7c661e7d2d8402dea23da F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 631b1f24d07114066c756984b8bc7be64529afb2ea3a5da4e3e262792f320dfa +F src/expr.c bea12b33808867bb8f336d4bd70ebedfef72bb96bd453adcb068e578417b5e46 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -527,14 +527,14 @@ F src/pragma.h 9f86a3a3a0099e651189521c8ad03768df598974e7bbdc21c7f9bb6125592fbd F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 894397f372b5c23fb68e0c534d3682f45285f228bb335d713344a7ed37f0ba45 +F src/resolve.c 5200d014fa78412f6189777cde3ac71b2dde55260c620be095610afe03fe9354 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c fbae5d6db63959aa1ecb34efe93caf5399444ca3c78d6f1ef4620b0ee5c37707 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f F src/sqlite.h.in 06452043348e35cf6108345a35574a2faa4d1c2829beefb1e73c73d6bfb2fa80 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h 8c1fcdad7418c87cd482d2868610ed299e0201091e247598495e92e9c5d8e884 +F src/sqliteInt.h 0ca99e207087851fd27c6e1314fc52d273caa424ff2bafa3f1daf6d5eb63b35a F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -930,7 +930,7 @@ F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 -F test/fts3atoken.test 2b2b0d7943eccf76e7a4887b557d4abcbb9279fbbb88e2bc2eba31c1817d11c7 +F test/fts3atoken.test dc2078ce464914efe3a8dfc545dd034a0fc14f2ab425c240471d5a5f1c721400 F test/fts3auto.test bfe0857bd0b69d68dd685a931b58486411a69f5794a7f6d6fe808bfa31a99614 F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f @@ -998,7 +998,7 @@ F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3c F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test 7d425f9a6eaa2c50baa751bef6b0c6c6af1751e0e0e1eb4863d426bb4c886788 +F test/func.test 93d692f6427bd01b39c6ddb1e2d728f5264abefdbdd56e2f95c9dc1fa7dbcb53 F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 F test/func4.test 6beacdfcb0e18c358e6c2dcacf1b65d1fa80955f @@ -1592,6 +1592,7 @@ F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499 +F test/trustschema1.test b337ef2d006c3c02ca822eca45bbc10d711ba96d12486cb0fa8e7beb5e0d7660 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 @@ -1854,7 +1855,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a679122ca8ec95d5c8afba3a1a50170db9dd519a3810e56877b8f56e858d0175 -R 9fbba3111d220dbea3ef9c5770ac6cef +P 0138652b6c2f21fd67e59a23a396a5b9d6a16ee9b44701cddfc49b23fddfce5b +R ce4061dc1b633cb47a4ee9d471ef9c80 U drh -Z fc531ff60387ab6488432d4541dd29bf +Z 1c75c43008bf3984bb39f61126a3891e diff --git a/manifest.uuid b/manifest.uuid index 0381fd8065..3ce3dd07e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0138652b6c2f21fd67e59a23a396a5b9d6a16ee9b44701cddfc49b23fddfce5b \ No newline at end of file +1da802d54b689a462e1fe899c6ffa08ef14d34f36728b14b055b5a76b1edc274 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4e8703e552..7d712ad674 100644 --- a/src/expr.c +++ b/src/expr.c @@ -973,6 +973,41 @@ Expr *sqlite3ExprFunction( return pNew; } +/* +** Check to see if a function is usable according to current access +** rules: +** +** SQLITE_FUNC_DIRECT - Only usable from top-level SQL +** +** SQLITE_FUNC_UNSAFE - Usable if TRUSTED_SCHEMA or from +** top-level SQL +** +** If the function is not usable, create an error. +*/ +void sqlite3ExprFunctionUsable( + Parse *pParse, /* Parsing and code generating context */ + Expr *pExpr, /* The function invocation */ + FuncDef *pDef /* The function being invoked */ +){ + assert( !IN_RENAME_OBJECT ); + if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 + && ExprHasProperty(pExpr, EP_FromDDL) + ){ + if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 + || (pParse->db->flags & SQLITE_TrustedSchema)==0 + ){ + /* Functions prohibited in triggers and views if: + ** (1) tagged with SQLITE_DIRECTONLY + ** (2) not tagged with SQLITE_INNOCUOUS (which means it + ** is tagged with SQLITE_FUNC_UNSAFE) and + ** SQLITE_DBCONFIG_TRUSTED_SCHEMA is off (meaning + ** that the schema is possibly tainted). + */ + sqlite3ErrorMsg(pParse, "unsafe use of %s()", pDef->zName); + } + } +} + /* ** Assign a variable number to an expression that encodes a wildcard ** in the original SQL statement. @@ -4073,9 +4108,12 @@ expr_code_doover: break; } if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ + assert( (pDef->funcFlags & SQLITE_FUNC_UNSAFE)==0 ); + assert( (pDef->funcFlags & SQLITE_FUNC_DIRECT)==0 ); return exprCodeInlineFunction(pParse, pFarg, SQLITE_PTR_TO_INT(pDef->pUserData), target); } + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); for(i=0; ia[i].pExpr) ){ @@ -5740,6 +5778,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ }else{ pItem->iDistinct = -1; } + sqlite3ExprFunctionUsable(pParse, pExpr, pItem->pFunc); } } /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry diff --git a/src/resolve.c b/src/resolve.c index 929c8743f5..16546ada4b 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -876,33 +876,18 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ }else{ assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */ pExpr->op2 = pNC->ncFlags & NC_SelfRef; + if( pExpr->op2 ) ExprSetProperty(pExpr, EP_FromDDL); } if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 && pParse->nested==0 && (pParse->db->mDbFlags & DBFLAG_InternalFunc)==0 ){ /* Internal-use-only functions are disallowed unless the - ** SQL is being compiled using sqlite3NestedParse() */ + ** SQL is being compiled using sqlite3NestedParse() or + ** the SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test-control has be + ** used to activate internal functionsn for testing purposes */ no_such_func = 1; pDef = 0; - }else - if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 - && ExprHasProperty(pExpr, EP_FromDDL) - && !IN_RENAME_OBJECT - ){ - if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 - || (pParse->db->flags & SQLITE_TrustedSchema)==0 - ){ - /* Functions prohibited in triggers and views if: - ** (1) tagged with SQLITE_DIRECTONLY - ** (2) not tagged with SQLITE_INNOCUOUS (which means it - ** is tagged with SQLITE_FUNC_UNSAFE) and - ** SQLITE_DBCONFIG_UNTRUSTED_SCHEMA is off (meaning - ** that the schema is fully trustworthy). - */ - sqlite3ErrorMsg(pParse, "%s() prohibited in triggers and views", - pDef->zName); - } } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 455403637a..e56a4b3d54 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4056,6 +4056,7 @@ void sqlite3PExprAddSelect(Parse*, Expr*, Select*); Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*); Expr *sqlite3ExprSimplifiedAndOr(Expr*); Expr *sqlite3ExprFunction(Parse*,ExprList*, Token*, int); +void sqlite3ExprFunctionUsable(Parse*,Expr*,FuncDef*); void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32); void sqlite3ExprDelete(sqlite3*, Expr*); void sqlite3ExprUnmapAndDelete(Parse*, Expr*); diff --git a/test/fts3atoken.test b/test/fts3atoken.test index 5694dfb9f0..4981480b5e 100644 --- a/test/fts3atoken.test +++ b/test/fts3atoken.test @@ -138,7 +138,7 @@ do_catchsql_test fts3atoken-1.10 { } {0 {}} do_catchsql_test fts3atoken-1.11 { SELECT * FROM v110; -} {1 {fts3_tokenizer() prohibited in triggers and views}} +} {1 {unsafe use of fts3_tokenizer()}} do_catchsql_test fts3atoken-1.12 { CREATE TABLE t110(a,b); CREATE TRIGGER r110 AFTER INSERT ON t110 BEGIN @@ -147,7 +147,7 @@ do_catchsql_test fts3atoken-1.12 { } {0 {}} do_catchsql_test fts3atoken-1.13 { INSERT INTO t110(a,b) VALUES(1,2); -} {1 {fts3_tokenizer() prohibited in triggers and views}} +} {1 {unsafe use of fts3_tokenizer()}} do_catchsql_test fts3atoken-1.14 { SELECT * FROM t110; } {0 {}} diff --git a/test/func.test b/test/func.test index 3bfb1fe8ac..585ae1a14f 100644 --- a/test/func.test +++ b/test/func.test @@ -1430,7 +1430,7 @@ do_test func-33.1 { do_catchsql_test func-33.2 { CREATE VIEW v33(y) AS SELECT testdirectonly(15); SELECT * FROM v33; -} {1 {testdirectonly() prohibited in triggers and views}} +} {1 {unsafe use of testdirectonly()}} do_execsql_test func-33.3 { SELECT * FROM (SELECT testdirectonly(15)) AS v33; } {30} @@ -1441,7 +1441,7 @@ do_execsql_test func-33.4 { do_catchsql_test func-33.5 { WITH c(x) AS (SELECT * FROM v33) SELECT * FROM c; -} {1 {testdirectonly() prohibited in triggers and views}} +} {1 {unsafe use of testdirectonly()}} do_execsql_test func-33.10 { CREATE TABLE t33a(a,b); CREATE TABLE t33b(x,y); @@ -1451,7 +1451,7 @@ do_execsql_test func-33.10 { } {} do_catchsql_test func-33.11 { INSERT INTO t33a VALUES(1,2); -} {1 {testdirectonly() prohibited in triggers and views}} +} {1 {unsafe use of testdirectonly()}} do_execsql_test func-33.20 { ALTER TABLE t33a RENAME COLUMN a TO aaa; SELECT sql FROM sqlite_master WHERE name='r1'; diff --git a/test/trustschema1.test b/test/trustschema1.test new file mode 100644 index 0000000000..d536645397 --- /dev/null +++ b/test/trustschema1.test @@ -0,0 +1,44 @@ +# 2020-01-08 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Test cases for managing execution of code snippets found in untrusted +# schemas. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix trustschema1 + + +proc f1 {x} {return $x} +do_test 1.100 { + db function f1 -innocuous -deterministic f1 + db function f2 -deterministic f1 + db function f3 -directonly -deterministic f1 + db eval { + CREATE TABLE t1(a, b AS (f1(a+1)), c AS (f2(a+2))); + INSERT INTO t1 VALUES(100),(200); + } +} {} +do_catchsql_test 1.110 { + SELECT a, b, c FROM t1; +} {0 {100 101 102 200 201 202}} +do_execsql_test 1.120 { + PRAGMA trusted_schema=OFF; +} {} +do_catchsql_test 1.130 { + SELECT a, b FROM t1; +} {0 {100 101 200 201}} +do_catchsql_test 1.140 { + SELECT a, b, c FROM t1; +} {1 {unsafe use of f2()}} + +finish_test From 2eeca2046eae31d913e7bae79893e343c17bd624 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 8 Jan 2020 20:37:45 +0000 Subject: [PATCH 449/476] Performance improvements and test cases added. Allow "PRAGMA trusted_schema=ON" FossilOrigin-Name: 30882ca80f6c51f6bb7b2692c1ac3f19a7c61a23aa8730be79aec0ae3ef08d54 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/callback.c | 9 +++++---- src/expr.c | 9 ++++----- src/pragma.c | 2 +- src/resolve.c | 5 +++++ test/tclsqlite.test | 2 +- test/trustschema1.test | 34 ++++++++++++++++++++++++++++++++++ 8 files changed, 62 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index dd4d4bcc90..72132f8790 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Check\sfor\swhether\sor\snot\sit\sis\ssafe\sto\suse\snon-innocuous\sfunctions\sas\sthe\nfunction\sis\sbeing\scoded,\snot\swhen\sits\sname\sis\sresolved. -D 2020-01-08T17:28:19.750 +C Performance\simprovements\sand\stest\scases\sadded.\sAllow\s"PRAGMA\strusted_schema=ON" +D 2020-01-08T20:37:45.893 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -474,14 +474,14 @@ F src/btree.c d70000b51523138582663b578b7f8a13e5d03c73c7c7ef18fdeafe1c234bbc3c F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 F src/btreeInt.h 6794084fad08c9750b45145743c0e3e5c27c94dee89f26dd8df7073314934fd2 F src/build.c 67b1a8d3ac700747687dbdc49ded847a3c17fef450a8c919ac0399b44cbd4215 -F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 +F src/callback.c c547d00963ae28100117b4fb1f0f32242109b5804374ee3bfe01138a54da7f76 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 0f55297469d4244ab7df395849e1af98eb5e95816af7c661e7d2d8402dea23da F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c bea12b33808867bb8f336d4bd70ebedfef72bb96bd453adcb068e578417b5e46 +F src/expr.c b1cb02a4b4fd1d2723f3de13d212fb5649923783835e37ee94d2792cad983035 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -522,12 +522,12 @@ F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c f648521a5b25c5ac17ddebab920ee0e5890a9af3492f747fd2e89bbce4d7e1d9 +F src/pragma.c 6e13c9a885c0f2effaa6a1155b707d3d3e39bc572c3b003ce4caa9c2e9010ca3 F src/pragma.h 9f86a3a3a0099e651189521c8ad03768df598974e7bbdc21c7f9bb6125592fbd F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 5200d014fa78412f6189777cde3ac71b2dde55260c620be095610afe03fe9354 +F src/resolve.c 06abaef6272a4f0da048a1728b039a4f0beb318bda4bdc0efca89cb6af3b4f88 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c fbae5d6db63959aa1ecb34efe93caf5399444ca3c78d6f1ef4620b0ee5c37707 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f @@ -1402,7 +1402,7 @@ F test/tabfunc01.test 5ca6d004157a3e886a55a9387b960cc0db41acd88753eb597ff409ec6c F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test c4a5f5af3672fbe28a0aa322b88d9d1ce2225b6b1284ea11ede2e6d38e7c812c +F test/tclsqlite.test 6f8705d09377e2f2ff482ab181a1388773953a280623fff2ccab0e87d2bc10a2 F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1592,7 +1592,7 @@ F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499 -F test/trustschema1.test b337ef2d006c3c02ca822eca45bbc10d711ba96d12486cb0fa8e7beb5e0d7660 +F test/trustschema1.test aec32a37ef8468aa6f8e5645cdd22c6ff70e0cddfff39d70de5683c67a2c0091 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 @@ -1855,7 +1855,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0138652b6c2f21fd67e59a23a396a5b9d6a16ee9b44701cddfc49b23fddfce5b -R ce4061dc1b633cb47a4ee9d471ef9c80 +P 1da802d54b689a462e1fe899c6ffa08ef14d34f36728b14b055b5a76b1edc274 +R 78a6c1828843e575068f968acb0f372e U drh -Z 1c75c43008bf3984bb39f61126a3891e +Z ca06f3bd43b14133e2371bf0709d0315 diff --git a/manifest.uuid b/manifest.uuid index 3ce3dd07e0..e118370206 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1da802d54b689a462e1fe899c6ffa08ef14d34f36728b14b055b5a76b1edc274 \ No newline at end of file +30882ca80f6c51f6bb7b2692c1ac3f19a7c61a23aa8730be79aec0ae3ef08d54 \ No newline at end of file diff --git a/src/callback.c b/src/callback.c index a360e46ee4..3d991901d1 100644 --- a/src/callback.c +++ b/src/callback.c @@ -288,12 +288,13 @@ static int matchQuality( u8 enc /* Desired text encoding */ ){ int match; - - /* nArg of -2 is a special case */ - if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + assert( p->nArg>=-1 ); /* Wrong number of arguments means "no match" */ - if( p->nArg!=nArg && p->nArg>=0 ) return 0; + if( p->nArg!=nArg ){ + if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + if( p->nArg>=0 ) return 0; + } /* Give a better score to a function with a specific number of arguments ** than to function that accepts any number of arguments. */ diff --git a/src/expr.c b/src/expr.c index 7d712ad674..a9d59cfa60 100644 --- a/src/expr.c +++ b/src/expr.c @@ -990,9 +990,8 @@ void sqlite3ExprFunctionUsable( FuncDef *pDef /* The function being invoked */ ){ assert( !IN_RENAME_OBJECT ); - if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 - && ExprHasProperty(pExpr, EP_FromDDL) - ){ + assert( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 ); + if( ExprHasProperty(pExpr, EP_FromDDL) ){ if( (pDef->funcFlags & SQLITE_FUNC_DIRECT)!=0 || (pParse->db->flags & SQLITE_TrustedSchema)==0 ){ @@ -4112,8 +4111,9 @@ expr_code_doover: assert( (pDef->funcFlags & SQLITE_FUNC_DIRECT)==0 ); return exprCodeInlineFunction(pParse, pFarg, SQLITE_PTR_TO_INT(pDef->pUserData), target); + }else if( pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE) ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); } - sqlite3ExprFunctionUsable(pParse, pExpr, pDef); for(i=0; ia[i].pExpr) ){ @@ -5778,7 +5778,6 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ }else{ pItem->iDistinct = -1; } - sqlite3ExprFunctionUsable(pParse, pExpr, pItem->pFunc); } } /* Make pExpr point to the appropriate pAggInfo->aFunc[] entry diff --git a/src/pragma.c b/src/pragma.c index f577fd2b58..2c127ed5a7 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1107,7 +1107,7 @@ void sqlite3Pragma( #endif if( sqlite3GetBoolean(zRight, 0) ){ - db->flags |= (mask & ~(SQLITE_TrustedSchema)); + db->flags |= mask; }else{ db->flags &= ~mask; if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0; diff --git a/src/resolve.c b/src/resolve.c index 16546ada4b..cfdbc569fd 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -888,6 +888,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ ** used to activate internal functionsn for testing purposes */ no_such_func = 1; pDef = 0; + }else + if( (pDef->funcFlags & (SQLITE_FUNC_DIRECT|SQLITE_FUNC_UNSAFE))!=0 + && !IN_RENAME_OBJECT + ){ + sqlite3ExprFunctionUsable(pParse, pExpr, pDef); } } diff --git a/test/tclsqlite.test b/test/tclsqlite.test index d72f858666..b01da0ec23 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -789,7 +789,7 @@ do_test 17.6.2 { do_test 17.6.3 { list [catch { db function xyz -n object ret } msg] $msg -} {1 {bad option "-n": must be -argcount, -deterministic, -directonly, or -returntype}} +} {1 {bad option "-n": must be -argcount, -deterministic, -directonly, -innocuous, or -returntype}} # 2019-02-28: The "bind_fallback" command. # diff --git a/test/trustschema1.test b/test/trustschema1.test index d536645397..1d8b5f924e 100644 --- a/test/trustschema1.test +++ b/test/trustschema1.test @@ -41,4 +41,38 @@ do_catchsql_test 1.140 { SELECT a, b, c FROM t1; } {1 {unsafe use of f2()}} +do_catchsql_test 1.200 { + CREATE TABLE t2(a,b,c,CHECK(f3(c)==c)); +} {1 {unsafe use of f3()}} +do_catchsql_test 1.210 { + PRAGMA trusted_schema=Off; + CREATE TABLE t2(a,b,c,CHECK(f2(c)==c)); +} {1 {unsafe use of f2()}} +do_catchsql_test 1.211 { + PRAGMA trusted_schema=On; + CREATE TABLE t2(a,b,c,CHECK(f2(c)==c)); +} {0 {}} +do_catchsql_test 1.220 { + INSERT INTO t2 VALUES(1,2,3); + SELECT * FROM t2; +} {0 {1 2 3}} +do_catchsql_test 1.230 { + PRAGMA trusted_schema=off; + INSERT INTO t2 VALUES(4,5,6); +} {1 {unsafe use of f2()}} +do_execsql_test 1.231 { + SELECT * FROM t2; +} {1 2 3} + +do_catchsql_test 1.300 { + CREATE TABLE t3(a,b DEFAULT(f2(25))); +} {0 {}} +do_catchsql_test 1.310 { + PRAGMA trusted_schema=Off; + INSERT INTO t3(a) VALUES(1); +} {1 {unsafe use of f2()}} +do_catchsql_test 1.311 { + INSERT INTO t3(a,b) VALUES(1,2); +} {0 {}} + finish_test From 014fff20adb15674b91be74895fc8e3164a92434 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 8 Jan 2020 22:22:36 +0000 Subject: [PATCH 450/476] Block edgy functions used in DEFAULT constraints. FossilOrigin-Name: da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 3 ++- src/expr.c | 28 +++++++++++++++++++++------- src/treeview.c | 2 +- 5 files changed, 33 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 72132f8790..c99f7e7da3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovements\sand\stest\scases\sadded.\sAllow\s"PRAGMA\strusted_schema=ON" -D 2020-01-08T20:37:45.893 +C Block\sedgy\sfunctions\sused\sin\sDEFAULT\sconstraints. +D 2020-01-08T22:22:36.071 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -473,7 +473,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c d70000b51523138582663b578b7f8a13e5d03c73c7c7ef18fdeafe1c234bbc3c F src/btree.h 6111552f19ed7a40f029cf4b33badc6fef9880314fffd80a945f0b7f43ab7471 F src/btreeInt.h 6794084fad08c9750b45145743c0e3e5c27c94dee89f26dd8df7073314934fd2 -F src/build.c 67b1a8d3ac700747687dbdc49ded847a3c17fef450a8c919ac0399b44cbd4215 +F src/build.c bd2f382562b08f14748d54402220be1082c2f8ff8973fad47e45a381c438f9bf F src/callback.c c547d00963ae28100117b4fb1f0f32242109b5804374ee3bfe01138a54da7f76 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -481,7 +481,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 0f55297469d4244ab7df395849e1af98eb5e95816af7c661e7d2d8402dea23da F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c b1cb02a4b4fd1d2723f3de13d212fb5649923783835e37ee94d2792cad983035 +F src/expr.c c5ff3bb83e5b512f6251a37e7ac9f5b1686e6a135e22d40c013d7d267a532af5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -594,7 +594,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 7b17f6e2f20f6cbcb0b215025a86b7457c38451fc7622f705e553d7a488c572d -F src/treeview.c f51bdcac260ed3eafd8880e857c56e086e28340a1d7b49b487893610d71a2325 +F src/treeview.c 438c1000587b33faba35e87596bebcf7f40638d98f33781cdd9e04711b18b09c F src/trigger.c a40d50e88bd3355f1d2a73f0a3b2d6b42eae26ca4219001b82ef0d064439badc F src/update.c 9ad19af96aff95dc02a923a99f97c1bc0b909009a29a2914b796f786b9ac0c60 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 @@ -1855,7 +1855,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1da802d54b689a462e1fe899c6ffa08ef14d34f36728b14b055b5a76b1edc274 -R 78a6c1828843e575068f968acb0f372e +P 30882ca80f6c51f6bb7b2692c1ac3f19a7c61a23aa8730be79aec0ae3ef08d54 +R 2d6bd4faf1a02c29990cd0df461c78ad U drh -Z ca06f3bd43b14133e2371bf0709d0315 +Z 9253d4aa29f3b6b8cb96462d5b434aa9 diff --git a/manifest.uuid b/manifest.uuid index e118370206..640d9dc50c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -30882ca80f6c51f6bb7b2692c1ac3f19a7c61a23aa8730be79aec0ae3ef08d54 \ No newline at end of file +da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 81332356ec..f0435aacec 100644 --- a/src/build.c +++ b/src/build.c @@ -1404,8 +1404,9 @@ void sqlite3AddDefaultValue( sqlite3 *db = pParse->db; p = pParse->pNewTable; if( p!=0 ){ + int isInit = db->init.busy && db->init.iDb!=1; pCol = &(p->aCol[p->nCol-1]); - if( !sqlite3ExprIsConstantOrFunction(pExpr, db->init.busy) ){ + if( !sqlite3ExprIsConstantOrFunction(pExpr, isInit) ){ sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", pCol->zName); #ifndef SQLITE_OMIT_GENERATED_COLUMNS diff --git a/src/expr.c b/src/expr.c index a9d59cfa60..994e3fe07f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1971,10 +1971,11 @@ Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ ** In all cases, the callbacks set Walker.eCode=0 and abort if the expression ** is found to not be a constant. ** -** The sqlite3ExprIsConstantOrFunction() is used for evaluating expressions -** in a CREATE TABLE statement. The Walker.eCode value is 5 when parsing -** an existing schema and 4 when processing a new statement. A bound -** parameter raises an error for new statements, but is silently converted +** The sqlite3ExprIsConstantOrFunction() is used for evaluating DEFAULT +** expressions in a CREATE TABLE statement. The Walker.eCode value is 5 +** when parsing an existing schema out of the sqlite_master table and 4 +** when processing a new CREATE TABLE statement. A bound parameter raises +** an error for new statements, but is silently converted ** to NULL for existing schemas. This allows sqlite_master tables that ** contain a bound parameter because they were generated by older versions ** of SQLite to be parsed by newer versions of SQLite without raising a @@ -1998,6 +1999,7 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ if( (pWalker->eCode>=4 || ExprHasProperty(pExpr,EP_ConstFunc)) && !ExprHasProperty(pExpr, EP_WinFunc) ){ + if( pWalker->eCode==5 ) ExprSetProperty(pExpr, EP_FromDDL); return WRC_Continue; }else{ pWalker->eCode = 0; @@ -2161,9 +2163,21 @@ int sqlite3ExprIsConstantOrGroupBy(Parse *pParse, Expr *p, ExprList *pGroupBy){ } /* -** Walk an expression tree. Return non-zero if the expression is constant -** or a function call with constant arguments. Return and 0 if there -** are any variables. +** Walk an expression tree for the DEFAULT field of a column definition +** in a CREATE TABLE statement. Return non-zero if the expression is +** acceptable for use as a DEFAULT. That is to say, return non-zero if +** the expression is constant or a function call with constant arguments. +** Return and 0 if there are any variables. +** +** isInit is true when parsing from sqlite_master. isInit is false when +** processing a new CREATE TABLE statement. When isInit is true, parameters +** (such as ? or $abc) in the expression are converted into NULL. When +** isInit is false, parameters raise an error. Parameters should not be +** allowed in a CREATE TABLE statement, but some legacy versions of SQLite +** allowed it, so we need to support it when reading sqlite_master for +** backwards compatibility. +** +** If isInit is true, set EP_FromDDL on every TK_FUNCTION node. ** ** For the purposes of this function, a double-quoted string (ex: "abc") ** is considered a variable but a single-quoted string (ex: 'abc') is diff --git a/src/treeview.c b/src/treeview.c index 1ea2f24f2f..90a1d2dcc9 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -572,7 +572,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ }else{ pFarg = pExpr->x.pList; #ifndef SQLITE_OMIT_WINDOWFUNC - pWin = pExpr->y.pWin; + pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0; #else pWin = 0; #endif From 05b32ee3c0788fbe3d210ade38e186c903678556 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 01:20:03 +0000 Subject: [PATCH 451/476] Fix a problem that restricted edgy functions in TEMP tables. New test cases added. FossilOrigin-Name: 8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d --- manifest | 16 ++-- manifest.uuid | 2 +- src/resolve.c | 7 +- src/sqliteInt.h | 1 + test/trustschema1.test | 175 ++++++++++++++++++++++++++++++++++++++++- 5 files changed, 190 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index c99f7e7da3..2544b8cd3d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Block\sedgy\sfunctions\sused\sin\sDEFAULT\sconstraints. -D 2020-01-08T22:22:36.071 +C Fix\sa\sproblem\sthat\srestricted\sedgy\sfunctions\sin\sTEMP\stables.\nNew\stest\scases\sadded. +D 2020-01-09T01:20:03.116 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -527,14 +527,14 @@ F src/pragma.h 9f86a3a3a0099e651189521c8ad03768df598974e7bbdc21c7f9bb6125592fbd F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 06abaef6272a4f0da048a1728b039a4f0beb318bda4bdc0efca89cb6af3b4f88 +F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c fbae5d6db63959aa1ecb34efe93caf5399444ca3c78d6f1ef4620b0ee5c37707 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f F src/sqlite.h.in 06452043348e35cf6108345a35574a2faa4d1c2829beefb1e73c73d6bfb2fa80 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h 0ca99e207087851fd27c6e1314fc52d273caa424ff2bafa3f1daf6d5eb63b35a +F src/sqliteInt.h ee242902766f9a96aeaca4315dbe1e204bbb2954cd455ffa085bba84fa47956b F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1592,7 +1592,7 @@ F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499 -F test/trustschema1.test aec32a37ef8468aa6f8e5645cdd22c6ff70e0cddfff39d70de5683c67a2c0091 +F test/trustschema1.test 4e970aef0bfe0cee139703cc7209d0e0f07725d999b180ba50770f49edef1494 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 @@ -1855,7 +1855,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 30882ca80f6c51f6bb7b2692c1ac3f19a7c61a23aa8730be79aec0ae3ef08d54 -R 2d6bd4faf1a02c29990cd0df461c78ad +P da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398 +R 5d23da58c4e26d6a3869b8997dbb1f9d U drh -Z 9253d4aa29f3b6b8cb96462d5b434aa9 +Z 2a63c0c342c8804a0df9ef8a4a5f7519 diff --git a/manifest.uuid b/manifest.uuid index 640d9dc50c..e7e1532d0f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398 \ No newline at end of file +8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index cfdbc569fd..3e5ac16e2e 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -876,7 +876,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ }else{ assert( (NC_SelfRef & 0xff)==NC_SelfRef ); /* Must fit in 8 bits */ pExpr->op2 = pNC->ncFlags & NC_SelfRef; - if( pExpr->op2 ) ExprSetProperty(pExpr, EP_FromDDL); + if( pNC->ncFlags & NC_FromDDL ) ExprSetProperty(pExpr, EP_FromDDL); } if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 && pParse->nested==0 @@ -1884,6 +1884,11 @@ int sqlite3ResolveSelfReference( sSrc.a[0].zName = pTab->zName; sSrc.a[0].pTab = pTab; sSrc.a[0].iCursor = -1; + if( pTab->pSchema!=pParse->db->aDb[1].pSchema ){ + /* Cause EP_FromDDL to be set on TK_FUNCTION nodes of non-TEMP + ** schema elements */ + type |= NC_FromDDL; + } } sNC.pParse = pParse; sNC.pSrcList = &sSrc; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e56a4b3d54..14c17a42e6 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2968,6 +2968,7 @@ struct NameContext { #define NC_HasWin 0x08000 /* One or more window functions seen */ #define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */ #define NC_InAggFunc 0x20000 /* True if analyzing arguments to an agg func */ +#define NC_FromDDL 0x40000 /* SQL text comes from sqlite_master */ /* ** An instance of the following object describes a single ON CONFLICT diff --git a/test/trustschema1.test b/test/trustschema1.test index 1d8b5f924e..dba954f146 100644 --- a/test/trustschema1.test +++ b/test/trustschema1.test @@ -17,7 +17,8 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix trustschema1 - +# edgy functions used in generated columns +# proc f1 {x} {return $x} do_test 1.100 { db function f1 -innocuous -deterministic f1 @@ -40,8 +41,22 @@ do_catchsql_test 1.130 { do_catchsql_test 1.140 { SELECT a, b, c FROM t1; } {1 {unsafe use of f2()}} +do_catchsql_test 1.150 { + PRAGMA trusted_schema=ON; + DROP TABLE t1; + CREATE TABLE t1(a, b AS (f3(a+1))); +} {1 {unsafe use of f3()}} +do_execsql_test 1.160 { + PRAGMA trusted_schema=OFF; + CREATE TEMP TABLE temp1(a,b AS (f3(a+1))); + INSERT INTO temp1(a) VALUES(100),(900); + SELECT * FROM temp1; +} {100 101 900 901} +# edgy functions used in CHECK constraints +# do_catchsql_test 1.200 { + PRAGMA trusted_schema=ON; CREATE TABLE t2(a,b,c,CHECK(f3(c)==c)); } {1 {unsafe use of f3()}} do_catchsql_test 1.210 { @@ -63,7 +78,17 @@ do_catchsql_test 1.230 { do_execsql_test 1.231 { SELECT * FROM t2; } {1 2 3} +# Ok to put as many edgy functions as you want in a +# TEMP table. +do_execsql_test 1.240 { + PRAGMA trusted_schema=OFF; + CREATE TEMP TABLE temp2(a, b, CHECK(f3(b)==b)); + INSERT INTO temp2(a,b) VALUES(1,2),('x','y'); + SELECT * FROM temp2; +} {1 2 x y} +# edgy functions used in DEFAULT constraints +# do_catchsql_test 1.300 { CREATE TABLE t3(a,b DEFAULT(f2(25))); } {0 {}} @@ -74,5 +99,153 @@ do_catchsql_test 1.310 { do_catchsql_test 1.311 { INSERT INTO t3(a,b) VALUES(1,2); } {0 {}} +do_execsql_test 1.320 { + CREATE TEMP TABLE temp3(a, b DEFAULT(f3(31))); + INSERT INTO temp3(a) VALUES(22); + SELECT * FROM temp3; +} {22 31} + +# edgy functions used in partial indexes. +# +do_execsql_test 1.400 { + CREATE TABLE t4(a,b,c); + INSERT INTO t4 VALUES(1,2,3),('a','b','c'),(4,'d',0); + SELECT * FROM t4; + CREATE TEMP TABLE temp4(a,b,c); + INSERT INTO temp4 SELECT * FROM t4; +} {1 2 3 a b c 4 d 0} +do_catchsql_test 1.410 { + CREATE INDEX t4a ON t4(a) WHERE f3(c); +} {1 {unsafe use of f3()}} +do_catchsql_test 1.420 { + PRAGMA trusted_schema=OFF; + CREATE INDEX t4a ON t4(a) WHERE f2(c); +} {1 {unsafe use of f2()}} +do_execsql_test 1.421 { + CREATE INDEX t4a ON t4(a) WHERE f1(c); + SELECT a FROM t4 WHERE f1(c) ORDER BY a; +} {1} +do_execsql_test 1.430 { + PRAGMA trusted_schema=ON; + CREATE INDEX t4b ON t4(b) WHERE f2(c); + SELECT b FROM t4 WHERE f2(c) ORDER BY b; +} {2} +do_execsql_test 1.440 { + PRAGMA trusted_schema=OFF; + CREATE INDEX temp4a ON temp4(a) WHERE f3(c); + SELECT a FROM temp4 WHERE f2(c) ORDER BY a; +} {1} + +# edgy functions used in index expressions +# +do_execsql_test 1.500 { + CREATE TABLE t5(a,b,c); + INSERT INTO t5 VALUES(1,2,3),(4,5,6),(7,0,-3); + SELECT * FROM t5; + CREATE TEMP TABLE temp5(a,b,c); + INSERT INTO temp5 SELECT * FROM t5; +} {1 2 3 4 5 6 7 0 -3} +do_catchsql_test 1.510 { + CREATE INDEX t5x1 ON t5(a+f3(b)); +} {1 {unsafe use of f3()}} +do_catchsql_test 1.520 { + PRAGMA trusted_schema=OFF; + CREATE INDEX t5x1 ON t5(a+f2(b)); +} {1 {unsafe use of f2()}} +do_execsql_test 1.521 { + CREATE INDEX t5x1 ON t5(a+f1(b)); + SELECT * FROM t5 INDEXED BY t5x1 WHERE a+f1(b)=3; +} {1 2 3} +do_execsql_test 1.530 { + PRAGMA trusted_schema=ON; + CREATE INDEX t5x2 ON t5(b+f2(c)); + SELECT * FROM t5 INDEXED BY t5x2 WHERE b+f2(c)=11; +} {4 5 6} +do_execsql_test 1.540 { + PRAGMA trusted_schema=OFF; + CREATE INDEX temp5x1 ON temp5(a+f3(b)); + SELECT * FROM temp5 INDEXED BY temp5x1 WHERE a+f3(b)=7; +} {7 0 -3} + +# edgy functions in VIEWs +# +reset_db +db function f1 -innocuous -deterministic f1 +db function f2 -deterministic f1 +db function f3 -directonly -deterministic f1 +do_execsql_test 2.100 { + CREATE TABLE t1(a,b,c); + INSERT INTO t1 VALUES(1,2,3),(100,50,75),(-11,22,-33); + CREATE VIEW v1a AS SELECT f3(a+b) FROM t1; + SELECT f3(a+b) FROM t1; +} {3 150 11} +do_catchsql_test 2.110 { + PRAGMA trusted_schema=ON; + SELECT * FROM v1a; +} {1 {unsafe use of f3()}} +do_catchsql_test 2.111 { + PRAGMA trusted_schema=OFF; + SELECT * FROM v1a; +} {1 {unsafe use of f3()}} +do_execsql_test 2.120 { + DROP VIEW v1a; + CREATE TEMP VIEW v1a AS SELECT f3(a+b) FROM t1; + SELECT * FROM v1a; +} {3 150 11} +do_execsql_test 2.130 { + CREATE VIEW v1b AS SELECT f2(b+c) FROM t1; + SELECT f2(b+c) FROM t1; +} {5 125 -11} +do_catchsql_test 2.140 { + PRAGMA trusted_schema=ON; + SELECT * FROM v1b; +} {0 {5 125 -11}} +do_catchsql_test 2.141 { + PRAGMA trusted_schema=OFF; + SELECT * FROM v1b; +} {1 {unsafe use of f2()}} +do_execsql_test 2.150 { + DROP VIEW v1b; + CREATE TEMP VIEW v1b AS SELECT f2(b+c) FROM t1; + SELECT * FROM v1b; +} {5 125 -11} + +# edgy functions inside of triggers +# +do_execsql_test 3.100 { + DELETE FROM t1; + CREATE TABLE t2(x); + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2(x) SELECT f3(new.a); + END; +} {} +do_catchsql_test 3.110 { + INSERT INTO t1 VALUES(7,6,5); +} {1 {unsafe use of f3()}} +do_execsql_test 3.111 { + SELECT * FROM t1; + SELECT * FROM t2; +} {} + +do_execsql_test 3.120 { + DROP TRIGGER r1; + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2(x) SELECT f2(new.a)+100; + END; + PRAGMA trusted_schema=ON; + INSERT INTO t1 VALUES(7,6,5); + SELECT * FROM t1, t2; +} {7 6 5 107} +do_catchsql_test 3.130 { + DELETE FROM t1; + DELETE FROM t2; + PRAGMA trusted_schema=OFF; + INSERT INTO t1 VALUES(7,6,5); +} {1 {unsafe use of f2()}} +do_execsql_test 3.131 { + SELECT * FROM t1; + SELECT * FROM t2; +} {} + finish_test From 32266a1072dae25c0bb52dc3aa6853e861f5d779 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 13:08:28 +0000 Subject: [PATCH 452/476] Simplified error message for the unsafe use of a virtual table. FossilOrigin-Name: d662129a601e05e8fca5717a890b5bc920b80a750d061f3c2494788d32b917a5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2544b8cd3d..a4a0bd8da2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sthat\srestricted\sedgy\sfunctions\sin\sTEMP\stables.\nNew\stest\scases\sadded. -D 2020-01-09T01:20:03.116 +C Simplified\serror\smessage\sfor\sthe\sunsafe\suse\sof\sa\svirtual\stable. +D 2020-01-09T13:08:28.875 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -529,7 +529,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c fbae5d6db63959aa1ecb34efe93caf5399444ca3c78d6f1ef4620b0ee5c37707 +F src/select.c 0ae5299e59845657ccbe1e05817b9926807523d3ca584e80040f57eab892b98a F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f F src/sqlite.h.in 06452043348e35cf6108345a35574a2faa4d1c2829beefb1e73c73d6bfb2fa80 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1855,7 +1855,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P da434dc149786e4b1cd80b3b2b25f8b614d0dec62d5439f839a66b536999e398 -R 5d23da58c4e26d6a3869b8997dbb1f9d +P 8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d +R 0dd0572d840f5da124648f9c608f9c87 U drh -Z 2a63c0c342c8804a0df9ef8a4a5f7519 +Z 4a660a42e378fba2b6c64d3dce74af2a diff --git a/manifest.uuid b/manifest.uuid index e7e1532d0f..47e32ca86f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d \ No newline at end of file +d662129a601e05e8fca5717a890b5bc920b80a750d061f3c2494788d32b917a5 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 34c476ff73..e7fd1b8c9f 100644 --- a/src/select.c +++ b/src/select.c @@ -4977,8 +4977,8 @@ static int selectExpander(Walker *pWalker, Select *p){ && ALWAYS(pTab->pVTable!=0) && pTab->pVTable->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0) ){ - sqlite3ErrorMsg(pParse, "cannot access \"%s\" from within a trigger" - " or view", pTab->zName); + sqlite3ErrorMsg(pParse, "unsafe use of virtual table \"%s\"", + pTab->zName); } pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); nCol = pTab->nCol; From b0c4ef711f625e1cdcc1340803e87e681e21e5f3 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 14:51:47 +0000 Subject: [PATCH 453/476] Design notes for the new-security-options branch. FossilOrigin-Name: af7c1ed4f8a7293d0ecacca3cfbe9414e0de5ec40b418ce7831b8dc724feb747 --- doc/trusted-schema.md | 142 ++++++++++++++++++++++++++++++++++++++++++ manifest | 11 ++-- manifest.uuid | 2 +- 3 files changed, 149 insertions(+), 6 deletions(-) create mode 100644 doc/trusted-schema.md diff --git a/doc/trusted-schema.md b/doc/trusted-schema.md new file mode 100644 index 0000000000..32abf9d4d0 --- /dev/null +++ b/doc/trusted-schema.md @@ -0,0 +1,142 @@ +# The new-security-options branch + +## The problem that the [new-security-options](/timeline?r=new-security-options) branch tries to solve + +An attacker might modify the schema of an SQLite database by adding +structures that cause code to run when some other application opens and +reads the database. For example, the attacker might replace a table +definition with a view. Or the attacker might add triggers to tables +or views, or add new CHECK constraints or generated columns or indexes +with expressions in the index list or in the WHERE clause. If the +added features invoke SQL functions or virtual tables with side effects, +that might cause harm to the system if run by a high-privilege victim. +Or, the added features might exfiltrate information if the database is +read by a high-privilege victim. + +The changes in this branch strive to make it easier for high-privilege +applications to safely read SQLite database files that might have been +maliciously corrupted by an attacker. + +## Overview of changes in [new-security-options](/timeline?r=new-security-options) + +The basic idea is to tag every SQL function and virtual table with one +of three risk levels: + + 1. Innocuous + 2. Normal + 3. Direct-Only + +Innocuous functions/vtabs are safe and can be used at any time. +Direct-only elements, in contrast, might have cause side-effects and +should only be used from top-level SQL, not from within triggers or views nor +in elements of the schema such as CHECK constraint, DEFAULT values, +generated columns, index expressions, or in the WHERE clause of a +partial index that are potentially under the control of an attacker. +Normal elements be have like Innocuous if TRUSTED\_SCHEMA=on +and behave like direct-only if TRUSTED\_SCHEMA=off. + +Application-defined functions and virtual tables go in as Normal unless +the application takes deliberate stesp to change the risk level. + +For backwards compatibility, the default is TRUSTED\_SCHEMA=on. Documentation +will be updated to recommend applications turn TRUSTED\_SCHEMA to off. + +An innocuous function or virtual table is one that can only read content +from the database file in which it resides, and can only alter the database +in which it resides. Most SQL functions are innocuous. For example, there +is no harm in an attacker running the abs() function. + +Direct-only elements that have side-effects that go outside the database file +in which it lives, or return information from outside of the database file. +Examples of direct-only elements include: + + 1. The fts3_tokenizer() function + 2. The writefile() function + 3. The readfile() function + 4. The zipvfs virtual table + 5. The csv virtual table + +We do not want an attacker to be able to add these kinds of things to +the database schema and possibly trick a high-privilege application +from performing any of these actions. Therefore, functions and vtabs +with side-effects are marked as Direct-Only. + +Legacy applications might add other risky functions or vtabs. Those will +go in as "Normal" by default. For optimal security, we want those risky +app-defined functions and vtabs to be direct-only, but making that the +default might break some legacy applications. Hence, all app-defined +functions and vtabs go in as Normal, but the application can switch them +over to "Direct-Only" behavior using a single pragma. + +The restrictions on the use of functions and virtual tables do not apply +to TEMP. A TEMP VIEW or a TEMP TRIGGER can use any valid SQL function +or virtual table. The idea is that TEMP views and triggers must be +directly created by the application and are thus under the control of the +application. TEMP views and triggers cannot be created by an attacker who +corrupts the schema of a persistent database file. Hence TEMP views and +triggers are safe. + +## Specific changes + + 1. New sqlite3\_db\_config() option SQLITE\_DBCONFIG\_TRUSTED\_SCHEMA for + turning TRUSTED\_SCHEMA on and off. It defaults to ON. + + 2. Compile-time option -DSQLITE\_TRUSTED\_SCHEMA=0 causes the default + TRUSTED\_SCHEMA setting to be off. + + 3. New pragma "PRAGMA trusted\_schema=(ON\|OFF);". This provides access + to the TRUSTED_SCHEMA setting for application coded using scripting + languages or other secondary languages where they are unable to make + calls to sqlite3\_db\_config(). + + 4. New options for the "enc" parameter to sqlite3\_create\_function() and + its kin: +
    +
  1. _SQLITE\_INNOCUOUS_ → tags the new functions as Innocuous +
  2. _SQLITE\_DIRECTONLY_ → tags the new functions as Direct-Only +
+ + 5. New options to sqlite3\_vtab\_config(): +
    +
  1. _SQLITE\_VTAB\_INNOCUOUS_ → tags the vtab as Innocuous +
  2. _SQLITE\_VTAB\_DIRECTONLY_ → tags the vtab as Direct-Only +
+ + 6. Change many of the functions and virtual tables in the SQLite source + tree to use one of the tags above. + + 7. Enhanced PRAGMA function\_list and virtual-table "pragma\_function\_list" + with additional columns. The columns now are: +
    +
  • _name_ → Name of the function +
  • _builtin_ → 1 for built-in functions. 0 otherwise. +
  • _type_ → 's'=Scalar, 'a'=Aggregate, 'w'=Window +
  • _enc_ → 'utf8', 'utf16le', or 'utf16be' +
  • _narg_ → number of argument +
  • _flags_ → Bitmask of SQLITE\_INNOCUOUS, SQLITE\_DIRECTONLY, + SQLITE\_DETERMINISTIC, SQLITE\_SUBTYPE, and + SQLITE\_FUNC\_INTERNAL flags. +
+

The last four columns are new. + + 8. The function\_list PRAGMA now also shows all entries for each function. + So, for example, if a function can take either 2 or 3 arguments, + there are separate rows for the 2-argument and 3-argument versions of + the function. + +## Additional Notes + +The function_list enhancements allow the application to query the set +of SQL functions that meet various criteria. For example, to see all +SQL functions that are never allowed to be used in the schema or in +trigger or views: + +~~~ + SELECT DISTINCT name FROM pragma_function_list + WHERE (flags & 0x80000)!=0 + ORDER BY name; +~~~ + +Doing the same is not possible for virtual tables, as a virtual table +might be Innocuous, Normal, or Direct-Only depending on the arguments +passed into the xConnect method. diff --git a/manifest b/manifest index a4a0bd8da2..fbcbb2b31d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplified\serror\smessage\sfor\sthe\sunsafe\suse\sof\sa\svirtual\stable. -D 2020-01-09T13:08:28.875 +C Design\snotes\sfor\sthe\snew-security-options\sbranch. +D 2020-01-09T14:51:47.198 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -40,6 +40,7 @@ F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 +F doc/trusted-schema.md f6f680325d98cd3d2e60fc1b189c89bd91e7cf243a7538ddaaa77a9a85ecfc27 F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91 @@ -1855,7 +1856,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8878c40753566a8c4ccd1d413019cabde7569b947f730527d13bfc3db384e97d -R 0dd0572d840f5da124648f9c608f9c87 +P d662129a601e05e8fca5717a890b5bc920b80a750d061f3c2494788d32b917a5 +R e15da1979fa75b113b42a835dcf65862 U drh -Z 4a660a42e378fba2b6c64d3dce74af2a +Z 56f64c5778330d36d74ed745f5b7a873 diff --git a/manifest.uuid b/manifest.uuid index 47e32ca86f..40f122c7f0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d662129a601e05e8fca5717a890b5bc920b80a750d061f3c2494788d32b917a5 \ No newline at end of file +af7c1ed4f8a7293d0ecacca3cfbe9414e0de5ec40b418ce7831b8dc724feb747 \ No newline at end of file From 3858be3e599d174a8a9b3e68810578be551946ff Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 15:18:08 +0000 Subject: [PATCH 454/476] Minor formatting changes in the trusted-schema.md document. FossilOrigin-Name: 55553b5e5ece8282f6a56a6f5c71024eaaef3c86ec42203af3da708b0de3643b --- doc/trusted-schema.md | 16 ++++++++-------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/doc/trusted-schema.md b/doc/trusted-schema.md index 32abf9d4d0..c552825eb2 100644 --- a/doc/trusted-schema.md +++ b/doc/trusted-schema.md @@ -22,9 +22,9 @@ maliciously corrupted by an attacker. The basic idea is to tag every SQL function and virtual table with one of three risk levels: - 1. Innocuous - 2. Normal - 3. Direct-Only + 1. Innocuous + 2. Normal + 3. Direct-Only Innocuous functions/vtabs are safe and can be used at any time. Direct-only elements, in contrast, might have cause side-effects and @@ -50,11 +50,11 @@ Direct-only elements that have side-effects that go outside the database file in which it lives, or return information from outside of the database file. Examples of direct-only elements include: - 1. The fts3_tokenizer() function - 2. The writefile() function - 3. The readfile() function - 4. The zipvfs virtual table - 5. The csv virtual table + 1. The fts3\_tokenizer() function + 2. The writefile() function + 3. The readfile() function + 4. The zipvfs virtual table + 5. The csv virtual table We do not want an attacker to be able to add these kinds of things to the database schema and possibly trick a high-privilege application diff --git a/manifest b/manifest index fbcbb2b31d..0261867caf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Design\snotes\sfor\sthe\snew-security-options\sbranch. -D 2020-01-09T14:51:47.198 +C Minor\sformatting\schanges\sin\sthe\strusted-schema.md\sdocument. +D 2020-01-09T15:18:08.637 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -40,7 +40,7 @@ F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/trusted-schema.md f6f680325d98cd3d2e60fc1b189c89bd91e7cf243a7538ddaaa77a9a85ecfc27 +F doc/trusted-schema.md 85ce619aa1c7234931b7a9ee681ae1ebc781ade512a61ca03f0248f473c8dbaa F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91 @@ -1856,7 +1856,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d662129a601e05e8fca5717a890b5bc920b80a750d061f3c2494788d32b917a5 -R e15da1979fa75b113b42a835dcf65862 +P af7c1ed4f8a7293d0ecacca3cfbe9414e0de5ec40b418ce7831b8dc724feb747 +R b5a1b0709d80497117a6d5aa63bfc530 U drh -Z 56f64c5778330d36d74ed745f5b7a873 +Z 1bcdfac76412383a4c9029e5fef7a395 diff --git a/manifest.uuid b/manifest.uuid index 40f122c7f0..e4192f2c3c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -af7c1ed4f8a7293d0ecacca3cfbe9414e0de5ec40b418ce7831b8dc724feb747 \ No newline at end of file +55553b5e5ece8282f6a56a6f5c71024eaaef3c86ec42203af3da708b0de3643b \ No newline at end of file From 51ebd5fa14916c791f2bde20810d9eed107e0db5 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 16:00:08 +0000 Subject: [PATCH 455/476] Fix minor typos in the trusted-schema.md document. FossilOrigin-Name: 87aea3ab1cdda4533e6fed605d1295e83bae0bbb9e1b238d239ce158a0d42954 --- doc/trusted-schema.md | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/doc/trusted-schema.md b/doc/trusted-schema.md index c552825eb2..d431fd49a3 100644 --- a/doc/trusted-schema.md +++ b/doc/trusted-schema.md @@ -32,11 +32,11 @@ should only be used from top-level SQL, not from within triggers or views nor in elements of the schema such as CHECK constraint, DEFAULT values, generated columns, index expressions, or in the WHERE clause of a partial index that are potentially under the control of an attacker. -Normal elements be have like Innocuous if TRUSTED\_SCHEMA=on +Normal elements behave like Innocuous if TRUSTED\_SCHEMA=on and behave like direct-only if TRUSTED\_SCHEMA=off. Application-defined functions and virtual tables go in as Normal unless -the application takes deliberate stesp to change the risk level. +the application takes deliberate steps to change the risk level. For backwards compatibility, the default is TRUSTED\_SCHEMA=on. Documentation will be updated to recommend applications turn TRUSTED\_SCHEMA to off. diff --git a/manifest b/manifest index 0261867caf..adf0883fee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sformatting\schanges\sin\sthe\strusted-schema.md\sdocument. -D 2020-01-09T15:18:08.637 +C Fix\sminor\stypos\sin\sthe\strusted-schema.md\sdocument. +D 2020-01-09T16:00:08.934 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -40,7 +40,7 @@ F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd F doc/lemon.html 24956ab2995e55fe171e55bdd04f22b553957dc8bb43501dbb9311e30187e0d3 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/trusted-schema.md 85ce619aa1c7234931b7a9ee681ae1ebc781ade512a61ca03f0248f473c8dbaa +F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91 @@ -1856,7 +1856,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P af7c1ed4f8a7293d0ecacca3cfbe9414e0de5ec40b418ce7831b8dc724feb747 -R b5a1b0709d80497117a6d5aa63bfc530 +P 55553b5e5ece8282f6a56a6f5c71024eaaef3c86ec42203af3da708b0de3643b +R 36e30271b935c30d68186edc80f5a0f4 U drh -Z 1bcdfac76412383a4c9029e5fef7a395 +Z e885b154077129671d15d2a44722704d diff --git a/manifest.uuid b/manifest.uuid index e4192f2c3c..0ea17ec104 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55553b5e5ece8282f6a56a6f5c71024eaaef3c86ec42203af3da708b0de3643b \ No newline at end of file +87aea3ab1cdda4533e6fed605d1295e83bae0bbb9e1b238d239ce158a0d42954 \ No newline at end of file From b84fda37efdd612288c1bc4933fa3ae6bcc2ffbc Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 16:28:50 +0000 Subject: [PATCH 456/476] Fix a problem in the encoding display in the updated PRAGMA function_list. FossilOrigin-Name: 318ff7720bc60c30c0826becce424226e9cec25c1d59cb2cdb75793739322760 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pragma.c | 16 +++++++--------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index adf0883fee..82c579652b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sminor\stypos\sin\sthe\strusted-schema.md\sdocument. -D 2020-01-09T16:00:08.934 +C Fix\sa\sproblem\sin\sthe\sencoding\sdisplay\sin\sthe\supdated\sPRAGMA\sfunction_list. +D 2020-01-09T16:28:50.025 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -523,7 +523,7 @@ F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c 6e13c9a885c0f2effaa6a1155b707d3d3e39bc572c3b003ce4caa9c2e9010ca3 +F src/pragma.c 9145cc0d7309b49d383fe15deca9ab592830b8b532e7fb25e9e36b6f470cbf66 F src/pragma.h 9f86a3a3a0099e651189521c8ad03768df598974e7bbdc21c7f9bb6125592fbd F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 @@ -1856,7 +1856,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 55553b5e5ece8282f6a56a6f5c71024eaaef3c86ec42203af3da708b0de3643b -R 36e30271b935c30d68186edc80f5a0f4 +P 87aea3ab1cdda4533e6fed605d1295e83bae0bbb9e1b238d239ce158a0d42954 +R a31dc2f4e3da7f138cd2121d67c1c563 U drh -Z e885b154077129671d15d2a44722704d +Z c76fa612566520f9cb4a404bd0c06588 diff --git a/manifest.uuid b/manifest.uuid index 0ea17ec104..d9bcdc87ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -87aea3ab1cdda4533e6fed605d1295e83bae0bbb9e1b238d239ce158a0d42954 \ No newline at end of file +318ff7720bc60c30c0826becce424226e9cec25c1d59cb2cdb75793739322760 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 2c127ed5a7..9c292e1631 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -307,7 +307,6 @@ static void pragmaFunclistLine( ){ for(; p; p=p->pNext){ const char *zType; - const char *zEnc; static const u32 mask = SQLITE_DETERMINISTIC | SQLITE_DIRECTONLY | @@ -315,6 +314,12 @@ static void pragmaFunclistLine( SQLITE_INNOCUOUS | SQLITE_FUNC_INTERNAL ; + static const char *azEnc[] = { 0, "utf8", "utf16le", "utf16be" }; + + assert( SQLITE_FUNC_ENCMASK==0x3 ); + assert( strcmp(azEnc[SQLITE_UTF8],"utf8")==0 ); + assert( strcmp(azEnc[SQLITE_UTF16LE],"utf16le")==0 ); + assert( strcmp(azEnc[SQLITE_UTF16BE],"utf16be")==0 ); if( p->xSFunc==0 ) continue; if( (p->funcFlags & SQLITE_FUNC_INTERNAL)!=0 @@ -329,16 +334,9 @@ static void pragmaFunclistLine( }else{ zType = "s"; } - if( p->funcFlags & SQLITE_UTF8 ){ - zEnc = "utf8"; - }else if( p->funcFlags & SQLITE_UTF16BE ){ - zEnc = "utf16be"; - }else{ - zEnc = "utf16le"; - } sqlite3VdbeMultiLoad(v, 1, "sissii", p->zName, isBuiltin, - zType, zEnc, + zType, azEnc[p->funcFlags&SQLITE_FUNC_ENCMASK], p->nArg, (p->funcFlags & mask) ^ SQLITE_INNOCUOUS ); From fbb6e9ff48fd6ee2e638de451e774328d9a5524b Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 9 Jan 2020 20:11:29 +0000 Subject: [PATCH 457/476] Fix an assert() in window.c that could fail with some obscure SELECT statements that use window functions. FossilOrigin-Name: 83dc55679a91bf5d1d13706088ce58eed02b9aad1ad0ae237966e78e0d769663 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 8 +++++--- src/window.c | 20 ++++++++++++++------ test/window1.test | 17 +++++++++++++++++ 5 files changed, 46 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index f4dd7639e2..50e9f57dc7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sdoing\sa\stest-to-double\sconversion\son\sa\sBLOB\swith\san\sodd\snumber\sof\sbytes\nand\sassuming\sa\sUTF16\sencoding,\signore\sthe\slast\sbyte.\nTicket\s[9eda2697f5cc1aba]. -D 2020-01-08T12:17:46.451 +C Fix\san\sassert()\sin\swindow.c\sthat\scould\sfail\swith\ssome\sobscure\sSELECT\sstatements\sthat\suse\swindow\sfunctions. +D 2020-01-09T20:11:29.695 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 5125f559b33787a29f7ded750f2a69080f50a85bced98fe8ad02a99e543c4b44 F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 631b1f24d07114066c756984b8bc7be64529afb2ea3a5da4e3e262792f320dfa +F src/expr.c d8854187a79c7798184c15982a25f457badf35eb3942d40e13ac292670fe996d F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -618,7 +618,7 @@ F src/where.c df2bea0e0122e853d9f1a8ec68920744166d2a524e338eba92e5470538ecd1f9 F src/whereInt.h e1d1db6bbec0ba4f345acc338f956c8237a6f06413afa68c6414e82fb5b06745 F src/wherecode.c 75ad6cbb8dfe585ffe0fc71008750b5158fc4811c3a498327033920b18f0a4be F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 -F src/window.c 659d613248f8bb8630f51409dc08235e4494c3c84162a535d9f88b38515f390a +F src/window.c f8ba2ee12a19b51d3ba42c16277c74185ee9215306bc0d5a03974ade8b5bc98f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1714,7 +1714,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test b61afc46bad183e19dcd46119d908ee79aecfd5929e61d332dba4ce9c2c0b7b9 +F test/window1.test cec56b9a0a2e7ca4bd63b30590c7b049dce9acfd87478e2597e13b67152bd821 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 295442887a3cd5868df26c5be244649ffb3bae8367f5cf02fe513424a1c9f6a7 -R 9275f44076e39841a96fb22faa964c5a -U drh -Z ac500ac229baf04846641aa2e74b4140 +P 1c76f1d8ec0937a2d2e4ce75f98494c953e9621db31945d7e44f45d90d1c3892 +R ffac5b4965945b4f5228b33ed0d4412f +U dan +Z 15dde77566cf35e66ee6ee4f50dfa225 diff --git a/manifest.uuid b/manifest.uuid index a31a5968eb..75197a84ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c76f1d8ec0937a2d2e4ce75f98494c953e9621db31945d7e44f45d90d1c3892 \ No newline at end of file +83dc55679a91bf5d1d13706088ce58eed02b9aad1ad0ae237966e78e0d769663 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4e8703e552..67b5ce7dc0 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5183,8 +5183,9 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ } /* -** Compare two ExprList objects. Return 0 if they are identical and -** non-zero if they differ in any way. +** Compare two ExprList objects. Return 0 if they are identical, 1 +** if they are certainly different, or 2 if it is not possible to +** determine if they are identical or not. ** ** If any subelement of pB has Expr.iTable==(-1) then it is allowed ** to compare equal to an equivalent element in pA with Expr.iTable==iTab. @@ -5203,10 +5204,11 @@ int sqlite3ExprListCompare(ExprList *pA, ExprList *pB, int iTab){ if( pA==0 || pB==0 ) return 1; if( pA->nExpr!=pB->nExpr ) return 1; for(i=0; inExpr; i++){ + int res; Expr *pExprA = pA->a[i].pExpr; Expr *pExprB = pB->a[i].pExpr; if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; - if( sqlite3ExprCompare(0, pExprA, pExprB, iTab) ) return 1; + if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res; } return 0; } diff --git a/src/window.c b/src/window.c index 5fb78ce358..a72ec0d2db 100644 --- a/src/window.c +++ b/src/window.c @@ -1279,10 +1279,12 @@ void sqlite3WindowLink(Select *pSel, Window *pWin){ } /* -** Return 0 if the two window objects are identical, or non-zero otherwise. -** Identical window objects can be processed in a single scan. +** Return 0 if the two window objects are identical, 1 if they are +** different, or 2 if it cannot be determined if the objects are identical +** or not. Identical window objects can be processed in a single scan. */ int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ + int res; if( NEVER(p1==0) || NEVER(p2==0) ) return 1; if( p1->eFrmType!=p2->eFrmType ) return 1; if( p1->eStart!=p2->eStart ) return 1; @@ -1290,10 +1292,16 @@ int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ if( p1->eExclude!=p2->eExclude ) return 1; if( sqlite3ExprCompare(pParse, p1->pStart, p2->pStart, -1) ) return 1; if( sqlite3ExprCompare(pParse, p1->pEnd, p2->pEnd, -1) ) return 1; - if( sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1) ) return 1; - if( sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1) ) return 1; + if( (res = sqlite3ExprListCompare(p1->pPartition, p2->pPartition, -1)) ){ + return res; + } + if( (res = sqlite3ExprListCompare(p1->pOrderBy, p2->pOrderBy, -1)) ){ + return res; + } if( bFilter ){ - if( sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1) ) return 1; + if( (res = sqlite3ExprCompare(pParse, p1->pFilter, p2->pFilter, -1)) ){ + return res; + } } return 0; } @@ -1580,7 +1588,7 @@ static void windowAggStep( /* All OVER clauses in the same window function aggregate step must ** be the same. */ - assert( pWin==pMWin || sqlite3WindowCompare(pParse,pWin,pMWin,0)==0 ); + assert( pWin==pMWin || sqlite3WindowCompare(pParse,pWin,pMWin,0)!=1 ); for(i=0; izName!=nth_valueName ){ diff --git a/test/window1.test b/test/window1.test index bc5796f87a..833e211fbd 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1577,4 +1577,21 @@ do_catchsql_test 47.2 { OR (SELECT k FROM t2 WHERE (SELECT sum(a) OVER() FROM t1 GROUP BY 1)); } {1 {misuse of window function sum()}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 48.0 { + CREATE TABLE t1(a); + INSERT INTO t1 VALUES(1); + INSERT INTO t1 VALUES(2); + INSERT INTO t1 VALUES(3); + SELECT (SELECT max(x)OVER(ORDER BY x) + min(x)OVER(ORDER BY x)) + FROM (SELECT (SELECT sum(a) FROM t1) AS x FROM t1); +} {12 12 12} + +do_execsql_test 48.1 { + SELECT (SELECT max(x)OVER(ORDER BY x) + min(x)OVER(ORDER BY x)) + FROM (SELECT (SELECT sum(a) FROM t1 GROUP BY a) AS x FROM t1); +} {2 2 2} + + finish_test From 7be5e3dd4ce9df4d7f1be86b494a25a9be78104a Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 20:33:13 +0000 Subject: [PATCH 458/476] Fix a harmless compiler warning. FossilOrigin-Name: edbf911fdeda14bd63cd752f6237896400eb5a65ef486abe7b91433621d21b5c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 50e9f57dc7..b65d8daf8a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\swindow.c\sthat\scould\sfail\swith\ssome\sobscure\sSELECT\sstatements\sthat\suse\swindow\sfunctions. -D 2020-01-09T20:11:29.695 +C Fix\sa\sharmless\scompiler\swarning. +D 2020-01-09T20:33:13.567 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -528,7 +528,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 31dc20837034491e5a043f411425a507b306ceedf40d666af5fc87b13020ff3d F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c de96e8a24dd273c472a9b4d89ba06014e81a218533a8b82fb8bbe2b3a94f6824 +F src/select.c c88a3597dac910ba647b9bf2777395df7efc2f90d928ce01ef6920a33df27b78 F src/shell.c.in 90b002bf0054399cbbfac62dd752a9b05770427ba141bcba75eefbb0098f4280 F src/sqlite.h.in 172a88e0d1e42f7d10cb8865d6f51c3b8fcc024ac9206806057da7a8b0c646b8 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1c76f1d8ec0937a2d2e4ce75f98494c953e9621db31945d7e44f45d90d1c3892 -R ffac5b4965945b4f5228b33ed0d4412f -U dan -Z 15dde77566cf35e66ee6ee4f50dfa225 +P 83dc55679a91bf5d1d13706088ce58eed02b9aad1ad0ae237966e78e0d769663 +R 56422d577197ed3f4272fc68cfc1ce64 +U drh +Z d432289797cbfb153a4bc9ba44c1dee6 diff --git a/manifest.uuid b/manifest.uuid index 75197a84ec..b43a391099 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83dc55679a91bf5d1d13706088ce58eed02b9aad1ad0ae237966e78e0d769663 \ No newline at end of file +edbf911fdeda14bd63cd752f6237896400eb5a65ef486abe7b91433621d21b5c \ No newline at end of file diff --git a/src/select.c b/src/select.c index 2ec131b3ad..6d885f6fa3 100644 --- a/src/select.c +++ b/src/select.c @@ -4172,10 +4172,10 @@ static void constInsert( /* 2018-10-25 ticket [cf5ed20f] ** Make sure the same pColumn is not inserted more than once */ for(i=0; inConst; i++){ - const Expr *pExpr = pConst->apExpr[i*2]; - assert( pExpr->op==TK_COLUMN ); - if( pExpr->iTable==pColumn->iTable - && pExpr->iColumn==pColumn->iColumn + const Expr *pE2 = pConst->apExpr[i*2]; + assert( pE2->op==TK_COLUMN ); + if( pE2->iTable==pColumn->iTable + && pE2->iColumn==pColumn->iColumn ){ return; /* Already present. Return without doing anything. */ } From 32d184e049b5a30d39b01be1b310c563ae716d23 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 20:33:36 +0000 Subject: [PATCH 459/476] Only register the fts3_tokenizer() function using a single text encoding. FossilOrigin-Name: 966964af1021feebc56cfda7b08bc787be7f447d682299f7958463aca30a73af --- ext/fts3/fts3_tokenizer.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/fts3/fts3_tokenizer.c b/ext/fts3/fts3_tokenizer.c index 443dc0c52c..eab3f513e5 100644 --- a/ext/fts3/fts3_tokenizer.c +++ b/ext/fts3/fts3_tokenizer.c @@ -481,7 +481,7 @@ int sqlite3Fts3InitHashTable( ){ int rc = SQLITE_OK; void *p = (void *)pHash; - const int any = SQLITE_ANY|SQLITE_DIRECTONLY; + const int any = SQLITE_UTF8|SQLITE_DIRECTONLY; #ifdef SQLITE_TEST char *zTest = 0; diff --git a/manifest b/manifest index b65d8daf8a..5615dc502d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning. -D 2020-01-09T20:33:13.567 +C Only\sregister\sthe\sfts3_tokenizer()\sfunction\susing\sa\ssingle\stext\sencoding. +D 2020-01-09T20:33:36.080 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -94,7 +94,7 @@ F ext/fts3/fts3_snippet.c 052b35ad746349ffb53820379bacdb23ff3ac60d3cc13d986e56d4 F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 F ext/fts3/fts3_test.c 73b16e229e517c1b1f0fb8e1046182a4e5dbc8dbe6eea8a5d4353fcce7dbbf39 F ext/fts3/fts3_tokenize_vtab.c 1de9a61acfa2a0445ed989310c31839c57f6b6086dd9d5c97177ae734a17fd8b -F ext/fts3/fts3_tokenizer.c 4a36573c36fae7654de6fc56bd87f39d82100bb6db2cfd23d6e04d2a9c28d51d +F ext/fts3/fts3_tokenizer.c 6d8fc150c48238955d5182bf661498db0dd473c8a2a80e00c16994a646fa96e7 F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d @@ -1853,7 +1853,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 83dc55679a91bf5d1d13706088ce58eed02b9aad1ad0ae237966e78e0d769663 -R 56422d577197ed3f4272fc68cfc1ce64 +P edbf911fdeda14bd63cd752f6237896400eb5a65ef486abe7b91433621d21b5c +R 5de0c500f4348137cfdd6d83ca68c4d0 U drh -Z d432289797cbfb153a4bc9ba44c1dee6 +Z 5f03761b5ba3e6acc7ad4fa15e74a7e4 diff --git a/manifest.uuid b/manifest.uuid index b43a391099..c2cfc2915e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -edbf911fdeda14bd63cd752f6237896400eb5a65ef486abe7b91433621d21b5c \ No newline at end of file +966964af1021feebc56cfda7b08bc787be7f447d682299f7958463aca30a73af \ No newline at end of file From 2e22579dea165f11a1dad802c23e96022307f302 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 9 Jan 2020 23:07:21 +0000 Subject: [PATCH 460/476] Fix the fossildelta.c extension so that it will compile on mingw. FossilOrigin-Name: 20237d5dc4451f142b511e50a4acef4574cef17b9222c87dcebfe1ed1bab0ad9 --- ext/misc/fossildelta.c | 2 +- manifest | 13 ++++++------- manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ext/misc/fossildelta.c b/ext/misc/fossildelta.c index 78c2be3014..6a597e0d7d 100644 --- a/ext/misc/fossildelta.c +++ b/ext/misc/fossildelta.c @@ -1071,7 +1071,7 @@ int sqlite3_fossildelta_init( char **pzErrMsg, const sqlite3_api_routines *pApi ){ - static const enc = SQLITE_UTF8|SQLITE_INNOCUOUS; + static const int enc = SQLITE_UTF8|SQLITE_INNOCUOUS; int rc = SQLITE_OK; SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ diff --git a/manifest b/manifest index 419a59bcad..ae061521be 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sin\sthe\suntrusted-schema\senhancements.\nSee\s[/doc/87aea3ab1cdda453/doc/trusted-schema.md|doc/trusted-schema.md]\nfor\sdetails. -D 2020-01-09T20:44:37.128 +C Fix\sthe\sfossildelta.c\sextension\sso\sthat\sit\swill\scompile\son\smingw. +D 2020-01-09T23:07:21.060 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -294,7 +294,7 @@ F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287 F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f F ext/misc/fileio.c bfa11a207da4eed8e5f84a1e3954608492f25f8850f9f00d0d2076f4648d7608 -F ext/misc/fossildelta.c 3761bc206e1d52b6c43fd86efbf94d9f800d32c8323cf2b5d51104262bdd4dc0 +F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d F ext/misc/ieee754.c eaffd9b364d7c8371727e9c43fc8bec38cdacc4d11fc26beffaa3ca05a0ea9d6 F ext/misc/json1.c 2d44e3fa37f958b42cbcd41651f9f0a0eaaf3bac3f1f4b8eb456431623cb3bd8 @@ -1856,8 +1856,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 966964af1021feebc56cfda7b08bc787be7f447d682299f7958463aca30a73af 318ff7720bc60c30c0826becce424226e9cec25c1d59cb2cdb75793739322760 -R ec8956333831ac4459fab3e97cbd448b -T +closed 318ff7720bc60c30c0826becce424226e9cec25c1d59cb2cdb75793739322760 +P 5720924cb07766cd54fb042da58f4b4acf12b60029fba86a23a606ad0d0f7c68 +R 33ee21636a28eaedc16cd7f6edbd34d5 U drh -Z 4b9d0a450dea6d3979baa9a1ef60417a +Z 155299afba314b1b1094f9a549545ab0 diff --git a/manifest.uuid b/manifest.uuid index e97f876287..9a55336f29 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5720924cb07766cd54fb042da58f4b4acf12b60029fba86a23a606ad0d0f7c68 \ No newline at end of file +20237d5dc4451f142b511e50a4acef4574cef17b9222c87dcebfe1ed1bab0ad9 \ No newline at end of file From e5f88010441d15b70fb3cbd9a4833c5d545e8c4c Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 10 Jan 2020 00:00:18 +0000 Subject: [PATCH 461/476] Documentation updates on newer APIs. No changes to code. FossilOrigin-Name: 8845a8c22a4ceabee130ce2addbe07e13b0496eeb542c89850f8658d21a48f89 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 39 ++++++++++++++++++++++++++------------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index ae061521be..eaa24e1e04 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sfossildelta.c\sextension\sso\sthat\sit\swill\scompile\son\smingw. -D 2020-01-09T23:07:21.060 +C Documentation\supdates\son\snewer\sAPIs.\s\sNo\schanges\sto\scode. +D 2020-01-10T00:00:18.770 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -532,7 +532,7 @@ F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 924b61cef57033a8ca1ed3dcffd02445a7dd0c837cc849b2e4117251cac831f5 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f -F src/sqlite.h.in 06452043348e35cf6108345a35574a2faa4d1c2829beefb1e73c73d6bfb2fa80 +F src/sqlite.h.in 0ed2c973fcfa1e2ce120b35827a23e252719c3337ff64a1f76b800b53169d56e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 F src/sqliteInt.h ee242902766f9a96aeaca4315dbe1e204bbb2954cd455ffa085bba84fa47956b @@ -1856,7 +1856,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5720924cb07766cd54fb042da58f4b4acf12b60029fba86a23a606ad0d0f7c68 -R 33ee21636a28eaedc16cd7f6edbd34d5 +P 20237d5dc4451f142b511e50a4acef4574cef17b9222c87dcebfe1ed1bab0ad9 +R 62d7e9ceb3c6bf2163d7b131b5c92b18 U drh -Z 155299afba314b1b1094f9a549545ab0 +Z 8e437f19b27b8e5454199c775779247a diff --git a/manifest.uuid b/manifest.uuid index 9a55336f29..d68bfd43b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -20237d5dc4451f142b511e50a4acef4574cef17b9222c87dcebfe1ed1bab0ad9 \ No newline at end of file +8845a8c22a4ceabee130ce2addbe07e13b0496eeb542c89850f8658d21a48f89 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 48aedf438f..9096669756 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2274,10 +2274,10 @@ struct sqlite3_mem_methods { ** including, but not limited to, the following: **

    **
  • Prohibit the use of SQL functions inside triggers, views, -** CHECK constraints, DEFAULT VALUEs, index definitions, and/or -** generated columns unless those functions are tagged -** with [SQLITE_INNOCUOUS]. -**
  • Pohibit the use of virtual tables inside of triggers and/or views +** CHECK constraints, DEFAULT clauses, expression indexes, +** partial indexes, or generated columns +** unless those functions are tagged with [SQLITE_INNOCUOUS]. +**
  • Pohibit the use of virtual tables inside of triggers or views ** unless those virtual tables are tagged with [SQLITE_VTAB_INNOCUOUS]. **
** This setting defaults to "on" for legacy compatibility, however @@ -5015,6 +5015,8 @@ int sqlite3_create_window_function( ** to [sqlite3_create_function()], [sqlite3_create_function16()], or ** [sqlite3_create_function_v2()]. ** +**
+** [[SQLITE_DETERMINISTIC]]
SQLITE_DETERMINISTIC
** The SQLITE_DETERMINISTIC flag means that the new function always gives ** the same output when the input parameters are the same. ** The [abs|abs() function] is deterministic, for example, but @@ -5022,28 +5024,37 @@ int sqlite3_create_window_function( ** be deterministic in order to be used in certain contexts such as ** [CHECK constraints] or [generated columns]. SQLite might also optimize ** deterministic functions by factoring them out of inner loops. +**
** +** [[SQLITE_INNOCUOUS]]
SQLITE_INNOCUOUS
** The SQLITE_INNOCUOUS flag means that the new function is unlikely ** to cause problems even if misused. An innocuous function should have ** no side effects and consume few resources. The [abs|abs() function] ** is an example of an innocuous function. ** The [load_extension() SQL function] is not innocuous because of its ** side effects. Some heightened security settings -** ([SQLITE_DBCONFIG_UNSAFE_FUNC_IN_VIEW]) -** disable the use of SQLlfunctions inside views and triggers unless +** ([SQLITE_DBCONFIG_TRUSTED_SCHEMA] and [PRAGMA trusted_schema=OFF]) +** disable the use of SQL functions inside views and triggers and in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], and [generated columns] unless ** the function is tagged with SQLITE_INNOCUOUS. Most built-in functions ** are innocuous. Developers are advised to avoid using the ** SQLITE_INNOCUOUS flag for application-defined functions unless the -** function is specifically intended for use inside of views and triggers. -** +** function has been carefully audited and found to be free of potentially +** security-adverse side-effects and information-leaks. +**
+** +** [[SQLITE_DIRECTONLY]]
SQLITE_DIRECTONLY
** The SQLITE_DIRECTONLY flag means that the function may only be invoked -** from top-level SQL, and cannot be used in VIEWs or TRIGGERs. This is +** from top-level SQL, and cannot be used in VIEWs or TRIGGERs nor in +** schema structures such as [CHECK constraints], [DEFAULT clauses], +** [expression indexes], [partial indexes], or [generated columns]. This is ** a security feature which is recommended for all -** [application-defined SQL functions] that have side-effects. This flag -** prevents an attacker from adding triggers and views to a schema then -** tricking a high-privilege application into causing unintended side-effects -** while performing ordinary queries. +** [application-defined SQL functions] that have side-effects or that +** could potentially leak sensitive information. +**
** +** [[SQLITE_SUBTYPE]]
SQLITE_SUBTYPE
** The SQLITE_SUBTYPE flag indicates to SQLite that a function may call ** [sqlite3_value_subtype()] to inspect the sub-types of its arguments. ** Specifying this flag makes no difference for scalar or aggregate user @@ -5051,6 +5062,8 @@ int sqlite3_create_window_function( ** function, then any sub-types belonging to arguments passed to the window ** function may be discarded before the window function is called (i.e. ** sqlite3_value_subtype() will always return 0). +**
+**
*/ #define SQLITE_DETERMINISTIC 0x000000800 #define SQLITE_DIRECTONLY 0x000080000 From b2fe5a7c35a114e8d4b869968c61c7b6a9a99cb7 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 10 Jan 2020 01:05:49 +0000 Subject: [PATCH 462/476] Fix to the register validity tracking logic in debug builds. No impact on release builds. FossilOrigin-Name: 0a500da6aa659a8e73206e6d22ddbf2da5e4f1d1d551eeb66433163a3e13109d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeaux.c | 18 ++++++++++-------- test/func.test | 17 +++++++++++++++++ 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index eaa24e1e04..1c2fbe6313 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Documentation\supdates\son\snewer\sAPIs.\s\sNo\schanges\sto\scode. -D 2020-01-10T00:00:18.770 +C Fix\sto\sthe\sregister\svalidity\stracking\slogic\sin\sdebug\sbuilds.\s\sNo\simpact\non\srelease\sbuilds. +D 2020-01-10T01:05:49.616 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -606,7 +606,7 @@ F src/vdbe.c 35dcc7d43c2635853773d994b052061283a4e5b0e60e799cef83e410d90f3145 F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h 30d3e8b991547cdf39025e416a0a737b0416d46747af70ae058f60e2e0466fe7 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 3b2076c59217f964ff5fca348fa3f69c3157cbd5cafc549e9ea3252d8613c6a9 +F src/vdbeaux.c ff690e6c9314ef281de7c06f8c8c33393f0afca80aabb1fe69836dcf2d60b0bf F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c ad9e6217635f2b04df98bc57b12c98cefc9c0a1745cca47f4e8109119213253d F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -999,7 +999,7 @@ F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3c F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test 93d692f6427bd01b39c6ddb1e2d728f5264abefdbdd56e2f95c9dc1fa7dbcb53 +F test/func.test b7f1a706d1bb8de103a24bd0c30c9e3dc3eedf0df24aabc54b0a4f6e08742622 F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 F test/func4.test 6beacdfcb0e18c358e6c2dcacf1b65d1fa80955f @@ -1856,7 +1856,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 20237d5dc4451f142b511e50a4acef4574cef17b9222c87dcebfe1ed1bab0ad9 -R 62d7e9ceb3c6bf2163d7b131b5c92b18 +P 8845a8c22a4ceabee130ce2addbe07e13b0496eeb542c89850f8658d21a48f89 +R da0f5b6fa0488473f060f2857ba231cf U drh -Z 8e437f19b27b8e5454199c775779247a +Z 7914b326b60d9184810fac64aa24751d diff --git a/manifest.uuid b/manifest.uuid index d68bfd43b5..1a9c6e325c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8845a8c22a4ceabee130ce2addbe07e13b0496eeb542c89850f8658d21a48f89 \ No newline at end of file +0a500da6aa659a8e73206e6d22ddbf2da5e4f1d1d551eeb66433163a3e13109d \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 8b01fdec60..fab8b705c8 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1209,14 +1209,16 @@ void sqlite3VdbeReleaseRegisters( assert( pParse->pVdbe ); assert( iFirst>=1 ); assert( iFirst+N-1<=pParse->nMem ); - while( N>0 && (mask&1)!=0 ){ - mask >>= 1; - iFirst++; - N--; - } - while( N>0 && N<=32 && (mask & MASKBIT32(N-1))!=0 ){ - mask &= ~MASKBIT32(N-1); - N--; + if( N<=31 && mask!=0 ){ + while( N>0 && (mask&1)!=0 ){ + mask >>= 1; + iFirst++; + N--; + } + while( N>0 && N<=32 && (mask & MASKBIT32(N-1))!=0 ){ + mask &= ~MASKBIT32(N-1); + N--; + } } if( N>0 ){ sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); diff --git a/test/func.test b/test/func.test index 585ae1a14f..34a6f18bcf 100644 --- a/test/func.test +++ b/test/func.test @@ -1459,5 +1459,22 @@ do_execsql_test func-33.20 { INSERT INTO t33b(x,y) VALUES(testdirectonly(new.aaa),new.b); END}} +# 2020-01-09 Yongheng fuzzer find +# The bug is in the register-validity debug logic, not in the SQLite core +# and as such it only impacts debug builds. Release builds work fine. +# +reset_db +do_execsql_test func-34.10 { + CREATE TABLE t1(a INT CHECK( + datetime( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, + 10,11,12,13,14,15,16,17,18,19, + 20,21,22,23,24,25,26,27,28,29, + 30,31,32,33,34,35,36,37,38,39, + 40,41,42,43,44,45,46,47,48,a) + ) + ); + INSERT INTO t1(a) VALUES(1),(2); + SELECT * FROM t1; +} {1 2} finish_test From 8875b9e7b5d699fac33171f7bafa32c7adb62dbf Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 10 Jan 2020 18:05:55 +0000 Subject: [PATCH 463/476] Rearchitect the way in which filenames are stored in the Pager object so that the sqlite3_uri_parameter() interface will work from journal and WAL filenames too. This check-in implements the central idea, and compile and runs somewhat, but crashes on an extended test. FossilOrigin-Name: 2ae77bd2335708343bce4541b4d2cf16edfe3fd5bc2dfb93757238c926aa960b --- manifest | 23 +++++---- manifest.uuid | 2 +- src/main.c | 42 +++++++++++++--- src/pager.c | 131 +++++++++++++++++++++++++++++++++++------------- src/pager.h | 6 ++- src/sqlite.h.in | 27 ++++++++++ src/sqliteInt.h | 3 -- 7 files changed, 179 insertions(+), 55 deletions(-) diff --git a/manifest b/manifest index 1c2fbe6313..e10370b83b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sto\sthe\sregister\svalidity\stracking\slogic\sin\sdebug\sbuilds.\s\sNo\simpact\non\srelease\sbuilds. -D 2020-01-10T01:05:49.616 +C Rearchitect\sthe\sway\sin\swhich\sfilenames\sare\sstored\sin\sthe\sPager\sobject\sso\sthat\nthe\ssqlite3_uri_parameter()\sinterface\swill\swork\sfrom\sjournal\sand\sWAL\sfilenames\ntoo.\s\sThis\scheck-in\simplements\sthe\scentral\sidea,\sand\scompile\sand\sruns\ssomewhat,\nbut\scrashes\son\san\sextended\stest. +D 2020-01-10T18:05:55.320 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -494,7 +494,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 5ba8fd376f539240939ae76b5bc9fa7ad9a0d86e9914ecd11eb7002204138c11 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c 6ba00f15f0e7d36a12136ac390a403de4c4b47b76733d1cad60c2b23b4a2cf1d +F src/main.c abc034557685db2bead003e7d6b2bd74bf1a44c4d3bfe9ddcf35dc90524a8c21 F src/malloc.c eaa4dc9602ce28b077f7de2eb275db2be270c5cc56d7fec5466301bd9b80e2f5 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -517,8 +517,8 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c ad7640c04eed946052a3b12856362a773d0a717696707313037186df0e2b59f2 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c b08541016855b06956cb34c4cddd8c9fa97793f3bfdc4f7809f09fda24702435 -F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 +F src/pager.c 14ae8110bcb65a703d91131586848fe256c1a3cbbbc3eb1791090dbf925aa742 +F src/pager.h e541ff7e1931e6e2165c38c7ff38cd1af8df0e20472ee8596479fd53c6aa149d F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 @@ -532,10 +532,10 @@ F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 924b61cef57033a8ca1ed3dcffd02445a7dd0c837cc849b2e4117251cac831f5 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f -F src/sqlite.h.in 0ed2c973fcfa1e2ce120b35827a23e252719c3337ff64a1f76b800b53169d56e +F src/sqlite.h.in 4022f00351aec1ad99b9dcadc4fbe70a1db0e306e84fee509daf97a82ef044a4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h ee242902766f9a96aeaca4315dbe1e204bbb2954cd455ffa085bba84fa47956b +F src/sqliteInt.h 7a29ba700a51eeb925731749a570cf3859f6a58ed94797ecf47508875b0ba279 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1856,7 +1856,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 8845a8c22a4ceabee130ce2addbe07e13b0496eeb542c89850f8658d21a48f89 -R da0f5b6fa0488473f060f2857ba231cf +P 0a500da6aa659a8e73206e6d22ddbf2da5e4f1d1d551eeb66433163a3e13109d +R dd17ff42793e7be350eec0c77a1551ba +T *branch * enhanced-uri +T *sym-enhanced-uri * +T -sym-trunk * U drh -Z 7914b326b60d9184810fac64aa24751d +Z a098e9553bba752fd93040dc261a9c76 diff --git a/manifest.uuid b/manifest.uuid index 1a9c6e325c..980ac6d4ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0a500da6aa659a8e73206e6d22ddbf2da5e4f1d1d551eeb66433163a3e13109d \ No newline at end of file +2ae77bd2335708343bce4541b4d2cf16edfe3fd5bc2dfb93757238c926aa960b \ No newline at end of file diff --git a/src/main.c b/src/main.c index c0f53916a6..5426c8d715 100644 --- a/src/main.c +++ b/src/main.c @@ -4272,13 +4272,17 @@ int sqlite3UriCount(const char *z){ ** returns a NULL pointer. */ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ + const Pager *pPager; + const char *z; if( zFilename==0 || zParam==0 ) return 0; - zFilename += sqlite3Strlen30(zFilename) + 1; - while( zFilename[0] ){ - int x = strcmp(zFilename, zParam); - zFilename += sqlite3Strlen30(zFilename) + 1; - if( x==0 ) return zFilename; - zFilename += sqlite3Strlen30(zFilename) + 1; + pPager = sqlite3PagerFromFilename(zFilename); + assert( pPager!=0 ); + z = sqlite3PagerQueryParameters(pPager); + while( z[0] ){ + int x = strcmp(z, zParam); + z += sqlite3Strlen30(z) + 1; + if( x==0 ) return z; + z += sqlite3Strlen30(z) + 1; } return 0; } @@ -4308,6 +4312,32 @@ sqlite3_int64 sqlite3_uri_int64( return bDflt; } +/* +** Translate a filename that was handed to a VFS routine into the corresponding +** database, journal, or WAL file. +** +** It is an error to pass this routine a filename string that was not +** passed into the VFS from the SQLite core. Doing so is similar to +** passing free() a pointer that was not obtained from malloc() - it is +** an error that we cannot easily detect but that will likely cause memory +** corruption. +*/ +const char *sqlite3_filename_database(const char *zFilename){ + const Pager *pPager = sqlite3PagerFromFilename(zFilename); + assert( pPager!=0 ); + return sqlite3PagerFilename(pPager, 0); +} +const char *sqlite3_filename_journal(const char *zFilename){ + const Pager *pPager = sqlite3PagerFromFilename(zFilename); + assert( pPager!=0 ); + return sqlite3PagerJournalFilename(pPager); +} +const char *sqlite3_filename_wal(const char *zFilename){ + const Pager *pPager = sqlite3PagerFromFilename(zFilename); + assert( pPager!=0 ); + return sqlite3PagerWalFilename(pPager); +} + /* ** Return the Btree pointer identified by zDbName. Return NULL if not found. */ diff --git a/src/pager.c b/src/pager.c index 0fae9ae3d9..685f0462b1 100644 --- a/src/pager.c +++ b/src/pager.c @@ -696,6 +696,7 @@ struct Pager { Pgno mxPgno; /* Maximum allowed size of the database */ i64 journalSizeLimit; /* Size limit for persistent journal files */ char *zFilename; /* Name of the database file */ + char *zQueryParam; /* URI query parameters on the filename */ char *zJournal; /* Name of the journal file */ int (*xBusyHandler)(void*); /* Function to call when busy */ void *pBusyHandlerArg; /* Context argument for xBusyHandler */ @@ -4838,53 +4839,72 @@ int sqlite3PagerOpen( ** Database file handle (pVfs->szOsFile bytes) ** Sub-journal file handle (journalFileSize bytes) ** Main journal file handle (journalFileSize bytes) + ** Pointer back to self (sizeof(*Pager) bytes) ** Database file name (nPathname+1 bytes) + ** URI query parameters (nUriByte bytes) + ** padding for 8-byte alignment + ** Pointer back to self (sizeof(*Pager) bytes) + ** WAL filename (nPathname+4+1 bytes) + ** padding for 8-byte alignment + ** Pointer back to self (sizeof(*Pager) bytes) ** Journal file name (nPathname+8+1 bytes) */ pPtr = (u8 *)sqlite3MallocZero( - ROUND8(sizeof(*pPager)) + /* Pager structure */ - ROUND8(pcacheSize) + /* PCache object */ - ROUND8(pVfs->szOsFile) + /* The main db file */ - journalFileSize * 2 + /* The two journal files */ - nPathname + 1 + nUriByte + /* zFilename */ - nPathname + 8 + 2 /* zJournal */ + ROUND8(sizeof(*pPager)) + /* Pager structure */ + ROUND8(pcacheSize) + /* PCache object */ + ROUND8(pVfs->szOsFile) + /* The main db file */ + journalFileSize * 2 + /* The two journal files */ + sizeof(Pager*) + /* Self-pointer for database */ + ROUND8(nPathname + 1 + nUriByte) + /* database filename + query params */ + sizeof(Pager*) + /* Self-pointer for journal */ + ROUND8(nPathname + 8 + 2) + /* zJournal */ #ifndef SQLITE_OMIT_WAL - + nPathname + 4 + 2 /* zWal */ + sizeof(Pager*) + /* Self-pointer for zWal */ + ROUND8(nPathname + 4 + 2) + /* zWal */ #endif + 0 ); assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); if( !pPtr ){ sqlite3DbFree(0, zPathname); return SQLITE_NOMEM_BKPT; } - pPager = (Pager*)(pPtr); - pPager->pPCache = (PCache*)(pPtr += ROUND8(sizeof(*pPager))); - pPager->fd = (sqlite3_file*)(pPtr += ROUND8(pcacheSize)); - pPager->sjfd = (sqlite3_file*)(pPtr += ROUND8(pVfs->szOsFile)); - pPager->jfd = (sqlite3_file*)(pPtr += journalFileSize); - pPager->zFilename = (char*)(pPtr += journalFileSize); + pPager = (Pager*)pPtr; pPtr += ROUND8(sizeof(*pPager)); + pPager->pPCache = (PCache*)pPtr; pPtr += ROUND8(pcacheSize); + pPager->fd = (sqlite3_file*)pPtr; pPtr += ROUND8(pVfs->szOsFile); + pPager->sjfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; + pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); - /* Fill in the Pager.zFilename and Pager.zJournal buffers, if required. */ - if( zPathname ){ - assert( nPathname>0 ); - memcpy(pPager->zFilename, zPathname, nPathname); - if( nUri ) memcpy(&pPager->zFilename[nPathname+1], zUri, nUriByte); - pPager->zJournal = (char*)(pPtr += nPathname + 1 + nUriByte); - memcpy(pPager->zJournal, zPathname, nPathname); - memcpy(&pPager->zJournal[nPathname], "-journal", 8); - sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal); + /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ + assert( EIGHT_BYTE_ALIGNMENT(pPtr) ); + memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); + pPager->zFilename = (char*)pPtr; + if( nPathname==0 ) zPathname = ""; + memcpy(pPtr, zPathname, nPathname); + pPager->zQueryParam = pPager->zFilename + nPathname + 1; + if( zUri ) memcpy(pPager->zQueryParam, zUri, nUriByte); + assert( nUriByte>=1 ); + assert( nUriByte >= nUri*3 + 1 ); + pPtr += ROUND8(nPathname + 1 + nUriByte); + #ifndef SQLITE_OMIT_WAL - pPager->zWal = (char*)(pPtr += nPathname + 8 + 2); - memcpy(pPager->zWal, zPathname, nPathname); - memcpy(&pPager->zWal[nPathname], "-wal", 4); - sqlite3FileSuffix3(pPager->zFilename, pPager->zWal); - assert( sqlite3UriCount(pPager->zWal)==0 ); + /* Fill in Pager.zWal */ + assert( EIGHT_BYTE_ALIGNMENT(pPtr) ); + memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); + pPager->zWal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); + memcpy(pPtr+nPathname, "-wal", 4); pPtr += ROUND8(nPathname + 4 + 2); #endif - assert( sqlite3UriCount(pPager->zFilename)==nUri ); - assert( sqlite3UriCount(pPager->zJournal)==0 ); - sqlite3DbFree(0, zPathname); - } + + /* Fill in Pager.zJournal */ + assert( EIGHT_BYTE_ALIGNMENT(pPtr) ); + memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); + pPager->zJournal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); + memcpy(pPtr+nPathname, "-journal",8); /*pPtr += ROUND8(nPathname + 8 + 2);*/ + + if( nPathname ) sqlite3DbFree(0, zPathname); pPager->pVfs = pVfs; pPager->vfsFlags = vfsFlags; @@ -4933,9 +4953,9 @@ int sqlite3PagerOpen( } #endif } - pPager->noLock = sqlite3_uri_boolean(zFilename, "nolock", 0); + pPager->noLock = sqlite3_uri_boolean(pPager->zFilename, "nolock", 0); if( (iDc & SQLITE_IOCAP_IMMUTABLE)!=0 - || sqlite3_uri_boolean(zFilename, "immutable", 0) ){ + || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0) ){ vfsFlags |= SQLITE_OPEN_READONLY; goto act_like_temp_file; } @@ -6999,10 +7019,51 @@ int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ ** shared cache, it uses nullIfMemDb==0 so that in-memory databases can ** participate in shared-cache. */ -const char *sqlite3PagerFilename(Pager *pPager, int nullIfMemDb){ +const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){ return (nullIfMemDb && pPager->memDb) ? "" : pPager->zFilename; } +/* +** Return the name of the Journal file or WAL file of the given pager. +*/ +const char *sqlite3PagerJournalFilename(const Pager *pPager){ + assert( pPager!=0 ); + return pPager->zJournal; +} +#ifndef SQLITE_OMIT_WAL +const char *sqlite3PagerWalFilename(const Pager *pPager){ + assert( pPager!=0 ); + return pPager->zWal; +} +#endif /* SQLITE_OMIT_WAL */ + +/* Return a pointer to the URI query parameters associated with the +** pager. +** +** The query parameters are a sequence of strings pairs. The first +** string of each pair is the key and the second string is the value. +** All strings are terminated by a single 0x00 byte. The list is +** terminated by the first empty-string key. +*/ +const char *sqlite3PagerQueryParameters(const Pager *pPager){ + assert( pPager!=0 ); + return pPager->zQueryParam; +} + +/* If zFilename is a filename passed to the xOpen method of the VFS - +** either the main database file, the WAL file, or the journal file - +** then this routine returns a pointer to the Pager object associated +** with that file. +*/ +const Pager *sqlite3PagerFromFilename(const char *zFilename){ + const Pager **pp = (const Pager**)zFilename; + pp--; + assert( (*pp)->zFilename==zFilename + || (*pp)->zJournal==zFilename + || (*pp)->zWal==zFilename ); + return *pp; +} + /* ** Return the VFS structure for the pager. */ @@ -7655,6 +7716,8 @@ int sqlite3PagerCloseWal(Pager *pPager, sqlite3 *db){ return rc; } + + #ifdef SQLITE_ENABLE_SNAPSHOT /* ** If this is a WAL database, obtain a snapshot handle for the snapshot diff --git a/src/pager.h b/src/pager.h index de96dc5515..2e8ba30f38 100644 --- a/src/pager.h +++ b/src/pager.h @@ -203,7 +203,11 @@ u32 sqlite3PagerDataVersion(Pager*); int sqlite3PagerRefcount(Pager*); #endif int sqlite3PagerMemUsed(Pager*); -const char *sqlite3PagerFilename(Pager*, int); +const char *sqlite3PagerFilename(const Pager*, int); +const char *sqlite3PagerWalFilename(const Pager*); +const char *sqlite3PagerJournalFilename(const Pager*); +const char *sqlite3PagerQueryParameters(const Pager*); +const Pager *sqlite3PagerFromFilename(const char*); sqlite3_vfs *sqlite3PagerVfs(Pager*); sqlite3_file *sqlite3PagerFile(Pager*); sqlite3_file *sqlite3PagerJrnlFile(Pager*); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9096669756..7f76e0855a 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3536,6 +3536,33 @@ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); +/* +** CAPI3REF: Translate filenames +** +** These routines are available to VFS implementations for translating +** filenames between the main database file, the journal file, and the +** WAL file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** then sqlite3_filename_database(F) returns the name of the corresponding +** database file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** then sqlite3_filename_journal(F) returns the name of the corresponding +** rollback journal file. +** +** If F is the name of an sqlite database file, journal file, or WAL file +** then sqlite3_filename_wal(F) returns the name of the corresponding +** WAL file. +** +** In all of the above, if F is not the name of a database, journal or WAL +** filename passed into the VFS from the SQLite core, then the result is +** undefined and is likely a memory access violation. +*/ +const char *sqlite3_filename_database(const char*); +const char *sqlite3_filename_journal(const char*); +const char *sqlite3_filename_wal(const char*); + /* ** CAPI3REF: Error Codes And Messages diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 14c17a42e6..53e7095daa 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4108,9 +4108,6 @@ void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); void sqlite3AddCollateType(Parse*, Token*); void sqlite3AddGenerated(Parse*,Expr*,Token*); void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); -#ifdef SQLITE_DEBUG - int sqlite3UriCount(const char*); -#endif int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); #ifdef SQLITE_HAS_CODEC From 8080403e44b864345af75689e31c986477139b7c Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 11 Jan 2020 16:08:31 +0000 Subject: [PATCH 464/476] Redesign for better legacy compatibility. Add the sqlite3_uri_key() interface. FossilOrigin-Name: bcb43d11c4d0be36888c9e968ccdf85e7d7fccd72a29866f85c014e0562d4b93 --- ext/misc/urifuncs.c | 207 +++++++++++++++++++++++++++++++++++++++++++ ext/rbu/sqlite3rbu.c | 31 +------ manifest | 28 +++--- manifest.uuid | 2 +- src/loadext.c | 4 + src/main.c | 79 +++++++++-------- src/pager.c | 134 ++++++++++++---------------- src/pager.h | 4 - src/sqlite.h.in | 66 ++++++++++---- src/sqlite3ext.h | 10 +++ 10 files changed, 381 insertions(+), 184 deletions(-) create mode 100644 ext/misc/urifuncs.c diff --git a/ext/misc/urifuncs.c b/ext/misc/urifuncs.c new file mode 100644 index 0000000000..5fc520a1bf --- /dev/null +++ b/ext/misc/urifuncs.c @@ -0,0 +1,207 @@ +/* +** 2020-01-11 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +****************************************************************************** +** +** This SQLite extension implements various SQL functions used to access +** the following SQLite C-language APIs: +** +** sqlite3_uri_parameter() +** sqlite3_uri_boolean() +** sqlite3_uri_int64() +** sqlite3_uri_key() +** sqlite3_filename_database() +** sqlite3_filename_journal() +** sqlite3_filename_wal() +** sqlite3_db_filename() +** +** These SQL functions are for testing and demonstration purposes only. +*/ +#include "sqlite3ext.h" +SQLITE_EXTENSION_INIT1 +#include +#include + +/* +** SQL function: sqlite3_db_filename(SCHEMA) +** +** Return the filename corresponding to SCHEMA. +*/ +static void func_db_filename( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zSchema = (const char*)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zFile = sqlite3_db_filename(db, zSchema); + sqlite3_result_text(context, zFile, -1, SQLITE_TRANSIENT); +} + +/* +** SQL function: sqlite3_uri_parameter(SCHEMA,NAME) +** +** Return the value of the NAME query parameter to the database for SCHEMA +*/ +static void func_uri_parameter( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zSchema = (const char*)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zName = (const char*)sqlite3_value_text(argv[1]); + const char *zFile = sqlite3_db_filename(db, zSchema); + const char *zRes = sqlite3_uri_parameter(zFile, zName); + sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); +} + +/* +** SQL function: sqlite3_uri_boolean(SCHEMA,NAME,DEFAULT) +** +** Return the boolean value of the NAME query parameter to +** the database for SCHEMA +*/ +static void func_uri_boolean( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zSchema = (const char*)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zName = (const char*)sqlite3_value_text(argv[1]); + const char *zFile = sqlite3_db_filename(db, zSchema); + int iDflt = sqlite3_value_int(argv[2]); + int iRes = sqlite3_uri_boolean(zFile, zName, iDflt); + sqlite3_result_int(context, iRes); +} + +/* +** SQL function: sqlite3_uri_key(SCHEMA,N) +** +** Return the name of the Nth query parameter +*/ +static void func_uri_key( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zSchema = (const char*)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + int N = sqlite3_value_int(argv[1]); + const char *zFile = sqlite3_db_filename(db, zSchema); + const char *zRes = sqlite3_uri_key(zFile, N); + sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); +} + +/* +** SQL function: sqlite3_uri_int64(SCHEMA,NAME,DEFAULT) +** +** Return the int64 value of the NAME query parameter to +** the database for SCHEMA +*/ +static void func_uri_int64( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zSchema = (const char*)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zName = (const char*)sqlite3_value_text(argv[1]); + const char *zFile = sqlite3_db_filename(db, zSchema); + sqlite3_int64 iDflt = sqlite3_value_int64(argv[2]); + sqlite3_int64 iRes = sqlite3_uri_int64(zFile, zName, iDflt); + sqlite3_result_int64(context, iRes); +} + +/* +** SQL function: sqlite3_filename_database(SCHEMA) +** +** Return the database filename for SCHEMA +*/ +static void func_filename_database( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zSchema = (const char*)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zFile = sqlite3_db_filename(db, zSchema); + const char *zRes = sqlite3_filename_database(zFile); + sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); +} + +/* +** SQL function: sqlite3_filename_journal(SCHEMA) +** +** Return the rollback journal filename for SCHEMA +*/ +static void func_filename_journal( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zSchema = (const char*)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zFile = sqlite3_db_filename(db, zSchema); + const char *zRes = sqlite3_filename_journal(zFile); + sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); +} + +/* +** SQL function: sqlite3_filename_wal(SCHEMA) +** +** Return the WAL filename for SCHEMA +*/ +static void func_filename_wal( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + const char *zSchema = (const char*)sqlite3_value_text(argv[0]); + sqlite3 *db = sqlite3_context_db_handle(context); + const char *zFile = sqlite3_db_filename(db, zSchema); + const char *zRes = sqlite3_filename_wal(zFile); + sqlite3_result_text(context, zRes, -1, SQLITE_TRANSIENT); +} + +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_urifuncs_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + static const struct { + const char *zFuncName; + int nArg; + void (*xFunc)(sqlite3_context*,int,sqlite3_value**); + } aFunc[] = { + { "sqlite3_db_filename", 1, func_db_filename }, + { "sqlite3_uri_parameter", 2, func_uri_parameter }, + { "sqlite3_uri_boolean", 3, func_uri_boolean }, + { "sqlite3_uri_int64", 3, func_uri_int64 }, + { "sqlite3_uri_key", 2, func_uri_key }, + { "sqlite3_filename_database", 1, func_filename_database }, + { "sqlite3_filename_journal", 1, func_filename_journal }, + { "sqlite3_filename_wal", 1, func_filename_wal }, + }; + int rc = SQLITE_OK; + int i; + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + for(i=0; rc==SQLITE_OK && izWal = rbuMainToWal(zName, flags); + pFd->zWal = sqlite3_filename_wal(zName); } else if( flags & SQLITE_OPEN_WAL ){ rbu_file *pDb = rbuFindMaindb(pRbuVfs, zName, 0); @@ -5026,7 +4999,7 @@ static int rbuVfsOpen( char *zCopy; if( rbuIsVacuum(pDb->pRbu) ){ zBase = sqlite3_db_filename(pDb->pRbu->dbRbu, "main"); - zBase = rbuMainToWal(zBase, SQLITE_OPEN_URI); + zBase = sqlite3_filename_wal(zBase); } nCopy = strlen(zBase); zCopy = sqlite3_malloc64(nCopy+2); diff --git a/manifest b/manifest index e10370b83b..e02228bbba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rearchitect\sthe\sway\sin\swhich\sfilenames\sare\sstored\sin\sthe\sPager\sobject\sso\sthat\nthe\ssqlite3_uri_parameter()\sinterface\swill\swork\sfrom\sjournal\sand\sWAL\sfilenames\ntoo.\s\sThis\scheck-in\simplements\sthe\scentral\sidea,\sand\scompile\sand\sruns\ssomewhat,\nbut\scrashes\son\san\sextended\stest. -D 2020-01-10T18:05:55.320 +C Redesign\sfor\sbetter\slegacy\scompatibility.\s\sAdd\sthe\ssqlite3_uri_key()\sinterface. +D 2020-01-11T16:08:31.366 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -321,6 +321,7 @@ F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da9 F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c fa4aedeb07f66169005dffa8de3b0a2b621779fd44f85c103228a42afa71853b F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061ef1625f9 +F ext/misc/urifuncs.c a0b02a607b4170552deeff26812bb2f09eed1cc72d1056a4296ae6be0c19d100 F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057b1cdb @@ -369,7 +370,7 @@ F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697 F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c 4e9a59aa80c03350a0ca5faa454dec894906537fbd98b3231604cc33baf174c8 +F ext/rbu/sqlite3rbu.c 77a47f3231f5f363b2c584dba3e310a7efdaf073ad8c18728ab846b38de2879c F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 @@ -493,8 +494,8 @@ F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 5ba8fd376f539240939ae76b5bc9fa7ad9a0d86e9914ecd11eb7002204138c11 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c abc034557685db2bead003e7d6b2bd74bf1a44c4d3bfe9ddcf35dc90524a8c21 +F src/loadext.c 8cd803f1747c03a50b32fe87ebfb5851998d0cdafefe02737daa95e0616b42bb +F src/main.c 347687f4d843cb1660ec4bafe17fd3a9444d1208900308fddf6b6a418f091171 F src/malloc.c eaa4dc9602ce28b077f7de2eb275db2be270c5cc56d7fec5466301bd9b80e2f5 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -517,8 +518,8 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c ad7640c04eed946052a3b12856362a773d0a717696707313037186df0e2b59f2 F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 14ae8110bcb65a703d91131586848fe256c1a3cbbbc3eb1791090dbf925aa742 -F src/pager.h e541ff7e1931e6e2165c38c7ff38cd1af8df0e20472ee8596479fd53c6aa149d +F src/pager.c 52a2923ebd6ca0e2ce917b5860ffe893a344481b5fa4c2a2568ad156168bc558 +F src/pager.h 71fe1d5016ec54d0cc5d344cd474e563450b438c59f535e8c1ec8a13b1373f14 F src/parse.y c8d2de64db469fd56e0fa24da46cd8ec8523eb98626567d2708df371b47fdc3f F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 @@ -532,9 +533,9 @@ F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 924b61cef57033a8ca1ed3dcffd02445a7dd0c837cc849b2e4117251cac831f5 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f -F src/sqlite.h.in 4022f00351aec1ad99b9dcadc4fbe70a1db0e306e84fee509daf97a82ef044a4 +F src/sqlite.h.in c4713ccfa76dda5a96176d315ef5861d47f8d4815cc192d893b282a7f35669e9 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 +F src/sqlite3ext.h b0f776a0d042b23b6bcbb6b0943e8a3768c7f0b438a275e7168f0204e223a4db F src/sqliteInt.h 7a29ba700a51eeb925731749a570cf3859f6a58ed94797ecf47508875b0ba279 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 @@ -1856,10 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0a500da6aa659a8e73206e6d22ddbf2da5e4f1d1d551eeb66433163a3e13109d -R dd17ff42793e7be350eec0c77a1551ba -T *branch * enhanced-uri -T *sym-enhanced-uri * -T -sym-trunk * +P 2ae77bd2335708343bce4541b4d2cf16edfe3fd5bc2dfb93757238c926aa960b +R 3c2b1115f362d773ce1134af1c5678e6 U drh -Z a098e9553bba752fd93040dc261a9c76 +Z d49a59ecf45703e7c01f38027d23c9e9 diff --git a/manifest.uuid b/manifest.uuid index 980ac6d4ce..5f0da69f8b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2ae77bd2335708343bce4541b4d2cf16edfe3fd5bc2dfb93757238c926aa960b \ No newline at end of file +bcb43d11c4d0be36888c9e968ccdf85e7d7fccd72a29866f85c014e0562d4b93 \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index 2622a81711..245e9b004d 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -470,6 +470,10 @@ static const sqlite3_api_routines sqlite3Apis = { #endif /* Version 3.31.0 and later */ sqlite3_hard_heap_limit64, + sqlite3_uri_key, + sqlite3_filename_database, + sqlite3_filename_journal, + sqlite3_filename_wal, }; /* diff --git a/src/main.c b/src/main.c index 5426c8d715..deec659ec7 100644 --- a/src/main.c +++ b/src/main.c @@ -4241,25 +4241,6 @@ int sqlite3_test_control(int op, ...){ return rc; } -#ifdef SQLITE_DEBUG -/* -** This routine appears inside assert() statements only. -** -** Return the number of URI parameters that follow the filename. -*/ -int sqlite3UriCount(const char *z){ - int n = 0; - if( z==0 ) return 0; - z += strlen(z)+1; - while( z[0] ){ - z += strlen(z)+1; - z += strlen(z)+1; - n++; - } - return n; -} -#endif /* SQLITE_DEBUG */ - /* ** This is a utility routine, useful to VFS implementations, that checks ** to see if a database file was a URI that contained a specific query @@ -4272,21 +4253,30 @@ int sqlite3UriCount(const char *z){ ** returns a NULL pointer. */ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ - const Pager *pPager; - const char *z; if( zFilename==0 || zParam==0 ) return 0; - pPager = sqlite3PagerFromFilename(zFilename); - assert( pPager!=0 ); - z = sqlite3PagerQueryParameters(pPager); - while( z[0] ){ - int x = strcmp(z, zParam); - z += sqlite3Strlen30(z) + 1; - if( x==0 ) return z; - z += sqlite3Strlen30(z) + 1; + zFilename += sqlite3Strlen30(zFilename) + 1; + while( zFilename[0] ){ + int x = strcmp(zFilename, zParam); + zFilename += sqlite3Strlen30(zFilename) + 1; + if( x==0 ) return zFilename; + zFilename += sqlite3Strlen30(zFilename) + 1; } return 0; } +/* +** Return a pointer to the name of Nth query parameter of the filename. +*/ +const char *sqlite3_uri_key(const char *zFilename, int N){ + if( zFilename==0 || N<0 ) return 0; + zFilename += sqlite3Strlen30(zFilename) + 1; + while( zFilename[0] && (N--)>0 ){ + zFilename += sqlite3Strlen30(zFilename) + 1; + zFilename += sqlite3Strlen30(zFilename) + 1; + } + return zFilename[0] ? zFilename : 0; +} + /* ** Return a boolean value for a query parameter. */ @@ -4312,6 +4302,25 @@ sqlite3_int64 sqlite3_uri_int64( return bDflt; } +/* +** The Pager stores the Journal filename, WAL filename, and Database filename +** consecutively in memory, in that order, with prefixes \000\001\000, +** \002\000, and \003\000, in that order. Thus the three names look like query +** parameters if you start at the first prefix. +** +** This routine backs up a filename to the start of the first prefix. +** +** This only works if the filenamed passed in was obtained from the Pager. +*/ +static const char *startOfNameList(const char *zName){ + while( zName[0]!='\001' || zName[1]!=0 ){ + zName -= 3; + while( zName[0]!='\000' ){ zName--; } + zName++; + } + return zName-1; +} + /* ** Translate a filename that was handed to a VFS routine into the corresponding ** database, journal, or WAL file. @@ -4323,19 +4332,13 @@ sqlite3_int64 sqlite3_uri_int64( ** corruption. */ const char *sqlite3_filename_database(const char *zFilename){ - const Pager *pPager = sqlite3PagerFromFilename(zFilename); - assert( pPager!=0 ); - return sqlite3PagerFilename(pPager, 0); + return sqlite3_uri_parameter(zFilename - 3, "\003"); } const char *sqlite3_filename_journal(const char *zFilename){ - const Pager *pPager = sqlite3PagerFromFilename(zFilename); - assert( pPager!=0 ); - return sqlite3PagerJournalFilename(pPager); + return sqlite3_uri_parameter(startOfNameList(zFilename), "\001"); } const char *sqlite3_filename_wal(const char *zFilename){ - const Pager *pPager = sqlite3PagerFromFilename(zFilename); - assert( pPager!=0 ); - return sqlite3PagerWalFilename(pPager); + return sqlite3_uri_parameter(startOfNameList(zFilename), "\002"); } /* diff --git a/src/pager.c b/src/pager.c index 685f0462b1..d023682b2a 100644 --- a/src/pager.c +++ b/src/pager.c @@ -696,7 +696,6 @@ struct Pager { Pgno mxPgno; /* Maximum allowed size of the database */ i64 journalSizeLimit; /* Size limit for persistent journal files */ char *zFilename; /* Name of the database file */ - char *zQueryParam; /* URI query parameters on the filename */ char *zJournal; /* Name of the journal file */ int (*xBusyHandler)(void*); /* Function to call when busy */ void *pBusyHandlerArg; /* Context argument for xBusyHandler */ @@ -4839,30 +4838,30 @@ int sqlite3PagerOpen( ** Database file handle (pVfs->szOsFile bytes) ** Sub-journal file handle (journalFileSize bytes) ** Main journal file handle (journalFileSize bytes) - ** Pointer back to self (sizeof(*Pager) bytes) + ** \0\1\0 journal prefix (3 bytes) + ** Journal filename (nPathname+8+1 bytes) + ** \2\0 WAL prefix (2 bytes) + ** WAL filename (nPathname+4+1 bytes) + ** \3\0 database prefix (2 bytes) ** Database file name (nPathname+1 bytes) ** URI query parameters (nUriByte bytes) - ** padding for 8-byte alignment - ** Pointer back to self (sizeof(*Pager) bytes) - ** WAL filename (nPathname+4+1 bytes) - ** padding for 8-byte alignment - ** Pointer back to self (sizeof(*Pager) bytes) - ** Journal file name (nPathname+8+1 bytes) + ** \0\0 terminator (2 bytes) */ pPtr = (u8 *)sqlite3MallocZero( ROUND8(sizeof(*pPager)) + /* Pager structure */ ROUND8(pcacheSize) + /* PCache object */ ROUND8(pVfs->szOsFile) + /* The main db file */ journalFileSize * 2 + /* The two journal files */ - sizeof(Pager*) + /* Self-pointer for database */ - ROUND8(nPathname + 1 + nUriByte) + /* database filename + query params */ - sizeof(Pager*) + /* Self-pointer for journal */ - ROUND8(nPathname + 8 + 2) + /* zJournal */ + 3 + /* Journal prefix */ + nPathname + 8 + 1 + /* Journal filename */ #ifndef SQLITE_OMIT_WAL - sizeof(Pager*) + /* Self-pointer for zWal */ - ROUND8(nPathname + 4 + 2) + /* zWal */ + 2 + /* WAL prefix */ + nPathname + 4 + 1 + /* WAL filename */ #endif - 0 + 2 + /* Database prefix */ + nPathname + 1 + /* database filename */ + nUriByte + /* query parameters */ + 2 /* Terminator */ ); assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); if( !pPtr ){ @@ -4876,33 +4875,47 @@ int sqlite3PagerOpen( pPager->jfd = (sqlite3_file*)pPtr; pPtr += journalFileSize; assert( EIGHT_BYTE_ALIGNMENT(pPager->jfd) ); - /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ - assert( EIGHT_BYTE_ALIGNMENT(pPtr) ); - memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); - pPager->zFilename = (char*)pPtr; - if( nPathname==0 ) zPathname = ""; - memcpy(pPtr, zPathname, nPathname); - pPager->zQueryParam = pPager->zFilename + nPathname + 1; - if( zUri ) memcpy(pPager->zQueryParam, zUri, nUriByte); - assert( nUriByte>=1 ); - assert( nUriByte >= nUri*3 + 1 ); - pPtr += ROUND8(nPathname + 1 + nUriByte); + + /* Fill in Pager.zJournal */ + pPtr[1] = '\001'; pPtr += 3; + if( nPathname>0 ){ + pPager->zJournal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; + memcpy(pPtr, "-journal",8); pPtr += 8 + 1; +#ifdef SQLITE_ENABLE_8_3_NAMES + sqlite3FileSuffix3(zFilename,pPager->zJournal); + pPtr = (u8*)(pPager->zJournal + sqlite3Strlen30(pPager->zJournal)+1); +#endif + }else{ + pPager->zJournal = 0; + pPtr++; + } #ifndef SQLITE_OMIT_WAL /* Fill in Pager.zWal */ - assert( EIGHT_BYTE_ALIGNMENT(pPtr) ); - memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); - pPager->zWal = (char*)pPtr; - memcpy(pPtr, zPathname, nPathname); - memcpy(pPtr+nPathname, "-wal", 4); pPtr += ROUND8(nPathname + 4 + 2); + pPtr[0] = '\002'; pPtr[1] = 0; pPtr += 2; + if( nPathname>0 ){ + pPager->zWal = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname; + memcpy(pPtr, "-wal", 4); pPtr += 4 + 1; +#ifdef SQLITE_ENABLE_8_3_NAMES + sqlite3FileSuffix3(zFilename, pPager->zWal); + pPtr = (u8*)(pPager->zWal + sqlite3Strlen30(pPager->zWal)+1); +#endif + }else{ + pPager->zWal = 0; + pPtr++; + } #endif - /* Fill in Pager.zJournal */ - assert( EIGHT_BYTE_ALIGNMENT(pPtr) ); - memcpy(pPtr, &pPager, sizeof(pPager)); pPtr += sizeof(pPager); - pPager->zJournal = (char*)pPtr; - memcpy(pPtr, zPathname, nPathname); - memcpy(pPtr+nPathname, "-journal",8); /*pPtr += ROUND8(nPathname + 8 + 2);*/ + /* Fill in the Pager.zFilename and pPager.zQueryParam fields */ + pPtr[0] = '\003'; pPtr[1] = 0; pPtr += 2; + pPager->zFilename = (char*)pPtr; + memcpy(pPtr, zPathname, nPathname); pPtr += nPathname + 1; + if( zUri ){ + memcpy(pPtr, zUri, nUriByte); /* pPtr += nUriByte; // not needed */ + } + /* Double-zero terminator implied by the sqlite3MallocZero */ if( nPathname ) sqlite3DbFree(0, zPathname); pPager->pVfs = pVfs; @@ -7018,50 +7031,13 @@ int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint){ ** behavior. But when the Btree needs to know the filename for matching to ** shared cache, it uses nullIfMemDb==0 so that in-memory databases can ** participate in shared-cache. +** +** The return value to this routine is always safe to use with +** sqlite3_uri_parameter() and sqlite3_filename_database() and friends. */ const char *sqlite3PagerFilename(const Pager *pPager, int nullIfMemDb){ - return (nullIfMemDb && pPager->memDb) ? "" : pPager->zFilename; -} - -/* -** Return the name of the Journal file or WAL file of the given pager. -*/ -const char *sqlite3PagerJournalFilename(const Pager *pPager){ - assert( pPager!=0 ); - return pPager->zJournal; -} -#ifndef SQLITE_OMIT_WAL -const char *sqlite3PagerWalFilename(const Pager *pPager){ - assert( pPager!=0 ); - return pPager->zWal; -} -#endif /* SQLITE_OMIT_WAL */ - -/* Return a pointer to the URI query parameters associated with the -** pager. -** -** The query parameters are a sequence of strings pairs. The first -** string of each pair is the key and the second string is the value. -** All strings are terminated by a single 0x00 byte. The list is -** terminated by the first empty-string key. -*/ -const char *sqlite3PagerQueryParameters(const Pager *pPager){ - assert( pPager!=0 ); - return pPager->zQueryParam; -} - -/* If zFilename is a filename passed to the xOpen method of the VFS - -** either the main database file, the WAL file, or the journal file - -** then this routine returns a pointer to the Pager object associated -** with that file. -*/ -const Pager *sqlite3PagerFromFilename(const char *zFilename){ - const Pager **pp = (const Pager**)zFilename; - pp--; - assert( (*pp)->zFilename==zFilename - || (*pp)->zJournal==zFilename - || (*pp)->zWal==zFilename ); - return *pp; + static const char zFake[] = { 0x01, 0x00, 0x00, 0x00 }; + return (nullIfMemDb && pPager->memDb) ? &zFake[2] : pPager->zFilename; } /* diff --git a/src/pager.h b/src/pager.h index 2e8ba30f38..904278944c 100644 --- a/src/pager.h +++ b/src/pager.h @@ -204,10 +204,6 @@ u32 sqlite3PagerDataVersion(Pager*); #endif int sqlite3PagerMemUsed(Pager*); const char *sqlite3PagerFilename(const Pager*, int); -const char *sqlite3PagerWalFilename(const Pager*); -const char *sqlite3PagerJournalFilename(const Pager*); -const char *sqlite3PagerQueryParameters(const Pager*); -const Pager *sqlite3PagerFromFilename(const char*); sqlite3_vfs *sqlite3PagerVfs(Pager*); sqlite3_file *sqlite3PagerFile(Pager*); sqlite3_file *sqlite3PagerJrnlFile(Pager*); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 7f76e0855a..0d22b87d43 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2794,7 +2794,7 @@ char *sqlite3_vsnprintf(int,char*,const char*, va_list); ** ** The SQLite core uses these three routines for all of its own ** internal memory allocation needs. "Core" in the previous sentence -** does not include operating-system specific VFS implementation. The +** does not include operating-system specific [VFS] implementation. The ** Windows VFS uses native malloc() and free() for some operations. ** ** ^The sqlite3_malloc() routine returns a pointer to a block @@ -3494,14 +3494,13 @@ int sqlite3_open_v2( /* ** CAPI3REF: Obtain Values For URI Parameters ** -** These are utility routines, useful to VFS implementations, that check -** to see if a database file was a URI that contained a specific query +** These are utility routines, useful to [VFS|custom VFS implementations], +** that check if a database file was a URI that contained a specific query ** parameter, and if so obtains the value of that query parameter. ** ** If F is the database filename pointer passed into the xOpen() method of -** a VFS implementation when the flags parameter to xOpen() has one or -** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and -** P is the name of the query parameter, then +** a VFS implementation or it is the return value of [sqlite3_db_filename()] +** and if P is the name of the query parameter, then ** sqlite3_uri_parameter(F,P) returns the value of the P ** parameter if it exists or a NULL pointer if P does not appear as a ** query parameter on F. If P is a query parameter of F and it @@ -3523,40 +3522,60 @@ int sqlite3_open_v2( ** 64-bit signed integer and returns that integer, or D if P does not ** exist. If the value of P is something other than an integer, then ** zero is returned. +** +** The sqlite3_uri_key(F,N) returns a pointer to the name (not +** the value) of the N-th query parameter for filename F, or a NULL +** pointer if N is less than zero or greater than the number of query +** parameters minus 1. The N value is zero-based so N should be 0 to obtain +** the name of the first query parameter, 1 for the second parameter, and +** so forth. ** ** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and ** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and -** is not a database file pathname pointer that SQLite passed into the xOpen -** VFS method, then the behavior of this routine is undefined and probably -** undesirable. +** is not a database file pathname pointer that the SQLite core passed +** into the xOpen VFS method, then the behavior of this routine is undefined +** and probably undesirable. +** +** Beginning with SQLite [version 3.31.0] ([dateof:3.31.0]) the input F +** parameter can also be the name of a rollback journal file or WAL file +** in addition to the main database file. Prior to version 3.31.0, these +** routines would only work if F was the name of the main database file. +** When the F parameter is the name of the rollback journal or WAL file, +** it has access to all the same query parameters as were found on the +** main database file. ** ** See the [URI filename] documentation for additional information. */ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); +const char *sqlite3_uri_key(const char *zFilename, int N); /* ** CAPI3REF: Translate filenames ** -** These routines are available to VFS implementations for translating -** filenames between the main database file, the journal file, and the -** WAL file. +** These routines are available to [VFS|custom VFS implementations] for +** translating filenames between the main database file, the journal file, +** and the WAL file. ** ** If F is the name of an sqlite database file, journal file, or WAL file -** then sqlite3_filename_database(F) returns the name of the corresponding -** database file. +** passed by the SQLite core into the VFS, then sqlite3_filename_database(F) +** returns the name of the corresponding database file. ** ** If F is the name of an sqlite database file, journal file, or WAL file -** then sqlite3_filename_journal(F) returns the name of the corresponding -** rollback journal file. +** passed by the SQLite core into the VFS, or if F is a database filename +** obtained from [sqlite3_db_filename()], then sqlite3_filename_journal(F) +** returns the name of the corresponding rollback journal file. ** ** If F is the name of an sqlite database file, journal file, or WAL file -** then sqlite3_filename_wal(F) returns the name of the corresponding +** that was passed by the SQLite core into the VFS, or if F is a database +** filename obtained from [sqlite3_db_filename()], then +** sqlite3_filename_wal(F) returns the name of the corresponding ** WAL file. ** ** In all of the above, if F is not the name of a database, journal or WAL -** filename passed into the VFS from the SQLite core, then the result is +** filename passed into the VFS from the SQLite core and F is not the +** return value from [sqlite3_db_filename()], then the result is ** undefined and is likely a memory access violation. */ const char *sqlite3_filename_database(const char*); @@ -6006,6 +6025,17 @@ sqlite3 *sqlite3_db_handle(sqlite3_stmt*); ** xFullPathname method of the [VFS]. ^In other words, the filename ** will be an absolute pathname, even if the filename used ** to open the database originally was a URI or relative pathname. +** +** If the filename pointer returned by this routine is not NULL, then it +** can be used as the filename input parameter to these routines: +**
    +**
  • [sqlite3_uri_parameter()] +**
  • [sqlite3_uri_boolean()] +**
  • [sqlite3_uri_int64()] +**
  • [sqlite3_filename_database()] +**
  • [sqlite3_filename_journal()] +**
  • [sqlite3_filename_wal()] +**
*/ const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index f7a0386a7a..b5258e0da0 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -324,7 +324,12 @@ struct sqlite3_api_routines { int (*value_frombind)(sqlite3_value*); /* Version 3.30.0 and later */ int (*drop_modules)(sqlite3*,const char**); + /* Version 3.31.0 and later */ sqlite3_int64 (*hard_heap_limit64)(sqlite3_int64); + const char *(*uri_key)(const char*,int); + const char *(*filename_database)(const char*); + const char *(*filename_journal)(const char*); + const char *(*filename_wal)(const char*); }; /* @@ -619,7 +624,12 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_value_frombind sqlite3_api->frombind /* Version 3.30.0 and later */ #define sqlite3_drop_modules sqlite3_api->drop_modules +/* Version 3.31.0 andn later */ #define sqlite3_hard_heap_limit64 sqlite3_api->hard_heap_limit64 +#define sqlite3_uri_key sqlite3_api->uri_key +#define sqlite3_filename_database sqlite3_api->filename_database +#define sqlite3_filename_journal sqlite3_api->filename_journal +#define sqlite3_filename_wal sqlite3_api->filename_wal #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) From cdfadc79484ad4ea8e3a5dfe0f635f3ad5f03b7e Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 11 Jan 2020 20:27:02 +0000 Subject: [PATCH 465/476] Minor changes for consistency between sqlite3_filename_wal() and sqlite3_filename_journal(). FossilOrigin-Name: 9a70ff43a7b6848a71d5049f5a4ae24e3eb8a83d5c6651f5a9937abf03b3eccf --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/main.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e02228bbba..cec6da1a26 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Redesign\sfor\sbetter\slegacy\scompatibility.\s\sAdd\sthe\ssqlite3_uri_key()\sinterface. -D 2020-01-11T16:08:31.366 +C Minor\schanges\sfor\sconsistency\sbetween\ssqlite3_filename_wal()\sand\nsqlite3_filename_journal(). +D 2020-01-11T20:27:02.236 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -495,7 +495,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 5ba8fd376f539240939ae76b5bc9fa7ad9a0d86e9914ecd11eb7002204138c11 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 8cd803f1747c03a50b32fe87ebfb5851998d0cdafefe02737daa95e0616b42bb -F src/main.c 347687f4d843cb1660ec4bafe17fd3a9444d1208900308fddf6b6a418f091171 +F src/main.c da8b42cee9b83cc923bf23d1945c9fb48cf57cb0422d5fe43a1ff88dc453b97b F src/malloc.c eaa4dc9602ce28b077f7de2eb275db2be270c5cc56d7fec5466301bd9b80e2f5 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2ae77bd2335708343bce4541b4d2cf16edfe3fd5bc2dfb93757238c926aa960b -R 3c2b1115f362d773ce1134af1c5678e6 +P bcb43d11c4d0be36888c9e968ccdf85e7d7fccd72a29866f85c014e0562d4b93 +R 871113a27520edbfc1ac5575d271c267 U drh -Z d49a59ecf45703e7c01f38027d23c9e9 +Z 3849c2e270b7744a5b5d300fb2b6fbdd diff --git a/manifest.uuid b/manifest.uuid index 5f0da69f8b..63a5361143 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bcb43d11c4d0be36888c9e968ccdf85e7d7fccd72a29866f85c014e0562d4b93 \ No newline at end of file +9a70ff43a7b6848a71d5049f5a4ae24e3eb8a83d5c6651f5a9937abf03b3eccf \ No newline at end of file diff --git a/src/main.c b/src/main.c index deec659ec7..995061fec7 100644 --- a/src/main.c +++ b/src/main.c @@ -4335,7 +4335,8 @@ const char *sqlite3_filename_database(const char *zFilename){ return sqlite3_uri_parameter(zFilename - 3, "\003"); } const char *sqlite3_filename_journal(const char *zFilename){ - return sqlite3_uri_parameter(startOfNameList(zFilename), "\001"); + const char *z = sqlite3_uri_parameter(startOfNameList(zFilename), "\001"); + return ALWAYS(z) && z[0] ? z : 0; } const char *sqlite3_filename_wal(const char *zFilename){ return sqlite3_uri_parameter(startOfNameList(zFilename), "\002"); From ca7d3e1d4290fda5887b91c2afbc5d85c39c7d1f Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 12 Jan 2020 22:20:07 +0000 Subject: [PATCH 466/476] Remove an incorrect assert(). Fix for ticket [614b25314c766238] FossilOrigin-Name: 6a999c5aa0d1d5569a5bda50d27e3a15c13e93e69d00db97c5294901522064a3 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/wherecode.c | 3 --- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 333d9f5a9c..e64e2455c2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sapis:\ssqlite3_filename_database(),\ssqlite3_filename_journal(),\sand\nsqlite3_filename_wal().\s\sAlso\ssqlite3_uri_key().\s\sAnd\sthe\sother\ssqlite3_uri\nfunctions\snow\swork\susing\sthe\sjournal\sor\swal\sfilename\sin\saddition\sto\sthe\ndatabase\sfile.\s\sAnd\sthe\ssqlite3_db_filename()\sresult\sis\sguaranteed\sto\swork\s\nas\san\sargument\sto\sthe\ssqlite3_uri\sfunctions. -D 2020-01-11T21:08:59.397 +C Remove\san\sincorrect\sassert().\s\sFix\sfor\sticket\s[614b25314c766238] +D 2020-01-12T22:20:07.875 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -619,7 +619,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c df2bea0e0122e853d9f1a8ec68920744166d2a524e338eba92e5470538ecd1f9 F src/whereInt.h e1d1db6bbec0ba4f345acc338f956c8237a6f06413afa68c6414e82fb5b06745 -F src/wherecode.c 75ad6cbb8dfe585ffe0fc71008750b5158fc4811c3a498327033920b18f0a4be +F src/wherecode.c 3f7b0f73a239842999ccac1f8210dc071cf9f3acd534fd119f500c9a91c7bb9f F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c f8ba2ee12a19b51d3ba42c16277c74185ee9215306bc0d5a03974ade8b5bc98f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1857,8 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0a500da6aa659a8e73206e6d22ddbf2da5e4f1d1d551eeb66433163a3e13109d 9a70ff43a7b6848a71d5049f5a4ae24e3eb8a83d5c6651f5a9937abf03b3eccf -R 871113a27520edbfc1ac5575d271c267 -T +closed 9a70ff43a7b6848a71d5049f5a4ae24e3eb8a83d5c6651f5a9937abf03b3eccf +P fd7bcc53524096f5245e5ae04c12780d2c43b9b3af17ec529447aed21b82cc2b +R a2b0a82d9cc6525c216005f05f5df763 U drh -Z ad17285b3e2c7538416f668767f6cf45 +Z edecc3b6733717f76464dac530e40e7c diff --git a/manifest.uuid b/manifest.uuid index e07fb8d89b..a7046b7edc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fd7bcc53524096f5245e5ae04c12780d2c43b9b3af17ec529447aed21b82cc2b \ No newline at end of file +6a999c5aa0d1d5569a5bda50d27e3a15c13e93e69d00db97c5294901522064a3 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 03e393498e..251695faf5 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -2150,9 +2150,6 @@ Bitmask sqlite3WhereCodeOneLoopStart( WhereInfo *pSubWInfo; /* Info for single OR-term scan */ Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ int jmp1 = 0; /* Address of jump operation */ - assert( (pTabItem[0].fg.jointype & JT_LEFT)==0 - || ExprHasProperty(pOrExpr, EP_FromJoin) - ); if( pAndExpr ){ pAndExpr->pLeft = pOrExpr; pOrExpr = pAndExpr; From d8df36bd4e7828619437e7d6eb2bbd622cb8ebad Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 12 Jan 2020 22:25:58 +0000 Subject: [PATCH 467/476] Change the zipfile virtual table so that the xBestIndex method gives a reasonable cost estimate even if no filename is specified. The missing filename error continues to be raised in the xFilter method. Meanwhile, the more reasonable cost estimate avoids unnecessary wierdness in the query planner. FossilOrigin-Name: 0e468aa6decc73be307596782a778a739ff1b5dc0eb10fc4bd6776e460f99f8b --- ext/misc/zipfile.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 82e9ce06e9..a35a26f4d8 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -1309,10 +1309,10 @@ static int zipfileBestIndex( idx = i; } } + pIdxInfo->estimatedCost = 1000.0; if( idx>=0 ){ pIdxInfo->aConstraintUsage[idx].argvIndex = 1; pIdxInfo->aConstraintUsage[idx].omit = 1; - pIdxInfo->estimatedCost = 1000.0; pIdxInfo->idxNum = 1; }else if( unusable ){ return SQLITE_CONSTRAINT; diff --git a/manifest b/manifest index e64e2455c2..91f12c1e12 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sincorrect\sassert().\s\sFix\sfor\sticket\s[614b25314c766238] -D 2020-01-12T22:20:07.875 +C Change\sthe\szipfile\svirtual\stable\sso\sthat\sthe\sxBestIndex\smethod\sgives\sa\nreasonable\scost\sestimate\seven\sif\sno\sfilename\sis\sspecified.\s\sThe\smissing\nfilename\serror\scontinues\sto\sbe\sraised\sin\sthe\sxFilter\smethod.\s\sMeanwhile,\nthe\smore\sreasonable\scost\sestimate\savoids\sunnecessary\swierdness\sin\sthe\squery\nplanner. +D 2020-01-12T22:25:58.315 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -328,7 +328,7 @@ F ext/misc/vfsstat.c 77b5b4235c9f7f11eddf82487c0a422944ac2f132dafd5af3be7a68a057 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 520f34c3099e5b7d546f13708607dc2fa173c46b68952eecf0d19cd675fec85e -F ext/misc/zipfile.c b09f38ccd4b9666b8e152f71c33ee381c8c2d6939203ac896c174e4c6fc6bc4a +F ext/misc/zipfile.c d1be54ea83ac9ad71b8b6ffc4b60db8946ce2ceacdf6bff063fcd9489f41bb49 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P fd7bcc53524096f5245e5ae04c12780d2c43b9b3af17ec529447aed21b82cc2b -R a2b0a82d9cc6525c216005f05f5df763 +P 6a999c5aa0d1d5569a5bda50d27e3a15c13e93e69d00db97c5294901522064a3 +R 1a302def53bcc8a305d91bdb4d7b1aeb U drh -Z edecc3b6733717f76464dac530e40e7c +Z 5ff48559c68bb18b16bc5be830c2b338 diff --git a/manifest.uuid b/manifest.uuid index a7046b7edc..d7c4de0dcf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6a999c5aa0d1d5569a5bda50d27e3a15c13e93e69d00db97c5294901522064a3 \ No newline at end of file +0e468aa6decc73be307596782a778a739ff1b5dc0eb10fc4bd6776e460f99f8b \ No newline at end of file From 3b8eb08b17cbf37c1d6da01bd7eaabc243158396 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 12 Jan 2020 22:38:17 +0000 Subject: [PATCH 468/476] Better than removing the incorrect assert() is to change it into a testcase() together with a comment indicating where an appropriate test case can be found, and the ticket that provoked the change. Ticket [614b25314c766238] FossilOrigin-Name: 3e3c60d8124672ff72a57dfa2e51276316bcac8c8ae8a5739da358f26924b0fb --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 91f12c1e12..194006e18b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\szipfile\svirtual\stable\sso\sthat\sthe\sxBestIndex\smethod\sgives\sa\nreasonable\scost\sestimate\seven\sif\sno\sfilename\sis\sspecified.\s\sThe\smissing\nfilename\serror\scontinues\sto\sbe\sraised\sin\sthe\sxFilter\smethod.\s\sMeanwhile,\nthe\smore\sreasonable\scost\sestimate\savoids\sunnecessary\swierdness\sin\sthe\squery\nplanner. -D 2020-01-12T22:25:58.315 +C Better\sthan\sremoving\sthe\sincorrect\sassert()\sis\sto\schange\sit\sinto\sa\ntestcase()\stogether\swith\sa\scomment\sindicating\swhere\san\sappropriate\stest\scase\ncan\sbe\sfound,\sand\sthe\sticket\sthat\sprovoked\sthe\schange.\nTicket\s[614b25314c766238] +D 2020-01-12T22:38:17.374 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -619,7 +619,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d F src/where.c df2bea0e0122e853d9f1a8ec68920744166d2a524e338eba92e5470538ecd1f9 F src/whereInt.h e1d1db6bbec0ba4f345acc338f956c8237a6f06413afa68c6414e82fb5b06745 -F src/wherecode.c 3f7b0f73a239842999ccac1f8210dc071cf9f3acd534fd119f500c9a91c7bb9f +F src/wherecode.c ec8870d6fe79668dd12d7edc65ae9771828d6cdfe478348c8abd872a89fdbadd F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c f8ba2ee12a19b51d3ba42c16277c74185ee9215306bc0d5a03974ade8b5bc98f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6a999c5aa0d1d5569a5bda50d27e3a15c13e93e69d00db97c5294901522064a3 -R 1a302def53bcc8a305d91bdb4d7b1aeb +P 0e468aa6decc73be307596782a778a739ff1b5dc0eb10fc4bd6776e460f99f8b +R 76358fd3663c08229f0e49e9d0a4f6fc U drh -Z 5ff48559c68bb18b16bc5be830c2b338 +Z e551a6acb253e74cc6216b26e8d80c01 diff --git a/manifest.uuid b/manifest.uuid index d7c4de0dcf..6405becdd2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e468aa6decc73be307596782a778a739ff1b5dc0eb10fc4bd6776e460f99f8b \ No newline at end of file +3e3c60d8124672ff72a57dfa2e51276316bcac8c8ae8a5739da358f26924b0fb \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 251695faf5..0014a695d1 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -2150,6 +2150,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( WhereInfo *pSubWInfo; /* Info for single OR-term scan */ Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ int jmp1 = 0; /* Address of jump operation */ + testcase( (pTabItem[0].fg.jointype & JT_LEFT)!=0 + && !ExprHasProperty(pOrExpr, EP_FromJoin) + ); /* See TH3 vtab25.400 and ticket 614b25314c766238 */ if( pAndExpr ){ pAndExpr->pLeft = pOrExpr; pOrExpr = pAndExpr; From 3c867026c084e6e50311ce3cb13feb747de0441c Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 13 Jan 2020 13:33:08 +0000 Subject: [PATCH 469/476] Documentation updates. No changes to code. FossilOrigin-Name: cc0e0aa3a7d534b806cdf63200b32ab3b7f0e08dde717f043a36d2f91c8a046c --- manifest | 12 ++++----- manifest.uuid | 2 +- src/sqlite.h.in | 69 +++++++++++++++++++++++++++---------------------- 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index 194006e18b..e87db48560 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Better\sthan\sremoving\sthe\sincorrect\sassert()\sis\sto\schange\sit\sinto\sa\ntestcase()\stogether\swith\sa\scomment\sindicating\swhere\san\sappropriate\stest\scase\ncan\sbe\sfound,\sand\sthe\sticket\sthat\sprovoked\sthe\schange.\nTicket\s[614b25314c766238] -D 2020-01-12T22:38:17.374 +C Documentation\supdates.\s\sNo\schanges\sto\scode. +D 2020-01-13T13:33:08.672 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/resolve.c 1139e3157c710c6e6f04fe726f4e0d8bdb1ae89a276d3b0ca4975af163141c9c F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 924b61cef57033a8ca1ed3dcffd02445a7dd0c837cc849b2e4117251cac831f5 F src/shell.c.in 43d3cfbee97d78ca5782dc53e4c1e22d3cc15c91beff20889dc60551f47eab9f -F src/sqlite.h.in c4713ccfa76dda5a96176d315ef5861d47f8d4815cc192d893b282a7f35669e9 +F src/sqlite.h.in 97c0691ec8fb1e61ae220f9d987644c43ff33302fe720b7da6cae0420b62bde4 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h b0f776a0d042b23b6bcbb6b0943e8a3768c7f0b438a275e7168f0204e223a4db F src/sqliteInt.h 7a29ba700a51eeb925731749a570cf3859f6a58ed94797ecf47508875b0ba279 @@ -1857,7 +1857,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0e468aa6decc73be307596782a778a739ff1b5dc0eb10fc4bd6776e460f99f8b -R 76358fd3663c08229f0e49e9d0a4f6fc +P 3e3c60d8124672ff72a57dfa2e51276316bcac8c8ae8a5739da358f26924b0fb +R 709f470e25c71e3d846b00e7bb20cc66 U drh -Z e551a6acb253e74cc6216b26e8d80c01 +Z 666e5887aeab5b35d8b57b54fe64a2ad diff --git a/manifest.uuid b/manifest.uuid index 6405becdd2..aec613b957 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e3c60d8124672ff72a57dfa2e51276316bcac8c8ae8a5739da358f26924b0fb \ No newline at end of file +cc0e0aa3a7d534b806cdf63200b32ab3b7f0e08dde717f043a36d2f91c8a046c \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 0d22b87d43..168d3f46c2 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2267,21 +2267,23 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_TRUSTED_SCHEMA]] **