From 115d663c05758e5d32a5c5123c1d7b4b5460ae7c Mon Sep 17 00:00:00 2001 From: numist Date: Thu, 12 Dec 2019 02:50:07 +0000 Subject: [PATCH 01/29] More efficient implementation of a lookaside allocator that supports mini (in this case, harcoded to 128B) slots. FossilOrigin-Name: b02fdc09c838f355d9efce57f817d6a86153153b4a1f2b763914f4aaa34cb76e --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/main.c | 22 +++++++++++++++++++++- src/malloc.c | 36 +++++++++++++++++++++++++++++++++--- src/sqliteInt.h | 5 +++++ src/status.c | 13 +++++++++++++ 6 files changed, 86 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 804a68c4d3..ca38c913ca 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sgoofy\sstring\sformatting\sin\slemon.c\sthat\sdates\sfrom\sthe\sK&R-C\sdays. -D 2019-12-12T00:20:40.700 +C More\sefficient\simplementation\sof\sa\slookaside\sallocator\sthat\ssupports\smini\s(in\sthis\scase,\sharcoded\sto\s128B)\sslots. +D 2019-12-12T02:50:07.468 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -491,8 +491,8 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 5de3fd62bd1a692353c8f9c7bbde658f0b579f195620ca3cde1948a53015dddd F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb -F src/malloc.c 550021fcae36f0ffe9f8563d83e6385f9df307a854d55d7d0abb7241ee8dbcc6 +F src/main.c dc4fe09174ef0c11204ca90ed46323471c127c9d18266ec97ee1bca871200e99 +F src/malloc.c 350d345ab12aa089f3dbd30b4db9b57e486c9dd920d275d1775aa5b6899199ff F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -532,9 +532,9 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h 1ac4dfde728b9d5812d1223d668d5e1f43c6fe4f469d6a7a482f298a10a03210 +F src/sqliteInt.h 7965727cc420b5e9ab79f4ba8bda8e806ba315c6e9f489e83f0202f3397fb522 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b -F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e +F src/status.c 0fe55b92810509eac821ded2e177e1da944a78cdcdfec7813ad1d6b36d6d667e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 8cd2600e8de23dff6cdf84d39f46ca57139b061b28f6f80b166bace17d52ab1c F src/test1.c c654981c1d86ebc90dd23fcc0969e6c85e28112f0acc2e2224a97a2a33e7c42f @@ -1852,7 +1852,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 4d6d2fc046d586a1e5989bbb2757f13d0371fbfad0acf45a0e2fd77dffd8d8f9 -R 5e026b3cfa5e818c2e50f705eaa7c6b6 -U drh -Z d2668f11b5269bc264b434444e0b4796 +P 48ba5e5a2227257cebafacbb09e9dd91d9b89ab2d52a8b4e4113c1d017d95f41 +R 7ee7a134ba45ae790f475dbb2e983799 +T *branch * mini-lookaside-take-2 +T *sym-mini-lookaside-take-2 * +T -sym-trunk * +U numist +Z aef044ee81b705b7df5a6b1d29e511a6 diff --git a/manifest.uuid b/manifest.uuid index 433b215c3e..c14893ca2e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -48ba5e5a2227257cebafacbb09e9dd91d9b89ab2d52a8b4e4113c1d017d95f41 \ No newline at end of file +b02fdc09c838f355d9efce57f817d6a86153153b4a1f2b763914f4aaa34cb76e \ No newline at end of file diff --git a/src/main.c b/src/main.c index 1afeee0bdb..96234bfe4a 100644 --- a/src/main.c +++ b/src/main.c @@ -683,6 +683,7 @@ int sqlite3_config(int op, ...){ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ #ifndef SQLITE_OMIT_LOOKASIDE void *pStart; + sqlite3_int64 szAlloc = sz*(sqlite3_int64)cnt; if( sqlite3LookasideUsed(db,0)>0 ){ return SQLITE_BUSY; @@ -705,7 +706,7 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ pStart = 0; }else if( pBuf==0 ){ sqlite3BeginBenignMalloc(); - pStart = sqlite3Malloc( sz*(sqlite3_int64)cnt ); /* IMP: R-61949-35727 */ + pStart = sqlite3Malloc( szAlloc ); /* IMP: R-61949-35727 */ sqlite3EndBenignMalloc(); if( pStart ) cnt = sqlite3MallocSize(pStart)/sz; }else{ @@ -714,6 +715,15 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.pStart = pStart; db->lookaside.pInit = 0; db->lookaside.pFree = 0; +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + db->lookaside.pMiniInit = 0; + db->lookaside.pMiniFree = 0; + /* The arithmetic below causes the number of large lookaside slots to be 1/3 + ** the number of mini slots, based on the observation that 75% of allocations + ** are <=128B. + */ + cnt = szAlloc/(3*128+sz); +#endif db->lookaside.sz = (u16)sz; db->lookaside.szTrue = (u16)sz; if( pStart ){ @@ -727,6 +737,16 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.pInit = p; p = (LookasideSlot*)&((u8*)p)[sz]; } +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + db->lookaside.pMiddle = p; + /* Fill the remainder of the buffer with mini slots */ + while(p<=(LookasideSlot*)&((u8*)pStart)[szAlloc-128]){ + p->pNext = db->lookaside.pMiniInit; + db->lookaside.pMiniInit = p; + db->lookaside.nSlot++; + p = (LookasideSlot*)&((u8*)p)[128]; + } +#endif db->lookaside.pEnd = p; db->lookaside.bDisable = 0; db->lookaside.bMalloced = pBuf==0 ?1:0; diff --git a/src/malloc.c b/src/malloc.c index 131ed6039a..9241b97c73 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -332,6 +332,13 @@ int sqlite3MallocSize(void *p){ assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); return sqlite3GlobalConfig.m.xSize(p); } +static int lookasideMallocSize(sqlite3 *db, void *p){ +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + return plookaside.pMiddle ? db->lookaside.szTrue : 128; +#else + return db->lookaside.szTrue; +#endif +} int sqlite3DbMallocSize(sqlite3 *db, void *p){ assert( p!=0 ); if( db==0 || !isLookaside(db,p) ){ @@ -347,7 +354,7 @@ int sqlite3DbMallocSize(sqlite3 *db, void *p){ return sqlite3GlobalConfig.m.xSize(p); }else{ assert( sqlite3_mutex_held(db->mutex) ); - return db->lookaside.szTrue; + return lookasideMallocSize(db, p); } } sqlite3_uint64 sqlite3_msize(void *p){ @@ -397,6 +404,17 @@ void sqlite3DbFreeNN(sqlite3 *db, void *p){ } if( isLookaside(db, p) ){ LookasideSlot *pBuf = (LookasideSlot*)p; +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + if( p>=db->lookaside.pMiddle ){ +# ifdef SQLITE_DEBUG + /* Trash all content in the buffer being freed */ + memset(p, 0xaa, 128); +# endif + pBuf->pNext = db->lookaside.pMiniFree; + db->lookaside.pMiniFree = pBuf; + return; + } +#endif #ifdef SQLITE_DEBUG /* Trash all content in the buffer being freed */ memset(p, 0xaa, db->lookaside.szTrue); @@ -564,6 +582,18 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ return db->mallocFailed ? 0 : dbMallocRawFinish(db, n); } db->lookaside.anStat[1]++; +# ifndef SQLITE_OMIT_MINI_LOOKASIDE + }else if( n<=128 ){ + if( (pBuf = db->lookaside.pMiniFree)!=0 ){ + db->lookaside.pMiniFree = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + }else if( (pBuf = db->lookaside.pMiniInit)!=0 ){ + db->lookaside.pMiniInit = pBuf->pNext; + db->lookaside.anStat[0]++; + return (void*)pBuf; + } +# endif }else if( (pBuf = db->lookaside.pFree)!=0 ){ db->lookaside.pFree = pBuf->pNext; db->lookaside.anStat[0]++; @@ -597,7 +627,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.szTrue ) return p; + if( isLookaside(db,p) && nlookaside.szTrue); + memcpy(pNew, p, lookasideMallocSize(db, p)); sqlite3DbFree(db, p); } }else{ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 2aca2abfa9..5280923378 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1287,6 +1287,11 @@ struct Lookaside { u32 anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ LookasideSlot *pInit; /* List of buffers not previously used */ LookasideSlot *pFree; /* List of available buffers */ +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + LookasideSlot *pMiniInit; /* List of mini buffers not prediously used */ + LookasideSlot *pMiniFree; /* List of available mini buffers */ + void *pMiddle; /* An address between the fullsize and mini buffers */ +#endif void *pStart; /* First byte of available memory space */ void *pEnd; /* First byte past end of available space */ }; diff --git a/src/status.c b/src/status.c index a5a39f4c18..d7ffe99ede 100644 --- a/src/status.c +++ b/src/status.c @@ -188,6 +188,10 @@ static u32 countLookasideSlots(LookasideSlot *p){ int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ u32 nInit = countLookasideSlots(db->lookaside.pInit); u32 nFree = countLookasideSlots(db->lookaside.pFree); +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + nInit += countLookasideSlots(db->lookaside.pMiniInit); + nFree += countLookasideSlots(db->lookaside.pMiniFree); +#endif if( pHighwater ) *pHighwater = db->lookaside.nSlot - nInit; return db->lookaside.nSlot - (nInit+nFree); } @@ -220,6 +224,15 @@ int sqlite3_db_status( db->lookaside.pInit = db->lookaside.pFree; db->lookaside.pFree = 0; } +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + p = db->lookaside.pMiniFree; + if( p ){ + while( p->pNext ) p = p->pNext; + p->pNext = db->lookaside.pMiniInit; + db->lookaside.pMiniInit = db->lookaside.pMiniFree; + db->lookaside.pMiniFree = 0; + } +#endif } break; } From 0225d819c4ca87cd29cd6f58d50c75bcee6213bc Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 12 Dec 2019 17:17:24 +0000 Subject: [PATCH 02/29] Change the size of a mini-lookaside allocation to a macro (MINI_SZ) rather than a magic number (128). FossilOrigin-Name: 5e1949bca998f3c8c23a8ebf01c7a2e7a2af1fdad43886271e1fe0f25411551d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 8 ++++---- src/malloc.c | 6 +++--- src/sqliteInt.h | 3 +++ 5 files changed, 19 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 146060627c..2120e5d6cd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\senhancements\sfrom\strunk. -D 2019-12-12T16:49:10.371 +C Change\sthe\ssize\sof\sa\smini-lookaside\sallocation\sto\sa\smacro\s(MINI_SZ)\srather\nthan\sa\smagic\snumber\s(128). +D 2019-12-12T17:17:24.501 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -491,8 +491,8 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 5de3fd62bd1a692353c8f9c7bbde658f0b579f195620ca3cde1948a53015dddd F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c dc4fe09174ef0c11204ca90ed46323471c127c9d18266ec97ee1bca871200e99 -F src/malloc.c 350d345ab12aa089f3dbd30b4db9b57e486c9dd920d275d1775aa5b6899199ff +F src/main.c 94bf8b6a283914cc8fa8743b3db5350206a4be5cccfd9c84d53409ca5d8bd1c1 +F src/malloc.c 8a907f9e802ff517acb5e9edc13798428fd7668136456d9432a884a7fe5680f5 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -532,7 +532,7 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h 7965727cc420b5e9ab79f4ba8bda8e806ba315c6e9f489e83f0202f3397fb522 +F src/sqliteInt.h fad2ac9bc3957bd090ca979e012b744caa60529411a6ab6d379b902983f84134 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 0fe55b92810509eac821ded2e177e1da944a78cdcdfec7813ad1d6b36d6d667e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1852,7 +1852,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 b02fdc09c838f355d9efce57f817d6a86153153b4a1f2b763914f4aaa34cb76e c6af9f655b73200ecc0c4189698e421af6ca584babdc76e73a36d468b2eea1f9 -R acd8cbaefaeedad19b6643abb0f66a70 +P 6cb053f99b5be2ecc30e0733d8f1e4f2a89f642656d3883fc0c867b10a87ba6b +R 795bb9e2b806be9ab8e7aa8c719a5a17 U drh -Z 68e3e8eeb067499423bb6b0f8443d732 +Z 49d95eecb36c694ed8db26c3a8686826 diff --git a/manifest.uuid b/manifest.uuid index 1583d58553..8da8683c68 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6cb053f99b5be2ecc30e0733d8f1e4f2a89f642656d3883fc0c867b10a87ba6b \ No newline at end of file +5e1949bca998f3c8c23a8ebf01c7a2e7a2af1fdad43886271e1fe0f25411551d \ No newline at end of file diff --git a/src/main.c b/src/main.c index 96234bfe4a..5b70273af2 100644 --- a/src/main.c +++ b/src/main.c @@ -720,9 +720,9 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.pMiniFree = 0; /* The arithmetic below causes the number of large lookaside slots to be 1/3 ** the number of mini slots, based on the observation that 75% of allocations - ** are <=128B. + ** are <= MINI_SZ bytes. */ - cnt = szAlloc/(3*128+sz); + cnt = szAlloc/(3*MINI_SZ+sz); #endif db->lookaside.sz = (u16)sz; db->lookaside.szTrue = (u16)sz; @@ -740,11 +740,11 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ #ifndef SQLITE_OMIT_MINI_LOOKASIDE db->lookaside.pMiddle = p; /* Fill the remainder of the buffer with mini slots */ - while(p<=(LookasideSlot*)&((u8*)pStart)[szAlloc-128]){ + while(p<=(LookasideSlot*)&((u8*)pStart)[szAlloc-MINI_SZ]){ p->pNext = db->lookaside.pMiniInit; db->lookaside.pMiniInit = p; db->lookaside.nSlot++; - p = (LookasideSlot*)&((u8*)p)[128]; + p = (LookasideSlot*)&((u8*)p)[MINI_SZ]; } #endif db->lookaside.pEnd = p; diff --git a/src/malloc.c b/src/malloc.c index 9241b97c73..8f77c96438 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -334,7 +334,7 @@ int sqlite3MallocSize(void *p){ } static int lookasideMallocSize(sqlite3 *db, void *p){ #ifndef SQLITE_OMIT_MINI_LOOKASIDE - return plookaside.pMiddle ? db->lookaside.szTrue : 128; + return plookaside.pMiddle ? db->lookaside.szTrue : MINI_SZ; #else return db->lookaside.szTrue; #endif @@ -408,7 +408,7 @@ void sqlite3DbFreeNN(sqlite3 *db, void *p){ if( p>=db->lookaside.pMiddle ){ # ifdef SQLITE_DEBUG /* Trash all content in the buffer being freed */ - memset(p, 0xaa, 128); + memset(p, 0xaa, MINI_SZ); # endif pBuf->pNext = db->lookaside.pMiniFree; db->lookaside.pMiniFree = pBuf; @@ -583,7 +583,7 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ } db->lookaside.anStat[1]++; # ifndef SQLITE_OMIT_MINI_LOOKASIDE - }else if( n<=128 ){ + }else if( n<=MINI_SZ ){ if( (pBuf = db->lookaside.pMiniFree)!=0 ){ db->lookaside.pMiniFree = pBuf->pNext; db->lookaside.anStat[0]++; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 5280923378..d01c8128b8 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1303,6 +1303,9 @@ struct LookasideSlot { #define EnableLookaside db->lookaside.bDisable--;\ db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue +/* Size of the MINI lookside allocation */ +#define MINI_SZ 128 + /* ** A hash table for built-in function definitions. (Application-defined ** functions use a regular table table from hash.h.) From 41cee66848afe40aba1e4d4a83bd50b6c33aaff0 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 12 Dec 2019 20:22:34 +0000 Subject: [PATCH 03/29] Change the name of the Expr.a.zName field to zEName, so that it has a name that is distinct from other fields and variables and is hence easier to grep for. FossilOrigin-Name: d3783357f8fa76c42a86f12b214522f0388c37773c36ab8c5ce0623abbc4436a --- manifest | 30 +++++++++++++++--------------- manifest.uuid | 2 +- src/alter.c | 8 ++++---- src/build.c | 14 +++++++------- src/expr.c | 20 ++++++++++---------- src/insert.c | 2 +- src/resolve.c | 4 ++-- src/select.c | 14 +++++++------- src/sqliteInt.h | 2 +- src/treeview.c | 4 ++-- src/trigger.c | 2 +- src/update.c | 6 +++--- 12 files changed, 54 insertions(+), 54 deletions(-) diff --git a/manifest b/manifest index 2120e5d6cd..d0515a9c87 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\ssize\sof\sa\smini-lookaside\sallocation\sto\sa\smacro\s(MINI_SZ)\srather\nthan\sa\smagic\snumber\s(128). -D 2019-12-12T17:17:24.501 +C Change\sthe\sname\sof\sthe\sExpr.a.zName\sfield\sto\szEName,\sso\sthat\sit\shas\sa\sname\nthat\sis\sdistinct\sfrom\sother\sfields\sand\svariables\sand\sis\shence\seasier\sto\ngrep\sfor. +D 2019-12-12T20:22:34.557 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -461,7 +461,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 9b3d6f8d3437f0bec3f9a4ebfa9fa4e7e3b34730631611b6d30f6ae1027bf3db +F src/alter.c 27aaf1045f52876320b431f4b45d9c1e5786899de41cec2bea39620095ab9aa7 F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -471,7 +471,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c d22498af716953400e314d2d98d1dac3ea5c3b01e0fd243ef9e9b132c74114ec F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484 F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437 -F src/build.c 7c277ccc24c249b84f29ba829b0ed377e78487c93d17d999798641be0c20fad5 +F src/build.c ec3332b5ff5871a5e134889392e7d9340a2c274b292b1674b595a7835c4908ad F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 947911a1826673add2311e8650aeaf9c2809706dfaa45fc2445a5ff32f70693d +F src/expr.c eefc9abca2d8bb8b2cad063dd65c764e5264f1d80c83268a9debcfff2f7a32bb F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -488,7 +488,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 5de3fd62bd1a692353c8f9c7bbde658f0b579f195620ca3cde1948a53015dddd +F src/insert.c 276463aa7a26ee73958b9f4bcbef4eaec516f22bf6b8d7d2428f39c8dea90840 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 94bf8b6a283914cc8fa8743b3db5350206a4be5cccfd9c84d53409ca5d8bd1c1 @@ -525,14 +525,14 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c acc54d97e7e867a76e4e0fe407589be9a390f579e6a6a36fe4a0f62f7678d4e4 +F src/resolve.c d703803412770e100be0d79adc4d0b52a99c49715ba8d4a736e503ee5526d473 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 0fe10579de20eb8dc04ec9ed29659fa782bee2bcc85a35734637f3e2cabc2762 +F src/select.c 39a9e180a2fdf738f3a02977684bc4cad3f5ff8d9f949f2aa48eef2ce5ff29aa F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h fad2ac9bc3957bd090ca979e012b744caa60529411a6ab6d379b902983f84134 +F src/sqliteInt.h ebb8c7e6439dc4cd6abad9fed0d01751160115328c8670b733505d7c5c6b12a4 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 0fe55b92810509eac821ded2e177e1da944a78cdcdfec7813ad1d6b36d6d667e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -592,9 +592,9 @@ 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 41d928f04d65931b15f629b4938e9f2c7dc259f02eef34cb2cc6e293f5af813f -F src/trigger.c 681ccdb910a87243940d63f99b26190d9c5d2534c2ded3c0825b7c0e315a342e -F src/update.c 07a50767f7d3e26d4c887c31cd66448d700d3215caea6023acf7269336097df7 +F src/treeview.c b36e832d4d17ba1abe7739a7a91f1432012c5ada762fb47bfec6fc9ab969af60 +F src/trigger.c a40d50e88bd3355f1d2a73f0a3b2d6b42eae26ca4219001b82ef0d064439badc +F src/update.c c66576a821d4821eda6b40c6aabc646cac5c9eb80f4987cc901db8657549c782 F src/upsert.c b445315c8958d8f17ec3297d06842e61dacaad0633ccaec1e4e160de7e562212 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 66b22af7b359ce6493c34fef28c87d5c2d1765f212d6e4cd5e08d99ac30b89bb @@ -1852,7 +1852,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 6cb053f99b5be2ecc30e0733d8f1e4f2a89f642656d3883fc0c867b10a87ba6b -R 795bb9e2b806be9ab8e7aa8c719a5a17 +P 5e1949bca998f3c8c23a8ebf01c7a2e7a2af1fdad43886271e1fe0f25411551d +R 251e88e80ae4e78253d2ec11ee9fa128 U drh -Z 49d95eecb36c694ed8db26c3a8686826 +Z c4130ee4f36c72a8f85ea58dbfd139dc diff --git a/manifest.uuid b/manifest.uuid index 8da8683c68..17e6a5e49d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5e1949bca998f3c8c23a8ebf01c7a2e7a2af1fdad43886271e1fe0f25411551d \ No newline at end of file +d3783357f8fa76c42a86f12b214522f0388c37773c36ab8c5ce0623abbc4436a \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 0fe41bd2f1..f3467fa09e 100644 --- a/src/alter.c +++ b/src/alter.c @@ -764,8 +764,8 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ if( ALWAYS(p->pEList) ){ ExprList *pList = p->pEList; for(i=0; inExpr; i++){ - if( pList->a[i].zName ){ - sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zName); + if( pList->a[i].zEName ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); } } } @@ -808,7 +808,7 @@ void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ sWalker.xExprCallback = renameUnmapExprCb; sqlite3WalkExprList(&sWalker, pEList); for(i=0; inExpr; i++){ - sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zName); + sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); } } } @@ -946,7 +946,7 @@ static void renameColumnElistNames( if( pEList ){ int i; for(i=0; inExpr; i++){ - char *zName = pEList->a[i].zName; + char *zName = pEList->a[i].zEName; if( 0==sqlite3_stricmp(zName, zOld) ){ renameTokenFind(pParse, pCtx, (void*)zName); } diff --git a/src/build.c b/src/build.c index 171cc68cf4..196b35acff 100644 --- a/src/build.c +++ b/src/build.c @@ -3091,7 +3091,7 @@ void sqlite3CreateForeignKey( nByte = sizeof(*pFKey) + (nCol-1)*sizeof(pFKey->aCol[0]) + pTo->n + 1; if( pToCol ){ for(i=0; inExpr; i++){ - nByte += sqlite3Strlen30(pToCol->a[i].zName) + 1; + nByte += sqlite3Strlen30(pToCol->a[i].zEName) + 1; } } pFKey = sqlite3DbMallocZero(db, nByte ); @@ -3116,7 +3116,7 @@ void sqlite3CreateForeignKey( for(i=0; inCol; j++){ - if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zName)==0 ){ + if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zEName)==0 ){ pFKey->aCol[i].iFrom = j; break; } @@ -3124,22 +3124,22 @@ void sqlite3CreateForeignKey( if( j>=p->nCol ){ sqlite3ErrorMsg(pParse, "unknown column \"%s\" in foreign key definition", - pFromCol->a[i].zName); + pFromCol->a[i].zEName); goto fk_end; } if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenRemap(pParse, &pFKey->aCol[i], pFromCol->a[i].zName); + sqlite3RenameTokenRemap(pParse, &pFKey->aCol[i], pFromCol->a[i].zEName); } } } if( pToCol ){ for(i=0; ia[i].zName); + int n = sqlite3Strlen30(pToCol->a[i].zEName); pFKey->aCol[i].zCol = z; if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenRemap(pParse, z, pToCol->a[i].zName); + sqlite3RenameTokenRemap(pParse, z, pToCol->a[i].zEName); } - memcpy(z, pToCol->a[i].zName, n); + memcpy(z, pToCol->a[i].zEName, n); z[n] = 0; z += n+1; } diff --git a/src/expr.c b/src/expr.c index 3b2b513b6d..f9c57baa9c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1436,7 +1436,7 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ pNewExpr->pLeft = pPriorSelectCol; } } - pItem->zName = sqlite3DbStrDup(db, pOldItem->zName); + pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); pItem->sortFlags = pOldItem->sortFlags; pItem->done = 0; @@ -1608,9 +1608,9 @@ ExprList *sqlite3ExprListAppend( pList = pNew; } pItem = &pList->a[pList->nExpr++]; - assert( offsetof(struct ExprList_item,zName)==sizeof(pItem->pExpr) ); + assert( offsetof(struct ExprList_item,zEName)==sizeof(pItem->pExpr) ); assert( offsetof(struct ExprList_item,pExpr)==0 ); - memset(&pItem->zName,0,sizeof(*pItem)-offsetof(struct ExprList_item,zName)); + memset(&pItem->zEName,0,sizeof(*pItem)-offsetof(struct ExprList_item,zEName)); pItem->pExpr = pExpr; return pList; @@ -1667,7 +1667,7 @@ ExprList *sqlite3ExprListAppendVector( pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); if( pList ){ assert( pList->nExpr==iFirst+i+1 ); - pList->a[pList->nExpr-1].zName = pColumns->a[i].zName; + pList->a[pList->nExpr-1].zEName = pColumns->a[i].zName; pColumns->a[i].zName = 0; } } @@ -1727,7 +1727,7 @@ void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int eNulls){ } /* -** Set the ExprList.a[].zName element of the most recently added item +** Set the ExprList.a[].zEName element of the most recently added item ** on the expression list. ** ** pList might be NULL following an OOM error. But pName should never be @@ -1745,11 +1745,11 @@ void sqlite3ExprListSetName( struct ExprList_item *pItem; assert( pList->nExpr>0 ); pItem = &pList->a[pList->nExpr-1]; - assert( pItem->zName==0 ); - pItem->zName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); - if( dequote ) sqlite3Dequote(pItem->zName); + assert( pItem->zEName==0 ); + pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); + if( dequote ) sqlite3Dequote(pItem->zEName); if( IN_RENAME_OBJECT ){ - sqlite3RenameTokenMap(pParse, (void*)pItem->zName, pName); + sqlite3RenameTokenMap(pParse, (void*)pItem->zEName, pName); } } } @@ -1804,7 +1804,7 @@ static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ assert( pList->nExpr>0 ); do{ sqlite3ExprDelete(db, pItem->pExpr); - sqlite3DbFree(db, pItem->zName); + sqlite3DbFree(db, pItem->zEName); sqlite3DbFree(db, pItem->zSpan); pItem++; }while( --i>0 ); diff --git a/src/insert.c b/src/insert.c index 5915f4fa95..75db131774 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1635,7 +1635,7 @@ void sqlite3GenerateConstraintChecks( if( onError==OE_Ignore ){ sqlite3VdbeGoto(v, ignoreDest); }else{ - char *zName = pCheck->a[i].zName; + char *zName = pCheck->a[i].zEName; if( zName==0 ) zName = pTab->zName; if( onError==OE_Replace ) onError = OE_Abort; /* IMP: R-26383-51744 */ sqlite3HaltConstraint(pParse, SQLITE_CONSTRAINT_CHECK, diff --git a/src/resolve.c b/src/resolve.c index 85db915cf1..b3c331535e 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -448,7 +448,7 @@ static int lookupName( pEList = pNC->uNC.pEList; assert( pEList!=0 ); for(j=0; jnExpr; j++){ - char *zAs = pEList->a[j].zName; + char *zAs = pEList->a[j].zEName; if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ Expr *pOrig; assert( pExpr->pLeft==0 && pExpr->pRight==0 ); @@ -1115,7 +1115,7 @@ static int resolveAsName( if( pE->op==TK_ID ){ char *zCol = pE->u.zToken; for(i=0; inExpr; i++){ - char *zAs = pEList->a[i].zName; + char *zAs = pEList->a[i].zEName; if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ return i+1; } diff --git a/src/select.c b/src/select.c index 26c72d6dad..b99b1459be 100644 --- a/src/select.c +++ b/src/select.c @@ -918,7 +918,7 @@ static void selectInnerLoop( if( srcTab>=0 ){ for(i=0; ipEList->a[i].zName)); + VdbeComment((v, "%s", p->pEList->a[i].zEName)); } }else if( eDest!=SRT_Exists ){ #ifdef SQLITE_ENABLE_SORTER_REFERENCES @@ -1539,7 +1539,7 @@ static void generateSortTail( iRead = iCol--; } sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i); - VdbeComment((v, "%s", aOutEx[i].zName?aOutEx[i].zName : aOutEx[i].zSpan)); + VdbeComment((v, "%s", aOutEx[i].zEName?aOutEx[i].zEName:aOutEx[i].zSpan)); } } switch( eDest ){ @@ -1873,9 +1873,9 @@ static void generateColumnNames( assert( p!=0 ); assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */ - if( pEList->a[i].zName ){ + if( pEList->a[i].zEName ){ /* An AS clause always takes first priority */ - char *zName = pEList->a[i].zName; + char *zName = pEList->a[i].zEName; sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); }else if( srcName && p->op==TK_COLUMN ){ char *zCol; @@ -1959,7 +1959,7 @@ int sqlite3ColumnsFromExprList( for(i=0, pCol=aCol; imallocFailed; i++, pCol++){ /* Get an appropriate name for the column */ - if( (zName = pEList->a[i].zName)!=0 ){ + if( (zName = pEList->a[i].zEName)!=0 ){ /* If the column contains an "AS " phrase, use as the name */ }else{ Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr); @@ -5003,9 +5003,9 @@ static int selectExpander(Walker *pWalker, Select *p){ */ pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); if( pNew ){ - pNew->a[pNew->nExpr-1].zName = a[k].zName; + pNew->a[pNew->nExpr-1].zEName = a[k].zEName; pNew->a[pNew->nExpr-1].zSpan = a[k].zSpan; - a[k].zName = 0; + a[k].zEName = 0; a[k].zSpan = 0; } a[k].pExpr = 0; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d01c8128b8..3de659f791 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2662,7 +2662,7 @@ struct ExprList { int nExpr; /* Number of expressions on the list */ struct ExprList_item { /* For each expression in the list */ Expr *pExpr; /* The parse tree for this expression */ - char *zName; /* Token associated with this expression */ + char *zEName; /* Token associated with this expression */ char *zSpan; /* Original text of the expression */ u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ unsigned done :1; /* A flag to indicate when processing is finished */ diff --git a/src/treeview.c b/src/treeview.c index 5b9e064540..ac0e92a08f 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -106,7 +106,7 @@ void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 moreToFollow){ char cSep = '('; int j; for(j=0; jpCols->nExpr; j++){ - sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zName); + sqlite3_str_appendf(&x, "%c%s", cSep, pCte->pCols->a[j].zEName); cSep = ','; } sqlite3_str_appendf(&x, ")"); @@ -727,7 +727,7 @@ void sqlite3TreeViewBareExprList( sqlite3TreeViewLine(pView, "%s", zLabel); for(i=0; inExpr; i++){ int j = pList->a[i].u.x.iOrderByCol; - char *zName = pList->a[i].zName; + char *zName = pList->a[i].zEName; int moreToFollow = inExpr - 1; if( j || zName ){ sqlite3TreeViewPush(pView, moreToFollow); diff --git a/src/trigger.c b/src/trigger.c index 5586995e32..458aa2996c 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -688,7 +688,7 @@ static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ int e; if( pIdList==0 || NEVER(pEList==0) ) return 1; for(e=0; enExpr; e++){ - if( sqlite3IdListIndex(pIdList, pEList->a[e].zName)>=0 ) return 1; + if( sqlite3IdListIndex(pIdList, pEList->a[e].zEName)>=0 ) return 1; } return 0; } diff --git a/src/update.c b/src/update.c index 935e1d9377..f4e8f696d2 100644 --- a/src/update.c +++ b/src/update.c @@ -305,7 +305,7 @@ void sqlite3Update( goto update_cleanup; } for(j=0; jnCol; j++){ - if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zName)==0 ){ + if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zEName)==0 ){ if( j==pTab->iPKey ){ chngRowid = 1; pRowidExpr = pChanges->a[i].pExpr; @@ -327,12 +327,12 @@ void sqlite3Update( } } if( j>=pTab->nCol ){ - if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zName) ){ + if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){ j = -1; chngRowid = 1; pRowidExpr = pChanges->a[i].pExpr; }else{ - sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zName); + sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zEName); pParse->checkSchema = 1; goto update_cleanup; } From c947d6a4dcdfe6f0185a22464cf97153cabb8052 Mon Sep 17 00:00:00 2001 From: numist Date: Thu, 12 Dec 2019 20:39:47 +0000 Subject: [PATCH 04/29] Fix an issue where malloc could be used to fulfill a small allocation when a large lookaside slot could have beeen used instead. FossilOrigin-Name: 611020e3378f4c81c277cccd84807ae51a816bbab6c3d887c91c5e5af3b5225f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/malloc.c | 7 +++++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index d0515a9c87..5f8fb620c5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sname\sof\sthe\sExpr.a.zName\sfield\sto\szEName,\sso\sthat\sit\shas\sa\sname\nthat\sis\sdistinct\sfrom\sother\sfields\sand\svariables\sand\sis\shence\seasier\sto\ngrep\sfor. -D 2019-12-12T20:22:34.557 +C Fix\san\sissue\swhere\smalloc\scould\sbe\sused\sto\sfulfill\sa\ssmall\sallocation\swhen\sa\slarge\slookaside\sslot\scould\shave\sbeeen\sused\sinstead. +D 2019-12-12T20:39:47.705 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -492,7 +492,7 @@ F src/insert.c 276463aa7a26ee73958b9f4bcbef4eaec516f22bf6b8d7d2428f39c8dea90840 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 94bf8b6a283914cc8fa8743b3db5350206a4be5cccfd9c84d53409ca5d8bd1c1 -F src/malloc.c 8a907f9e802ff517acb5e9edc13798428fd7668136456d9432a884a7fe5680f5 +F src/malloc.c cae32705aad5549e46687b48f8e5c6f8d045dfeec95b0ad30c295be4773b7c7c F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -1852,7 +1852,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 5e1949bca998f3c8c23a8ebf01c7a2e7a2af1fdad43886271e1fe0f25411551d -R 251e88e80ae4e78253d2ec11ee9fa128 -U drh -Z c4130ee4f36c72a8f85ea58dbfd139dc +P d3783357f8fa76c42a86f12b214522f0388c37773c36ab8c5ce0623abbc4436a +R 419a6defa175975b0c1f1ba26db0be60 +U numist +Z c7e98609c62b97e8952867680421d71f diff --git a/manifest.uuid b/manifest.uuid index 17e6a5e49d..50a02db889 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d3783357f8fa76c42a86f12b214522f0388c37773c36ab8c5ce0623abbc4436a \ No newline at end of file +611020e3378f4c81c277cccd84807ae51a816bbab6c3d887c91c5e5af3b5225f \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index 8f77c96438..79cdcbcb21 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -582,8 +582,10 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ return db->mallocFailed ? 0 : dbMallocRawFinish(db, n); } db->lookaside.anStat[1]++; + return dbMallocRawFinish(db, n); + } # ifndef SQLITE_OMIT_MINI_LOOKASIDE - }else if( n<=MINI_SZ ){ + if( n<=MINI_SZ ){ if( (pBuf = db->lookaside.pMiniFree)!=0 ){ db->lookaside.pMiniFree = pBuf->pNext; db->lookaside.anStat[0]++; @@ -593,8 +595,9 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ db->lookaside.anStat[0]++; return (void*)pBuf; } + } # endif - }else if( (pBuf = db->lookaside.pFree)!=0 ){ + if( (pBuf = db->lookaside.pFree)!=0 ){ db->lookaside.pFree = pBuf->pNext; db->lookaside.anStat[0]++; return (void*)pBuf; From 1b47c9c98e9e00bc24d11e6c6cad2c754b05dd02 Mon Sep 17 00:00:00 2001 From: numist Date: Thu, 12 Dec 2019 20:58:32 +0000 Subject: [PATCH 05/29] Reduce the number of call sites to dbMallocRawFinish in the case where n > lookaside.sz FossilOrigin-Name: e392e7f22861ce4b66e4bf84b59c8fd38568fc241a699e001f47fd82011f4d28 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/malloc.c | 7 ++++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 5f8fb620c5..5576b7e323 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\swhere\smalloc\scould\sbe\sused\sto\sfulfill\sa\ssmall\sallocation\swhen\sa\slarge\slookaside\sslot\scould\shave\sbeeen\sused\sinstead. -D 2019-12-12T20:39:47.705 +C Reduce\sthe\snumber\sof\scall\ssites\sto\sdbMallocRawFinish\sin\sthe\scase\swhere\sn\s>\slookaside.sz +D 2019-12-12T20:58:32.965 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -492,7 +492,7 @@ F src/insert.c 276463aa7a26ee73958b9f4bcbef4eaec516f22bf6b8d7d2428f39c8dea90840 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 94bf8b6a283914cc8fa8743b3db5350206a4be5cccfd9c84d53409ca5d8bd1c1 -F src/malloc.c cae32705aad5549e46687b48f8e5c6f8d045dfeec95b0ad30c295be4773b7c7c +F src/malloc.c 02235d039c72102d4bddf203a493c2613164487c70ec84bab679fc30daa883f0 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -1852,7 +1852,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 d3783357f8fa76c42a86f12b214522f0388c37773c36ab8c5ce0623abbc4436a -R 419a6defa175975b0c1f1ba26db0be60 +P 611020e3378f4c81c277cccd84807ae51a816bbab6c3d887c91c5e5af3b5225f +R ad47704ebb6417a0219438b5b1af0ca2 U numist -Z c7e98609c62b97e8952867680421d71f +Z 7cabc14d06c02da6aca77386b2ebbfdc diff --git a/manifest.uuid b/manifest.uuid index 50a02db889..a46bfa5958 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -611020e3378f4c81c277cccd84807ae51a816bbab6c3d887c91c5e5af3b5225f \ No newline at end of file +e392e7f22861ce4b66e4bf84b59c8fd38568fc241a699e001f47fd82011f4d28 \ No newline at end of file diff --git a/src/malloc.c b/src/malloc.c index 79cdcbcb21..26a258b347 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -578,10 +578,11 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ assert( sqlite3_mutex_held(db->mutex) ); assert( db->pnBytesFreed==0 ); if( n>db->lookaside.sz ){ - if( db->lookaside.bDisable ){ - return db->mallocFailed ? 0 : dbMallocRawFinish(db, n); + if( !db->lookaside.bDisable ){ + db->lookaside.anStat[1]++; + }else if( db->mallocFailed ){ + return 0; } - db->lookaside.anStat[1]++; return dbMallocRawFinish(db, n); } # ifndef SQLITE_OMIT_MINI_LOOKASIDE From cbb9da337e7f8dc4e6bea59399a0394ec390f1f2 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 12 Dec 2019 22:11:33 +0000 Subject: [PATCH 06/29] Work toward reducing the incremental size of an ExprList object to 24-byte per entry, from 32-bytes (on a 64-bit machine). This helps the new mini-lookaside allocator to run better by avoiding excessive reallocs. The current change mostly works, but still has a few loose ends to tie up. This check-in is merely a snapshot to save my work. FossilOrigin-Name: fdda76cfb01bf2b19522ac4558b443634d28a69b0828677c42682b645eae1f3b --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/expr.c | 10 +++++----- src/resolve.c | 2 +- src/select.c | 26 +++++++++++++------------- src/sqliteInt.h | 30 +++++++++++++++++++++--------- 6 files changed, 54 insertions(+), 39 deletions(-) diff --git a/manifest b/manifest index 5f8fb620c5..e886d85f40 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\swhere\smalloc\scould\sbe\sused\sto\sfulfill\sa\ssmall\sallocation\swhen\sa\slarge\slookaside\sslot\scould\shave\sbeeen\sused\sinstead. -D 2019-12-12T20:39:47.705 +C Work\stoward\sreducing\sthe\sincremental\ssize\sof\san\sExprList\sobject\sto\s24-byte\nper\sentry,\sfrom\s32-bytes\s(on\sa\s64-bit\smachine).\s\sThis\shelps\sthe\snew\nmini-lookaside\sallocator\sto\srun\sbetter\sby\savoiding\sexcessive\sreallocs.\nThe\scurrent\schange\smostly\sworks,\sbut\sstill\shas\sa\sfew\sloose\sends\sto\stie\sup.\nThis\scheck-in\sis\smerely\sa\ssnapshot\sto\ssave\smy\swork. +D 2019-12-12T22:11:33.445 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c eefc9abca2d8bb8b2cad063dd65c764e5264f1d80c83268a9debcfff2f7a32bb +F src/expr.c 828bc6ae0c15e60a5b0a5fb17ddf98fb3f9a52752fb34cbbdc15ea4868afcf90 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -525,14 +525,14 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c d703803412770e100be0d79adc4d0b52a99c49715ba8d4a736e503ee5526d473 +F src/resolve.c fc7bed8f23355db3af73859b4af42af4ee2f7cf3467aa5e242321575203e2896 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 39a9e180a2fdf738f3a02977684bc4cad3f5ff8d9f949f2aa48eef2ce5ff29aa +F src/select.c b5702ca6b2f215bb8bee27f591d72dfd52250a680b5fa11871a1a7be69dff758 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h ebb8c7e6439dc4cd6abad9fed0d01751160115328c8670b733505d7c5c6b12a4 +F src/sqliteInt.h 5be56f6523e0980b4ab66d6420e11dbe66c060c7b2e20aa28344fd67457cbe32 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 0fe55b92810509eac821ded2e177e1da944a78cdcdfec7813ad1d6b36d6d667e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1852,7 +1852,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 d3783357f8fa76c42a86f12b214522f0388c37773c36ab8c5ce0623abbc4436a -R 419a6defa175975b0c1f1ba26db0be60 -U numist -Z c7e98609c62b97e8952867680421d71f +P 611020e3378f4c81c277cccd84807ae51a816bbab6c3d887c91c5e5af3b5225f +R 162199bc809f1616aa82013813cc7e3c +T *branch * exprlist-size-reduction +T *sym-exprlist-size-reduction * +T -sym-mini-lookaside-take-2 * +U drh +Z 2404f597cd0a4292958003b4ec4cbb04 diff --git a/manifest.uuid b/manifest.uuid index 50a02db889..fe20eceadf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -611020e3378f4c81c277cccd84807ae51a816bbab6c3d887c91c5e5af3b5225f \ No newline at end of file +fdda76cfb01bf2b19522ac4558b443634d28a69b0828677c42682b645eae1f3b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index f9c57baa9c..0ca1d04077 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1437,11 +1437,10 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ } } pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); - pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); pItem->sortFlags = pOldItem->sortFlags; + pItem->eEName = pOldItem->eEName; pItem->done = 0; pItem->bNulls = pOldItem->bNulls; - pItem->bSpanIsTab = pOldItem->bSpanIsTab; pItem->bSorterRef = pOldItem->bSorterRef; pItem->u = pOldItem->u; } @@ -1773,8 +1772,10 @@ void sqlite3ExprListSetSpan( if( pList ){ struct ExprList_item *pItem = &pList->a[pList->nExpr-1]; assert( pList->nExpr>0 ); - sqlite3DbFree(db, pItem->zSpan); - pItem->zSpan = sqlite3DbSpanDup(db, zStart, zEnd); + if( pItem->zEName==0 ){ + pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd); + pItem->eEName = ENAME_SPAN; + } } } @@ -1805,7 +1806,6 @@ static SQLITE_NOINLINE void exprListDeleteNN(sqlite3 *db, ExprList *pList){ do{ sqlite3ExprDelete(db, pItem->pExpr); sqlite3DbFree(db, pItem->zEName); - sqlite3DbFree(db, pItem->zSpan); pItem++; }while( --i>0 ); sqlite3DbFreeNN(db, pList); diff --git a/src/resolve.c b/src/resolve.c index b3c331535e..cce9210313 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -267,7 +267,7 @@ static int lookupName( int hit = 0; pEList = pItem->pSelect->pEList; for(j=0; jnExpr; j++){ - if( sqlite3MatchSpanName(pEList->a[j].zSpan, zCol, zTab, zDb) ){ + if( sqlite3MatchSpanName(pEList->a[j].zEName, zCol, zTab, zDb) ){ cnt++; cntTab = 2; pMatch = pItem; diff --git a/src/select.c b/src/select.c index b99b1459be..57bf685ede 100644 --- a/src/select.c +++ b/src/select.c @@ -1539,7 +1539,7 @@ static void generateSortTail( iRead = iCol--; } sqlite3VdbeAddOp3(v, OP_Column, iSortTab, iRead, regRow+i); - VdbeComment((v, "%s", aOutEx[i].zEName?aOutEx[i].zEName:aOutEx[i].zSpan)); + VdbeComment((v, "%s", aOutEx[i].zEName)); } } switch( eDest ){ @@ -1873,7 +1873,7 @@ static void generateColumnNames( assert( p!=0 ); assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ assert( p->op!=TK_COLUMN || p->y.pTab!=0 ); /* Covering idx not yet coded */ - if( pEList->a[i].zEName ){ + if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){ /* An AS clause always takes first priority */ char *zName = pEList->a[i].zEName; sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); @@ -1897,7 +1897,7 @@ static void generateColumnNames( sqlite3VdbeSetColName(v, i, COLNAME_NAME, zCol, SQLITE_TRANSIENT); } }else{ - const char *z = pEList->a[i].zSpan; + const char *z = pEList->a[i].zEName; z = z==0 ? sqlite3MPrintf(db, "column%d", i+1) : sqlite3DbStrDup(db, z); sqlite3VdbeSetColName(v, i, COLNAME_NAME, z, SQLITE_DYNAMIC); } @@ -1959,7 +1959,7 @@ int sqlite3ColumnsFromExprList( for(i=0, pCol=aCol; imallocFailed; i++, pCol++){ /* Get an appropriate name for the column */ - if( (zName = pEList->a[i].zEName)!=0 ){ + if( (zName = pEList->a[i].zEName)!=0 && pEList->a[i].eEName==ENAME_NAME ){ /* If the column contains an "AS " phrase, use as the name */ }else{ Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr); @@ -1979,7 +1979,7 @@ int sqlite3ColumnsFromExprList( zName = pColExpr->u.zToken; }else{ /* Use the original text of the column expression as its name */ - zName = pEList->a[i].zSpan; + zName = pEList->a[i].zEName; } } if( zName ){ @@ -5004,9 +5004,8 @@ static int selectExpander(Walker *pWalker, Select *p){ pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); if( pNew ){ pNew->a[pNew->nExpr-1].zEName = a[k].zEName; - pNew->a[pNew->nExpr-1].zSpan = a[k].zSpan; + pNew->a[pNew->nExpr-1].eEName = a[k].eEName; a[k].zEName = 0; - a[k].zSpan = 0; } a[k].pExpr = 0; }else{ @@ -5045,7 +5044,7 @@ static int selectExpander(Walker *pWalker, Select *p){ assert( zName ); if( zTName && pSub - && sqlite3MatchSpanName(pSub->pEList->a[j].zSpan, 0, zTName, 0)==0 + && sqlite3MatchSpanName(pSub->pEList->a[j].zEName, 0, zTName, 0)==0 ){ continue; } @@ -5098,15 +5097,16 @@ static int selectExpander(Walker *pWalker, Select *p){ sqlite3ExprListSetName(pParse, pNew, &sColname, 0); if( pNew && (p->selFlags & SF_NestedFrom)!=0 ){ struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; + sqlite3DbFree(db, pX->zEName); if( pSub ){ - pX->zSpan = sqlite3DbStrDup(db, pSub->pEList->a[j].zSpan); - testcase( pX->zSpan==0 ); + pX->zEName = sqlite3DbStrDup(db, pSub->pEList->a[j].zEName); + testcase( pX->zEName==0 ); }else{ - pX->zSpan = sqlite3MPrintf(db, "%s.%s.%s", + pX->zEName = sqlite3MPrintf(db, "%s.%s.%s", zSchemaName, zTabName, zColname); - testcase( pX->zSpan==0 ); + testcase( pX->zEName==0 ); } - pX->bSpanIsTab = 1; + pX->eEName = ENAME_TAB; } sqlite3DbFree(db, zToFree); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 3de659f791..7425b29887 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2650,23 +2650,28 @@ struct Expr { ** also be used as the argument to a function, in which case the a.zName ** field is not used. ** -** By default the Expr.zSpan field holds a human-readable description of -** the expression that is used in the generation of error messages and -** column labels. In this case, Expr.zSpan is typically the text of a -** column expression as it exists in a SELECT statement. However, if -** the bSpanIsTab flag is set, then zSpan is overloaded to mean the name -** of the result column in the form: DATABASE.TABLE.COLUMN. This later -** form is used for name resolution with nested FROM clauses. +** In order to try to keep memory usage down, the Expr.a.zEName field +** is used for multiple purposes: +** +** bNameIsTab bNameIsSpan Usage +** ---------- ----------- ------------------------- +** false false (1) the AS of result set column +** (2) COLUMN= of an UPDATE +** +** true false DB.TABLE.NAME used to resolve names +** of subqueries +** +** false true Text of the original result set +** expression. */ struct ExprList { int nExpr; /* Number of expressions on the list */ struct ExprList_item { /* For each expression in the list */ Expr *pExpr; /* The parse tree for this expression */ char *zEName; /* Token associated with this expression */ - char *zSpan; /* Original text of the expression */ u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ + unsigned eEName :2; /* Meaning of zEName */ unsigned done :1; /* A flag to indicate when processing is finished */ - unsigned bSpanIsTab :1; /* zSpan holds DB.TABLE.COLUMN */ unsigned reusable :1; /* Constant expression is reusable */ unsigned bSorterRef :1; /* Defer evaluation until after sorting */ unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ @@ -2680,6 +2685,13 @@ struct ExprList { } a[1]; /* One slot for each expression in the list */ }; +/* +** Allowed values for Expr.a.eEName +*/ +#define ENAME_NAME 0 /* The AS clause of a result set */ +#define ENAME_SPAN 1 /* Complete text of the result set expression */ +#define ENAME_TAB 2 /* "DB.TABLE.NAME" for the result set */ + /* ** An instance of this structure can hold a simple list of identifiers, ** such as the list "a,b,c" in the following statements: From c4938ea2ba17cdba4bd03a23b2f3cfd783f79c0a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2019 00:49:42 +0000 Subject: [PATCH 07/29] Tie up the loose ends in the ExprList size reduction. FossilOrigin-Name: 59d0f3afe5249a2a6453fe7bc810c2c7beb896d3800174c7c90f9304c0b1ad88 --- manifest | 23 ++++++++++------------- manifest.uuid | 2 +- src/alter.c | 10 +++++++--- src/expr.c | 1 + src/resolve.c | 21 +++++++++++++++------ src/select.c | 2 +- src/sqliteInt.h | 23 ++++++++++++++--------- 7 files changed, 49 insertions(+), 33 deletions(-) diff --git a/manifest b/manifest index e886d85f40..e65f7b1b68 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Work\stoward\sreducing\sthe\sincremental\ssize\sof\san\sExprList\sobject\sto\s24-byte\nper\sentry,\sfrom\s32-bytes\s(on\sa\s64-bit\smachine).\s\sThis\shelps\sthe\snew\nmini-lookaside\sallocator\sto\srun\sbetter\sby\savoiding\sexcessive\sreallocs.\nThe\scurrent\schange\smostly\sworks,\sbut\sstill\shas\sa\sfew\sloose\sends\sto\stie\sup.\nThis\scheck-in\sis\smerely\sa\ssnapshot\sto\ssave\smy\swork. -D 2019-12-12T22:11:33.445 +C Tie\sup\sthe\sloose\sends\sin\sthe\sExprList\ssize\sreduction. +D 2019-12-13T00:49:42.494 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -461,7 +461,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 27aaf1045f52876320b431f4b45d9c1e5786899de41cec2bea39620095ab9aa7 +F src/alter.c accee2f80a2db2cb0ca253a62704ab9fad0e8355b0e4b372f0d3bfdf7737a8e3 F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -479,7 +479,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 828bc6ae0c15e60a5b0a5fb17ddf98fb3f9a52752fb34cbbdc15ea4868afcf90 +F src/expr.c a4c16d4eed1508377bb8aba71471f3f023edb2ebd79fb7ba3bf379b1e54a6cb7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -525,14 +525,14 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c fc7bed8f23355db3af73859b4af42af4ee2f7cf3467aa5e242321575203e2896 +F src/resolve.c 347c0624f83451803530668055665f770afa851a35a09cb429a7a4749c61706f F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c b5702ca6b2f215bb8bee27f591d72dfd52250a680b5fa11871a1a7be69dff758 +F src/select.c 3590f0641817f0d3af4211315ff91abd197f7c03ba8d20129388af8dcdb707f3 F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h 5be56f6523e0980b4ab66d6420e11dbe66c060c7b2e20aa28344fd67457cbe32 +F src/sqliteInt.h 344e090acc6491b86c4e4368dbac3b679ecf169be0675f567c6e72e71895cadf F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 0fe55b92810509eac821ded2e177e1da944a78cdcdfec7813ad1d6b36d6d667e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -1852,10 +1852,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 611020e3378f4c81c277cccd84807ae51a816bbab6c3d887c91c5e5af3b5225f -R 162199bc809f1616aa82013813cc7e3c -T *branch * exprlist-size-reduction -T *sym-exprlist-size-reduction * -T -sym-mini-lookaside-take-2 * +P fdda76cfb01bf2b19522ac4558b443634d28a69b0828677c42682b645eae1f3b +R 1f0ba04ae14155cebfb37c7f11e00a7b U drh -Z 2404f597cd0a4292958003b4ec4cbb04 +Z 64cc739752f0df56bd4f170960481f66 diff --git a/manifest.uuid b/manifest.uuid index fe20eceadf..c0090acd67 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fdda76cfb01bf2b19522ac4558b443634d28a69b0828677c42682b645eae1f3b \ No newline at end of file +59d0f3afe5249a2a6453fe7bc810c2c7beb896d3800174c7c90f9304c0b1ad88 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index f3467fa09e..3bc779a1e9 100644 --- a/src/alter.c +++ b/src/alter.c @@ -764,7 +764,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ if( ALWAYS(p->pEList) ){ ExprList *pList = p->pEList; for(i=0; inExpr; i++){ - if( pList->a[i].zEName ){ + if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){ sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); } } @@ -808,7 +808,9 @@ void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ sWalker.xExprCallback = renameUnmapExprCb; sqlite3WalkExprList(&sWalker, pEList); for(i=0; inExpr; i++){ - sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); + if( pEList->a[i].eEName==ENAME_NAME ){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); + } } } } @@ -947,7 +949,9 @@ static void renameColumnElistNames( int i; for(i=0; inExpr; i++){ char *zName = pEList->a[i].zEName; - if( 0==sqlite3_stricmp(zName, zOld) ){ + if( pEList->a[i].eEName==ENAME_NAME + && 0==sqlite3_stricmp(zName, zOld) + ){ renameTokenFind(pParse, pCtx, (void*)zName); } } diff --git a/src/expr.c b/src/expr.c index 0ca1d04077..150e34a2c1 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1745,6 +1745,7 @@ void sqlite3ExprListSetName( assert( pList->nExpr>0 ); pItem = &pList->a[pList->nExpr-1]; assert( pItem->zEName==0 ); + assert( pItem->eEName==ENAME_NAME ); pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); if( dequote ) sqlite3Dequote(pItem->zEName); if( IN_RENAME_OBJECT ){ diff --git a/src/resolve.c b/src/resolve.c index cce9210313..572e0a9f3c 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -132,13 +132,16 @@ static int nameInUsingClause(IdList *pUsing, const char *zCol){ ** and zCol. If any of zDb, zTab, and zCol are NULL then those fields will ** match anything. */ -int sqlite3MatchSpanName( - const char *zSpan, +int sqlite3MatchEName( + const struct ExprList_item *pItem, const char *zCol, const char *zTab, const char *zDb ){ int n; + const char *zSpan; + if( pItem->eEName!=ENAME_TAB ) return 0; + zSpan = pItem->zEName; for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ return 0; @@ -267,7 +270,7 @@ static int lookupName( int hit = 0; pEList = pItem->pSelect->pEList; for(j=0; jnExpr; j++){ - if( sqlite3MatchSpanName(pEList->a[j].zEName, zCol, zTab, zDb) ){ + if( sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ cnt++; cntTab = 2; pMatch = pItem; @@ -448,8 +451,11 @@ static int lookupName( pEList = pNC->uNC.pEList; assert( pEList!=0 ); for(j=0; jnExpr; j++){ - char *zAs = pEList->a[j].zEName; - if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ + char *zAs; + if( pEList->a[j].eEName==ENAME_NAME + && (zAs = pEList->a[j].zEName)!=0 + && sqlite3StrICmp(zAs, zCol)==0 + ){ Expr *pOrig; assert( pExpr->pLeft==0 && pExpr->pRight==0 ); assert( pExpr->x.pList==0 ); @@ -1116,7 +1122,10 @@ static int resolveAsName( char *zCol = pE->u.zToken; for(i=0; inExpr; i++){ char *zAs = pEList->a[i].zEName; - if( zAs!=0 && sqlite3StrICmp(zAs, zCol)==0 ){ + if( pEList->a[i].eEName==ENAME_NAME + && (zAs = pEList->a[i].zEName)!=0 + && sqlite3StrICmp(zAs, zCol)==0 + ){ return i+1; } } diff --git a/src/select.c b/src/select.c index 57bf685ede..11c25e7876 100644 --- a/src/select.c +++ b/src/select.c @@ -5044,7 +5044,7 @@ static int selectExpander(Walker *pWalker, Select *p){ assert( zName ); if( zTName && pSub - && sqlite3MatchSpanName(pSub->pEList->a[j].zEName, 0, zTName, 0)==0 + && sqlite3MatchEName(&pSub->pEList->a[j], 0, zTName, 0)==0 ){ continue; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 7425b29887..d022436d38 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2653,16 +2653,16 @@ struct Expr { ** In order to try to keep memory usage down, the Expr.a.zEName field ** is used for multiple purposes: ** -** bNameIsTab bNameIsSpan Usage -** ---------- ----------- ------------------------- -** false false (1) the AS of result set column -** (2) COLUMN= of an UPDATE +** eEName Usage +** ---------- ------------------------- +** ENAME_NAME (1) the AS of result set column +** (2) COLUMN= of an UPDATE ** -** true false DB.TABLE.NAME used to resolve names -** of subqueries +** ENAME_TAB DB.TABLE.NAME used to resolve names +** of subqueries ** -** false true Text of the original result set -** expression. +** ENAME_SPAN Text of the original result set +** expression. */ struct ExprList { int nExpr; /* Number of expressions on the list */ @@ -4430,7 +4430,12 @@ void sqlite3CodeRhsOfIN(Parse*, Expr*, int); int sqlite3CodeSubselect(Parse*, Expr*); void sqlite3SelectPrep(Parse*, Select*, NameContext*); void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); -int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); +int sqlite3MatchEName( + const struct ExprList_item*, + const char*, + const char*, + const char* +); int sqlite3ResolveExprNames(NameContext*, Expr*); int sqlite3ResolveExprListNames(NameContext*, ExprList*); void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); From e6068027ca584a1263d2d659f48eded07fc4a297 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2019 15:48:21 +0000 Subject: [PATCH 08/29] Cleanup and performance enhancements for mini-lookaside. FossilOrigin-Name: 74805668430051032ae9b256c84e252755ee03075fc08293c948675ed40ec280 --- manifest | 18 +++++++------- manifest.uuid | 2 +- src/main.c | 47 +++++++++++++++++++++++------------ src/malloc.c | 65 ++++++++++++++++++++++++++++++++----------------- src/sqliteInt.h | 30 ++++++++++++++++++++--- src/status.c | 2 +- 6 files changed, 112 insertions(+), 52 deletions(-) diff --git a/manifest b/manifest index 448d34a0ee..6425c9f1a0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sfixes\sfrom\strunk. -D 2019-12-13T12:14:23.880 +C Cleanup\sand\sperformance\senhancements\sfor\smini-lookaside. +D 2019-12-13T15:48:21.644 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -491,8 +491,8 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 276463aa7a26ee73958b9f4bcbef4eaec516f22bf6b8d7d2428f39c8dea90840 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c 94bf8b6a283914cc8fa8743b3db5350206a4be5cccfd9c84d53409ca5d8bd1c1 -F src/malloc.c 02235d039c72102d4bddf203a493c2613164487c70ec84bab679fc30daa883f0 +F src/main.c 34d73303ac76015d3c8961f16d49ab44a56cbc998f178b27ca07847db4cf9273 +F src/malloc.c d74d986f91ebd6a4a9b2995467f4c13a1fdb57ac87df5bb0a7fa3afe1db72d1d F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -532,9 +532,9 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 2a23e8161775253d9cf383c2c6aa559005dc787d350dcb0be67a6c4cc3bd1d19 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h a036ca4ee94ac0dea82c90b2c902dc84bce187adf75e68284e890bc0c4cd3d95 +F src/sqliteInt.h 4948c2046c921461d2021e52ac8cec5b65cd56ab0c58aa7150313abace90153c F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b -F src/status.c 0fe55b92810509eac821ded2e177e1da944a78cdcdfec7813ad1d6b36d6d667e +F src/status.c baf38f521ac079be616dab1ff13f60c6ce0703c7f0429a65238c695197a56935 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 8cd2600e8de23dff6cdf84d39f46ca57139b061b28f6f80b166bace17d52ab1c F src/test1.c c654981c1d86ebc90dd23fcc0969e6c85e28112f0acc2e2224a97a2a33e7c42f @@ -1852,7 +1852,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 bda92d92bf69a73bc6dd498f92578ad6e81111a3f97bc8724d1720e7283a83b6 c1014e80b26131200a115beb86929a8f0ded2dd65b075e47373346c0f170576a -R b2be5daabe2de4420861c8338271e7de +P 9c471195f6d3e4b00e2d0f909b306a4036352082dca5f016a8eece226e82163d +R 40d26fbfedcb39151f8726a7fa468e8a U drh -Z 5e37344191b5a16624379099587382f5 +Z 7742eaad4b11604e1540b9f51bda9209 diff --git a/manifest.uuid b/manifest.uuid index 69d04cf3ef..4e1f2b833d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9c471195f6d3e4b00e2d0f909b306a4036352082dca5f016a8eece226e82163d \ No newline at end of file +74805668430051032ae9b256c84e252755ee03075fc08293c948675ed40ec280 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 5b70273af2..9f541ff0d0 100644 --- a/src/main.c +++ b/src/main.c @@ -684,6 +684,8 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ #ifndef SQLITE_OMIT_LOOKASIDE void *pStart; sqlite3_int64 szAlloc = sz*(sqlite3_int64)cnt; + int nBig; /* Number of full-size slots */ + int nSm; /* Number smaller mini-slots */ if( sqlite3LookasideUsed(db,0)>0 ){ return SQLITE_BUSY; @@ -708,56 +710,69 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ sqlite3BeginBenignMalloc(); pStart = sqlite3Malloc( szAlloc ); /* IMP: R-61949-35727 */ sqlite3EndBenignMalloc(); - if( pStart ) cnt = sqlite3MallocSize(pStart)/sz; + if( pStart ) szAlloc = sqlite3MallocSize(pStart); }else{ pStart = pBuf; } +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + if( sz>=MINI_SZ*3 ){ + nBig = szAlloc/(3*MINI_SZ+sz); + nSm = (szAlloc - sz*nBig)/MINI_SZ; + }else if( sz>=MINI_SZ*2 ){ + nBig = szAlloc/(MINI_SZ+sz); + nSm = (szAlloc - sz*nBig)/MINI_SZ; + }else +#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ + if( sz>0 ){ + nBig = szAlloc/sz; + nSm = 0; + }else{ + nBig = nSm = 0; + } db->lookaside.pStart = pStart; db->lookaside.pInit = 0; db->lookaside.pFree = 0; -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - db->lookaside.pMiniInit = 0; - db->lookaside.pMiniFree = 0; - /* The arithmetic below causes the number of large lookaside slots to be 1/3 - ** the number of mini slots, based on the observation that 75% of allocations - ** are <= MINI_SZ bytes. - */ - cnt = szAlloc/(3*MINI_SZ+sz); -#endif db->lookaside.sz = (u16)sz; db->lookaside.szTrue = (u16)sz; if( pStart ){ int i; LookasideSlot *p; assert( sz > (int)sizeof(LookasideSlot*) ); - db->lookaside.nSlot = cnt; p = (LookasideSlot*)pStart; - for(i=cnt-1; i>=0; i--){ + for(i=0; ipNext = db->lookaside.pInit; db->lookaside.pInit = p; p = (LookasideSlot*)&((u8*)p)[sz]; } #ifndef SQLITE_OMIT_MINI_LOOKASIDE + db->lookaside.pMiniInit = 0; + db->lookaside.pMiniFree = 0; db->lookaside.pMiddle = p; - /* Fill the remainder of the buffer with mini slots */ - while(p<=(LookasideSlot*)&((u8*)pStart)[szAlloc-MINI_SZ]){ + for(i=0; ipNext = db->lookaside.pMiniInit; db->lookaside.pMiniInit = p; - db->lookaside.nSlot++; p = (LookasideSlot*)&((u8*)p)[MINI_SZ]; } -#endif +#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ + assert( ((uptr)p)<=szAlloc + (uptr)pStart ); db->lookaside.pEnd = p; db->lookaside.bDisable = 0; db->lookaside.bMalloced = pBuf==0 ?1:0; + db->lookaside.nSlot = nBig+nSm; }else{ db->lookaside.pStart = db; +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + db->lookaside.pMiniInit = 0; + db->lookaside.pMiniFree = 0; + db->lookaside.pMiddle = db; +#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ db->lookaside.pEnd = db; db->lookaside.bDisable = 1; db->lookaside.sz = 0; db->lookaside.bMalloced = 0; db->lookaside.nSlot = 0; } + assert( sqlite3LookasideUsed(db,0)==0 ); #endif /* SQLITE_OMIT_LOOKASIDE */ return SQLITE_OK; } diff --git a/src/malloc.c b/src/malloc.c index 26a258b347..1074156eec 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -341,8 +341,8 @@ static int lookasideMallocSize(sqlite3 *db, void *p){ } int sqlite3DbMallocSize(sqlite3 *db, void *p){ assert( p!=0 ); - if( db==0 || !isLookaside(db,p) ){ #ifdef SQLITE_DEBUG + if( db==0 || !isLookaside(db,p) ){ if( db==0 ){ assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); assert( sqlite3MemdebugHasType(p, MEMTYPE_HEAP) ); @@ -350,12 +350,23 @@ int sqlite3DbMallocSize(sqlite3 *db, void *p){ assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); assert( sqlite3MemdebugNoType(p, (u8)~(MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); } -#endif - return sqlite3GlobalConfig.m.xSize(p); - }else{ - assert( sqlite3_mutex_held(db->mutex) ); - return lookasideMallocSize(db, p); } +#endif + if( db ){ + if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ + assert( sqlite3_mutex_held(db->mutex) ); + return MINI_SZ; + } +#endif + if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ + assert( sqlite3_mutex_held(db->mutex) ); + return db->lookaside.szTrue; + } + } + } + return sqlite3GlobalConfig.m.xSize(p); } sqlite3_uint64 sqlite3_msize(void *p){ assert( sqlite3MemdebugNoType(p, (u8)~MEMTYPE_HEAP) ); @@ -402,26 +413,27 @@ void sqlite3DbFreeNN(sqlite3 *db, void *p){ measureAllocationSize(db, p); return; } - if( isLookaside(db, p) ){ - LookasideSlot *pBuf = (LookasideSlot*)p; + if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ #ifndef SQLITE_OMIT_MINI_LOOKASIDE - if( p>=db->lookaside.pMiddle ){ -# ifdef SQLITE_DEBUG - /* Trash all content in the buffer being freed */ - memset(p, 0xaa, MINI_SZ); -# endif + if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; +#ifdef SQLITE_DEBUG + memset(p, 0xaa, MINI_SZ); /* Trash freed content */ +#endif pBuf->pNext = db->lookaside.pMiniFree; db->lookaside.pMiniFree = pBuf; return; } -#endif +#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ + if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ + LookasideSlot *pBuf = (LookasideSlot*)p; #ifdef SQLITE_DEBUG - /* Trash all content in the buffer being freed */ - memset(p, 0xaa, db->lookaside.szTrue); + memset(p, 0xaa, db->lookaside.szTrue); /* Trash freed content */ #endif - pBuf->pNext = db->lookaside.pFree; - db->lookaside.pFree = pBuf; - return; + pBuf->pNext = db->lookaside.pFree; + db->lookaside.pFree = pBuf; + return; + } } } assert( sqlite3MemdebugHasType(p, (MEMTYPE_LOOKASIDE|MEMTYPE_HEAP)) ); @@ -585,7 +597,7 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ } return dbMallocRawFinish(db, n); } -# ifndef SQLITE_OMIT_MINI_LOOKASIDE +#ifndef SQLITE_OMIT_MINI_LOOKASIDE if( n<=MINI_SZ ){ if( (pBuf = db->lookaside.pMiniFree)!=0 ){ db->lookaside.pMiniFree = pBuf->pNext; @@ -597,7 +609,7 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ return (void*)pBuf; } } -# endif +#endif if( (pBuf = db->lookaside.pFree)!=0 ){ db->lookaside.pFree = pBuf->pNext; db->lookaside.anStat[0]++; @@ -631,7 +643,16 @@ 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) && nlookaside.pEnd ){ +#ifndef SQLITE_OMIT_MINI_LOOKASIDE + if( ((uptr)p)>=(uptr)db->lookaside.pMiddle ){ + if( n<=MINI_SZ ) return p; + }else +#endif + if( ((uptr)p)>=(uptr)db->lookaside.pStart ){ + if( n<=db->lookaside.szTrue ) return p; + } + } return dbReallocFinish(db, p, n); } static SQLITE_NOINLINE void *dbReallocFinish(sqlite3 *db, void *p, u64 n){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index da9a7ff811..b18f05c85e 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1277,6 +1277,25 @@ struct Schema { ** 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. +** +** Lookaside buffers are initially held on the pInit list. As they are +** used and freed, they are added back to the pFree list. New allocations +** come off of pFree first, then pInit as a fallback. This dual-list +** allows use to compute a high-water mark - the maximum number of allocations +** outstanding at any point in the past - by subtracting the number of +** allocations on the pInit list from the total number of allocations. +** +** Enhancement on 2019-12-12: Mini-lookaside +** The default lookaside configuration is 100 slots of 1200 bytes each. +** The larger slot sizes are important for performance, but they waste +** a lot of space, as most lookaside allocations are less than 128 bytes. +** The mini-lookaside enhancement breaks up the lookaside allocation into +** two pools: One of 128-byte slots and the other of the default size +** (1200-byte) slots. Allocations are filled from the mini-pool first, +** failing over to the full-size pool if that does not work. Thus more +** lookaside slots are available while also using less memory. +** This enhancement can be omitted by compiling with +** SQLITE_OMIT_MINI_LOOKASIDE. */ struct Lookaside { u32 bDisable; /* Only operate the lookaside when zero */ @@ -1290,8 +1309,9 @@ struct Lookaside { #ifndef SQLITE_OMIT_MINI_LOOKASIDE LookasideSlot *pMiniInit; /* List of mini buffers not prediously used */ LookasideSlot *pMiniFree; /* List of available mini buffers */ - void *pMiddle; /* An address between the fullsize and mini buffers */ -#endif + void *pMiddle; /* First byte past end of full-size buffers and + ** the first byte of mini-buffers */ +#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ void *pStart; /* First byte of available memory space */ void *pEnd; /* First byte past end of available space */ }; @@ -1304,7 +1324,11 @@ struct LookasideSlot { db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue /* Size of the MINI lookside allocation */ -#define MINI_SZ 128 +#ifdef SQLITE_OMIT_MINI_LOOKASIDE +# define MINI_SZ 0 +#else +# define MINI_SZ 128 +#endif /* ** A hash table for built-in function definitions. (Application-defined diff --git a/src/status.c b/src/status.c index d7ffe99ede..977457f8e3 100644 --- a/src/status.c +++ b/src/status.c @@ -191,7 +191,7 @@ int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ #ifndef SQLITE_OMIT_MINI_LOOKASIDE nInit += countLookasideSlots(db->lookaside.pMiniInit); nFree += countLookasideSlots(db->lookaside.pMiniFree); -#endif +#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ if( pHighwater ) *pHighwater = db->lookaside.nSlot - nInit; return db->lookaside.nSlot - (nInit+nFree); } From d335bc40a6576d8759466d8efaaaf82b04667aaa Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 13 Dec 2019 16:04:52 +0000 Subject: [PATCH 09/29] Change the default lookaside configuration to 40 slots of 1200-bytes each. This actually works out to 30 big slots and 93 small slots using the mini-lookaside allocator. We get the same (or better) lookaside coverage but with 72KB less memory per connection. FossilOrigin-Name: 47b71a84d1262c4bf6ad4f4a91820fd63593f08ae9efa144199d44972225e073 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/global.c | 11 ++++++++++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 6425c9f1a0..16e83f5bd7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Cleanup\sand\sperformance\senhancements\sfor\smini-lookaside. -D 2019-12-13T15:48:21.644 +C Change\sthe\sdefault\slookaside\sconfiguration\sto\s40\sslots\sof\s1200-bytes\seach.\nThis\sactually\sworks\sout\sto\s30\sbig\sslots\sand\s93\ssmall\sslots\susing\sthe\s\nmini-lookaside\sallocator.\s\sWe\sget\sthe\ssame\s(or\sbetter)\slookaside\scoverage\nbut\swith\s72KB\sless\smemory\sper\sconnection. +D 2019-12-13T16:04:52.502 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -483,7 +483,7 @@ F src/expr.c a4c16d4eed1508377bb8aba71471f3f023edb2ebd79fb7ba3bf379b1e54a6cb7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 -F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 +F src/global.c 76da82a621fed40105172969f1a4af93bdab107fa07426f532502c498cf81eb8 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -1852,7 +1852,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 9c471195f6d3e4b00e2d0f909b306a4036352082dca5f016a8eece226e82163d -R 40d26fbfedcb39151f8726a7fa468e8a +P 74805668430051032ae9b256c84e252755ee03075fc08293c948675ed40ec280 +R be744340ad93a72a39e7a253bc678105 U drh -Z 7742eaad4b11604e1540b9f51bda9209 +Z cd1e4565dc6a4c9271072cb91752ff19 diff --git a/manifest.uuid b/manifest.uuid index 4e1f2b833d..5fd4b18240 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -74805668430051032ae9b256c84e252755ee03075fc08293c948675ed40ec280 \ No newline at end of file +47b71a84d1262c4bf6ad4f4a91820fd63593f08ae9efa144199d44972225e073 \ No newline at end of file diff --git a/src/global.c b/src/global.c index 4689e94bb4..570002be4d 100644 --- a/src/global.c +++ b/src/global.c @@ -190,9 +190,18 @@ const unsigned char sqlite3CtypeMap[256] = { ** changed as start-time using sqlite3_config(SQLITE_CONFIG_LOOKASIDE) ** or at run-time for an individual database connection using ** sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE); +** +** With the mini-lookaside enhancement, must less lookaside is required. +** The default configuration of 1200,40 actually proves 30 1200-byte slots +** and 93 128-byte slots, which is more lookaside slots that are available +** using the older 1200,100 configuration without mini-lookaside. */ #ifndef SQLITE_DEFAULT_LOOKASIDE -# define SQLITE_DEFAULT_LOOKASIDE 1200,100 +# ifdef SQLITE_OMIT_MINI_LOOKASIDE +# define SQLITE_DEFAULT_LOOKASIDE 1200,100 /* 120KB of memory */ +# else +# define SQLITE_DEFAULT_LOOKASIDE 1200,40 /* 48KB of memory */ +# endif #endif From cf014f6cbd2452abb29b3bef2b3b4e63e59c09f8 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 Dec 2019 15:12:34 +0000 Subject: [PATCH 10/29] Refactor names. Use "small" instead of "mini" to describe the smaller of the two lookaside memory allocation sizes. FossilOrigin-Name: 88d244983854cdc1a369c5df09ae00f1098784db768ba4e17b963d187dcb1009 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/global.c | 10 +++++----- src/main.c | 40 ++++++++++++++++++++-------------------- src/malloc.c | 34 +++++++++++++++++----------------- src/sqliteInt.h | 28 ++++++++++++++-------------- src/status.c | 18 +++++++++--------- 7 files changed, 76 insertions(+), 76 deletions(-) diff --git a/manifest b/manifest index d7ccb2fbc8..afb4de68b3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\srecent\senhancements\sfrom\strunk. -D 2019-12-31T14:49:10.816 +C Refactor\snames.\s\sUse\s"small"\sinstead\sof\s"mini"\sto\sdescribe\sthe\ssmaller\nof\sthe\stwo\slookaside\smemory\sallocation\ssizes. +D 2019-12-31T15:12:34.090 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -484,7 +484,7 @@ F src/expr.c 8d4b6ac02f69e60b185cba0e38a76ba3f6f2122ee767e7de0f933fddec423e4a F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 -F src/global.c 76da82a621fed40105172969f1a4af93bdab107fa07426f532502c498cf81eb8 +F src/global.c 89e36838a355f99cf86b118c3d4078fc3fc95cc9f992cbd70b422da8bfdf1789 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -492,8 +492,8 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c e43c6475b302d094ffa01d76b784c719001c9cf24c0b5af96b78e5b25dc54b83 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c 34d73303ac76015d3c8961f16d49ab44a56cbc998f178b27ca07847db4cf9273 -F src/malloc.c d74d986f91ebd6a4a9b2995467f4c13a1fdb57ac87df5bb0a7fa3afe1db72d1d +F src/main.c e9e8da06e089933c3151951be34ac7212212dd8d1551f1d84a2f4416e7af56e0 +F src/malloc.c eaa4dc9602ce28b077f7de2eb275db2be270c5cc56d7fec5466301bd9b80e2f5 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 @@ -533,9 +533,9 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h b5784a17e5ad158a759b2ed0a0d2ded1e1c3e9cf4cf51e4da21783790b9d0567 +F src/sqliteInt.h edc69ef8684086e8c195f969e47173ad960a0eb3f6298222b635e2ad3e0c1f98 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b -F src/status.c baf38f521ac079be616dab1ff13f60c6ce0703c7f0429a65238c695197a56935 +F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 8cd2600e8de23dff6cdf84d39f46ca57139b061b28f6f80b166bace17d52ab1c F src/test1.c c654981c1d86ebc90dd23fcc0969e6c85e28112f0acc2e2224a97a2a33e7c42f @@ -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 47b71a84d1262c4bf6ad4f4a91820fd63593f08ae9efa144199d44972225e073 1dc83c5d54ca2890112e735e336c209adb8d067d2f647e9f8ae5d58f84a52461 -R 8dbc460e590e85bbe19d4191ea7ea91a +P 39d55579376906f212271ce9b2d367e3ad029fb173f22c7253312b467970208a +R c6267a3dfb8286b9a7bf015a7e8fc93b U drh -Z ac3eece56ae65a72ceccf8b58e31752f +Z 457f22be9b5a945c48c466bed56b269c diff --git a/manifest.uuid b/manifest.uuid index 47ee9f350b..2ca43abc99 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -39d55579376906f212271ce9b2d367e3ad029fb173f22c7253312b467970208a \ No newline at end of file +88d244983854cdc1a369c5df09ae00f1098784db768ba4e17b963d187dcb1009 \ No newline at end of file diff --git a/src/global.c b/src/global.c index 570002be4d..4072fa0d07 100644 --- a/src/global.c +++ b/src/global.c @@ -191,13 +191,13 @@ const unsigned char sqlite3CtypeMap[256] = { ** or at run-time for an individual database connection using ** sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE); ** -** With the mini-lookaside enhancement, must less lookaside is required. -** The default configuration of 1200,40 actually proves 30 1200-byte slots -** and 93 128-byte slots, which is more lookaside slots that are available -** using the older 1200,100 configuration without mini-lookaside. +** With the two-size-lookaside enhancement, less lookaside is required. +** The default configuration of 1200,40 actually provides 30 1200-byte slots +** and 93 128-byte slots, which is more lookaside than is available +** using the older 1200,100 configuration without two-size-lookaside. */ #ifndef SQLITE_DEFAULT_LOOKASIDE -# ifdef SQLITE_OMIT_MINI_LOOKASIDE +# ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE # define SQLITE_DEFAULT_LOOKASIDE 1200,100 /* 120KB of memory */ # else # define SQLITE_DEFAULT_LOOKASIDE 1200,40 /* 48KB of memory */ diff --git a/src/main.c b/src/main.c index 9f541ff0d0..35741ab9f9 100644 --- a/src/main.c +++ b/src/main.c @@ -685,7 +685,7 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ void *pStart; sqlite3_int64 szAlloc = sz*(sqlite3_int64)cnt; int nBig; /* Number of full-size slots */ - int nSm; /* Number smaller mini-slots */ + int nSm; /* Number smaller LOOKASIDE_SMALL-byte slots */ if( sqlite3LookasideUsed(db,0)>0 ){ return SQLITE_BUSY; @@ -714,15 +714,15 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ }else{ pStart = pBuf; } -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - if( sz>=MINI_SZ*3 ){ - nBig = szAlloc/(3*MINI_SZ+sz); - nSm = (szAlloc - sz*nBig)/MINI_SZ; - }else if( sz>=MINI_SZ*2 ){ - nBig = szAlloc/(MINI_SZ+sz); - nSm = (szAlloc - sz*nBig)/MINI_SZ; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( sz>=LOOKASIDE_SMALL*3 ){ + nBig = szAlloc/(3*LOOKASIDE_SMALL+sz); + nSm = (szAlloc - sz*nBig)/LOOKASIDE_SMALL; + }else if( sz>=LOOKASIDE_SMALL*2 ){ + nBig = szAlloc/(LOOKASIDE_SMALL+sz); + nSm = (szAlloc - sz*nBig)/LOOKASIDE_SMALL; }else -#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ if( sz>0 ){ nBig = szAlloc/sz; nSm = 0; @@ -744,16 +744,16 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.pInit = p; p = (LookasideSlot*)&((u8*)p)[sz]; } -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - db->lookaside.pMiniInit = 0; - db->lookaside.pMiniFree = 0; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + db->lookaside.pSmallInit = 0; + db->lookaside.pSmallFree = 0; db->lookaside.pMiddle = p; for(i=0; ipNext = db->lookaside.pMiniInit; - db->lookaside.pMiniInit = p; - p = (LookasideSlot*)&((u8*)p)[MINI_SZ]; + p->pNext = db->lookaside.pSmallInit; + db->lookaside.pSmallInit = p; + p = (LookasideSlot*)&((u8*)p)[LOOKASIDE_SMALL]; } -#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ assert( ((uptr)p)<=szAlloc + (uptr)pStart ); db->lookaside.pEnd = p; db->lookaside.bDisable = 0; @@ -761,11 +761,11 @@ static int setupLookaside(sqlite3 *db, void *pBuf, int sz, int cnt){ db->lookaside.nSlot = nBig+nSm; }else{ db->lookaside.pStart = db; -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - db->lookaside.pMiniInit = 0; - db->lookaside.pMiniFree = 0; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + db->lookaside.pSmallInit = 0; + db->lookaside.pSmallFree = 0; db->lookaside.pMiddle = db; -#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ db->lookaside.pEnd = db; db->lookaside.bDisable = 1; db->lookaside.sz = 0; diff --git a/src/malloc.c b/src/malloc.c index 1074156eec..9dd400a3ba 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -333,8 +333,8 @@ int sqlite3MallocSize(void *p){ return sqlite3GlobalConfig.m.xSize(p); } static int lookasideMallocSize(sqlite3 *db, void *p){ -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - return plookaside.pMiddle ? db->lookaside.szTrue : MINI_SZ; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + return plookaside.pMiddle ? db->lookaside.szTrue : LOOKASIDE_SMALL; #else return db->lookaside.szTrue; #endif @@ -354,10 +354,10 @@ int sqlite3DbMallocSize(sqlite3 *db, void *p){ #endif if( db ){ if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ -#ifndef SQLITE_OMIT_MINI_LOOKASIDE +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ assert( sqlite3_mutex_held(db->mutex) ); - return MINI_SZ; + return LOOKASIDE_SMALL; } #endif if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ @@ -414,17 +414,17 @@ void sqlite3DbFreeNN(sqlite3 *db, void *p){ return; } if( ((uptr)p)<(uptr)(db->lookaside.pEnd) ){ -#ifndef SQLITE_OMIT_MINI_LOOKASIDE +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE if( ((uptr)p)>=(uptr)(db->lookaside.pMiddle) ){ LookasideSlot *pBuf = (LookasideSlot*)p; #ifdef SQLITE_DEBUG - memset(p, 0xaa, MINI_SZ); /* Trash freed content */ + memset(p, 0xaa, LOOKASIDE_SMALL); /* Trash freed content */ #endif - pBuf->pNext = db->lookaside.pMiniFree; - db->lookaside.pMiniFree = pBuf; + pBuf->pNext = db->lookaside.pSmallFree; + db->lookaside.pSmallFree = pBuf; return; } -#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ if( ((uptr)p)>=(uptr)(db->lookaside.pStart) ){ LookasideSlot *pBuf = (LookasideSlot*)p; #ifdef SQLITE_DEBUG @@ -597,14 +597,14 @@ void *sqlite3DbMallocRawNN(sqlite3 *db, u64 n){ } return dbMallocRawFinish(db, n); } -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - if( n<=MINI_SZ ){ - if( (pBuf = db->lookaside.pMiniFree)!=0 ){ - db->lookaside.pMiniFree = pBuf->pNext; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + if( n<=LOOKASIDE_SMALL ){ + if( (pBuf = db->lookaside.pSmallFree)!=0 ){ + db->lookaside.pSmallFree = pBuf->pNext; db->lookaside.anStat[0]++; return (void*)pBuf; - }else if( (pBuf = db->lookaside.pMiniInit)!=0 ){ - db->lookaside.pMiniInit = pBuf->pNext; + }else if( (pBuf = db->lookaside.pSmallInit)!=0 ){ + db->lookaside.pSmallInit = pBuf->pNext; db->lookaside.anStat[0]++; return (void*)pBuf; } @@ -644,9 +644,9 @@ void *sqlite3DbRealloc(sqlite3 *db, void *p, u64 n){ if( p==0 ) return sqlite3DbMallocRawNN(db, n); assert( sqlite3_mutex_held(db->mutex) ); if( ((uptr)p)<(uptr)db->lookaside.pEnd ){ -#ifndef SQLITE_OMIT_MINI_LOOKASIDE +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE if( ((uptr)p)>=(uptr)db->lookaside.pMiddle ){ - if( n<=MINI_SZ ) return p; + if( n<=LOOKASIDE_SMALL ) return p; }else #endif if( ((uptr)p)>=(uptr)db->lookaside.pStart ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 463cfcefc5..1ed789eb7f 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1305,17 +1305,17 @@ struct Schema { ** outstanding at any point in the past - by subtracting the number of ** allocations on the pInit list from the total number of allocations. ** -** Enhancement on 2019-12-12: Mini-lookaside +** Enhancement on 2019-12-12: Two-size-lookaside ** The default lookaside configuration is 100 slots of 1200 bytes each. ** The larger slot sizes are important for performance, but they waste ** a lot of space, as most lookaside allocations are less than 128 bytes. -** The mini-lookaside enhancement breaks up the lookaside allocation into -** two pools: One of 128-byte slots and the other of the default size -** (1200-byte) slots. Allocations are filled from the mini-pool first, +** The two-size-lookaside enhancement breaks up the lookaside allocation +** into two pools: One of 128-byte slots and the other of the default size +** (1200-byte) slots. Allocations are filled from the small-pool first, ** failing over to the full-size pool if that does not work. Thus more ** lookaside slots are available while also using less memory. ** This enhancement can be omitted by compiling with -** SQLITE_OMIT_MINI_LOOKASIDE. +** SQLITE_OMIT_TWOSIZE_LOOKASIDE. */ struct Lookaside { u32 bDisable; /* Only operate the lookaside when zero */ @@ -1326,12 +1326,12 @@ struct Lookaside { u32 anStat[3]; /* 0: hits. 1: size misses. 2: full misses */ LookasideSlot *pInit; /* List of buffers not previously used */ LookasideSlot *pFree; /* List of available buffers */ -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - LookasideSlot *pMiniInit; /* List of mini buffers not prediously used */ - LookasideSlot *pMiniFree; /* List of available mini buffers */ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + LookasideSlot *pSmallInit; /* List of small buffers not prediously used */ + LookasideSlot *pSmallFree; /* List of available small buffers */ void *pMiddle; /* First byte past end of full-size buffers and - ** the first byte of mini-buffers */ -#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ + ** the first byte of LOOKASIDE_SMALL buffers */ +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ void *pStart; /* First byte of available memory space */ void *pEnd; /* First byte past end of available space */ }; @@ -1343,11 +1343,11 @@ struct LookasideSlot { #define EnableLookaside db->lookaside.bDisable--;\ db->lookaside.sz=db->lookaside.bDisable?0:db->lookaside.szTrue -/* Size of the MINI lookside allocation */ -#ifdef SQLITE_OMIT_MINI_LOOKASIDE -# define MINI_SZ 0 +/* Size of the smaller allocations in two-size lookside */ +#ifdef SQLITE_OMIT_TWOSIZE_LOOKASIDE +# define LOOKASIDE_SMALL 0 #else -# define MINI_SZ 128 +# define LOOKASIDE_SMALL 128 #endif /* diff --git a/src/status.c b/src/status.c index 977457f8e3..c42bcc2856 100644 --- a/src/status.c +++ b/src/status.c @@ -188,10 +188,10 @@ static u32 countLookasideSlots(LookasideSlot *p){ int sqlite3LookasideUsed(sqlite3 *db, int *pHighwater){ u32 nInit = countLookasideSlots(db->lookaside.pInit); u32 nFree = countLookasideSlots(db->lookaside.pFree); -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - nInit += countLookasideSlots(db->lookaside.pMiniInit); - nFree += countLookasideSlots(db->lookaside.pMiniFree); -#endif /* SQLITE_OMIT_MINI_LOOKASIDE */ +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + nInit += countLookasideSlots(db->lookaside.pSmallInit); + nFree += countLookasideSlots(db->lookaside.pSmallFree); +#endif /* SQLITE_OMIT_TWOSIZE_LOOKASIDE */ if( pHighwater ) *pHighwater = db->lookaside.nSlot - nInit; return db->lookaside.nSlot - (nInit+nFree); } @@ -224,13 +224,13 @@ int sqlite3_db_status( db->lookaside.pInit = db->lookaside.pFree; db->lookaside.pFree = 0; } -#ifndef SQLITE_OMIT_MINI_LOOKASIDE - p = db->lookaside.pMiniFree; +#ifndef SQLITE_OMIT_TWOSIZE_LOOKASIDE + p = db->lookaside.pSmallFree; if( p ){ while( p->pNext ) p = p->pNext; - p->pNext = db->lookaside.pMiniInit; - db->lookaside.pMiniInit = db->lookaside.pMiniFree; - db->lookaside.pMiniFree = 0; + p->pNext = db->lookaside.pSmallInit; + db->lookaside.pSmallInit = db->lookaside.pSmallFree; + db->lookaside.pSmallFree = 0; } #endif } From 51676fab72dd89450f6c8b8c252703016e005286 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 31 Dec 2019 23:17:35 +0000 Subject: [PATCH 11/29] Remove an incorrect assert() statement. Ticket [46fcd700b855e6d1] FossilOrigin-Name: eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c162495ecf..7bf247d565 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Also\sset\sthe\sSQLITE_DIRECTONLY\sflag\son\sthe\sload_extension()\sfunction. -D 2019-12-31T18:39:23.702 +C Remove\san\sincorrect\sassert()\sstatement.\s\sTicket\s[46fcd700b855e6d1] +D 2019-12-31T23:17:35.723 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -606,7 +606,7 @@ F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 0a9716e47012ef018038c2e1dab9f701a6fb4429bb3ee1d4d0f49497519ace74 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c fa083086758379b52f8771d69424b273c7bd0f94413802404ee32cd5cc7cd870 +F src/vdbemem.c a5c16cfa5e8ec960cf1ae1226a0718b31bb93de8fba7804fb60217e1dbe28721 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -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 f3171dc22e4d3a40ca17fe609391d92fc6a997b775bfefa5947aec69c889aa73 -R 25bc6cfca86f50c6bebf64970cf717c5 +P 3bd095a53119c368fe30e539983588b27957203344cf427405b9a64784b8eba7 +R 9a290668b8247b93cd51ae150764a4e7 U drh -Z 6a954000d634738bb471999423aebba1 +Z 3a723a31e4b46687e83c27b7c95d8d29 diff --git a/manifest.uuid b/manifest.uuid index 266e4c4a56..fe05dead13 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3bd095a53119c368fe30e539983588b27957203344cf427405b9a64784b8eba7 \ No newline at end of file +eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index c64901e44d..7d56d1684b 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -964,7 +964,9 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ ** same. */ u16 mFlags = pMem->flags & pX->flags & pX->mScopyFlags; assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i ); - assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r ); + /* assert( (mFlags&MEM_Real)==0 || pMem->u.r==pX->u.r ); */ + /* ^^ */ + /* Cannot reliably compare doubles for equality */ assert( (mFlags&MEM_Str)==0 || (pMem->n==pX->n && pMem->z==pX->z) ); assert( (mFlags&MEM_Blob)==0 || sqlite3BlobCompare(pMem,pX)==0 ); From 6d67aff0e3d613b2decc7d9a9e93d5d6be633edc Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 01:26:05 +0000 Subject: [PATCH 12/29] Issue OP_ReleaseReg opcodes against the array of registers used to compute index records after the index record has been computed. FossilOrigin-Name: e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 7bf247d565..f74d206ba8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sincorrect\sassert()\sstatement.\s\sTicket\s[46fcd700b855e6d1] -D 2019-12-31T23:17:35.723 +C Issue\sOP_ReleaseReg\sopcodes\sagainst\sthe\sarray\sof\sregisters\sused\sto\scompute\nindex\srecords\safter\sthe\sindex\srecord\shas\sbeen\scomputed. +D 2020-01-01T01:26:05.547 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -489,7 +489,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 97afb0bf06d7fd7b820f6de3e42cf60beb5cd10131828c29b131b2614bbb1f39 +F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb @@ -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 3bd095a53119c368fe30e539983588b27957203344cf427405b9a64784b8eba7 -R 9a290668b8247b93cd51ae150764a4e7 +P eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f +R 831eba5ca2213a1142c1d3fcf8abb412 U drh -Z 3a723a31e4b46687e83c27b7c95d8d29 +Z d9905a9f70d8f738c4685ad63b39c0a5 diff --git a/manifest.uuid b/manifest.uuid index fe05dead13..6ac57e8761 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f \ No newline at end of file +e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index d778e4b457..3b4ad56403 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1976,6 +1976,7 @@ void sqlite3GenerateConstraintChecks( sqlite3SetMakeRecordP5(v, pIdx->pTable); } #endif + sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0); /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the From 25c4296bd97072f7b5a13f4eda021bd2782bcc45 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 13:55:08 +0000 Subject: [PATCH 13/29] Factor out code generation for in-line SQL functions into a separate routine inside of expr.c. FossilOrigin-Name: 586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb --- manifest | 16 ++++---- manifest.uuid | 2 +- src/expr.c | 106 ++++++++++++++++++++++++++++++------------------ src/func.c | 12 +++--- src/sqliteInt.h | 27 +++++++++++- 5 files changed, 107 insertions(+), 56 deletions(-) diff --git a/manifest b/manifest index f74d206ba8..1899d7f3fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Issue\sOP_ReleaseReg\sopcodes\sagainst\sthe\sarray\sof\sregisters\sused\sto\scompute\nindex\srecords\safter\sthe\sindex\srecord\shas\sbeen\scomputed. -D 2020-01-01T01:26:05.547 +C Factor\sout\scode\sgeneration\sfor\sin-line\sSQL\sfunctions\sinto\sa\sseparate\sroutine\ninside\sof\sexpr.c. +D 2020-01-01T13:55:08.668 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,10 +480,10 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 3584e19c222f94cd0bb9070318ad270c3ca0d4fe235a6f70a198f16d8faf976f +F src/expr.c afde0ea1060266338820277d210edc0ed383416c59e5f3472a253f121b5a9de3 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 -F src/func.c 511204091c82bd0f351a64f05359b1b0444f0953de92fa1d37b129e544ed5126 +F src/func.c de2641a4763c78b872099649c12adedc638a83df0c41dcb0cb99efc6ceb5f69b F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -533,7 +533,7 @@ F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817de F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h e526421d44d88f17c397647371e460841c961b27ccf69301177b63d18ebbeead +F src/sqliteInt.h a7d75ef422e07c85eaeb12309b071f3342497d960bf0a353dca8665be6ceb576 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -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 eca7ec9cda4606c4104bcb8da315070b615713db9f3444579c6a3e96b0aad02f -R 831eba5ca2213a1142c1d3fcf8abb412 +P e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 +R cfe1bf37072aa553a15293de91196bb1 U drh -Z d9905a9f70d8f738c4685ad63b39c0a5 +Z 1739d48acd97cb5e3553660f1568a9b2 diff --git a/manifest.uuid b/manifest.uuid index 6ac57e8761..82209644bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 \ No newline at end of file +586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e0a03d956f..629768f3a2 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3573,6 +3573,69 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ return iResult; } +/* +** Generate code to implement special SQL functions that are implemented +** in-line rather than by using the usual callbacks. +*/ +static int exprCodeInlineFunction( + Parse *pParse, /* Parsing context */ + ExprList *pFarg, /* List of function arguments */ + int iFuncId, /* Function ID. One of the INTFUNC_... values */ + int target /* Store function result in this register */ +){ + int nFarg; + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + assert( pFarg!=0 ); + nFarg = pFarg->nExpr; + assert( nFarg>0 ); /* All in-line functions have at least one argument */ + switch( iFuncId ){ + case INLINEFUNC_coalesce: { + /* Attempt a direct implementation of the built-in COALESCE() and + ** IFNULL() functions. This avoids unnecessary evaluation of + ** arguments past the first non-NULL argument. + */ + int endCoalesce = sqlite3VdbeMakeLabel(pParse); + int i; + assert( nFarg>=2 ); + sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); + for(i=1; ia[i].pExpr, target); + } + sqlite3VdbeResolveLabel(v, endCoalesce); + break; + } + + case INLINEFUNC_unlikely: { + /* The UNLIKELY() function is a no-op. The result is the value + ** of the first argument. + */ + assert( nFarg>=1 ); + target = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); + break; + } + +#ifdef SQLITE_DEBUG + case INLINEFUNC_affinity: { + /* The AFFINITY() function evaluates to a string that describes + ** the type affinity of the argument. This is used for testing of + ** the SQLite type logic. + */ + const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; + char aff; + assert( nFarg==1 ); + aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); + sqlite3VdbeLoadString(v, target, + (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); + break; + } +#endif + } + return target; +} + /* ** Generate code into the current Vdbe to evaluate the given @@ -3953,48 +4016,11 @@ expr_code_doover: sqlite3ErrorMsg(pParse, "unknown function: %s()", zId); break; } - - /* Attempt a direct implementation of the built-in COALESCE() and - ** IFNULL() functions. This avoids unnecessary evaluation of - ** arguments past the first non-NULL argument. - */ - if( pDef->funcFlags & SQLITE_FUNC_COALESCE ){ - int endCoalesce = sqlite3VdbeMakeLabel(pParse); - assert( nFarg>=2 ); - sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); - for(i=1; ia[i].pExpr, target); - } - sqlite3VdbeResolveLabel(v, endCoalesce); - break; + if( pDef->funcFlags & SQLITE_FUNC_INLINE ){ + return exprCodeInlineFunction(pParse, pFarg, + SQLITE_PTR_TO_INT(pDef->pUserData), target); } - /* The UNLIKELY() function is a no-op. The result is the value - ** of the first argument. - */ - if( pDef->funcFlags & SQLITE_FUNC_UNLIKELY ){ - assert( nFarg>=1 ); - return sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); - } - -#ifdef SQLITE_DEBUG - /* The AFFINITY() function evaluates to a string that describes - ** the type affinity of the argument. This is used for testing of - ** the SQLite type logic. - */ - if( pDef->funcFlags & SQLITE_FUNC_AFFINITY ){ - const char *azAff[] = { "blob", "text", "numeric", "integer", "real" }; - char aff; - assert( nFarg==1 ); - aff = sqlite3ExprAffinity(pFarg->a[0].pExpr); - sqlite3VdbeLoadString(v, target, - (aff<=SQLITE_AFF_NONE) ? "none" : azAff[aff-SQLITE_AFF_BLOB]); - return target; - } -#endif - for(i=0; ia[i].pExpr) ){ testcase( i==31 ); diff --git a/src/func.c b/src/func.c index d4c6936b10..31b548ff93 100644 --- a/src/func.c +++ b/src/func.c @@ -1921,11 +1921,11 @@ void sqlite3RegisterBuiltinFunctions(void){ DFUNCTION(sqlite_compileoption_used,1, 0, 0, compileoptionusedFunc ), DFUNCTION(sqlite_compileoption_get, 1, 0, 0, compileoptiongetFunc ), #endif /* SQLITE_OMIT_COMPILEOPTION_DIAGS */ - FUNCTION2(unlikely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), - FUNCTION2(likelihood, 2, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), - FUNCTION2(likely, 1, 0, 0, noopFunc, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(unlikely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), + INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), #ifdef SQLITE_DEBUG - FUNCTION2(affinity, 1, 0, 0, noopFunc, SQLITE_FUNC_AFFINITY), + TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), #endif #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| @@ -1959,7 +1959,7 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(upper, 1, 0, 0, upperFunc ), FUNCTION(lower, 1, 0, 0, lowerFunc ), FUNCTION(hex, 1, 0, 0, hexFunc ), - FUNCTION2(ifnull, 2, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), + INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE), VFUNCTION(random, 0, 0, 0, randomFunc ), VFUNCTION(randomblob, 1, 0, 0, randomBlob ), FUNCTION(nullif, 2, 0, 1, nullifFunc ), @@ -1999,7 +1999,7 @@ void sqlite3RegisterBuiltinFunctions(void){ #endif FUNCTION(coalesce, 1, 0, 0, 0 ), FUNCTION(coalesce, 0, 0, 0, 0 ), - FUNCTION2(coalesce, -1, 0, 0, noopFunc, SQLITE_FUNC_COALESCE), + INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, SQLITE_FUNC_COALESCE), }; #ifndef SQLITE_OMIT_ALTERTABLE sqlite3AlterFunctions(); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0dcb103532..d696ffd3a0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1712,12 +1712,18 @@ struct FuncDestructor { #define SQLITE_FUNC_MINMAX 0x1000 /* True for min() and max() aggregates */ #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a ** single query - might change over time */ -#define SQLITE_FUNC_AFFINITY 0x4000 /* Built-in affinity() function */ +#define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ #define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ #define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ #define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ +#define SQLITE_FUNC_INLINE 0x00200000 /* Functions implemented in-line */ + +/* Identifier numbers for each in-line function */ +#define INLINEFUNC_unlikely 0 /* unlikely(EXPR) and friends */ +#define INLINEFUNC_coalesce 1 /* coalesce(EXPR,...) */ +#define INLINEFUNC_affinity 2 /* affinity(EXPR) */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -1737,6 +1743,18 @@ struct FuncDestructor { ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and ** adds the SQLITE_DIRECTONLY flag. ** +** INLINE_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a function that is implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** +** TEST_FUNC(zName, nArg, iFuncId, mFlags) +** zName is the name of a test-only function implemented by in-line +** byte code rather than by the usual callbacks. The iFuncId +** parameter determines the function id. The mFlags parameter is +** optional SQLITE_FUNC_ flags for this function. +** ** DFUNCTION(zName, nArg, iArg, bNC, xFunc) ** Like FUNCTION except it omits the SQLITE_FUNC_CONSTANT flag and ** adds the SQLITE_FUNC_SLOCHNG flag. Used for date & time functions @@ -1779,6 +1797,13 @@ struct FuncDestructor { #define SFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_UTF8|SQLITE_DIRECTONLY, \ SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} } +#define INLINE_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_UTF8|SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } +#define TEST_FUNC(zName, nArg, iArg, mFlags) \ + {nArg, SQLITE_UTF8|SQLITE_FUNC_INTERNAL|SQLITE_FUNC_TEST| \ + SQLITE_FUNC_INLINE|SQLITE_FUNC_CONSTANT|(mFlags), \ + SQLITE_INT_TO_PTR(iArg), 0, noopFunc, 0, 0, 0, #zName, {0} } #define DFUNCTION(zName, nArg, iArg, bNC, xFunc) \ {nArg, SQLITE_FUNC_SLOCHNG|SQLITE_UTF8, \ 0, 0, xFunc, 0, 0, 0, #zName, {0} } From 171c50ec381c5fb4ff1e8b258a49fbf810917011 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 15:43:30 +0000 Subject: [PATCH 14/29] New test-only SQL functions: implies_nonnull_row(), expr_compare(), and expr_implies_expr(). The SQLITE_TESTCTRL_INTERNAL_FUNCTIONS test-control is modified to toggle internal function access on and off for a single database connection. FossilOrigin-Name: 473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 --- manifest | 36 +++++++++++++++++------------------ manifest.uuid | 2 +- src/expr.c | 41 ++++++++++++++++++++++++++++++++++++++-- src/func.c | 11 ++++++++--- src/global.c | 1 - src/main.c | 11 +++++------ src/resolve.c | 2 +- src/shell.c.in | 8 ++++++-- src/sqliteInt.h | 11 +++++++---- src/test1.c | 11 ++++++++++- test/alter.test | 4 ++-- test/altercol.test | 4 ++-- test/altertab.test | 4 ++-- test/fkey2.test | 12 ++++++------ test/without_rowid3.test | 12 ++++++------ 15 files changed, 113 insertions(+), 57 deletions(-) diff --git a/manifest b/manifest index 1899d7f3fb..e18705c664 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Factor\sout\scode\sgeneration\sfor\sin-line\sSQL\sfunctions\sinto\sa\sseparate\sroutine\ninside\sof\sexpr.c. -D 2020-01-01T13:55:08.668 +C New\stest-only\sSQL\sfunctions:\simplies_nonnull_row(),\sexpr_compare(),\sand\nexpr_implies_expr().\s\sThe\sSQLITE_TESTCTRL_INTERNAL_FUNCTIONS\stest-control\nis\smodified\sto\stoggle\sinternal\sfunction\saccess\son\sand\soff\sfor\sa\ssingle\ndatabase\sconnection. +D 2020-01-01T15:43:30.603 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,11 +480,11 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c afde0ea1060266338820277d210edc0ed383416c59e5f3472a253f121b5a9de3 +F src/expr.c 971e442fd52c493826a23e993de94e504adb10e5979d69169786af594687911b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 -F src/func.c de2641a4763c78b872099649c12adedc638a83df0c41dcb0cb99efc6ceb5f69b -F src/global.c a1a8d698762ddd9a1543aac26c1e0029b20fcc3fcb56bfa41ec8cea2368f2798 +F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c +F src/global.c bdd582ba2be6f29ffa5b9b91635c0dbea98101a25c92da15d1caca5ac999c7bb F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -492,7 +492,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c 868ae7db7a54fe859bf2ca8b7a4f24e9fa03a6134abfb7c9801d08411ef5dacb +F src/main.c a76071a978b59055e63d4b5befa1efacc34e985984943251b300e682fee0e776 F src/malloc.c 550021fcae36f0ffe9f8563d83e6385f9df307a854d55d7d0abb7241ee8dbcc6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -526,19 +526,19 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c e231da7dd307f99772c40e76096abaf05c6fedcb4f1f045de23a61c194df6da6 +F src/resolve.c 17c74d7c180b50c703c404c1be7b80769536d9a1913fee4fc176cd95e445966b F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 2a753ec714703c32e4aade5b0115033bbee8a377b215cb0fbe88ab2fa4b3e028 -F src/shell.c.in 4a3a9e1c11847b1904f2b01d087af1c052f660902755abab457cab1756817ded +F src/shell.c.in 36fb3732ee465f1a418add45aec616ecc5d936245c616be761f3b6ba7bb3661e F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h a7d75ef422e07c85eaeb12309b071f3342497d960bf0a353dca8665be6ceb576 +F src/sqliteInt.h e6db732b65fa526ceb75183fbb03cd4b00d4a7741485bcb0dc71222323f52166 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 F src/tclsqlite.c 8cd2600e8de23dff6cdf84d39f46ca57139b061b28f6f80b166bace17d52ab1c -F src/test1.c c654981c1d86ebc90dd23fcc0969e6c85e28112f0acc2e2224a97a2a33e7c42f +F src/test1.c 4d0ab2f67053a4fff87d1d3586ecc0e5322a1fc45dd4119ab11dc96de44f17a1 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb @@ -626,17 +626,17 @@ F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 16ed8d2470193f34bc711e51506ff1211ebfab8025ca3b9510ff2aef139874cb +F test/alter.test 77f0092d137dd9470fc683b64ed92868e188462e713e52f48deae8902ea60b96 F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 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 +F test/altercol.test 1d6a6fe698b81e626baea4881f5717f9bc53d7d07f1cd23ee7ad1b931f117ddf F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 4d8b79b0b88b62b90b710390df14fe99e0a3578345526886eaa550e28e3065dc +F test/altertab.test bd61e5b73d495ec4707133db91b07f09d57e339d988de5ec5a76d34a2198e8f2 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b F test/altertab3.test 155b8dc225ce484454a7fb4c8ba745680b6fa0fc3e08919cbbc19f9309d128ff F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f @@ -867,7 +867,7 @@ F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f9339 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test d35d1c81e7569bdd2b872e91750f7098117d2e8291369f70b7e3d50a0e523dc2 +F test/fkey2.test 65c86b11127c11f80c0f450b3480321e0f087edea3031b9daa1978e3c020c91b F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a @@ -1740,7 +1740,7 @@ F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f1982 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test ea4b59dd1b0d7f5f5e4b7cca978cdb905752a9d7c57dc4344a591dba765a3691 +F test/without_rowid3.test 392e6e12f275d11d931a8bc4580e573342f391639c87ffb631010a7b3cedfdc0 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 8463b20098e9f75a501a9f17dfb42fffc79068eac0b2775fe56ef2281d2df45e @@ -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 e3330861b4deab7c7cc09ad8b936d633c600b9fb4e274801efeaaf94e5c860b4 -R cfe1bf37072aa553a15293de91196bb1 +P 586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb +R 3b4f115c4445c4450469f73abe883b1d U drh -Z 1739d48acd97cb5e3553660f1568a9b2 +Z 13c9af33d91ecf550a075017a4801480 diff --git a/manifest.uuid b/manifest.uuid index 82209644bd..d2123d7daa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb \ No newline at end of file +473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 629768f3a2..da7e4bc349 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3608,15 +3608,52 @@ static int exprCodeInlineFunction( break; } - case INLINEFUNC_unlikely: { + default: { /* The UNLIKELY() function is a no-op. The result is the value ** of the first argument. */ - assert( nFarg>=1 ); + assert( nFarg==1 || nFarg==2 ); target = sqlite3ExprCodeTarget(pParse, pFarg->a[0].pExpr, target); break; } + /*********************************************************************** + ** Test-only SQL functions that are only usable if enabled + ** via SQLITE_TESTCTRL_INTERNAL_FUNCTIONS + */ + case INLINEFUNC_expr_compare: { + /* Compare two expressions using sqlite3ExprCompare() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprCompare(0,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_expr_implies_expr: { + /* Compare two expressions using sqlite3ExprImpliesExpr() */ + assert( nFarg==2 ); + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesExpr(pParse,pFarg->a[0].pExpr, pFarg->a[1].pExpr,-1), + target); + break; + } + + case INLINEFUNC_implies_nonnull_row: { + /* REsult of sqlite3ExprImpliesNonNullRow() */ + Expr *pA1; + assert( nFarg==2 ); + pA1 = pFarg->a[1].pExpr; + if( pA1->op==TK_COLUMN ){ + sqlite3VdbeAddOp2(v, OP_Integer, + sqlite3ExprImpliesNonNullRow(pFarg->a[0].pExpr,pA1->iTable), + target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + break; + } + #ifdef SQLITE_DEBUG case INLINEFUNC_affinity: { /* The AFFINITY() function evaluates to a string that describes diff --git a/src/func.c b/src/func.c index 31b548ff93..be4975afcc 100644 --- a/src/func.c +++ b/src/func.c @@ -1907,6 +1907,14 @@ void sqlite3RegisterBuiltinFunctions(void){ ** For peak efficiency, put the most frequently used function last. */ static FuncDef aBuiltinFunc[] = { +/***** Functions only available with SQLITE_TESTCTRL_INTERNAL_FUNCTIONS *****/ + TEST_FUNC(implies_nonnull_row, 2, INLINEFUNC_implies_nonnull_row, 0), + TEST_FUNC(expr_compare, 2, INLINEFUNC_expr_compare, 0), + TEST_FUNC(expr_implies_expr, 2, INLINEFUNC_expr_implies_expr, 0), +#ifdef SQLITE_DEBUG + TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), +#endif +/***** Regular functions *****/ #ifdef SQLITE_SOUNDEX FUNCTION(soundex, 1, 0, 0, soundexFunc ), #endif @@ -1924,9 +1932,6 @@ void sqlite3RegisterBuiltinFunctions(void){ INLINE_FUNC(unlikely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), -#ifdef SQLITE_DEBUG - TEST_FUNC(affinity, 1, INLINEFUNC_affinity, 0), -#endif #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET| SQLITE_FUNC_TYPEOF), diff --git a/src/global.c b/src/global.c index 4689e94bb4..d8b3e1d31a 100644 --- a/src/global.c +++ b/src/global.c @@ -258,7 +258,6 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ - 0, /* bInternalFunctions */ 0x7ffffffe, /* iOnceResetThreshold */ SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ 0, /* iPrngSeed */ diff --git a/src/main.c b/src/main.c index 1afeee0bdb..880106a850 100644 --- a/src/main.c +++ b/src/main.c @@ -4044,15 +4044,14 @@ int sqlite3_test_control(int op, ...){ break; } - /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCS, int onoff); + /* sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, sqlite3*); ** - ** If parameter onoff is non-zero, internal-use-only SQL functions - ** are visible to ordinary SQL. This is useful for testing but is - ** unsafe because invalid parameters to those internal-use-only functions - ** can result in crashes or segfaults. + ** Toggle the ability to use internal functions on or off for + ** the database connection given in the argument. */ case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { - sqlite3GlobalConfig.bInternalFunctions = va_arg(ap, int); + sqlite3 *db = va_arg(ap, sqlite3*); + db->mDbFlags ^= DBFLAG_InternalFunc; break; } diff --git a/src/resolve.c b/src/resolve.c index a0f9c0f22f..ec082ba256 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -874,7 +874,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } if( (pDef->funcFlags & SQLITE_FUNC_INTERNAL)!=0 && pParse->nested==0 - && sqlite3Config.bInternalFunctions==0 + && (pParse->db->mDbFlags & DBFLAG_InternalFunc)==0 ){ /* Internal-use-only functions are disallowed unless the ** SQL is being compiled using sqlite3NestedParse() */ diff --git a/src/shell.c.in b/src/shell.c.in index e6b6f1a1b3..1143d5309a 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9219,7 +9219,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "extra_schema_checks",SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS,"BOOLEAN" }, /*{ "fault_install", SQLITE_TESTCTRL_FAULT_INSTALL, "" },*/ { "imposter", SQLITE_TESTCTRL_IMPOSTER, "SCHEMA ON/OFF ROOTPAGE"}, - { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "BOOLEAN" }, + { "internal_functions", SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, "" }, { "localtime_fault", SQLITE_TESTCTRL_LOCALTIME_FAULT,"BOOLEAN" }, { "never_corrupt", SQLITE_TESTCTRL_NEVER_CORRUPT, "BOOLEAN" }, { "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS, "DISABLE-MASK" }, @@ -9335,7 +9335,6 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(int, int) */ case SQLITE_TESTCTRL_ASSERT: case SQLITE_TESTCTRL_ALWAYS: - case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: if( nArg==3 ){ int opt = booleanValue(azArg[2]); rc2 = sqlite3_test_control(testctrl, opt); @@ -9353,6 +9352,11 @@ static int do_meta_command(char *zLine, ShellState *p){ } break; + /* sqlite3_test_control(sqlite3*) */ + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: + rc2 = sqlite3_test_control(testctrl, p->db); + break; + case SQLITE_TESTCTRL_IMPOSTER: if( nArg==5 ){ rc2 = sqlite3_test_control(testctrl, p->db, diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d696ffd3a0..8090f77cc1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1589,6 +1589,7 @@ struct sqlite3 { #define DBFLAG_Vacuum 0x0004 /* Currently in a VACUUM */ #define DBFLAG_VacuumInto 0x0008 /* Currently running VACUUM INTO */ #define DBFLAG_SchemaKnownOk 0x0010 /* Schema is known to be valid */ +#define DBFLAG_InternalFunc 0x0020 /* Allow use of internal functions */ /* ** Bits of the sqlite3.dbOptFlags field that are used by the @@ -1721,9 +1722,12 @@ struct FuncDestructor { #define SQLITE_FUNC_INLINE 0x00200000 /* Functions implemented in-line */ /* Identifier numbers for each in-line function */ -#define INLINEFUNC_unlikely 0 /* unlikely(EXPR) and friends */ -#define INLINEFUNC_coalesce 1 /* coalesce(EXPR,...) */ -#define INLINEFUNC_affinity 2 /* affinity(EXPR) */ +#define INLINEFUNC_coalesce 0 +#define INLINEFUNC_implies_nonnull_row 1 +#define INLINEFUNC_expr_implies_expr 2 +#define INLINEFUNC_expr_compare 3 +#define INLINEFUNC_affinity 4 +#define INLINEFUNC_unlikely 99 /* Default case */ /* ** The following three macros, FUNCTION(), LIKEFUNC() and AGGREGATE() are @@ -3561,7 +3565,6 @@ struct Sqlite3Config { int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif int bLocaltimeFault; /* True to fail localtime() calls */ - int bInternalFunctions; /* Internal SQL functions are visible */ int iOnceResetThreshold; /* When to reset OP_Once counters */ u32 szSorterRef; /* Min size in bytes to use sorter-refs */ unsigned int iPrngSeed; /* Alternative fixed seed for the PRNG */ diff --git a/src/test1.c b/src/test1.c index b6a39aad5e..5b07aef2d5 100644 --- a/src/test1.c +++ b/src/test1.c @@ -6872,7 +6872,16 @@ static int SQLITE_TCLAPI test_test_control( iFlag = aVerb[iVerb].i; switch( iFlag ){ - case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: + case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: { + sqlite3 *db = 0; + if( objc!=3 ){ + Tcl_WrongNumArgs(interp, 2, objv, "DB"); + return TCL_ERROR; + } + if( getDbPointer(interp, Tcl_GetString(objv[2]), &db) ) return TCL_ERROR; + sqlite3_test_control(SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, db); + break; + } case SQLITE_TESTCTRL_LOCALTIME_FAULT: { int val; if( objc!=3 ){ diff --git a/test/alter.test b/test/alter.test index a82456d47b..0ec485ef81 100644 --- a/test/alter.test +++ b/test/alter.test @@ -684,7 +684,7 @@ do_test alter-8.2 { # alter-9.X - Special test: Make sure the sqlite_rename_column() and # rename_table() functions do not crash when handed bad input. # -sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test alter-9.1 { execsql {SELECT SQLITE_RENAME_COLUMN(0,0,0,0,0,0,0,0,0)} } {{}} @@ -697,7 +697,7 @@ foreach {tn sql} { catch { execsql $sql } } 1 } -sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # If the INTERNAL_FUNCTIONS test-control is disabled (which is the default), # then the sqlite_rename_table() SQL function is not accessible to ordinary SQL. diff --git a/test/altercol.test b/test/altercol.test index d71a9b06e4..1479b3a7d3 100644 --- a/test/altercol.test +++ b/test/altercol.test @@ -618,7 +618,7 @@ foreach {tn trigger error} { #------------------------------------------------------------------------- # Passing invalid parameters directly to sqlite_rename_column(). # -sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_execsql_test 14.1 { CREATE TABLE ddd(sql, type, object, db, tbl, icol, znew, bquote); INSERT INTO ddd VALUES( @@ -641,7 +641,7 @@ do_execsql_test 14.2 { sqlite_rename_column(sql, type, object, db, tbl, icol, znew, bquote, 0) FROM ddd; } {{} {} {} {}} -sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # If the INTERNAL_FUNCTIONS test-control is disabled (which is the default) # then the sqlite_rename_table() SQL function is not accessible to diff --git a/test/altertab.test b/test/altertab.test index 3f0398fd5e..7dcf8a5e0d 100644 --- a/test/altertab.test +++ b/test/altertab.test @@ -240,13 +240,13 @@ ifcapable vtab { ); } {} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_execsql_test 7.2 { SELECT sqlite_rename_table(db, 0, 0, sql, zOld, zNew, bTemp) FROM ddd; } {{} {} {}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db } #------------------------------------------------------------------------- diff --git a/test/fkey2.test b/test/fkey2.test index 86316f2936..e7fa7b6457 100644 --- a/test/fkey2.test +++ b/test/fkey2.test @@ -987,7 +987,7 @@ ifcapable altertable { 'main', 'table', 't1', $zCreate, $zOld, $zNew, 0 )} } - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test fkey2-14.2.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -997,7 +997,7 @@ ifcapable altertable { do_test fkey2-14.2.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # @@ -1070,7 +1070,7 @@ ifcapable altertable { } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test fkey2-14.2tmp.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -1080,7 +1080,7 @@ ifcapable altertable { do_test fkey2-14.2tmp.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # @@ -1154,7 +1154,7 @@ ifcapable altertable { } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test fkey2-14.2aux.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -1164,7 +1164,7 @@ ifcapable altertable { do_test fkey2-14.2aux.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # diff --git a/test/without_rowid3.test b/test/without_rowid3.test index b895f06cf3..24ef2304de 100644 --- a/test/without_rowid3.test +++ b/test/without_rowid3.test @@ -953,7 +953,7 @@ ifcapable altertable { 'main', 'table', 't1', $zCreate, $zOld, $zNew, 0 )} } - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test without_rowid3-14.2.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -963,7 +963,7 @@ ifcapable altertable { do_test without_rowid3-14.2.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # @@ -1039,7 +1039,7 @@ ifcapable altertable { } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test without_rowid3-14.2tmp.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -1049,7 +1049,7 @@ ifcapable altertable { do_test without_rowid3-14.2tmp.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # @@ -1126,7 +1126,7 @@ ifcapable altertable { } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 1 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db do_test without_rowid3-14.2aux.1.1 { test_rename_parent {CREATE TABLE t1(a REFERENCES t2)} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} @@ -1136,7 +1136,7 @@ ifcapable altertable { do_test without_rowid3-14.2aux.1.3 { test_rename_parent {CREATE TABLE t1(a REFERENCES "t2")} t2 t3 } {{CREATE TABLE t1(a REFERENCES "t3")}} - sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS 0 + sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db # Test ALTER TABLE RENAME TABLE a bit. # From aef81674211ab2f0f93852e3e9ca3bebb7e77c0b Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 16:43:41 +0000 Subject: [PATCH 15/29] Fix the sqlite3ExprImpliesNonNullRow() routine so that it correctly handles a numeric comparison of two AND subexpressions. FossilOrigin-Name: 07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 11 ++++++----- test/expr.test | 20 ++++++++++++++++++++ 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index e18705c664..a8574aaf05 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest-only\sSQL\sfunctions:\simplies_nonnull_row(),\sexpr_compare(),\sand\nexpr_implies_expr().\s\sThe\sSQLITE_TESTCTRL_INTERNAL_FUNCTIONS\stest-control\nis\smodified\sto\stoggle\sinternal\sfunction\saccess\son\sand\soff\sfor\sa\ssingle\ndatabase\sconnection. -D 2020-01-01T15:43:30.603 +C Fix\sthe\ssqlite3ExprImpliesNonNullRow()\sroutine\sso\sthat\sit\scorrectly\nhandles\sa\snumeric\scomparison\sof\stwo\sAND\ssubexpressions. +D 2020-01-01T16:43:41.805 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 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 971e442fd52c493826a23e993de94e504adb10e5979d69169786af594687911b +F src/expr.c e76660a57fa2bbe4103686dc8add1a8c5ca40ae139076956dc8c670f5af34e93 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -855,7 +855,7 @@ F test/exclusive.test d6ccc6acc5d660544f8e0cacaec2c620f8ebb42a764d783ab53430e260 F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7 F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac -F test/expr.test 7cb55e80aeb41d65fec968c08212505123063fea60bdc355d764d747670e9eea +F test/expr.test 26cd01e8485bc48c8aa6a1add598e9ce1e706b4eb4f3f554e0b0223022e8c2cf F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8 F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 @@ -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 586a65a28fc6cac77309612abc32a2e1017c65e0387f9f438f5d8ac8406da8eb -R 3b4f115c4445c4450469f73abe883b1d +P 473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 +R 2d8f123f2e4a8a472445b72603dcb7b0 U drh -Z 13c9af33d91ecf550a075017a4801480 +Z d39001e583054b62fec0d63ed0de45b7 diff --git a/manifest.uuid b/manifest.uuid index d2123d7daa..d44eaabffb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 \ No newline at end of file +07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index da7e4bc349..1c03cf634e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5359,11 +5359,12 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ return WRC_Prune; case TK_AND: - assert( pWalker->eCode==0 ); - sqlite3WalkExpr(pWalker, pExpr->pLeft); - if( pWalker->eCode ){ - pWalker->eCode = 0; - sqlite3WalkExpr(pWalker, pExpr->pRight); + if( pWalker->eCode==0 ){ + sqlite3WalkExpr(pWalker, pExpr->pLeft); + if( pWalker->eCode ){ + pWalker->eCode = 0; + sqlite3WalkExpr(pWalker, pExpr->pRight); + } } return WRC_Prune; diff --git a/test/expr.test b/test/expr.test index 3cdc9180e8..ec5c55c2e4 100644 --- a/test/expr.test +++ b/test/expr.test @@ -1036,4 +1036,24 @@ foreach {tn val} [list 1 NaN 2 -NaN 3 NaN0 4 -NaN0 5 Inf 6 -Inf] { } {0} } +reset_db +sqlite3_test_control SQLITE_TESTCTRL_INTERNAL_FUNCTIONS db +do_execsql_test expr-16.1 { + CREATE TABLE t1(a,b,c); + CREATE TABLE dual(dummy); + INSERT INTO dual VALUES('X'); +} {} +do_execsql_test expr-16.100 { + SELECT implies_nonnull_row( (b=1 AND 0)>(b=3 AND 0),a) + FROM dual LEFT JOIN t1; +} {0} +do_execsql_test expr-16.101 { + SELECT implies_nonnull_row( (b=1 AND 0)>(b=3 AND a=4),a) + FROM dual LEFT JOIN t1; +} {1} +do_execsql_test expr-16.102 { + SELECT implies_nonnull_row( (b=1 AND a=2)>(b=3 AND a=4),a) + FROM dual LEFT JOIN t1; +} {1} + finish_test From 4ea562ee7007f184b53faa4a2bbdbfa70d0dbe9c Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 1 Jan 2020 20:17:15 +0000 Subject: [PATCH 16/29] Ensure that when code for a scalar SELECT featuring window functions is generated more than once by the planner, separate ephemeral tables are opened for each instance. FossilOrigin-Name: ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/select.c | 2 +- src/sqliteInt.h | 2 +- src/window.c | 13 ++++++++----- test/window1.test | 23 +++++++++++++++++++++++ 6 files changed, 44 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index a8574aaf05..75b662d105 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\ssqlite3ExprImpliesNonNullRow()\sroutine\sso\sthat\sit\scorrectly\nhandles\sa\snumeric\scomparison\sof\stwo\sAND\ssubexpressions. -D 2020-01-01T16:43:41.805 +C Ensure\sthat\swhen\scode\sfor\sa\sscalar\sSELECT\sfeaturing\swindow\sfunctions\sis\sgenerated\smore\sthan\sonce\sby\sthe\splanner,\sseparate\sephemeral\stables\sare\sopened\sfor\seach\sinstance. +D 2020-01-01T20:17:15.714 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -528,12 +528,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 17c74d7c180b50c703c404c1be7b80769536d9a1913fee4fc176cd95e445966b F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 2a753ec714703c32e4aade5b0115033bbee8a377b215cb0fbe88ab2fa4b3e028 +F src/select.c ba1af88f0dc93a03c0d5c379aab518109912cf87f92f1196de52812174e6fc9f F src/shell.c.in 36fb3732ee465f1a418add45aec616ecc5d936245c616be761f3b6ba7bb3661e F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 -F src/sqliteInt.h e6db732b65fa526ceb75183fbb03cd4b00d4a7741485bcb0dc71222323f52166 +F src/sqliteInt.h 52a9d124cf7bc902eeaee8b744f928f38a8ca343f9555a922f3800bbca35533c F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -618,7 +618,7 @@ F src/where.c 602e5093556bbd9090c0a9bd834fec0717e3a4b0377a021d38091a6d554a1177 F src/whereInt.h a727b32260e12707a8c1bc29d7f7e9b6dc1a44551a45093d5968fbe570ff0c56 F src/wherecode.c a987d22b42e09b06f3a49596e0953b1cd28e568cc656681776edc0026cfac0cc F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 -F src/window.c 87795bb8293179cb8a92529264d49bd66b5bcad5e91cfc17dd8d3e66a2a77f88 +F src/window.c 659d613248f8bb8630f51409dc08235e4494c3c84162a535d9f88b38515f390a 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 cd6e2dafaa14ae26c995547013a9765356d910f473664497c926ea3f47510997 +F test/window1.test 30f38038f2878a28befa66c288099e5da131ba673799d73d0864f08375d503e1 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 473892a8eceacf24d57fd0c72ff2a0b8be4e0d75e0af7a30bdb24fbc3b453601 -R 2d8f123f2e4a8a472445b72603dcb7b0 -U drh -Z d39001e583054b62fec0d63ed0de45b7 +P 07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb +R ca9b505edc6627c7559e6f132a7a42f0 +U dan +Z 91f49b7c37ac409cb8d99713dae333ea diff --git a/manifest.uuid b/manifest.uuid index d44eaabffb..d2e2d0b759 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb \ No newline at end of file +ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c \ No newline at end of file diff --git a/src/select.c b/src/select.c index 247ccfbaae..1a23b2b26f 100644 --- a/src/select.c +++ b/src/select.c @@ -6177,7 +6177,7 @@ int sqlite3Select( #ifndef SQLITE_OMIT_WINDOWFUNC Window *pWin = p->pWin; /* Master window object (or NULL) */ if( pWin ){ - sqlite3WindowCodeInit(pParse, pWin); + sqlite3WindowCodeInit(pParse, p); } #endif assert( WHERE_USE_LIMIT==SF_FixedLimit ); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 8090f77cc1..6eb07b7c60 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3727,7 +3727,7 @@ Window *sqlite3WindowAlloc(Parse*, int, int, Expr*, int , Expr*, u8); void sqlite3WindowAttach(Parse*, Expr*, Window*); void sqlite3WindowLink(Select *pSel, Window *pWin); int sqlite3WindowCompare(Parse*, Window*, Window*, int); -void sqlite3WindowCodeInit(Parse*, Window*); +void sqlite3WindowCodeInit(Parse*, Select*); void sqlite3WindowCodeStep(Parse*, Select*, WhereInfo*, int, int); int sqlite3WindowRewrite(Parse*, Select*); int sqlite3ExpandSubquery(Parse*, struct SrcList_item*); diff --git a/src/window.c b/src/window.c index 15a49f4423..5fb78ce358 100644 --- a/src/window.c +++ b/src/window.c @@ -1033,10 +1033,6 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc->a[0].pTab = pTab; pTab = pTab2; } - sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, pSublist->nExpr); - sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); - sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); - sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+3, pMWin->iEphCsr); }else{ sqlite3SelectDelete(db, pSub); } @@ -1308,10 +1304,17 @@ int sqlite3WindowCompare(Parse *pParse, Window *p1, Window *p2, int bFilter){ ** to begin iterating through the sub-query results. It is used to allocate ** and initialize registers and cursors used by sqlite3WindowCodeStep(). */ -void sqlite3WindowCodeInit(Parse *pParse, Window *pMWin){ +void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ + int nEphExpr = pSelect->pSrc->a[0].pSelect->pEList->nExpr; + Window *pMWin = pSelect->pWin; Window *pWin; Vdbe *v = sqlite3GetVdbe(pParse); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pMWin->iEphCsr, nEphExpr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+1, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+2, pMWin->iEphCsr); + sqlite3VdbeAddOp2(v, OP_OpenDup, pMWin->iEphCsr+3, pMWin->iEphCsr); + /* Allocate registers to use for PARTITION BY values, if any. Initialize ** said registers to NULL. */ if( pMWin->pPartition ){ diff --git a/test/window1.test b/test/window1.test index 0b7884784f..a2d26a2f7b 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1531,4 +1531,27 @@ do_execsql_test 45.2 { ); } {2000 2000 10000} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 46.1 { + CREATE TABLE t1 (a); + CREATE INDEX i1 ON t1(a); + + INSERT INTO t1 VALUES (10); +} + +do_execsql_test 46.2 { + SELECT (SELECT sum(a) OVER(ORDER BY a)) FROM t1 +} 10 + +do_execsql_test 46.3 { + SELECT * FROM t1 WHERE (SELECT sum(a) OVER(ORDER BY a)); +} 10 + +do_execsql_test 46.4 { + SELECT * FROM t1 NATURAL JOIN t1 + WHERE a=1 + OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10) +} 10 + finish_test From fc705da15d0af088db099aa5c8c2b26fa63fe951 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 21:14:30 +0000 Subject: [PATCH 17/29] When generating code for a subquery, make a copy of the Select object and generate the code out of the copy, in case the code generator makes modifications to expression and the Select object needs to be reused. FossilOrigin-Name: 4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 15 ++++++++++++--- test/select1.test | 13 +++++++++++++ 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 75b662d105..dac35a2241 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\swhen\scode\sfor\sa\sscalar\sSELECT\sfeaturing\swindow\sfunctions\sis\sgenerated\smore\sthan\sonce\sby\sthe\splanner,\sseparate\sephemeral\stables\sare\sopened\sfor\seach\sinstance. -D 2020-01-01T20:17:15.714 +C When\sgenerating\scode\sfor\sa\ssubquery,\smake\sa\scopy\sof\sthe\sSelect\sobject\sand\ngenerate\sthe\scode\sout\sof\sthe\scopy,\sin\scase\sthe\scode\sgenerator\smakes\nmodifications\sto\sexpression\sand\sthe\sSelect\sobject\sneeds\sto\sbe\sreused. +D 2020-01-01T21:14:30.174 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 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c e76660a57fa2bbe4103686dc8add1a8c5ca40ae139076956dc8c670f5af34e93 +F src/expr.c 7f3a19d0d400d079bd5e40389c75634a1b6feeb91eadfff5919d5b7d73f0c418 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -1295,7 +1295,7 @@ F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test b887331202618dbdabed92446b661ebd95a55ef3923700af56ed71266e9c1157 +F test/select1.test 0aaefed5e770232effeba2d19b8dde01b639d617b844cb2492a75961e4119549 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select3.test 3905450067c28766bc83ee397f6d87342de868baa60f2bcfd00f286dfbd62cb9 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 @@ -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 07e504d5174a1a8b1aa05ec5b44ac81ab3ea706c5a098caa88deb3d489cec8fb -R ca9b505edc6627c7559e6f132a7a42f0 -U dan -Z 91f49b7c37ac409cb8d99713dae333ea +P ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c +R 27455ef65ab3880a3c1e4f96d6b4fc0f +U drh +Z c1086ddd18661ca4be21f6cd956e9129 diff --git a/manifest.uuid b/manifest.uuid index d2e2d0b759..0e9ee4f3a6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c \ No newline at end of file +4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 1c03cf634e..b441b9a4f7 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2933,6 +2933,8 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ SelectDest dest; /* How to deal with SELECT result */ int nReg; /* Registers to allocate */ Expr *pLimit; /* New limit expression */ + Select *pCopy; /* Copy of pSel */ + int rc; /* return value from subroutine call */ Vdbe *v = pParse->pVdbe; assert( v!=0 ); @@ -3016,9 +3018,16 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); } pSel->iLimit = 0; - if( sqlite3Select(pParse, pSel, &dest) ){ - return 0; - } + + /* pSel might be reused. So generate code using a copy of pSel, so that + ** if the code generator modifies the underlying structure of the SELECT + ** (for example in whereIndexExprTrans()) the original in pSel will be + ** unchanged. */ + pCopy = sqlite3SelectDup(pParse->db, pSel, 0); + rc = sqlite3Select(pParse, pCopy, &dest); + sqlite3SelectDelete(pParse->db, pCopy); + if( rc ) return 0; + pExpr->iTable = rReg = dest.iSDParm; ExprSetVVAProperty(pExpr, EP_NoReduce); if( addrOnce ){ diff --git a/test/select1.test b/test/select1.test index 47dcd0fe4a..b4d62554ae 100644 --- a/test/select1.test +++ b/test/select1.test @@ -1184,5 +1184,18 @@ do_catchsql_test select-19.21 { ORDER BY 1; } {1 {table t1 has 1 columns but 15 values were supplied}} +# 2020-01-01 Found by Yongheng's fuzzer +# +reset_db +do_execsql_test select-20.10 { + CREATE TABLE t1 ( + a INTEGER PRIMARY KEY, + b AS('Y') UNIQUE + ); + INSERT INTO t1(a) VALUES (10); + SELECT * FROM t1 JOIN t1 USING(a,b) + WHERE ((SELECT t1.a FROM t1 AS x GROUP BY b) AND b=0) + OR a = 10; +} {10 Y} finish_test From 2a83c100728451558b8b3e07e4d172bf9ef9f7fb Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 1 Jan 2020 23:02:35 +0000 Subject: [PATCH 18/29] Provide the -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time option. Fix the ".testctrl internal_function" command in the CLI so that it does not signal an error on a valid input. FossilOrigin-Name: 8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/main.c | 7 +++++++ src/shell.c.in | 1 + 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index dac35a2241..db0f653441 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sgenerating\scode\sfor\sa\ssubquery,\smake\sa\scopy\sof\sthe\sSelect\sobject\sand\ngenerate\sthe\scode\sout\sof\sthe\scopy,\sin\scase\sthe\scode\sgenerator\smakes\nmodifications\sto\sexpression\sand\sthe\sSelect\sobject\sneeds\sto\sbe\sreused. -D 2020-01-01T21:14:30.174 +C Provide\sthe\s-DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1\scompile-time\soption.\s\sFix\nthe\s".testctrl\sinternal_function"\scommand\sin\sthe\sCLI\sso\sthat\sit\sdoes\snot\nsignal\san\serror\son\sa\svalid\sinput. +D 2020-01-01T23:02:35.846 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -492,7 +492,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da -F src/main.c a76071a978b59055e63d4b5befa1efacc34e985984943251b300e682fee0e776 +F src/main.c 7b06af0c38abf9720d9a5c49660bff8b7137427bbd513fa069baf8afa15da4d7 F src/malloc.c 550021fcae36f0ffe9f8563d83e6385f9df307a854d55d7d0abb7241ee8dbcc6 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -529,7 +529,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 17c74d7c180b50c703c404c1be7b80769536d9a1913fee4fc176cd95e445966b F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c ba1af88f0dc93a03c0d5c379aab518109912cf87f92f1196de52812174e6fc9f -F src/shell.c.in 36fb3732ee465f1a418add45aec616ecc5d936245c616be761f3b6ba7bb3661e +F src/shell.c.in 90b002bf0054399cbbfac62dd752a9b05770427ba141bcba75eefbb0098f4280 F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2 @@ -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 ce1417325273aba866767349b55d9bbfb61a08e716bebda2122918a9657ee38c -R 27455ef65ab3880a3c1e4f96d6b4fc0f +P 4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 +R 7719ca5b06b1882198898d45d0aa33b1 U drh -Z c1086ddd18661ca4be21f6cd956e9129 +Z a96bfaa62b0a101e6ed6e47d09a94ada diff --git a/manifest.uuid b/manifest.uuid index 0e9ee4f3a6..e2f996a6cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 \ No newline at end of file +8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a \ No newline at end of file diff --git a/src/main.c b/src/main.c index 880106a850..8a811f45b0 100644 --- a/src/main.c +++ b/src/main.c @@ -3312,6 +3312,13 @@ static int openDatabase( } #endif +#ifdef SQLITE_ENABLE_INTERNAL_FUNCTIONS + /* Testing use only!!! The -DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1 compile-time + ** option gives access to internal functions by default. + ** Testing use only!!! */ + db->mDbFlags |= DBFLAG_InternalFunc; +#endif + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking ** mode. Doing nothing at all also makes NORMAL the default. diff --git a/src/shell.c.in b/src/shell.c.in index 1143d5309a..da2c78d70e 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9355,6 +9355,7 @@ static int do_meta_command(char *zLine, ShellState *p){ /* sqlite3_test_control(sqlite3*) */ case SQLITE_TESTCTRL_INTERNAL_FUNCTIONS: rc2 = sqlite3_test_control(testctrl, p->db); + isOk = 3; break; case SQLITE_TESTCTRL_IMPOSTER: From 36e678bc398e864ec0806cf381408a57d6dcd4c4 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 00:45:38 +0000 Subject: [PATCH 19/29] The sqlite3WhereEnd() call now unwinds all Expr modifications made by the sqlite3WhereBegin(). FossilOrigin-Name: 7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 --- manifest | 19 ++++++++++--------- manifest.uuid | 2 +- src/expr.c | 15 +++------------ src/where.c | 9 +++++++++ src/whereInt.h | 27 +++++++++++++++++++++------ src/wherecode.c | 19 +++++++++++++++++++ 6 files changed, 63 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index db0f653441..1997e94b95 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Provide\sthe\s-DSQLITE_ENABLE_INTERNAL_FUNCTIONS=1\scompile-time\soption.\s\sFix\nthe\s".testctrl\sinternal_function"\scommand\sin\sthe\sCLI\sso\sthat\sit\sdoes\snot\nsignal\san\serror\son\sa\svalid\sinput. -D 2020-01-01T23:02:35.846 +C The\ssqlite3WhereEnd()\scall\snow\sunwinds\sall\sExpr\smodifications\smade\sby\sthe\nsqlite3WhereBegin(). +D 2020-01-02T00:45:38.107 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 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 7f3a19d0d400d079bd5e40389c75634a1b6feeb91eadfff5919d5b7d73f0c418 +F src/expr.c e76660a57fa2bbe4103686dc8add1a8c5ca40ae139076956dc8c670f5af34e93 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -614,9 +614,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 15a2845769f51ba132f9cf0b2c7a6887a91fc8437892dbcce9fcdc68b66d60a1 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 602e5093556bbd9090c0a9bd834fec0717e3a4b0377a021d38091a6d554a1177 -F src/whereInt.h a727b32260e12707a8c1bc29d7f7e9b6dc1a44551a45093d5968fbe570ff0c56 -F src/wherecode.c a987d22b42e09b06f3a49596e0953b1cd28e568cc656681776edc0026cfac0cc +F src/where.c 9353093c2a444580857006fc959494edc40e2393ac08a1f7e1eefe455c079cdb +F src/whereInt.h d2b771335083070ff82991cc43603e2db27b7ba1313da72de092c50c68f2be9c +F src/wherecode.c b8acf97f95de7398455e238036e96aeda8563d87c6b8108c967396431b6f2307 F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 F src/window.c 659d613248f8bb8630f51409dc08235e4494c3c84162a535d9f88b38515f390a F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1853,7 +1853,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 4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 -R 7719ca5b06b1882198898d45d0aa33b1 +P 8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a +Q -4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 +R 78a3f85d954b3a0eb1fce93a6a40c0b8 U drh -Z a96bfaa62b0a101e6ed6e47d09a94ada +Z 7a9eae0197a9672b5fa1c50dd4bf6963 diff --git a/manifest.uuid b/manifest.uuid index e2f996a6cd..10cbba2b95 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a \ No newline at end of file +7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b441b9a4f7..1c03cf634e 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2933,8 +2933,6 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ SelectDest dest; /* How to deal with SELECT result */ int nReg; /* Registers to allocate */ Expr *pLimit; /* New limit expression */ - Select *pCopy; /* Copy of pSel */ - int rc; /* return value from subroutine call */ Vdbe *v = pParse->pVdbe; assert( v!=0 ); @@ -3018,16 +3016,9 @@ int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); } pSel->iLimit = 0; - - /* pSel might be reused. So generate code using a copy of pSel, so that - ** if the code generator modifies the underlying structure of the SELECT - ** (for example in whereIndexExprTrans()) the original in pSel will be - ** unchanged. */ - pCopy = sqlite3SelectDup(pParse->db, pSel, 0); - rc = sqlite3Select(pParse, pCopy, &dest); - sqlite3SelectDelete(pParse->db, pCopy); - if( rc ) return 0; - + if( sqlite3Select(pParse, pSel, &dest) ){ + return 0; + } pExpr->iTable = rReg = dest.iSDParm; ExprSetVVAProperty(pExpr, EP_NoReduce); if( addrOnce ){ diff --git a/src/where.c b/src/where.c index 7c05a58e49..0877b80dd3 100644 --- a/src/where.c +++ b/src/where.c @@ -1942,6 +1942,7 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ pWInfo->pLoops = p->pNextLoop; whereLoopDelete(db, p); } + assert( pWInfo->pExprMods==0 ); sqlite3DbFreeNN(db, pWInfo); } @@ -5440,6 +5441,14 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ } } + /* Undo all Expr node modifications */ + while( pWInfo->pExprMods ){ + WhereExprMod *p = pWInfo->pExprMods; + pWInfo->pExprMods = p->pNext; + memcpy(p->pExpr, &p->orig, sizeof(p->orig)); + sqlite3DbFree(db, p); + } + /* Final cleanup */ pParse->nQueryLoop = pWInfo->savedNQueryLoop; diff --git a/src/whereInt.h b/src/whereInt.h index f500e01d48..ad433652f4 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -433,6 +433,20 @@ struct WhereLoopBuilder { # define SQLITE_QUERY_PLANNER_LIMIT_INCR 1000 #endif +/* +** Each instance of this object records a change to a single node +** in an expression tree to cause that node to point to a column +** of an index rather than an expression or a virtual column. All +** such transformations need to be undone at the end of WHERE clause +** processing. +*/ +typedef struct WhereExprMod WhereExprMod; +struct WhereExprMod { + WhereExprMod *pNext; /* Next translation on a list of them all */ + Expr *pExpr; /* The Expr node that was transformed */ + Expr orig; /* Original value of the Expr node */ +}; + /* ** The WHERE clause processing routine has two halves. The ** first part does the start of the WHERE loop and the second @@ -449,24 +463,25 @@ struct WhereInfo { ExprList *pOrderBy; /* The ORDER BY clause or NULL */ ExprList *pResultSet; /* Result set of the query */ Expr *pWhere; /* The complete WHERE clause */ - LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ int aiCurOnePass[2]; /* OP_OpenWrite cursors for the ONEPASS opt */ int iContinue; /* Jump here to continue with next record */ int iBreak; /* Jump here to break out of the loop */ int savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */ u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */ + LogEst iLimit; /* LIMIT if wctrlFlags has WHERE_USE_LIMIT */ u8 nLevel; /* Number of nested loop */ i8 nOBSat; /* Number of ORDER BY terms satisfied by indices */ - u8 sorted; /* True if really sorted (not just grouped) */ u8 eOnePass; /* ONEPASS_OFF, or _SINGLE, or _MULTI */ - u8 bDeferredSeek; /* Uses OP_DeferredSeek */ - u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */ u8 eDistinct; /* One of the WHERE_DISTINCT_* values */ - u8 bOrderedInnerLoop; /* True if only the inner-most loop is ordered */ + u8 bDeferredSeek : 1; /* Uses OP_DeferredSeek */ + u8 untestedTerms : 1; /* Not all WHERE terms resolved by outer loop */ + u8 bOrderedInnerLoop : 1; /* True if only the inner-most loop is ordered */ + u8 sorted : 1; /* True if really sorted (not just grouped) */ + LogEst nRowOut; /* Estimated number of output rows */ int iTop; /* The very beginning of the WHERE loop */ WhereLoop *pLoops; /* List of all WhereLoop objects */ + WhereExprMod *pExprMods; /* Expression modifications */ Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ - LogEst nRowOut; /* Estimated number of output rows */ WhereClause sWC; /* Decomposition of the WHERE clause */ WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ WhereLevel a[1]; /* Information about each nest loop in WHERE */ diff --git a/src/wherecode.c b/src/wherecode.c index 96c2971a5f..beb23e0c18 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1113,8 +1113,23 @@ typedef struct IdxExprTrans { int iIdxCur; /* The cursor for the index */ int iIdxCol; /* The column for the index */ int iTabCol; /* The column for the table */ + WhereInfo *pWInfo; /* Complete WHERE clause information */ + sqlite3 *db; /* Database connection (for malloc()) */ } IdxExprTrans; +/* +** Preserve pExpr on the WhereETrans list of the WhereInfo. +*/ +static void preserveExpr(IdxExprTrans *pTrans, Expr *pExpr){ + WhereExprMod *pNew; + pNew = sqlite3DbMallocRaw(pTrans->db, sizeof(*pNew)); + if( pNew==0 ) return; + pNew->pNext = pTrans->pWInfo->pExprMods; + pTrans->pWInfo->pExprMods = pNew; + pNew->pExpr = pExpr; + memcpy(&pNew->orig, pExpr, sizeof(*pExpr)); +} + /* The walker node callback used to transform matching expressions into ** a reference to an index column for an index on an expression. ** @@ -1124,6 +1139,7 @@ typedef struct IdxExprTrans { static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( sqlite3ExprCompare(0, pExpr, pX->pIdxExpr, pX->iTabCur)==0 ){ + preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3ExprAffinity(pExpr); pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; @@ -1147,6 +1163,7 @@ static int whereIndexExprTransColumn(Walker *p, Expr *pExpr){ IdxExprTrans *pX = p->u.pIdxTrans; if( pExpr->iTable==pX->iTabCur && pExpr->iColumn==pX->iTabCol ){ assert( pExpr->y.pTab!=0 ); + preserveExpr(pX, pExpr); pExpr->affExpr = sqlite3TableColumnAffinity(pExpr->y.pTab,pExpr->iColumn); pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; @@ -1188,6 +1205,8 @@ static void whereIndexExprTrans( w.u.pIdxTrans = &x; x.iTabCur = iTabCur; x.iIdxCur = iIdxCur; + x.pWInfo = pWInfo; + x.db = pWInfo->pParse->db; for(iIdxCol=0; iIdxColnColumn; iIdxCol++){ i16 iRef = pIdx->aiColumn[iIdxCol]; if( iRef==XN_EXPR ){ From 629b88c683056ad69761cc1ae7e8026dbb4f530f Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 02:50:45 +0000 Subject: [PATCH 20/29] Use OP_Copy instead of OP_SCopy to move the results of a scalar subquery. FossilOrigin-Name: 435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/expr.c | 8 +++++++- test/fuzzdata8.db | Bin 1620992 -> 1720320 bytes 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 1997e94b95..6cf93101f9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\ssqlite3WhereEnd()\scall\snow\sunwinds\sall\sExpr\smodifications\smade\sby\sthe\nsqlite3WhereBegin(). -D 2020-01-02T00:45:38.107 +C Use\sOP_Copy\sinstead\sof\sOP_SCopy\sto\smove\sthe\sresults\sof\sa\sscalar\ssubquery. +D 2020-01-02T02:50:45.152 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 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c e76660a57fa2bbe4103686dc8add1a8c5ca40ae139076956dc8c670f5af34e93 +F src/expr.c 75985a13af1b1d629f5f3c206a2af6250a971dd058d30fce0c0e0ba8d7c899a6 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -1018,7 +1018,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 a0b7151bf505ee9735f6e5a3f7851ecb35121f1cd731ac677a77ee540f358939 +F test/fuzzdata8.db 09733ef4b4246cd97e4513ee315c2900771ead4cc6a5ff83cb511dd43cfc5a43 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1853,8 +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 8ee2ce92c082771675d0e8be597043cf9f0fd4f8a73d6a1498bf8743d6b3904a -Q -4edddcc0bc8d71e9b8abac67bc3766f1d9143dddd1f59264859ce65e5aa9b8c6 -R 78a3f85d954b3a0eb1fce93a6a40c0b8 +P 7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 +R d537ec2097ea14e175c328187e686eee U drh -Z 7a9eae0197a9672b5fa1c50dd4bf6963 +Z e19c3a27a330f4b39d07df72e769f17a diff --git a/manifest.uuid b/manifest.uuid index 10cbba2b95..edc96cb1d0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 \ No newline at end of file +435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 1c03cf634e..298843a8ab 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4492,7 +4492,13 @@ void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int 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); + u8 op; + if( ExprHasProperty(pExpr,EP_Subquery) ){ + op = OP_Copy; + }else{ + op = OP_SCopy; + } + sqlite3VdbeAddOp2(pParse->pVdbe, op, inReg, target); } } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index e103ef27eb0362154219a22b571dbc4e46d10205..108bcad778125ef88bd2f6be47b8203f93c19075 100644 GIT binary patch delta 114124 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 delta 23283 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 From 52f11b885a5580e270fa28cc066b884eea3274b7 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 13:26:49 +0000 Subject: [PATCH 21/29] Add the test_trace_breakpoint() subroutine that is invoked after each instruction is printed while running PRAGMA vdbe_trace=on. Only works for SQLITE_DEBUG builds. Also add parameters "pc" and "pOp" to test_addop_breakpoint() to make it easier to set conditionals. FossilOrigin-Name: 49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 21 +++++++++++++++++++++ src/vdbeaux.c | 13 ++++++++++--- src/vdbemem.c | 4 ++-- 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 6cf93101f9..3a79ec66f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sOP_Copy\sinstead\sof\sOP_SCopy\sto\smove\sthe\sresults\sof\sa\sscalar\ssubquery. -D 2020-01-02T02:50:45.152 +C Add\sthe\stest_trace_breakpoint()\ssubroutine\sthat\sis\sinvoked\safter\seach\ninstruction\sis\sprinted\swhile\srunning\sPRAGMA\svdbe_trace=on.\s\sOnly\sworks\sfor\nSQLITE_DEBUG\sbuilds.\s\sAlso\sadd\sparameters\s"pc"\sand\s"pOp"\sto\s\ntest_addop_breakpoint()\sto\smake\sit\seasier\sto\sset\sconditionals. +D 2020-01-02T13:26:49.943 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,13 +600,13 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 119ddfe16b35fbaaf5460c9b58a8eeb0cc5d43058342af36925411dfc73f9862 +F src/vdbe.c 9d432abf6c7979dc8661572ed5d61773be72a6b7475c0e97901309dc611fe4bd F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 0a9716e47012ef018038c2e1dab9f701a6fb4429bb3ee1d4d0f49497519ace74 +F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c a5c16cfa5e8ec960cf1ae1226a0718b31bb93de8fba7804fb60217e1dbe28721 +F src/vdbemem.c 4029cb6a5a4d94f95e63e29c998791534788ce64ffb0f3bdfd373aba04a7169f F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -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 7bfd42f1dc0c94f9bb74516e62fec8e39c20f4749f4e0972f66c2886d3c64f73 -R d537ec2097ea14e175c328187e686eee +P 435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b +R 012a47d79081ec029afe02cb3190d8b3 U drh -Z e19c3a27a330f4b39d07df72e769f17a +Z 44bc6f6389cf28eb8f2cfc35d7778fbb diff --git a/manifest.uuid b/manifest.uuid index edc96cb1d0..06232d4889 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b \ No newline at end of file +49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index cc999a3ebb..ca737ffccb 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -117,6 +117,26 @@ int sqlite3_found_count = 0; # define UPDATE_MAX_BLOBSIZE(P) #endif +#ifdef SQLITE_DEBUG +/* This routine provides a convenient place to set a breakpoint during +** tracing with PRAGMA vdbe_trace=on. The breakpoint fires right after +** each opcode is printed. Variables "pc" (program counter) and pOp are +** available to add conditionals to the breakpoint. GDB example: +** +** break test_trace_breakpoint if pc=22 +** +** Other useful labels for breakpoints include: +** test_addop_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) +*/ +static void test_trace_breakpoint(int pc, Op *pOp){ + static int n = 0; + n++; +} +#endif + /* ** Invoke the VDBE coverage callback, if that callback is defined. This ** feature is used for test suite validation only and does not appear an @@ -738,6 +758,7 @@ int sqlite3VdbeExec( #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeTrace ){ sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); + test_trace_breakpoint((int)(pOp - aOp),pOp); } #endif diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 9d04c160a2..ced3ec24c4 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -194,9 +194,16 @@ static int growOpArray(Vdbe *v, int nOp){ #ifdef SQLITE_DEBUG /* This routine is just a convenient place to set a breakpoint that will ** fire after each opcode is inserted and displayed using -** "PRAGMA vdbe_addoptrace=on". +** "PRAGMA vdbe_addoptrace=on". Parameters "pc" (program counter) and +** pOp are available to make the breakpoint conditional. +** +** Other useful labels for breakpoints include: +** test_trace_breakpoint(pc,pOp) +** sqlite3CorruptError(lineno) +** sqlite3MisuseError(lineno) +** sqlite3CantopenError(lineno) */ -static void test_addop_breakpoint(void){ +static void test_addop_breakpoint(int pc, Op *pOp){ static int n = 0; n++; } @@ -249,7 +256,7 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ #ifdef SQLITE_DEBUG if( p->db->flags & SQLITE_VdbeAddopTrace ){ sqlite3VdbePrintOp(0, i, &p->aOp[i]); - test_addop_breakpoint(); + test_addop_breakpoint(i, &p->aOp[i]); } #endif #ifdef VDBE_PROFILE diff --git a/src/vdbemem.c b/src/vdbemem.c index 7d56d1684b..faf555af90 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -948,8 +948,8 @@ int sqlite3VdbeMemTooBig(Mem *p){ ** its link to a shallow copy and by marking any current shallow ** copies of this cell as invalid. ** -** This is used for testing and debugging only - to make sure shallow -** copies are not misused. +** This is used for testing and debugging only - to help ensure that shallow +** copies (created by OP_SCopy) are not misused. */ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ int i; From 22e95fbd741dd492471db39450a149cc1e23a12c Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 14:42:42 +0000 Subject: [PATCH 22/29] Enhancements to aid testing and debugging: In PRAGMA vdbe_trace=on output, show pScopyFrom dependencies on register values. Add the sqlite3VdbeRegisterDump() procedure, callable from a debugger, that shows the values of all registers. Pass the VDBE pointer into test_trace_breakpoint() so that sqlite3VdbeRegisterDump() is callable from the breakpoint. FossilOrigin-Name: 9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 21 ++++++++++++++++++--- src/vdbemem.c | 5 ++++- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 3a79ec66f3..7ebefd3b60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\stest_trace_breakpoint()\ssubroutine\sthat\sis\sinvoked\safter\seach\ninstruction\sis\sprinted\swhile\srunning\sPRAGMA\svdbe_trace=on.\s\sOnly\sworks\sfor\nSQLITE_DEBUG\sbuilds.\s\sAlso\sadd\sparameters\s"pc"\sand\s"pOp"\sto\s\ntest_addop_breakpoint()\sto\smake\sit\seasier\sto\sset\sconditionals. -D 2020-01-02T13:26:49.943 +C Enhancements\sto\said\stesting\sand\sdebugging:\nIn\sPRAGMA\svdbe_trace=on\soutput,\sshow\spScopyFrom\sdependencies\son\sregister\nvalues.\s\sAdd\sthe\ssqlite3VdbeRegisterDump()\sprocedure,\scallable\sfrom\sa\ndebugger,\sthat\sshows\sthe\svalues\sof\sall\sregisters.\s\sPass\sthe\sVDBE\spointer\ninto\stest_trace_breakpoint()\sso\sthat\ssqlite3VdbeRegisterDump()\sis\scallable\nfrom\sthe\sbreakpoint. +D 2020-01-02T14:42:42.874 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,13 +600,13 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 9d432abf6c7979dc8661572ed5d61773be72a6b7475c0e97901309dc611fe4bd +F src/vdbe.c 62f0a6d1d5685b65530f93e5ad4fc852fe7ce8225b8852c67f7177f4748c72d0 F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 4029cb6a5a4d94f95e63e29c998791534788ce64ffb0f3bdfd373aba04a7169f +F src/vdbemem.c e5c0fbadf3ad9e45623a63825dc45a30ef0b9b9137ba5351b57d15a3a17aff5d F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -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 435c272dcf6ed5f3acb564b8f959557145f117b869547b670258cf5a1908ab6b -R 012a47d79081ec029afe02cb3190d8b3 +P 49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 +R cbc77bfc0e90f07a788c6fc62ef01b63 U drh -Z 44bc6f6389cf28eb8f2cfc35d7778fbb +Z 908b39c48323f7d785aae70d03f5f0a5 diff --git a/manifest.uuid b/manifest.uuid index 06232d4889..4406375c59 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 \ No newline at end of file +9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index ca737ffccb..ab5e4c8048 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -131,7 +131,7 @@ int sqlite3_found_count = 0; ** sqlite3MisuseError(lineno) ** sqlite3CantopenError(lineno) */ -static void test_trace_breakpoint(int pc, Op *pOp){ +static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){ static int n = 0; n++; } @@ -586,13 +586,28 @@ static void memTracePrint(Mem *p){ if( p->flags & MEM_Subtype ) printf(" subtype=0x%02x", p->eSubtype); } static void registerTrace(int iReg, Mem *p){ - printf("REG[%d] = ", iReg); + printf("R[%d] = ", iReg); memTracePrint(p); + if( p->pScopyFrom ){ + printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg])); + } printf("\n"); sqlite3VdbeCheckMemInvariants(p); } #endif +#ifdef SQLITE_DEBUG +/* +** Show the values of all registers in the virtual machine. Used for +** interactive debugging. +*/ +void sqlite3VdbeRegisterDump(Vdbe *v){ + int i; + for(i=1; inMem; i++) registerTrace(i, v->aMem+i); +} +#endif /* SQLITE_DEBUG */ + + #ifdef SQLITE_DEBUG # define REGISTER_TRACE(R,M) if(db->flags&SQLITE_VdbeTrace)registerTrace(R,M) #else @@ -758,7 +773,7 @@ int sqlite3VdbeExec( #ifdef SQLITE_DEBUG if( db->flags & SQLITE_VdbeTrace ){ sqlite3VdbePrintOp(stdout, (int)(pOp - aOp), pOp); - test_trace_breakpoint((int)(pOp - aOp),pOp); + test_trace_breakpoint((int)(pOp - aOp),pOp,p); } #endif diff --git a/src/vdbemem.c b/src/vdbemem.c index faf555af90..aaeda24253 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -956,6 +956,10 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ Mem *pX; for(i=0, pX=pVdbe->aMem; inMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ + if( pVdbe->db->flags & SQLITE_VdbeTrace ){ + sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", + (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); + } /* If pX is marked as a shallow copy of pMem, then verify that ** no significant changes have been made to pX since the OP_SCopy. ** A significant change would indicated a missed call to this @@ -980,7 +984,6 @@ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ } #endif /* SQLITE_DEBUG */ - /* ** Make an shallow copy of pFrom into pTo. Prior contents of ** pTo are freed. The pFrom->z field is not duplicated. If From 4cbd847a910091a2da56b0bc0a631b240ff52784 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 15:02:08 +0000 Subject: [PATCH 23/29] Fix the OP_Move opcode so that it correctly manages dependency tracking. This change impacts debugging builds only. FossilOrigin-Name: 5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vdbe.c | 9 +++++++-- src/vdbemem.c | 2 +- test/fuzzdata8.db | Bin 1720320 -> 1720320 bytes 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 7ebefd3b60..e09aa20a60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\said\stesting\sand\sdebugging:\nIn\sPRAGMA\svdbe_trace=on\soutput,\sshow\spScopyFrom\sdependencies\son\sregister\nvalues.\s\sAdd\sthe\ssqlite3VdbeRegisterDump()\sprocedure,\scallable\sfrom\sa\ndebugger,\sthat\sshows\sthe\svalues\sof\sall\sregisters.\s\sPass\sthe\sVDBE\spointer\ninto\stest_trace_breakpoint()\sso\sthat\ssqlite3VdbeRegisterDump()\sis\scallable\nfrom\sthe\sbreakpoint. -D 2020-01-02T14:42:42.874 +C Fix\sthe\sOP_Move\sopcode\sso\sthat\sit\scorrectly\smanages\sdependency\stracking.\nThis\schange\simpacts\sdebugging\sbuilds\sonly. +D 2020-01-02T15:02:08.865 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -600,13 +600,13 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c 62f0a6d1d5685b65530f93e5ad4fc852fe7ce8225b8852c67f7177f4748c72d0 +F src/vdbe.c af35d7adef9dcb23fb7b379453eadcf5c5840037a540924c3cac9b4328e09c9a F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c e5c0fbadf3ad9e45623a63825dc45a30ef0b9b9137ba5351b57d15a3a17aff5d +F src/vdbemem.c 30c13916dd6516a52330540a3e4bf15ac9886940cf6c6a6a6c66273a1c6b5176 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -1018,7 +1018,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 09733ef4b4246cd97e4513ee315c2900771ead4cc6a5ff83cb511dd43cfc5a43 +F test/fuzzdata8.db d702762f8bf21456a6b69d15dde3e3023733da01ed6f1c06fe50d0b2d161199f F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -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 49a6368c384178653cb3ccb58cc8eff93327c16929bf79eeefeb13a4ce897153 -R cbc77bfc0e90f07a788c6fc62ef01b63 +P 9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 +R 24a07003701b78db81971cb6840d91ff U drh -Z 908b39c48323f7d785aae70d03f5f0a5 +Z 4a934f9df899c177f571c59121e59bde diff --git a/manifest.uuid b/manifest.uuid index 4406375c59..7638175920 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 \ No newline at end of file +5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index ab5e4c8048..e11564b17c 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -1371,8 +1371,13 @@ case OP_Move: { memAboutToChange(p, pOut); sqlite3VdbeMemMove(pOut, pIn1); #ifdef SQLITE_DEBUG - if( pOut->pScopyFrom>=&aMem[p1] && pOut->pScopyFrompScopyFrom += pOp->p2 - p1; + pIn1->pScopyFrom = 0; + { int i; + for(i=1; inMem; i++){ + if( aMem[i].pScopyFrom==pIn1 ){ + aMem[i].pScopyFrom = pOut; + } + } } #endif Deephemeralize(pOut); diff --git a/src/vdbemem.c b/src/vdbemem.c index aaeda24253..e817996950 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -954,7 +954,7 @@ int sqlite3VdbeMemTooBig(Mem *p){ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ int i; Mem *pX; - for(i=0, pX=pVdbe->aMem; inMem; i++, pX++){ + for(i=1, pX=pVdbe->aMem+1; inMem; i++, pX++){ if( pX->pScopyFrom==pMem ){ if( pVdbe->db->flags & SQLITE_VdbeTrace ){ sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 108bcad778125ef88bd2f6be47b8203f93c19075..05f07ad4bb424cd0629552f0530cf1a2855acffc 100644 GIT binary patch delta 5708 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 K#e%@H_CEkUd$oQ5 delta 5394 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 Date: Thu, 2 Jan 2020 16:24:22 +0000 Subject: [PATCH 24/29] Handle blobs that are the return values of functions being cast to text in utf16 databases in the same way as blobs read directly from the database. Fix for [771fe617]. FossilOrigin-Name: e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a --- ext/fts5/test/fts5integrity.test | 27 +++++++++++++++++++++++++++ manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/vdbemem.c | 11 +++++++++-- test/cast.test | 12 ++++++++++++ 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/ext/fts5/test/fts5integrity.test b/ext/fts5/test/fts5integrity.test index 72cdeb3e30..38dff21f79 100644 --- a/ext/fts5/test/fts5integrity.test +++ b/ext/fts5/test/fts5integrity.test @@ -255,4 +255,31 @@ do_execsql_test 8.1 { INSERT INTO vt0(vt0, rank) VALUES('usermerge', 2); } +#------------------------------------------------------------------------- +# Ticket [771fe617] +# +reset_db +do_execsql_test 9.0 { + PRAGMA encoding = 'UTF16'; + CREATE VIRTUAL TABLE vt0 USING fts5(c0); +} + +#explain_i { SELECT quote(SUBSTR(x'37', 0)); } +#execsql { PRAGMA vdbe_trace = 1 } +do_execsql_test 9.1.1 { + SELECT quote(SUBSTR(x'37', 0)); +} {X'37'} +do_execsql_test 9.1.2 { + SELECT quote(x'37'); +} {X'37'} + +breakpoint +do_execsql_test 9.2 { + INSERT INTO vt0 VALUES (SUBSTR(x'37', 0)); +-- INSERT INTO vt0 VALUES (x'37'); +} +do_execsql_test 9.3 { + INSERT INTO vt0(vt0) VALUES('integrity-check'); +} + finish_test diff --git a/manifest b/manifest index e09aa20a60..6cfd7bc1a8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sOP_Move\sopcode\sso\sthat\sit\scorrectly\smanages\sdependency\stracking.\nThis\schange\simpacts\sdebugging\sbuilds\sonly. -D 2020-01-02T15:02:08.865 +C Handle\sblobs\sthat\sare\sthe\sreturn\svalues\sof\sfunctions\sbeing\scast\sto\stext\sin\sutf16\sdatabases\sin\sthe\ssame\sway\sas\sblobs\sread\sdirectly\sfrom\sthe\sdatabase.\sFix\sfor\s[771fe617]. +D 2020-01-02T16:24:22.013 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -182,7 +182,7 @@ F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b99 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 c354fd693d9fb14018b33113aa2331265d915d51f67067a2cfa7873894c9ecf0 +F ext/fts5/test/fts5integrity.test 8ffabcd91b058d812aba3e3e0a06f76ce165ba402a18cca20e34204a7feec92e F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad @@ -606,7 +606,7 @@ F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 30c13916dd6516a52330540a3e4bf15ac9886940cf6c6a6a6c66273a1c6b5176 +F src/vdbemem.c d0e294c0f4fa1ac90d7f7f33b3ca4717db271d1550a870f5819cae384bec4610 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -727,7 +727,7 @@ F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 3619f0c58c2e4b2a94aa86e75607e497d34ef40ab74418e71aef7b4ca5155895 +F test/cast.test 2906ccab6a3ebd147ffa63304b635be903ce58264110d0a0eb4fd9939422bb53 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef F test/check.test b21a76546c2115af2674280566a8eba577e72adfec330c3d9a8a466d41f8eb0d F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 @@ -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 9886cb4b7987f720aa9d701222ab0987caa0ab8c5d216cb6e523c4a45366dfe5 -R 24a07003701b78db81971cb6840d91ff -U drh -Z 4a934f9df899c177f571c59121e59bde +P 5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 +R 240c23e2f5654f0233016450faf6070c +U dan +Z 4d0f2df52a6bba7041a9460fa8e92429 diff --git a/manifest.uuid b/manifest.uuid index 7638175920..e4fe5ccca1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 \ No newline at end of file +e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index e817996950..5c17669492 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1129,10 +1129,17 @@ int sqlite3VdbeMemSetStr( pMem->n = nByte; pMem->flags = flags; - pMem->enc = (enc==0 ? SQLITE_UTF8 : enc); + if( enc ){ + pMem->enc = enc; + }else if( pMem->db ){ + pMem->enc = ENC(pMem->db); + }else{ + pMem->enc = SQLITE_UTF8; + } + #ifndef SQLITE_OMIT_UTF16 - if( pMem->enc!=SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ + if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ return SQLITE_NOMEM_BKPT; } #endif diff --git a/test/cast.test b/test/cast.test index e6795ce456..d2eaffcbb5 100644 --- a/test/cast.test +++ b/test/cast.test @@ -461,6 +461,18 @@ do_execsql_test cast-7.43 { SELECT CAST('-1.0' AS numeric); } -1 +ifcapable utf16 { + reset_db + execsql { PRAGMA encoding='utf16' } + + do_execsql_test cast-8.1 { + SELECT quote(X'310032003300')==quote(substr(X'310032003300', 1)) + } 1 + do_execsql_test cast-8.2 { + SELECT CAST(X'310032003300' AS TEXT) + ==CAST(substr(X'310032003300', 1) AS TEXT) + } 1 +} finish_test From 3aef2fb1b43eb391472b74174cdbae69241ecf8d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 17:46:02 +0000 Subject: [PATCH 25/29] Have the OP_ReleaseReg opcode also invalidate the registers if P5 is non-zero. FossilOrigin-Name: 937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/expr.c | 6 +++--- src/insert.c | 4 ++-- src/vdbe.c | 12 +++++++----- src/vdbe.h | 4 ++-- src/vdbeaux.c | 12 +++++++++++- 7 files changed, 37 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 6cfd7bc1a8..cf25a77c8b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\sblobs\sthat\sare\sthe\sreturn\svalues\sof\sfunctions\sbeing\scast\sto\stext\sin\sutf16\sdatabases\sin\sthe\ssame\sway\sas\sblobs\sread\sdirectly\sfrom\sthe\sdatabase.\sFix\sfor\s[771fe617]. -D 2020-01-02T16:24:22.013 +C Have\sthe\sOP_ReleaseReg\sopcode\salso\sinvalidate\sthe\sregisters\sif\sP5\sis\snon-zero. +D 2020-01-02T17:46:02.719 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 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c 75985a13af1b1d629f5f3c206a2af6250a971dd058d30fce0c0e0ba8d7c899a6 +F src/expr.c d74209d6abec71609a64329726df5d003b6fb2897f5bbde77c35882e5d482e7c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c @@ -489,7 +489,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 2cadbc8a81ea03f6cc1b629f6019192c9c5e6bcfaa8356e53511047f290cdd76 +F src/insert.c 7bbb7dec1d69f961f21d75bd83ed00ceee48d5aa71c794b1cce3205470c8a48f F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c d74f5e7bd51f3c9d283442473eb65aef359664efd6513591c03f01881c4ae2da F src/main.c 7b06af0c38abf9720d9a5c49660bff8b7137427bbd513fa069baf8afa15da4d7 @@ -600,11 +600,11 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c af35d7adef9dcb23fb7b379453eadcf5c5840037a540924c3cac9b4328e09c9a -F src/vdbe.h 3f068f00b23aebf392df142312ab5874588371c6d83e60d953f6d6b6453491c5 +F src/vdbe.c a8c88ee06d3510d8dc9a5cee594ec46f2ef476bd0c9be834e7e664b76ca2c179 +F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 -F src/vdbeaux.c 83b666882a55bd2762cec9dc32cd71b71d053890253a3d7c9646d59abfcb3381 +F src/vdbeaux.c 3b2076c59217f964ff5fca348fa3f69c3157cbd5cafc549e9ea3252d8613c6a9 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c d0e294c0f4fa1ac90d7f7f33b3ca4717db271d1550a870f5819cae384bec4610 F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be @@ -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 5377add4b8af8c52d0a32f5273835ac6bdc42cfb2a95ffcb335b987437a91aa6 -R 240c23e2f5654f0233016450faf6070c -U dan -Z 4d0f2df52a6bba7041a9460fa8e92429 +P e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a +R 03e3fe8bf73f136f9929ea1e989495c3 +U drh +Z a92746a6d0d3821fb326cef80fc59b0c diff --git a/manifest.uuid b/manifest.uuid index e4fe5ccca1..cf9c08cbe6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a \ No newline at end of file +937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 298843a8ab..88500b066b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4140,7 +4140,7 @@ expr_code_doover: if( constMask==0 ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); }else{ - sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask); + sqlite3VdbeReleaseRegisters(pParse, r1, nFarg, constMask, 1); } } return target; @@ -5799,7 +5799,7 @@ int sqlite3GetTempReg(Parse *pParse){ */ void sqlite3ReleaseTempReg(Parse *pParse, int iReg){ if( iReg ){ - sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0); + sqlite3VdbeReleaseRegisters(pParse, iReg, 1, 0, 0); if( pParse->nTempRegaTempReg) ){ pParse->aTempReg[pParse->nTempReg++] = iReg; } @@ -5828,7 +5828,7 @@ void sqlite3ReleaseTempRange(Parse *pParse, int iReg, int nReg){ sqlite3ReleaseTempReg(pParse, iReg); return; } - sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0); + sqlite3VdbeReleaseRegisters(pParse, iReg, nReg, 0, 0); if( nReg>pParse->nRangeReg ){ pParse->nRangeReg = nReg; pParse->iRangeReg = iReg; diff --git a/src/insert.c b/src/insert.c index 3b4ad56403..87e9c7ead3 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1020,7 +1020,7 @@ void sqlite3Insert( ** goto C ** D: ... */ - sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0); + sqlite3VdbeReleaseRegisters(pParse, regData, pTab->nCol, 0, 0); addrInsTop = addrCont = sqlite3VdbeAddOp1(v, OP_Yield, dest.iSDParm); VdbeCoverage(v); if( ipkColumn>=0 ){ @@ -1976,7 +1976,7 @@ void sqlite3GenerateConstraintChecks( sqlite3SetMakeRecordP5(v, pIdx->pTable); } #endif - sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0); + sqlite3VdbeReleaseRegisters(pParse, regIdx, pIdx->nColumn, 0, 0); /* In an UPDATE operation, if this index is the PRIMARY KEY index ** of a WITHOUT ROWID table and there has been no change the diff --git a/src/vdbe.c b/src/vdbe.c index e11564b17c..971b37d5d0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -7811,7 +7811,7 @@ case OP_Abortable: { #endif #ifdef SQLITE_DEBUG -/* Opcode: ReleaseReg P1 P2 P3 * * +/* Opcode: ReleaseReg P1 P2 P3 * P5 ** Synopsis: release r[P1@P2] mask P3 ** ** Release registers from service. Any content that was in the @@ -7826,10 +7826,12 @@ case OP_Abortable: { ** a change to the value of the source register for the OP_SCopy will no longer ** generate an assertion fault in sqlite3VdbeMemAboutToChange(). ** -** TODO: Released registers ought to also have their datatype set to -** MEM_Undefined so that any subsequent attempt to read the released +** If P5 is set, then all released registers have their type set +** to MEM_Undefined so that any subsequent attempt to read the released ** register (before it is reinitialized) will generate an assertion fault. -** However, there are places in the code generator which release registers +** +** P5 ought to be set on every call to this opcode. +** However, there are places in the code generator will release registers ** before their are used, under the (valid) assumption that the registers ** will not be reallocated for some other purpose before they are used and ** hence are safe to release. @@ -7850,7 +7852,7 @@ case OP_ReleaseReg: { for(i=0; ip2; i++, pMem++){ if( i>=32 || (constMask & MASKBIT32(i))==0 ){ pMem->pScopyFrom = 0; - /* MemSetTypeFlag(pMem, MEM_Undefined); // See the TODO */ + if( i<32 && pOp->p5 ) MemSetTypeFlag(pMem, MEM_Undefined); } } break; diff --git a/src/vdbe.h b/src/vdbe.h index 9b25452e2f..bfde25873f 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -233,9 +233,9 @@ void sqlite3VdbeJumpHere(Vdbe*, int addr); int sqlite3VdbeChangeToNoop(Vdbe*, int addr); int sqlite3VdbeDeletePriorOpcode(Vdbe*, u8 op); #ifdef SQLITE_DEBUG - void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask); + void sqlite3VdbeReleaseRegisters(Parse*,int addr, int n, u32 mask, int); #else -# define sqlite3VdbeReleaseRegisters(P,A,N,M) +# define sqlite3VdbeReleaseRegisters(P,A,N,M,F) #endif void sqlite3VdbeChangeP4(Vdbe*, int addr, const char *zP4, int N); void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index ced3ec24c4..8b01fdec60 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1198,8 +1198,17 @@ int sqlite3VdbeDeletePriorOpcode(Vdbe *p, u8 op){ ** Generate an OP_ReleaseReg opcode to indicate that a range of ** registers, except any identified by mask, are no longer in use. */ -void sqlite3VdbeReleaseRegisters(Parse *pParse, int iFirst, int N, u32 mask){ +void sqlite3VdbeReleaseRegisters( + Parse *pParse, /* Parsing context */ + int iFirst, /* Index of first register to be released */ + int N, /* Number of registers to release */ + u32 mask, /* Mask of registers to NOT release */ + int bUndefine /* If true, mark registers as undefined */ +){ + if( N==0 ) return; assert( pParse->pVdbe ); + assert( iFirst>=1 ); + assert( iFirst+N-1<=pParse->nMem ); while( N>0 && (mask&1)!=0 ){ mask >>= 1; iFirst++; @@ -1211,6 +1220,7 @@ void sqlite3VdbeReleaseRegisters(Parse *pParse, int iFirst, int N, u32 mask){ } if( N>0 ){ sqlite3VdbeAddOp3(pParse->pVdbe, OP_ReleaseReg, iFirst, N, *(int*)&mask); + if( bUndefine ) sqlite3VdbeChangeP5(pParse->pVdbe, 1); } } #endif /* SQLITE_DEBUG */ From 1b39aab08d371123b7a83bc0162dc9a1c29984b0 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 18:37:04 +0000 Subject: [PATCH 26/29] Ifdef-out code that is only possible with the sessions extension. FossilOrigin-Name: 4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbemem.c | 10 ++++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index cf25a77c8b..451786ba48 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sthe\sOP_ReleaseReg\sopcode\salso\sinvalidate\sthe\sregisters\sif\sP5\sis\snon-zero. -D 2020-01-02T17:46:02.719 +C Ifdef-out\scode\sthat\sis\sonly\spossible\swith\sthe\ssessions\sextension. +D 2020-01-02T18:37:04.704 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -606,7 +606,7 @@ F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02 F src/vdbeaux.c 3b2076c59217f964ff5fca348fa3f69c3157cbd5cafc549e9ea3252d8613c6a9 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c d0e294c0f4fa1ac90d7f7f33b3ca4717db271d1550a870f5819cae384bec4610 +F src/vdbemem.c 05668cc1b44845736784f1ce9da46403dbf202c7c6d1a02205285cfc30e78f0d F src/vdbesort.c a3be032cc3fee0e3af31773af4a7a6f931b7230a34f53282ccf1d9a2a72343be F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 F src/vtab.c a2fead3e97fca54fcf3f3db784e17c9ee2d39a0c5ad323e9d514855106300a86 @@ -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 e782096aa06fcf410c3a0a6ee26a9e4f44333da39b28b2efe675814a8652911a -R 03e3fe8bf73f136f9929ea1e989495c3 +P 937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e +R 3a024adb421e4e36e63a5af385fc2fb7 U drh -Z a92746a6d0d3821fb326cef80fc59b0c +Z 3efc973945bc1da091c431612275c1f5 diff --git a/manifest.uuid b/manifest.uuid index cf9c08cbe6..8632123cd4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e \ No newline at end of file +4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 \ No newline at end of file diff --git a/src/vdbemem.c b/src/vdbemem.c index 5c17669492..5b911f2f01 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1131,13 +1131,15 @@ int sqlite3VdbeMemSetStr( pMem->flags = flags; if( enc ){ pMem->enc = enc; - }else if( pMem->db ){ - pMem->enc = ENC(pMem->db); - }else{ +#ifdef SQLITE_ENABLE_SESSION + }else if( pMem->db==0 ){ pMem->enc = SQLITE_UTF8; +#endif + }else{ + assert( pMem->db!=0 ); + pMem->enc = ENC(pMem->db); } - #ifndef SQLITE_OMIT_UTF16 if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ return SQLITE_NOMEM_BKPT; From 6b559f3033b1352c369ad551a09b336d8a655593 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 19:50:50 +0000 Subject: [PATCH 27/29] Fix some test logic in the OP_Delete opcode so that it works after a cursor-trip. FossilOrigin-Name: 28900e5cab73f9edb9383d64a37e14fed0602966cb704ddffa60c0281698fd52 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 6 +++++- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 451786ba48..0e63864694 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ifdef-out\scode\sthat\sis\sonly\spossible\swith\sthe\ssessions\sextension. -D 2020-01-02T18:37:04.704 +C Fix\ssome\stest\slogic\sin\sthe\sOP_Delete\sopcode\sso\sthat\sit\sworks\safter\sa\ncursor-trip. +D 2020-01-02T19:50:50.203 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 2f0fac345c7660d5c5bd3df9e9d8d33d4c27f366bcfb09e07443064d751a0507 F src/util.c 2c92bc706bbdb1c45a25180291e7e05a56e297aa5dd7b2bcd2b1c47e8bb05b17 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf -F src/vdbe.c a8c88ee06d3510d8dc9a5cee594ec46f2ef476bd0c9be834e7e664b76ca2c179 +F src/vdbe.c 459a233a60aba8b8b2462f42bd6e93623e13beafc5e0c40c6646e0527e444fd0 F src/vdbe.h defd693289c7bb8d325f109be9490c77138061211a116827da7244b6015a4934 F src/vdbeInt.h e02ccac0334f7c71c952210657e6e18de1917605887c7bc6167a80a17f62da18 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 937be22106f7e3f08712febd342d6cb81d129f2d5ab24ce80b3a5c3f9bbde54e -R 3a024adb421e4e36e63a5af385fc2fb7 +P 4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 +R 23c2d910f0f8167283a76ba9540e77df U drh -Z 3efc973945bc1da091c431612275c1f5 +Z 335647452bacbb554070cabfbe244c03 diff --git a/manifest.uuid b/manifest.uuid index 8632123cd4..e2a7ccfb80 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 \ No newline at end of file +28900e5cab73f9edb9383d64a37e14fed0602966cb704ddffa60c0281698fd52 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 971b37d5d0..5479a311b1 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4995,7 +4995,11 @@ case OP_Delete: { sqlite3VdbeIncrWriteCounter(p, pC); #ifdef SQLITE_DEBUG - if( pOp->p4type==P4_TABLE && HasRowid(pOp->p4.pTab) && pOp->p5==0 ){ + if( pOp->p4type==P4_TABLE + && HasRowid(pOp->p4.pTab) + && pOp->p5==0 + && sqlite3BtreeCursorIsValidNN(pC->uc.pCursor) + ){ /* If p5 is zero, the seek operation that positioned the cursor prior to ** OP_Delete will have also set the pC->movetoTarget field to the rowid of ** the row that is being deleted */ From 0c4f82051c7ff301ea78cf1d279005d2dc26ad19 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 21:30:13 +0000 Subject: [PATCH 28/29] Do not allow the zipfile virtual table to start a transaction if no filename has been specified. FossilOrigin-Name: 7405e982257611803792617f5d8142c54f9831b4a030f4de8607888c525e6289 --- ext/misc/zipfile.c | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- test/zipfile.test | 5 +++++ 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index 3262283377..ef02d88d17 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -1444,6 +1444,7 @@ static int zipfileBegin(sqlite3_vtab *pVtab){ int rc = SQLITE_OK; assert( pTab->pWriteFd==0 ); + if( pTab->zFile==0 ) return SQLITE_OK; /* Open a write fd on the file. Also load the entire central directory ** structure into memory. During the transaction any new file data is diff --git a/manifest b/manifest index 0e63864694..e7281ec469 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssome\stest\slogic\sin\sthe\sOP_Delete\sopcode\sso\sthat\sit\sworks\safter\sa\ncursor-trip. -D 2020-01-02T19:50:50.203 +C Do\snot\sallow\sthe\szipfile\svirtual\stable\sto\sstart\sa\stransaction\sif\sno\nfilename\shas\sbeen\sspecified. +D 2020-01-02T21:30:13.891 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -325,7 +325,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 185d060a595c79ebbec904e9d73b97b400dca94d2f910d351d6a8b5fcfe2c3d0 +F ext/misc/zipfile.c 442bd056690ceb82a125f2be53738c721357612b3ba5d9249220d4c1f85b2e3a F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -1749,7 +1749,7 @@ F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912ade F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test aab99dc488586842bed415a1ce1a2327948064aa660c00243e3f14a1ff1cf282 +F test/zipfile.test 42603fac7f7d6fdb3e8690da9fd1492b89b2325b3946fcff683cc88437d84ce4 F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 @@ -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 4fcf07f79672d203efbc90ad21d97f6a131c3885306f8e0bab015d5ac44b8644 -R 23c2d910f0f8167283a76ba9540e77df +P 28900e5cab73f9edb9383d64a37e14fed0602966cb704ddffa60c0281698fd52 +R 03baaef710a83490f407e9d1a4367e2e U drh -Z 335647452bacbb554070cabfbe244c03 +Z 36e9c165e34c3938dc7f6f92537f7688 diff --git a/manifest.uuid b/manifest.uuid index e2a7ccfb80..ed83f643ec 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28900e5cab73f9edb9383d64a37e14fed0602966cb704ddffa60c0281698fd52 \ No newline at end of file +7405e982257611803792617f5d8142c54f9831b4a030f4de8607888c525e6289 \ No newline at end of file diff --git a/test/zipfile.test b/test/zipfile.test index 6ea9ac6a01..da853e0aed 100644 --- a/test/zipfile.test +++ b/test/zipfile.test @@ -834,6 +834,11 @@ do_execsql_test 15.20 { REPLACE INTO t2 values(null,null,null,null,null,10,null); } {} +# 2020-01-02 Yongheng fuzzer discovery +# +do_catchsql_test 16.10 { + DELETE FROM zipfile; +} {1 {zipfile() function requires an argument}} finish_test From 9fc1b9af36e54c7863a9404a9611abfb4b682374 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 2 Jan 2020 22:23:01 +0000 Subject: [PATCH 29/29] NEVER() and ALWAYS() macros tagging unreachable branches. FossilOrigin-Name: 34b877742ef78e9bb3f16815180f4ad9cd722beb1d610f713400a3b25d68aa9b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 5 +++-- src/resolve.c | 8 ++++---- 4 files changed, 15 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 752a4f3e35..7cfd44f858 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\senhancements\sfrom\strunk. -D 2020-01-02T21:41:59.033 +C NEVER()\sand\sALWAYS()\smacros\stagging\sunreachable\sbranches. +D 2020-01-02T22:23:01.861 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -462,7 +462,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 92604dd52bd73dbc4f0cc4f4a1b1fdd366e53cb0503494291e5798524beb74ec +F src/alter.c f48a4423c8f198d7f1ae4940f74b606707d05384ac79fb219be8e3323af2a2de F src/analyze.c b3ceec3fc052df8a96ca8a8c858d455dc5029ba681b4be98bb5c5a9162cfa58c F src/attach.c b30c44333d55a68c0a12920b5b9d40b254cbd3d4509bda77417209eeed8b3d80 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 @@ -526,7 +526,7 @@ F src/pragma.h ec3b31eac9b1df040f1cc8cb3d89bc06605c3b4cb3d76f833de8d6d6c3f77f04 F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 6cc3ce3d674b027b437e5b3c4f0c29be7995dc8abf27f1ee8b16e3d070e19d2f +F src/resolve.c 938295261d556dc173e7c4b85c921b565b25c38656b924bdf03c3ff8f37e24ab F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c 8791103f21df458fdaba16c7d6452f92b00363f222f0f242661654f12455ea0a F src/shell.c.in 90b002bf0054399cbbfac62dd752a9b05770427ba141bcba75eefbb0098f4280 @@ -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 88d244983854cdc1a369c5df09ae00f1098784db768ba4e17b963d187dcb1009 7405e982257611803792617f5d8142c54f9831b4a030f4de8607888c525e6289 -R efdd5d9177183f4cebb9b751b044f27a +P bd57e6d923d3b04f0a07aaf18bf389d2b2b7efc7c57e8cb37e6ef910662d8397 +R 896a86b40586a93b7de7ff4de391d81d U drh -Z dc1b72a94a902754e9baf3ba10a5a0b3 +Z b012354b66730a3de909478223de72aa diff --git a/manifest.uuid b/manifest.uuid index d9e19f60fe..266bf3350f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd57e6d923d3b04f0a07aaf18bf389d2b2b7efc7c57e8cb37e6ef910662d8397 \ No newline at end of file +34b877742ef78e9bb3f16815180f4ad9cd722beb1d610f713400a3b25d68aa9b \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index f3caba4c18..ee193d18bf 100644 --- a/src/alter.c +++ b/src/alter.c @@ -811,7 +811,7 @@ void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ sWalker.xExprCallback = renameUnmapExprCb; sqlite3WalkExprList(&sWalker, pEList); for(i=0; inExpr; i++){ - if( pEList->a[i].eEName==ENAME_NAME ){ + if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){ sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); } } @@ -952,7 +952,8 @@ static void renameColumnElistNames( int i; for(i=0; inExpr; i++){ char *zName = pEList->a[i].zEName; - if( pEList->a[i].eEName==ENAME_NAME + if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) + && ALWAYS(zName!=0) && 0==sqlite3_stricmp(zName, zOld) ){ renameTokenFind(pParse, pCtx, (void*)zName); diff --git a/src/resolve.c b/src/resolve.c index 607cfd5df0..f69f9ef311 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -140,7 +140,7 @@ int sqlite3MatchEName( ){ int n; const char *zSpan; - if( pItem->eEName!=ENAME_TAB ) return 0; + if( NEVER(pItem->eEName!=ENAME_TAB) ) return 0; zSpan = pItem->zEName; for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ @@ -451,9 +451,9 @@ static int lookupName( pEList = pNC->uNC.pEList; assert( pEList!=0 ); for(j=0; jnExpr; j++){ - char *zAs; + char *zAs = pEList->a[j].zEName; if( pEList->a[j].eEName==ENAME_NAME - && (zAs = pEList->a[j].zEName)!=0 + && ALWAYS(zAs!=0) && sqlite3StrICmp(zAs, zCol)==0 ){ Expr *pOrig; @@ -1125,7 +1125,7 @@ static int resolveAsName( for(i=0; inExpr; i++){ char *zAs = pEList->a[i].zEName; if( pEList->a[i].eEName==ENAME_NAME - && (zAs = pEList->a[i].zEName)!=0 + && ALWAYS(zAs!=0) && sqlite3StrICmp(zAs, zCol)==0 ){ return i+1;