From 6d72858e795481571a40c07675cc9d2c15b5b3ef Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 18 Jun 2021 18:36:39 +0000 Subject: [PATCH 001/100] Version 3.36.0 FossilOrigin-Name: 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5 --- manifest | 10 ++++++---- manifest.uuid | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index 12a3b0afb6..2a6b8f404f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sALWAYS\son\sa\sbranch\sin\sSTAT4-only\slogic\sthat\sis\snow\salways\ntrue\sdue\sto\scheck-in\s[c21bc5a2353e660f]. -D 2021-06-16T19:23:24.924 +C Version\s3.36.0 +D 2021-06-18T18:36:39.378 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1918,7 +1918,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c3036c28259c1375cd2c480c9ca0ce7f9aa1e952be4f110dde49b2b7d72a43b7 +P 7bd55eee1ac63cf6d5699ce85bc5a29bf51afdf7a80bce44937fa833947a40f4 R 6b8a0a7cf847af9edb1fb9387491b821 +T +sym-release * +T +sym-version-3.36.0 * U drh -Z a27f3d8d5b7841a565ad9f6d2ecda9f9 +Z 05ee2bbc3eef4148ab2800c954a168c4 diff --git a/manifest.uuid b/manifest.uuid index fd4c15710d..ccffbad5d9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7bd55eee1ac63cf6d5699ce85bc5a29bf51afdf7a80bce44937fa833947a40f4 \ No newline at end of file +5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5 \ No newline at end of file From 42a410dcad214c132787fddc3564e605fd7e1daf Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 19 Jun 2021 18:32:20 +0000 Subject: [PATCH 002/100] Split the sqlite3BtreeMovetoUnpacked() routine into two separate routines sqlite3BtreeTableMoveto() and sqlite3BtreeIndexMoveto(), since we usually know the type of btree in advance. This results in less branching and better performance. FossilOrigin-Name: 3b0d34e5e5f9a16c3397e4551f3b534729b1b375770f05f6ed5847818b1f4c0b --- manifest | 20 ++- manifest.uuid | 2 +- src/btree.c | 403 ++++++++++++++++++++++++++++++-------------------- src/btree.h | 8 +- src/vdbe.c | 12 +- src/vdbeaux.c | 2 +- 6 files changed, 266 insertions(+), 181 deletions(-) diff --git a/manifest b/manifest index 2a6b8f404f..2e83754568 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.36.0 -D 2021-06-18T18:36:39.378 +C Split\sthe\ssqlite3BtreeMovetoUnpacked()\sroutine\sinto\stwo\sseparate\sroutines\nsqlite3BtreeTableMoveto()\sand\ssqlite3BtreeIndexMoveto(),\ssince\swe\susually\nknow\sthe\stype\sof\sbtree\sin\sadvance.\s\sThis\sresults\sin\sless\sbranching\sand\nbetter\sperformance. +D 2021-06-19T18:32:20.087 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,8 +485,8 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 399e1ebcd6c4f9ad47f5457bfe3623441db287f0923433cf6539497791557be8 -F src/btree.h 096cc53baa58be22b02c896d1cf933c38cfc6d65f9253c1367ece8cc88a24de5 +F src/btree.c 6079ee9dc399a7a6f0727f2c6ba2f43c18600c71827a76ddcdedde54a58b646e +F src/btree.h ace9c1c243612bb95c32d848e3f9e159340c2caefcb68412b441569f56328f65 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c @@ -616,11 +616,11 @@ F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 F src/vacuum.c 492422c1463c076473bae1858799c7a0a5fe87a133d1223239447c422cd26286 -F src/vdbe.c 6ece0ee94fa3a95601372efdc4ec6d068cd6cc58e28af8852f3407b90be4b7f8 +F src/vdbe.c 226deb5bc5d88c4feb215cccaecdbe36924078737f27629fa06123d4da10f609 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 465fcb494db4ca6630fb9c19b2f3dfed597fbe885b0d4204193a5093b0dd7dc6 F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 -F src/vdbeaux.c 065a10392378109f08435bd50d03dff315e384cde2831d6b8dbaec05f33b10af +F src/vdbeaux.c 17e5f6a491d439396296dd20427829fad14c78a6be8f84415d253ff94c31ce9a F src/vdbeblob.c c6b8db50b227f66fb404215732068df76485b5b433e5f9d4d9ac27410b218193 F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 @@ -1918,9 +1918,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 7bd55eee1ac63cf6d5699ce85bc5a29bf51afdf7a80bce44937fa833947a40f4 -R 6b8a0a7cf847af9edb1fb9387491b821 -T +sym-release * -T +sym-version-3.36.0 * +P 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5 +R cc13a86c593d747f18b1766f1996fa8f U drh -Z 05ee2bbc3eef4148ab2800c954a168c4 +Z 15ce4941abcea77bc0d9552f8406032e diff --git a/manifest.uuid b/manifest.uuid index ccffbad5d9..6d43424977 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5 \ No newline at end of file +3b0d34e5e5f9a16c3397e4551f3b534729b1b375770f05f6ed5847818b1f4c0b \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index d1e84d0a60..12d07dcc01 100644 --- a/src/btree.c +++ b/src/btree.c @@ -827,15 +827,13 @@ static int btreeMoveto( sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ rc = SQLITE_CORRUPT_BKPT; - goto moveto_done; + }else{ + rc = sqlite3BtreeIndexMoveto(pCur, pIdxKey, pRes); } + sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey); }else{ pIdxKey = 0; - } - rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes); -moveto_done: - if( pIdxKey ){ - sqlite3DbFree(pCur->pKeyInfo->db, pIdxKey); + rc = sqlite3BtreeTableMoveto(pCur, nKey, bias, pRes); } return rc; } @@ -5421,12 +5419,8 @@ int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ return rc; } -/* Move the cursor so that it points to an entry near the key -** specified by pIdxKey or intKey. Return a success code. -** -** For INTKEY tables, the intKey parameter is used. pIdxKey -** must be NULL. For index tables, pIdxKey is used and intKey -** is ignored. +/* Move the cursor so that it points to an entry in a table (a.k.a INTKEY) +** table near the key intKey. Return a success code. ** ** If an exact match is not found, then the cursor is always ** left pointing at a leaf page which would hold the entry if it @@ -5439,39 +5433,32 @@ int sqlite3BtreeLast(BtCursor *pCur, int *pRes){ ** *pRes is as follows: ** ** *pRes<0 The cursor is left pointing at an entry that -** is smaller than intKey/pIdxKey or if the table is empty +** is smaller than intKey or if the table is empty ** and the cursor is therefore left point to nothing. ** ** *pRes==0 The cursor is left pointing at an entry that -** exactly matches intKey/pIdxKey. +** exactly matches intKey. ** ** *pRes>0 The cursor is left pointing at an entry that -** is larger than intKey/pIdxKey. -** -** For index tables, the pIdxKey->eqSeen field is set to 1 if there -** exists an entry in the table that exactly matches pIdxKey. +** is larger than intKey. */ -int sqlite3BtreeMovetoUnpacked( +int sqlite3BtreeTableMoveto( BtCursor *pCur, /* The cursor to be moved */ - UnpackedRecord *pIdxKey, /* Unpacked index key */ i64 intKey, /* The table key */ int biasRight, /* If true, bias the search to the high end */ int *pRes /* Write search results here */ ){ int rc; - RecordCompare xRecordCompare; assert( cursorOwnsBtShared(pCur) ); assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); assert( pRes ); - assert( (pIdxKey==0)==(pCur->pKeyInfo==0) ); - assert( pCur->eState!=CURSOR_VALID || (pIdxKey==0)==(pCur->curIntKey!=0) ); + assert( pCur->pKeyInfo==0 ); + assert( pCur->eState!=CURSOR_VALID || pCur->curIntKey!=0 ); /* If the cursor is already positioned at the point we are trying ** to move to, then just return without doing any work */ - if( pIdxKey==0 - && pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0 - ){ + if( pCur->eState==CURSOR_VALID && (pCur->curFlags & BTCF_ValidNKey)!=0 ){ if( pCur->info.nKey==intKey ){ *pRes = 0; return SQLITE_OK; @@ -5506,16 +5493,149 @@ int sqlite3BtreeMovetoUnpacked( pCur->pBtree->nSeek++; /* Performance measurement during testing */ #endif - if( pIdxKey ){ - xRecordCompare = sqlite3VdbeFindCompare(pIdxKey); - pIdxKey->errCode = 0; - assert( pIdxKey->default_rc==1 - || pIdxKey->default_rc==0 - || pIdxKey->default_rc==-1 - ); - }else{ - xRecordCompare = 0; /* All keys are integers */ + rc = moveToRoot(pCur); + if( rc ){ + if( rc==SQLITE_EMPTY ){ + assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); + *pRes = -1; + return SQLITE_OK; + } + return rc; } + assert( pCur->pPage ); + assert( pCur->pPage->isInit ); + assert( pCur->eState==CURSOR_VALID ); + assert( pCur->pPage->nCell > 0 ); + assert( pCur->iPage==0 || pCur->apPage[0]->intKey==pCur->curIntKey ); + assert( pCur->curIntKey ); + + for(;;){ + int lwr, upr, idx, c; + Pgno chldPg; + MemPage *pPage = pCur->pPage; + u8 *pCell; /* Pointer to current cell in pPage */ + + /* pPage->nCell must be greater than zero. If this is the root-page + ** the cursor would have been INVALID above and this for(;;) loop + ** not run. If this is not the root-page, then the moveToChild() routine + ** would have already detected db corruption. Similarly, pPage must + ** be the right kind (index or table) of b-tree page. Otherwise + ** a moveToChild() or moveToRoot() call would have detected corruption. */ + assert( pPage->nCell>0 ); + assert( pPage->intKey ); + lwr = 0; + upr = pPage->nCell-1; + assert( biasRight==0 || biasRight==1 ); + idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */ + pCur->ix = (u16)idx; + for(;;){ + i64 nCellKey; + pCell = findCellPastPtr(pPage, idx); + if( pPage->intKeyLeaf ){ + while( 0x80 <= *(pCell++) ){ + if( pCell>=pPage->aDataEnd ){ + return SQLITE_CORRUPT_PAGE(pPage); + } + } + } + getVarint(pCell, (u64*)&nCellKey); + if( nCellKeyupr ){ c = -1; break; } + }else if( nCellKey>intKey ){ + upr = idx-1; + if( lwr>upr ){ c = +1; break; } + }else{ + assert( nCellKey==intKey ); + pCur->ix = (u16)idx; + if( !pPage->leaf ){ + lwr = idx; + goto moveto_table_next_layer; + }else{ + pCur->curFlags |= BTCF_ValidNKey; + pCur->info.nKey = nCellKey; + pCur->info.nSize = 0; + *pRes = 0; + return SQLITE_OK; + } + } + assert( lwr+upr>=0 ); + idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2; */ + } + assert( lwr==upr+1 || !pPage->leaf ); + assert( pPage->isInit ); + if( pPage->leaf ){ + assert( pCur->ixpPage->nCell ); + pCur->ix = (u16)idx; + *pRes = c; + rc = SQLITE_OK; + goto moveto_table_finish; + } +moveto_table_next_layer: + if( lwr>=pPage->nCell ){ + chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); + }else{ + chldPg = get4byte(findCell(pPage, lwr)); + } + pCur->ix = (u16)lwr; + rc = moveToChild(pCur, chldPg); + if( rc ) break; + } +moveto_table_finish: + pCur->info.nSize = 0; + assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); + return rc; +} + +/* Move the cursor so that it points to an entry in an index table +** near the key pIdxKey. Return a success code. +** +** If an exact match is not found, then the cursor is always +** left pointing at a leaf page which would hold the entry if it +** were present. The cursor might point to an entry that comes +** before or after the key. +** +** An integer is written into *pRes which is the result of +** comparing the key with the entry to which the cursor is +** pointing. The meaning of the integer written into +** *pRes is as follows: +** +** *pRes<0 The cursor is left pointing at an entry that +** is smaller than pIdxKey or if the table is empty +** and the cursor is therefore left point to nothing. +** +** *pRes==0 The cursor is left pointing at an entry that +** exactly matches pIdxKey. +** +** *pRes>0 The cursor is left pointing at an entry that +** is larger than pIdxKey. +** +** The pIdxKey->eqSeen field is set to 1 if there +** exists an entry in the table that exactly matches pIdxKey. +*/ +int sqlite3BtreeIndexMoveto( + BtCursor *pCur, /* The cursor to be moved */ + UnpackedRecord *pIdxKey, /* Unpacked index key */ + int *pRes /* Write search results here */ +){ + int rc; + RecordCompare xRecordCompare; + + assert( cursorOwnsBtShared(pCur) ); + assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) ); + assert( pRes ); + assert( pCur->pKeyInfo!=0 ); + +#ifdef SQLITE_DEBUG + pCur->pBtree->nSeek++; /* Performance measurement during testing */ +#endif + + xRecordCompare = sqlite3VdbeFindCompare(pIdxKey); + pIdxKey->errCode = 0; + assert( pIdxKey->default_rc==1 + || pIdxKey->default_rc==0 + || pIdxKey->default_rc==-1 + ); rc = moveToRoot(pCur); if( rc ){ @@ -5548,130 +5668,92 @@ int sqlite3BtreeMovetoUnpacked( assert( pPage->intKey==(pIdxKey==0) ); lwr = 0; upr = pPage->nCell-1; - assert( biasRight==0 || biasRight==1 ); - idx = upr>>(1-biasRight); /* idx = biasRight ? upr : (lwr+upr)/2; */ + idx = upr>>1; /* idx = (lwr+upr)/2; */ pCur->ix = (u16)idx; - if( xRecordCompare==0 ){ - for(;;){ - i64 nCellKey; - pCell = findCellPastPtr(pPage, idx); - if( pPage->intKeyLeaf ){ - while( 0x80 <= *(pCell++) ){ - if( pCell>=pPage->aDataEnd ){ - return SQLITE_CORRUPT_PAGE(pPage); - } - } - } - getVarint(pCell, (u64*)&nCellKey); - if( nCellKeyupr ){ c = -1; break; } - }else if( nCellKey>intKey ){ - upr = idx-1; - if( lwr>upr ){ c = +1; break; } - }else{ - assert( nCellKey==intKey ); - pCur->ix = (u16)idx; - if( !pPage->leaf ){ - lwr = idx; - goto moveto_next_layer; - }else{ - pCur->curFlags |= BTCF_ValidNKey; - pCur->info.nKey = nCellKey; - pCur->info.nSize = 0; - *pRes = 0; - return SQLITE_OK; - } - } - assert( lwr+upr>=0 ); - idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2; */ - } - }else{ - for(;;){ - int nCell; /* Size of the pCell cell in bytes */ - pCell = findCellPastPtr(pPage, idx); + for(;;){ + int nCell; /* Size of the pCell cell in bytes */ + pCell = findCellPastPtr(pPage, idx); - /* The maximum supported page-size is 65536 bytes. This means that - ** the maximum number of record bytes stored on an index B-Tree - ** page is less than 16384 bytes and may be stored as a 2-byte - ** varint. This information is used to attempt to avoid parsing - ** the entire cell by checking for the cases where the record is - ** stored entirely within the b-tree page by inspecting the first - ** 2 bytes of the cell. - */ - nCell = pCell[0]; - if( nCell<=pPage->max1bytePayload ){ - /* This branch runs if the record-size field of the cell is a - ** single byte varint and the record fits entirely on the main - ** b-tree page. */ - testcase( pCell+nCell+1==pPage->aDataEnd ); - c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); - }else if( !(pCell[1] & 0x80) - && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal - ){ - /* The record-size field is a 2 byte varint and the record - ** fits entirely on the main b-tree page. */ - testcase( pCell+nCell+2==pPage->aDataEnd ); - c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); - }else{ - /* The record flows over onto one or more overflow pages. In - ** this case the whole cell needs to be parsed, a buffer allocated - ** and accessPayload() used to retrieve the record into the - ** buffer before VdbeRecordCompare() can be called. - ** - ** If the record is corrupt, the xRecordCompare routine may read - ** up to two varints past the end of the buffer. An extra 18 - ** bytes of padding is allocated at the end of the buffer in - ** case this happens. */ - void *pCellKey; - u8 * const pCellBody = pCell - pPage->childPtrSize; - const int nOverrun = 18; /* Size of the overrun padding */ - pPage->xParseCell(pPage, pCellBody, &pCur->info); - nCell = (int)pCur->info.nKey; - testcase( nCell<0 ); /* True if key size is 2^32 or more */ - testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ - testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ - testcase( nCell==2 ); /* Minimum legal index key size */ - if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ - rc = SQLITE_CORRUPT_PAGE(pPage); - goto moveto_finish; - } - pCellKey = sqlite3Malloc( nCell+nOverrun ); - if( pCellKey==0 ){ - rc = SQLITE_NOMEM_BKPT; - goto moveto_finish; - } - pCur->ix = (u16)idx; - rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0); - memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */ - pCur->curFlags &= ~BTCF_ValidOvfl; - if( rc ){ - sqlite3_free(pCellKey); - goto moveto_finish; - } - c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); + /* The maximum supported page-size is 65536 bytes. This means that + ** the maximum number of record bytes stored on an index B-Tree + ** page is less than 16384 bytes and may be stored as a 2-byte + ** varint. This information is used to attempt to avoid parsing + ** the entire cell by checking for the cases where the record is + ** stored entirely within the b-tree page by inspecting the first + ** 2 bytes of the cell. + */ + nCell = pCell[0]; + if( nCell<=pPage->max1bytePayload ){ + /* This branch runs if the record-size field of the cell is a + ** single byte varint and the record fits entirely on the main + ** b-tree page. */ + testcase( pCell+nCell+1==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); + }else if( !(pCell[1] & 0x80) + && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal + ){ + /* The record-size field is a 2 byte varint and the record + ** fits entirely on the main b-tree page. */ + testcase( pCell+nCell+2==pPage->aDataEnd ); + c = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); + }else{ + /* The record flows over onto one or more overflow pages. In + ** this case the whole cell needs to be parsed, a buffer allocated + ** and accessPayload() used to retrieve the record into the + ** buffer before VdbeRecordCompare() can be called. + ** + ** If the record is corrupt, the xRecordCompare routine may read + ** up to two varints past the end of the buffer. An extra 18 + ** bytes of padding is allocated at the end of the buffer in + ** case this happens. */ + void *pCellKey; + u8 * const pCellBody = pCell - pPage->childPtrSize; + const int nOverrun = 18; /* Size of the overrun padding */ + pPage->xParseCell(pPage, pCellBody, &pCur->info); + nCell = (int)pCur->info.nKey; + testcase( nCell<0 ); /* True if key size is 2^32 or more */ + testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ + testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ + testcase( nCell==2 ); /* Minimum legal index key size */ + if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ + rc = SQLITE_CORRUPT_PAGE(pPage); + goto moveto_index_finish; + } + pCellKey = sqlite3Malloc( nCell+nOverrun ); + if( pCellKey==0 ){ + rc = SQLITE_NOMEM_BKPT; + goto moveto_index_finish; + } + pCur->ix = (u16)idx; + rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0); + memset(((u8*)pCellKey)+nCell,0,nOverrun); /* Fix uninit warnings */ + pCur->curFlags &= ~BTCF_ValidOvfl; + if( rc ){ sqlite3_free(pCellKey); + goto moveto_index_finish; } - assert( - (pIdxKey->errCode!=SQLITE_CORRUPT || c==0) - && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed) - ); - if( c<0 ){ - lwr = idx+1; - }else if( c>0 ){ - upr = idx-1; - }else{ - assert( c==0 ); - *pRes = 0; - rc = SQLITE_OK; - pCur->ix = (u16)idx; - if( pIdxKey->errCode ) rc = SQLITE_CORRUPT_BKPT; - goto moveto_finish; - } - if( lwr>upr ) break; - assert( lwr+upr>=0 ); - idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2 */ + c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey); + sqlite3_free(pCellKey); } + assert( + (pIdxKey->errCode!=SQLITE_CORRUPT || c==0) + && (pIdxKey->errCode!=SQLITE_NOMEM || pCur->pBtree->db->mallocFailed) + ); + if( c<0 ){ + lwr = idx+1; + }else if( c>0 ){ + upr = idx-1; + }else{ + assert( c==0 ); + *pRes = 0; + rc = SQLITE_OK; + pCur->ix = (u16)idx; + if( pIdxKey->errCode ) rc = SQLITE_CORRUPT_BKPT; + goto moveto_index_finish; + } + if( lwr>upr ) break; + assert( lwr+upr>=0 ); + idx = (lwr+upr)>>1; /* idx = (lwr+upr)/2 */ } assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) ); assert( pPage->isInit ); @@ -5680,9 +5762,8 @@ int sqlite3BtreeMovetoUnpacked( pCur->ix = (u16)idx; *pRes = c; rc = SQLITE_OK; - goto moveto_finish; + goto moveto_index_finish; } -moveto_next_layer: if( lwr>=pPage->nCell ){ chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); }else{ @@ -5692,7 +5773,7 @@ moveto_next_layer: rc = moveToChild(pCur, chldPg); if( rc ) break; } -moveto_finish: +moveto_index_finish: pCur->info.nSize = 0; assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); return rc; @@ -8798,7 +8879,8 @@ int sqlite3BtreeInsert( ** to an adjacent cell. Move the cursor so that it is pointing either ** to the cell to be overwritten or an adjacent cell. */ - rc = sqlite3BtreeMovetoUnpacked(pCur, 0, pX->nKey, flags!=0, &loc); + rc = sqlite3BtreeTableMoveto(pCur, pX->nKey, + (flags & BTREE_APPEND)!=0, &loc); if( rc ) return rc; } }else{ @@ -8825,9 +8907,10 @@ int sqlite3BtreeInsert( r.r1 = 0; r.r2 = 0; r.eqSeen = 0; - rc = sqlite3BtreeMovetoUnpacked(pCur, &r, 0, flags!=0, &loc); + rc = sqlite3BtreeIndexMoveto(pCur, &r, &loc); }else{ - rc = btreeMoveto(pCur, pX->pKey, pX->nKey, flags!=0, &loc); + rc = btreeMoveto(pCur, pX->pKey, pX->nKey, + (flags & BTREE_APPEND)!=0, &loc); } if( rc ) return rc; } diff --git a/src/btree.h b/src/btree.h index b7afecc426..fe724d6bb5 100644 --- a/src/btree.h +++ b/src/btree.h @@ -247,13 +247,17 @@ void sqlite3BtreeCursorHint(BtCursor*, int, ...); #endif int sqlite3BtreeCloseCursor(BtCursor*); -int sqlite3BtreeMovetoUnpacked( +int sqlite3BtreeTableMoveto( BtCursor*, - UnpackedRecord *pUnKey, i64 intKey, int bias, int *pRes ); +int sqlite3BtreeIndexMoveto( + BtCursor*, + UnpackedRecord *pUnKey, + int *pRes +); int sqlite3BtreeCursorHasMoved(BtCursor*); int sqlite3BtreeCursorRestore(BtCursor*, int*); int sqlite3BtreeDelete(BtCursor*, u8 flags); diff --git a/src/vdbe.c b/src/vdbe.c index 4442f7d9f7..6623009aac 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4307,7 +4307,7 @@ case OP_SeekGT: { /* jump, in3, group */ if( (oc & 0x0001)==(OP_SeekLT & 0x0001) ) oc++; } } - rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)iKey, 0, &res); + rc = sqlite3BtreeTableMoveto(pC->uc.pCursor, (u64)iKey, 0, &res); pC->movetoTarget = iKey; /* Used by OP_Delete */ if( rc!=SQLITE_OK ){ goto abort_due_to_error; @@ -4354,7 +4354,7 @@ case OP_SeekGT: { /* jump, in3, group */ { int i; for(i=0; iuc.pCursor, &r, 0, 0, &res); + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, &r, &res); if( rc!=SQLITE_OK ){ goto abort_due_to_error; } @@ -4773,7 +4773,7 @@ case OP_Found: { /* jump, in3 */ } } } - rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, pIdxKey, 0, 0, &res); + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, pIdxKey, &res); if( pFree ) sqlite3DbFreeNN(db, pFree); if( rc!=SQLITE_OK ){ goto abort_due_to_error; @@ -4882,7 +4882,7 @@ notExistsWithKey: pCrsr = pC->uc.pCursor; assert( pCrsr!=0 ); res = 0; - rc = sqlite3BtreeMovetoUnpacked(pCrsr, 0, iKey, 0, &res); + rc = sqlite3BtreeTableMoveto(pCrsr, iKey, 0, &res); assert( rc==SQLITE_OK || res==0 ); pC->movetoTarget = iKey; /* Used by OP_Delete */ pC->nullRow = 0; @@ -5039,7 +5039,7 @@ case OP_NewRowid: { /* out2 */ do{ sqlite3_randomness(sizeof(v), &v); v &= (MAX_ROWID>>1); v++; /* Ensure that v is greater than zero */ - }while( ((rc = sqlite3BtreeMovetoUnpacked(pC->uc.pCursor, 0, (u64)v, + }while( ((rc = sqlite3BtreeTableMoveto(pC->uc.pCursor, (u64)v, 0, &res))==SQLITE_OK) && (res==0) && (++cnt<100)); @@ -5937,7 +5937,7 @@ case OP_IdxDelete: { r.nField = (u16)pOp->p3; r.default_rc = 0; r.aMem = &aMem[pOp->p2]; - rc = sqlite3BtreeMovetoUnpacked(pCrsr, &r, 0, 0, &res); + rc = sqlite3BtreeIndexMoveto(pCrsr, &r, &res); if( rc ) goto abort_due_to_error; if( res==0 ){ rc = sqlite3BtreeDelete(pCrsr, BTREE_AUXDELETE); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index d22a6a5592..edbf062749 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3501,7 +3501,7 @@ int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ assert( p->deferredMoveto ); assert( p->isTable ); assert( p->eCurType==CURTYPE_BTREE ); - rc = sqlite3BtreeMovetoUnpacked(p->uc.pCursor, 0, p->movetoTarget, 0, &res); + rc = sqlite3BtreeTableMoveto(p->uc.pCursor, p->movetoTarget, 0, &res); if( rc ) return rc; if( res!=0 ) return SQLITE_CORRUPT_BKPT; #ifdef SQLITE_TEST From f51bad45f0e5aca7e6e4436692d55cd847181a68 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 19 Jun 2021 18:35:20 +0000 Subject: [PATCH 003/100] The previous check-in is a significant change to btree, so go ahead and increment the version number for the next development cycle. FossilOrigin-Name: 2eb6697051c13bf0cc3772fd6c16bfdea0be3b01c0d985e05004c04eaf7a4a48 --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/VERSION b/VERSION index 0b477b458f..c03c47aa89 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.36.0 +3.37.0 diff --git a/configure b/configure index 5df1386305..542ee5a1fe 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.36.0. +# Generated by GNU Autoconf 2.69 for sqlite 3.37.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.36.0' -PACKAGE_STRING='sqlite 3.36.0' +PACKAGE_VERSION='3.37.0' +PACKAGE_STRING='sqlite 3.37.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1467,7 +1467,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.36.0 to adapt to many kinds of systems. +\`configure' configures sqlite 3.37.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1532,7 +1532,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.36.0:";; + short | recursive ) echo "Configuration of sqlite 3.37.0:";; esac cat <<\_ACEOF @@ -1660,7 +1660,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.36.0 +sqlite configure 3.37.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2079,7 +2079,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.36.0, which was +It was created by sqlite $as_me 3.37.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12378,7 +12378,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.36.0, which was +This file was extended by sqlite $as_me 3.37.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12444,7 +12444,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.36.0 +sqlite config.status 3.37.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index 2e83754568..f04c35aa2e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Split\sthe\ssqlite3BtreeMovetoUnpacked()\sroutine\sinto\stwo\sseparate\sroutines\nsqlite3BtreeTableMoveto()\sand\ssqlite3BtreeIndexMoveto(),\ssince\swe\susually\nknow\sthe\stype\sof\sbtree\sin\sadvance.\s\sThis\sresults\sin\sless\sbranching\sand\nbetter\sperformance. -D 2021-06-19T18:32:20.087 +C The\sprevious\scheck-in\sis\sa\ssignificant\schange\sto\sbtree,\sso\sgo\sahead\sand\nincrement\sthe\sversion\snumber\sfor\sthe\snext\sdevelopment\scycle. +D 2021-06-19T18:35:20.994 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -7,7 +7,7 @@ F Makefile.in ff5ac24ec9cb700135ee4453fa14c18ea371e94250d3673bda1f2cb56e1108ce F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc 8285e1ea7264f32b08702866d69dd127c0f663bbc2002323d853c68c27c6b6e4 F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 -F VERSION 8c392f6d70d82e513a0eac622bdf23c43df3e084cb630288beba8cef3012c812 +F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -34,7 +34,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure c658869fc056a2460a2212fb2960e410cd24e3fb9c55640fbc78d15b48810936 x +F configure 9712ea724ff2a1d48fadcf04b29fa1852f325792462c55f4fc71ab972653b20d x F configure.ac 4e4b58b32f88c8da9914a2f2c3158f80e69907eccc019fcc7e3ba14ffd91c640 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -1918,7 +1918,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 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5 -R cc13a86c593d747f18b1766f1996fa8f +P 3b0d34e5e5f9a16c3397e4551f3b534729b1b375770f05f6ed5847818b1f4c0b +R e85267aa1e581371a6eeabbe5500efbb U drh -Z 15ce4941abcea77bc0d9552f8406032e +Z 413ce8c5c5db00ea92410effb5485be3 diff --git a/manifest.uuid b/manifest.uuid index 6d43424977..72466dd3c4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3b0d34e5e5f9a16c3397e4551f3b534729b1b375770f05f6ed5847818b1f4c0b \ No newline at end of file +2eb6697051c13bf0cc3772fd6c16bfdea0be3b01c0d985e05004c04eaf7a4a48 \ No newline at end of file From 5d8ade1f67c8a4f3ed516f8e476834659394735a Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 19 Jun 2021 20:20:23 +0000 Subject: [PATCH 004/100] Remove unnecessary (redundant) variable initialization from sqlite3BtreeInsert() for a small size reduction and performance increase. FossilOrigin-Name: 70d1836474207fa045ff7aa513839c9df26ea6e180eb898b30d89bd5b3833f58 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 3 --- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index f04c35aa2e..7d36e6ee78 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sprevious\scheck-in\sis\sa\ssignificant\schange\sto\sbtree,\sso\sgo\sahead\sand\nincrement\sthe\sversion\snumber\sfor\sthe\snext\sdevelopment\scycle. -D 2021-06-19T18:35:20.994 +C Remove\sunnecessary\s(redundant)\svariable\sinitialization\sfrom\nsqlite3BtreeInsert()\sfor\sa\ssmall\ssize\sreduction\sand\sperformance\sincrease. +D 2021-06-19T20:20:23.249 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 6079ee9dc399a7a6f0727f2c6ba2f43c18600c71827a76ddcdedde54a58b646e +F src/btree.c 5c6533683f1ece5159a6e4a2cbbf71dd9b3ff75c4748998497ad37870578c3d4 F src/btree.h ace9c1c243612bb95c32d848e3f9e159340c2caefcb68412b441569f56328f65 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 @@ -1918,7 +1918,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 3b0d34e5e5f9a16c3397e4551f3b534729b1b375770f05f6ed5847818b1f4c0b -R e85267aa1e581371a6eeabbe5500efbb +P 2eb6697051c13bf0cc3772fd6c16bfdea0be3b01c0d985e05004c04eaf7a4a48 +R f4744447deeee4d736853bd310124014 U drh -Z 413ce8c5c5db00ea92410effb5485be3 +Z d23a58a69ada4da5b4f1a357cc1eef9e diff --git a/manifest.uuid b/manifest.uuid index 72466dd3c4..923919bed6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2eb6697051c13bf0cc3772fd6c16bfdea0be3b01c0d985e05004c04eaf7a4a48 \ No newline at end of file +70d1836474207fa045ff7aa513839c9df26ea6e180eb898b30d89bd5b3833f58 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 12d07dcc01..2f7e398f39 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8903,9 +8903,6 @@ int sqlite3BtreeInsert( r.aMem = pX->aMem; r.nField = pX->nMem; r.default_rc = 0; - r.errCode = 0; - r.r1 = 0; - r.r2 = 0; r.eqSeen = 0; rc = sqlite3BtreeIndexMoveto(pCur, &r, &loc); }else{ From 41d26396bbc8d7e2f2ae479d621cc38accd56cd0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 20 Jun 2021 22:17:49 +0000 Subject: [PATCH 005/100] Do not allow an SQLITE_CORRUPT error to mask a prior SQLITE_IOERR in balance_nonroot(). dbsqlfuzz 5e1c86e7f18023f2b9abe3429977d7ea726f50d8 FossilOrigin-Name: 50e818767e423991b99b3155cb15a0d1c1b744ab6139a8273f9348aab9a53d9c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7d36e6ee78..3c3956ab19 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sunnecessary\s(redundant)\svariable\sinitialization\sfrom\nsqlite3BtreeInsert()\sfor\sa\ssmall\ssize\sreduction\sand\sperformance\sincrease. -D 2021-06-19T20:20:23.249 +C Do\snot\sallow\san\sSQLITE_CORRUPT\serror\sto\smask\sa\sprior\sSQLITE_IOERR\sin\nbalance_nonroot().\s\sdbsqlfuzz\s5e1c86e7f18023f2b9abe3429977d7ea726f50d8 +D 2021-06-20T22:17:49.519 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 5c6533683f1ece5159a6e4a2cbbf71dd9b3ff75c4748998497ad37870578c3d4 +F src/btree.c df7f1f926d7a5aa7687f93f63eddf8dfc2c4156cb4d6dfb3fd00c54180446198 F src/btree.h ace9c1c243612bb95c32d848e3f9e159340c2caefcb68412b441569f56328f65 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 @@ -1918,7 +1918,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 2eb6697051c13bf0cc3772fd6c16bfdea0be3b01c0d985e05004c04eaf7a4a48 -R f4744447deeee4d736853bd310124014 +P 70d1836474207fa045ff7aa513839c9df26ea6e180eb898b30d89bd5b3833f58 +R 177db51702586a2991feeee2ddea1f57 U drh -Z d23a58a69ada4da5b4f1a357cc1eef9e +Z e0ef153a9222b50c9eeb03894347cc76 diff --git a/manifest.uuid b/manifest.uuid index 923919bed6..0b302acc91 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -70d1836474207fa045ff7aa513839c9df26ea6e180eb898b30d89bd5b3833f58 \ No newline at end of file +50e818767e423991b99b3155cb15a0d1c1b744ab6139a8273f9348aab9a53d9c \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 2f7e398f39..f6e31513ad 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8081,7 +8081,9 @@ static int balance_nonroot( apOld[i] = 0; rc = sqlite3PagerWrite(pNew->pDbPage); nNew++; - if( sqlite3PagerPageRefcount(pNew->pDbPage)!=1+(i==(iParentIdx-nxDiv)) ){ + if( sqlite3PagerPageRefcount(pNew->pDbPage)!=1+(i==(iParentIdx-nxDiv)) + && rc==SQLITE_OK + ){ rc = SQLITE_CORRUPT_BKPT; } if( rc ) goto balance_cleanup; From b915418134767ae766def5cfd5db2f994c476ea2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 20 Jun 2021 22:49:26 +0000 Subject: [PATCH 006/100] Remove a NEVER() that is reachable by a corrupt database. dbsqlfuzz 8456a0f88e39a49fb675d8f77394979ebb2a03c1. Test case in TH3. FossilOrigin-Name: 1c41e86fa102ec2b73fb7a55357ba6328fda37af316215e8808be88e2d1fd75f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3c3956ab19..13e0f30a5f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\san\sSQLITE_CORRUPT\serror\sto\smask\sa\sprior\sSQLITE_IOERR\sin\nbalance_nonroot().\s\sdbsqlfuzz\s5e1c86e7f18023f2b9abe3429977d7ea726f50d8 -D 2021-06-20T22:17:49.519 +C Remove\sa\sNEVER()\sthat\sis\sreachable\sby\sa\scorrupt\sdatabase.\ndbsqlfuzz\s8456a0f88e39a49fb675d8f77394979ebb2a03c1.\s\sTest\scase\sin\sTH3. +D 2021-06-20T22:49:26.003 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c df7f1f926d7a5aa7687f93f63eddf8dfc2c4156cb4d6dfb3fd00c54180446198 +F src/btree.c 8bb85e524ba7f8bce294deedaf8f86582a5ae72f1fe2fd33ca18dfdaa876b9db F src/btree.h ace9c1c243612bb95c32d848e3f9e159340c2caefcb68412b441569f56328f65 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 @@ -1918,7 +1918,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 70d1836474207fa045ff7aa513839c9df26ea6e180eb898b30d89bd5b3833f58 -R 177db51702586a2991feeee2ddea1f57 +P 50e818767e423991b99b3155cb15a0d1c1b744ab6139a8273f9348aab9a53d9c +R 31a2e489dd9012401c2a06d6d5b87f8d U drh -Z e0ef153a9222b50c9eeb03894347cc76 +Z 05cc657cd536aa29caf5c5f5c0efa654 diff --git a/manifest.uuid b/manifest.uuid index 0b302acc91..5c3df6864f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -50e818767e423991b99b3155cb15a0d1c1b744ab6139a8273f9348aab9a53d9c \ No newline at end of file +1c41e86fa102ec2b73fb7a55357ba6328fda37af316215e8808be88e2d1fd75f \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f6e31513ad..22624b5df4 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1682,7 +1682,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ int g2; assert( pSpace+nByte<=data+pPage->pBt->usableSize ); *pIdx = g2 = (int)(pSpace-data); - if( NEVER(g2<=gap) ){ + if( g2<=gap ){ return SQLITE_CORRUPT_PAGE(pPage); }else{ return SQLITE_OK; From 4d2c20331a3aca0e7c4b84fd27696f5a0e304838 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 20 Jun 2021 22:52:51 +0000 Subject: [PATCH 007/100] Load recent dbsqlfuzz cases into test/fuzzdata8.db. FossilOrigin-Name: a766bba0eead47e9ff24b6afd152a7fbd331261e04dd76feb9510585a08c5786 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 2398208 -> 2502656 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 13e0f30a5f..28e3c25f37 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sNEVER()\sthat\sis\sreachable\sby\sa\scorrupt\sdatabase.\ndbsqlfuzz\s8456a0f88e39a49fb675d8f77394979ebb2a03c1.\s\sTest\scase\sin\sTH3. -D 2021-06-20T22:49:26.003 +C Load\srecent\sdbsqlfuzz\scases\sinto\stest/fuzzdata8.db. +D 2021-06-20T22:52:51.103 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1056,7 +1056,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 9e0123ce3df47d1f159f7b71d60b96bd8b89800a40ab081c5402167d7239ead7 +F test/fuzzdata8.db a44fe27989a002c0c9b554923ecf933b9f16750c1c0bb187a04f5beee0802aa6 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1918,7 +1918,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 50e818767e423991b99b3155cb15a0d1c1b744ab6139a8273f9348aab9a53d9c -R 31a2e489dd9012401c2a06d6d5b87f8d +P 1c41e86fa102ec2b73fb7a55357ba6328fda37af316215e8808be88e2d1fd75f +R 672505c5366119aa1f60ba1d5624e0f4 U drh -Z 05cc657cd536aa29caf5c5f5c0efa654 +Z fa7f3737c560a11c39f1b19fa42176a0 diff --git a/manifest.uuid b/manifest.uuid index 5c3df6864f..52b7acfc99 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c41e86fa102ec2b73fb7a55357ba6328fda37af316215e8808be88e2d1fd75f \ No newline at end of file +a766bba0eead47e9ff24b6afd152a7fbd331261e04dd76feb9510585a08c5786 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 86217e4b421375154ba0316867b7d9aa9514c191..7e6764af0b237cb400f472116ec469a0fd9e8b91 100644 GIT binary patch delta 43364 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

`-e7^m9JG^FrU_430HWEdpyz8$=7c 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 R9@FcGB3sr!vi$_G{|}#lVxa&4 delta 37546 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 SHHw|3A Date: Tue, 22 Jun 2021 14:59:34 +0000 Subject: [PATCH 008/100] Ensure that the cell array used in balance_nonroot() is always large enough, even if the pages being balanced are corrupt. FossilOrigin-Name: 53f64e83b39cb56ac7211ffc80d06da13318e1da9dbca7b9123954f5be229a0d --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 28e3c25f37..9a78c17320 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Load\srecent\sdbsqlfuzz\scases\sinto\stest/fuzzdata8.db. -D 2021-06-20T22:52:51.103 +C Ensure\sthat\sthe\scell\sarray\sused\sin\sbalance_nonroot()\sis\salways\slarge\senough,\seven\sif\sthe\spages\sbeing\sbalanced\sare\scorrupt. +D 2021-06-22T14:59:34.354 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 8bb85e524ba7f8bce294deedaf8f86582a5ae72f1fe2fd33ca18dfdaa876b9db +F src/btree.c 195bb34aecc258cdf4093497f4e586914df0dbf84e3f4e69eb88243810886ec8 F src/btree.h ace9c1c243612bb95c32d848e3f9e159340c2caefcb68412b441569f56328f65 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 @@ -1918,7 +1918,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 1c41e86fa102ec2b73fb7a55357ba6328fda37af316215e8808be88e2d1fd75f -R 672505c5366119aa1f60ba1d5624e0f4 -U drh -Z fa7f3737c560a11c39f1b19fa42176a0 +P a766bba0eead47e9ff24b6afd152a7fbd331261e04dd76feb9510585a08c5786 +R 9b0dfa599c959c734c474e105e6aca28 +U dan +Z f84f280f537453851309b8a740cc4fce diff --git a/manifest.uuid b/manifest.uuid index 52b7acfc99..2f50fd913c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a766bba0eead47e9ff24b6afd152a7fbd331261e04dd76feb9510585a08c5786 \ No newline at end of file +53f64e83b39cb56ac7211ffc80d06da13318e1da9dbca7b9123954f5be229a0d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 22624b5df4..b764e3de6d 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7757,6 +7757,7 @@ static int balance_nonroot( goto balance_cleanup; } } + nMaxCells += apOld[i]->nCell + ArraySize(pParent->apOvfl); if( (i--)==0 ) break; if( pParent->nOverflow && i+nxDiv==pParent->aiOvfl[0] ){ @@ -7798,7 +7799,6 @@ static int balance_nonroot( /* Make nMaxCells a multiple of 4 in order to preserve 8-byte ** alignment */ - nMaxCells = nOld*(MX_CELL(pBt) + ArraySize(pParent->apOvfl)); nMaxCells = (nMaxCells + 3)&~3; /* From 020c4f38308398795f4906b2f2669f6abb3d9137 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 22 Jun 2021 18:06:23 +0000 Subject: [PATCH 009/100] Fix a problem causing sqlite3_changes() to return an incorrect value following a "DELETE FROM tbl" command on an intkey table (because internal b+tree cells were being included in the count). FossilOrigin-Name: f662ff4746aaa43e63e20710b8cbfeeceab3183e953ac1685c41846d2e9d124c --- manifest | 15 +++++---- manifest.uuid | 2 +- src/btree.c | 1 + test/changes.test | 84 +++++++++++++++++++++++++++++++++++++++++++++++ test/delete.test | 2 +- 5 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 test/changes.test diff --git a/manifest b/manifest index 9a78c17320..6b799dd407 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\scell\sarray\sused\sin\sbalance_nonroot()\sis\salways\slarge\senough,\seven\sif\sthe\spages\sbeing\sbalanced\sare\scorrupt. -D 2021-06-22T14:59:34.354 +C Fix\sa\sproblem\scausing\ssqlite3_changes()\sto\sreturn\san\sincorrect\svalue\sfollowing\sa\s"DELETE\sFROM\stbl"\scommand\son\san\sintkey\stable\s(because\sinternal\sb+tree\scells\swere\sbeing\sincluded\sin\sthe\scount). +D 2021-06-22T18:06:23.070 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 195bb34aecc258cdf4093497f4e586914df0dbf84e3f4e69eb88243810886ec8 +F src/btree.c 34f14b261a0de31a2c195c88a698e940e93e112c137845c620a7149fde493300 F src/btree.h ace9c1c243612bb95c32d848e3f9e159340c2caefcb68412b441569f56328f65 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 @@ -756,6 +756,7 @@ F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/carray01.test 3f2658bbddd75a013735a296ae2178ff441aca3f00ba623cfbae00b732ede792 F test/cast.test 336fa21989b5170ebcaf90c24266be22dd97b3e23d1fad5ecf6ad4efb04c4423 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef +F test/changes.test 5d39e302b1d8047897961fdd682b4ce74a8abae6a7ba921a949d12ad0c4a9673 F test/check.test 4a2a91ed67eee84a6be16057c48d5198b6fb24849cd6da6cd855981de3fbb416 F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 @@ -836,7 +837,7 @@ F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef F test/decimal.test fcf403fd5585f47342234e153c4a4338cd737b8e0884ac66fc484df47dbcf1a7 F test/default.test 9687cfb16717e4b8238c191697c98be88c0b16e568dd5368cd9284154097ef50 -F test/delete.test 438c14fdf2f2a520b63f892ea645896acf8832e2a2308578593d8e05274314b1 +F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0 F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab F test/delete4.test 51fafebe9503a40796d1aae1565c60524cada720e50eecac01b7fd0419d9ea0b @@ -1918,7 +1919,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 a766bba0eead47e9ff24b6afd152a7fbd331261e04dd76feb9510585a08c5786 -R 9b0dfa599c959c734c474e105e6aca28 +P 53f64e83b39cb56ac7211ffc80d06da13318e1da9dbca7b9123954f5be229a0d +R b8b931728b78e63830e81de935919c1c U dan -Z f84f280f537453851309b8a740cc4fce +Z 0889b85b76d9b21be2f69e6657d9c993 diff --git a/manifest.uuid b/manifest.uuid index 2f50fd913c..698f3426e2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -53f64e83b39cb56ac7211ffc80d06da13318e1da9dbca7b9123954f5be229a0d \ No newline at end of file +f662ff4746aaa43e63e20710b8cbfeeceab3183e953ac1685c41846d2e9d124c \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index b764e3de6d..f6e6ec545f 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9576,6 +9576,7 @@ static int clearDatabasePage( if( !pPage->leaf ){ rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); if( rc ) goto cleardatabasepage_out; + if( pPage->intKey ) pnChange = 0; } if( pnChange ){ testcase( !pPage->intKey ); diff --git a/test/changes.test b/test/changes.test new file mode 100644 index 0000000000..3b31c50c0d --- /dev/null +++ b/test/changes.test @@ -0,0 +1,84 @@ +# 2021 June 22 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Tests for the sqlite3_changes() and sqlite3_total_changes() APIs. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix changes + + +foreach {tn nRow wor} { + 1 50 "" + 2 50 "WITHOUT ROWID" + + 3 5000 "" + 4 5000 "WITHOUT ROWID" + + 5 50000 "" + 6 50000 "WITHOUT ROWID" +} { + reset_db + set nBig [expr $nRow] + + do_execsql_test 1.$tn.0 " + PRAGMA journal_mode = off; + CREATE TABLE t1(x INTEGER PRIMARY KEY) $wor; + " {off} + + do_execsql_test 1.$tn.1 { + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i < $nBig + ) + INSERT INTO t1 SELECT i FROM s; + } + + do_test 1.$tn.2 { + db changes + } [expr $nBig] + + do_test 1.$tn.3 { + db total_changes + } [expr $nBig] + + do_execsql_test 1.$tn.4 { + INSERT INTO t1 VALUES(-1) + } + + do_test 1.$tn.5 { + db changes + } [expr 1] + + do_test 1.$tn.6 { + db total_changes + } [expr {$nBig+1}] + + do_execsql_test 1.$tn.7a { + SELECT count(*) FROM t1 + } [expr {$nBig+1}] + + do_execsql_test 1.$tn.7 { + DELETE FROM t1 + } + + do_test 1.$tn.8 { + db changes + } [expr {$nBig+1}] + + do_test 1.$tn.9 { + db total_changes + } [expr {2*($nBig+1)}] +} + +finish_test + + diff --git a/test/delete.test b/test/delete.test index c15ac53c63..a448e52dd2 100644 --- a/test/delete.test +++ b/test/delete.test @@ -100,7 +100,7 @@ do_test delete-5.2.1 { } {200} do_test delete-5.2.2 { execsql {DELETE FROM table1} -} {202} +} {200} do_test delete-5.2.3 { execsql {BEGIN TRANSACTION} for {set i 1} {$i<=200} {incr i} { From 2c7188732d7c62a0b04bc972c3b161442e693e28 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 22 Jun 2021 18:32:05 +0000 Subject: [PATCH 010/100] Add the sqlite3_changes64() and sqlite3_total_changes64() API functions. FossilOrigin-Name: 48fdec22c966003f5577e0bf52906ef90df11e4e395723a646304e67ed976f37 --- manifest | 34 +++++++++++++++++----------------- manifest.uuid | 2 +- src/btree.c | 4 ++-- src/btree.h | 2 +- src/func.c | 2 +- src/main.c | 10 ++++++++-- src/sqlite.h.in | 21 +++++++++++++++------ src/sqliteInt.h | 6 +++--- src/tclsqlite.c | 4 ++-- src/vacuum.c | 4 ++-- src/vdbe.c | 2 +- src/vdbeInt.h | 6 +++--- src/vdbeaux.c | 2 +- test/changes.test | 6 ++++++ 14 files changed, 63 insertions(+), 42 deletions(-) diff --git a/manifest b/manifest index 6b799dd407..9a44b2b29f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\scausing\ssqlite3_changes()\sto\sreturn\san\sincorrect\svalue\sfollowing\sa\s"DELETE\sFROM\stbl"\scommand\son\san\sintkey\stable\s(because\sinternal\sb+tree\scells\swere\sbeing\sincluded\sin\sthe\scount). -D 2021-06-22T18:06:23.070 +C Add\sthe\ssqlite3_changes64()\sand\ssqlite3_total_changes64()\sAPI\sfunctions. +D 2021-06-22T18:32:05.878 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,8 +485,8 @@ F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c 34f14b261a0de31a2c195c88a698e940e93e112c137845c620a7149fde493300 -F src/btree.h ace9c1c243612bb95c32d848e3f9e159340c2caefcb68412b441569f56328f65 +F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 +F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c @@ -499,7 +499,7 @@ F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf F src/expr.c 30a2abf526531ce6bd45fbc85bfec0fc3f6e5a0fb490cd2350855f2fc34dd789 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 -F src/func.c 9eb67f0aaf1cf439c21d6fc8afe270973d6e8345af3f1ebda98ad42186d30f5b +F src/func.c 29264c728fc02a167eabc7c30c6c7719d8c9020f7ce5795061d25cf3322ed2d8 F src/global.c 25ba4d58476f6be29bba9d9d14f7f146b78476d3a4d75ebb8c3b736328afe0f9 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -508,7 +508,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 12684b3f19cd103cea97cdf14d0758196d0c646e12a898d7245141a9abfde9a4 -F src/main.c 9c06f8dc6137aaa990692ce30db1c00c3e6a574c5a4756640625c19b507c65ec +F src/main.c c49a03dc832c479fbdce6f0bb51f20ac3c7c2541a956c8cba68a2f61c4d23ba6 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -546,14 +546,14 @@ F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 F src/shell.c.in f3e91c697f33daae14923355dcadfc26bb0c1eabdb343e5508706893e017a0a6 -F src/sqlite.h.in 8549395aa13361d5dcea04e3a57d680af10f7ee0989c45ebfffe3a3bcb2cdc3d +F src/sqlite.h.in ee3df0ee7aa8ca2364377861bfa0ebd33b86c34d212f915147df9fc6a09b980f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e -F src/sqliteInt.h ab37a8dd95884fc25ef1eb7b6d53d6674905c67298affc2b5bf947f739096504 +F src/sqliteInt.h fccf952bd572fe52f3bd2928982bd80933308c1118fdde27f667d0de7c77fb30 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 97645e4a15dde6a6ad6de8d81057ff9869413b866015a89e208fedacd709493e +F src/tclsqlite.c 05663f6b5010b044eac0ef22fc8fb5ea3406d2502700a898261683258042c88b F src/test1.c 2100f4c28bae21ce83a9a0c5ec6827efd0e15d11b93b569b614daa5654b3fcf6 F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 @@ -615,12 +615,12 @@ F src/update.c 56fa0458b1ffc1042629f926443e8ed44203983df3ab2b0db2ba556e6ceed68c F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 -F src/vacuum.c 492422c1463c076473bae1858799c7a0a5fe87a133d1223239447c422cd26286 -F src/vdbe.c 226deb5bc5d88c4feb215cccaecdbe36924078737f27629fa06123d4da10f609 +F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 +F src/vdbe.c e86894469af9c4c7824832df00f38ef727f6127080c69a7ad2f06d519c6db9aa F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe -F src/vdbeInt.h 465fcb494db4ca6630fb9c19b2f3dfed597fbe885b0d4204193a5093b0dd7dc6 +F src/vdbeInt.h 1fc1e3581afcd3f56bdbe930639edac84ee823c034f31da97f49c35522f4c8c2 F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 -F src/vdbeaux.c 17e5f6a491d439396296dd20427829fad14c78a6be8f84415d253ff94c31ce9a +F src/vdbeaux.c 23f9800742b11eb6d1d775fd332a88252e44e9f7ba94b826e211a5d9dbfe0ced F src/vdbeblob.c c6b8db50b227f66fb404215732068df76485b5b433e5f9d4d9ac27410b218193 F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 @@ -756,7 +756,7 @@ F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/carray01.test 3f2658bbddd75a013735a296ae2178ff441aca3f00ba623cfbae00b732ede792 F test/cast.test 336fa21989b5170ebcaf90c24266be22dd97b3e23d1fad5ecf6ad4efb04c4423 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/changes.test 5d39e302b1d8047897961fdd682b4ce74a8abae6a7ba921a949d12ad0c4a9673 +F test/changes.test 9dd8e597d84072122fc8a4fcdea837f4a54a461e6e536053ea984303e8ca937b F test/check.test 4a2a91ed67eee84a6be16057c48d5198b6fb24849cd6da6cd855981de3fbb416 F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 @@ -1919,7 +1919,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 53f64e83b39cb56ac7211ffc80d06da13318e1da9dbca7b9123954f5be229a0d -R b8b931728b78e63830e81de935919c1c +P f662ff4746aaa43e63e20710b8cbfeeceab3183e953ac1685c41846d2e9d124c +R d7ab321cd3717ae98c57b82526dde848 U dan -Z 0889b85b76d9b21be2f69e6657d9c993 +Z 21b9ccfdea30ed9e9c32e68e5722010b diff --git a/manifest.uuid b/manifest.uuid index 698f3426e2..a38d536818 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f662ff4746aaa43e63e20710b8cbfeeceab3183e953ac1685c41846d2e9d124c \ No newline at end of file +48fdec22c966003f5577e0bf52906ef90df11e4e395723a646304e67ed976f37 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f6e6ec545f..57c556cc26 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9543,7 +9543,7 @@ static int clearDatabasePage( BtShared *pBt, /* The BTree that contains the table */ Pgno pgno, /* Page number to clear */ int freePageFlag, /* Deallocate page if true */ - int *pnChange /* Add number of Cells freed to this counter */ + i64 *pnChange /* Add number of Cells freed to this counter */ ){ MemPage *pPage; int rc; @@ -9606,7 +9606,7 @@ cleardatabasepage_out: ** If pnChange is not NULL, then the integer value pointed to by pnChange ** is incremented by the number of entries in the table. */ -int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){ +int sqlite3BtreeClearTable(Btree *p, int iTable, i64 *pnChange){ int rc; BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); diff --git a/src/btree.h b/src/btree.h index fe724d6bb5..f80ba4a97b 100644 --- a/src/btree.h +++ b/src/btree.h @@ -123,7 +123,7 @@ int sqlite3BtreeIncrVacuum(Btree *); #define BTREE_BLOBKEY 2 /* Table has keys only - no data */ int sqlite3BtreeDropTable(Btree*, int, int*); -int sqlite3BtreeClearTable(Btree*, int, int*); +int sqlite3BtreeClearTable(Btree*, int, i64*); int sqlite3BtreeClearTableOfCursor(BtCursor*); int sqlite3BtreeTripAllCursors(Btree*, int, int); diff --git a/src/func.c b/src/func.c index dc19ec7222..807b4574a1 100644 --- a/src/func.c +++ b/src/func.c @@ -582,7 +582,7 @@ static void changes( ){ sqlite3 *db = sqlite3_context_db_handle(context); UNUSED_PARAMETER2(NotUsed, NotUsed2); - sqlite3_result_int(context, sqlite3_changes(db)); + sqlite3_result_int64(context, sqlite3_changes64(db)); } /* diff --git a/src/main.c b/src/main.c index a04a6bc0f2..f73f103f2a 100644 --- a/src/main.c +++ b/src/main.c @@ -1086,7 +1086,7 @@ void sqlite3_set_last_insert_rowid(sqlite3 *db, sqlite3_int64 iRowid){ /* ** Return the number of changes in the most recent call to sqlite3_exec(). */ -int sqlite3_changes(sqlite3 *db){ +sqlite3_int64 sqlite3_changes64(sqlite3 *db){ #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ){ (void)SQLITE_MISUSE_BKPT; @@ -1095,11 +1095,14 @@ int sqlite3_changes(sqlite3 *db){ #endif return db->nChange; } +int sqlite3_changes(sqlite3 *db){ + return (int)sqlite3_changes64(db); +} /* ** Return the number of changes since the database handle was opened. */ -int sqlite3_total_changes(sqlite3 *db){ +sqlite3_int64 sqlite3_total_changes64(sqlite3 *db){ #ifdef SQLITE_ENABLE_API_ARMOR if( !sqlite3SafetyCheckOk(db) ){ (void)SQLITE_MISUSE_BKPT; @@ -1108,6 +1111,9 @@ int sqlite3_total_changes(sqlite3 *db){ #endif return db->nTotalChange; } +int sqlite3_total_changes(sqlite3 *db){ + return (int)sqlite3_total_changes64(db); +} /* ** Close all open savepoints. This function only manipulates fields of the diff --git a/src/sqlite.h.in b/src/sqlite.h.in index f8037a2d94..28c4bf01ef 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2464,11 +2464,14 @@ void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); ** CAPI3REF: Count The Number Of Rows Modified ** METHOD: sqlite3 ** -** ^This function returns the number of rows modified, inserted or +** ^These functions return the number of rows modified, inserted or ** deleted by the most recently completed INSERT, UPDATE or DELETE ** statement on the database connection specified by the only parameter. -** ^Executing any other type of SQL statement does not modify the value -** returned by this function. +** The two functions are identical except for the type of the return value +** and that if the number of rows modified by the most recent INSERT, UPDATE +** or DELETE is greater than the maximum value supported by type "int", then +** the return value of sqlite3_changes() is undefined. ^Executing any other +** type of SQL statement does not modify the value returned by these functions. ** ** ^Only changes made directly by the INSERT, UPDATE or DELETE statement are ** considered - auxiliary changes caused by [CREATE TRIGGER | triggers], @@ -2517,16 +2520,21 @@ void sqlite3_set_last_insert_rowid(sqlite3*,sqlite3_int64); ** */ int sqlite3_changes(sqlite3*); +sqlite3_int64 sqlite3_changes64(sqlite3*); /* ** CAPI3REF: Total Number Of Rows Modified ** METHOD: sqlite3 ** -** ^This function returns the total number of rows inserted, modified or +** ^These functions return the total number of rows inserted, modified or ** deleted by all [INSERT], [UPDATE] or [DELETE] statements completed ** since the database connection was opened, including those executed as -** part of trigger programs. ^Executing any other type of SQL statement -** does not affect the value returned by sqlite3_total_changes(). +** part of trigger programs. The two functions are identical except for the +** type of the return value and that if the number of rows modified by the +** connection exceeds the maximum value supported by type "int", then +** the return value of sqlite3_total_changes() is undefined. ^Executing +** any other type of SQL statement does not affect the value returned by +** sqlite3_total_changes(). ** ** ^Changes made as part of [foreign key actions] are included in the ** count, but those made as part of REPLACE constraint resolution are @@ -2554,6 +2562,7 @@ int sqlite3_changes(sqlite3*); ** */ int sqlite3_total_changes(sqlite3*); +sqlite3_int64 sqlite3_total_changes64(sqlite3*); /* ** CAPI3REF: Interrupt A Long-Running Query diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 91af412bbd..6906d7ed57 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1522,8 +1522,8 @@ struct sqlite3 { u8 nSqlExec; /* Number of pending OP_SqlExec opcodes */ int nextPagesize; /* Pagesize after VACUUM if >0 */ u32 magic; /* Magic number for detect library misuse */ - int nChange; /* Value returned by sqlite3_changes() */ - int nTotalChange; /* Value returned by sqlite3_total_changes() */ + i64 nChange; /* Value returned by sqlite3_changes() */ + i64 nTotalChange; /* Value returned by sqlite3_total_changes() */ int aLimit[SQLITE_N_LIMIT]; /* Limits */ int nMaxSorterMmap; /* Maximum size of regions mapped by sorter */ struct sqlite3InitInfo { /* Information used during initialization */ @@ -4741,7 +4741,7 @@ Expr *sqlite3ExprSkipCollateAndLikely(Expr*); int sqlite3CheckCollSeq(Parse *, CollSeq *); int sqlite3WritableSchema(sqlite3*); int sqlite3CheckObjectName(Parse*, const char*,const char*,const char*); -void sqlite3VdbeSetChanges(sqlite3 *, int); +void sqlite3VdbeSetChanges(sqlite3 *, i64); int sqlite3AddInt64(i64*,i64); int sqlite3SubInt64(i64*,i64); int sqlite3MulInt64(i64*,i64); diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 2206bca321..8874ab7699 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -2207,7 +2207,7 @@ static int SQLITE_TCLAPI DbObjCmd( return TCL_ERROR; } pResult = Tcl_GetObjResult(interp); - Tcl_SetIntObj(pResult, sqlite3_changes(pDb->db)); + Tcl_SetWideIntObj(pResult, sqlite3_changes64(pDb->db)); break; } @@ -3255,7 +3255,7 @@ deserialize_error: return TCL_ERROR; } pResult = Tcl_GetObjResult(interp); - Tcl_SetIntObj(pResult, sqlite3_total_changes(pDb->db)); + Tcl_SetWideIntObj(pResult, sqlite3_total_changes64(pDb->db)); break; } diff --git a/src/vacuum.c b/src/vacuum.c index 93e2307d1a..be0e17535d 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -151,8 +151,8 @@ SQLITE_NOINLINE int sqlite3RunVacuum( Btree *pTemp; /* The temporary database we vacuum into */ u32 saved_mDbFlags; /* Saved value of db->mDbFlags */ u64 saved_flags; /* Saved value of db->flags */ - int saved_nChange; /* Saved value of db->nChange */ - int saved_nTotalChange; /* Saved value of db->nTotalChange */ + i64 saved_nChange; /* Saved value of db->nChange */ + i64 saved_nTotalChange; /* Saved value of db->nTotalChange */ u32 saved_openFlags; /* Saved value of db->openFlags */ u8 saved_mTrace; /* Saved trace settings */ Db *pDb = 0; /* Database to detach at end of vacuum */ diff --git a/src/vdbe.c b/src/vdbe.c index 6623009aac..e21e0a55f0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -6250,7 +6250,7 @@ case OP_Destroy: { /* out2 */ ** See also: Destroy */ case OP_Clear: { - int nChange; + i64 nChange; sqlite3VdbeIncrWriteCounter(p, 0); nChange = 0; diff --git a/src/vdbeInt.h b/src/vdbeInt.h index b6e0288807..4a41c43a52 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -180,8 +180,8 @@ struct VdbeFrame { int nMem; /* Number of entries in aMem */ int nChildMem; /* Number of memory cells for child frame */ int nChildCsr; /* Number of cursors for child frame */ - int nChange; /* Statement changes (Vdbe.nChange) */ - int nDbChange; /* Value of db->nChange */ + i64 nChange; /* Statement changes (Vdbe.nChange) */ + i64 nDbChange; /* Value of db->nChange */ }; /* Magic number for sanity checking on VdbeFrame objects */ @@ -388,7 +388,7 @@ struct Vdbe { u32 cacheCtr; /* VdbeCursor row cache generation counter */ int pc; /* The program counter */ int rc; /* Value to return */ - int nChange; /* Number of db changes made since last reset */ + i64 nChange; /* Number of db changes made since last reset */ int iStatement; /* Statement number (or 0 if has no opened stmt) */ i64 iCurrentTime; /* Value of julianday('now') for this statement */ i64 nFkConstraint; /* Number of imm. FK constraints this VM */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index edbf062749..7f08b5d25b 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -5009,7 +5009,7 @@ int sqlite3VdbeIdxKeyCompare( ** This routine sets the value to be returned by subsequent calls to ** sqlite3_changes() on the database handle 'db'. */ -void sqlite3VdbeSetChanges(sqlite3 *db, int nChange){ +void sqlite3VdbeSetChanges(sqlite3 *db, i64 nChange){ assert( sqlite3_mutex_held(db->mutex) ); db->nChange = nChange; db->nTotalChange += nChange; diff --git a/test/changes.test b/test/changes.test index 3b31c50c0d..21db075f96 100644 --- a/test/changes.test +++ b/test/changes.test @@ -16,6 +16,12 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix changes +# To test that the change-counters do not suffer from 32-bit signed integer +# rollover, add the following line to the array of test cases below. The +# test will take will over an hour to run. +# +# 7 (1<<31)+10 "" +# foreach {tn nRow wor} { 1 50 "" From 415ac68ae8a5c6c9a8806cc34b01101ca0891bd3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 22 Jun 2021 23:24:58 +0000 Subject: [PATCH 011/100] When an index is used by all branches of the WHERE_MULTI_OR optimization and becomes a covering index, make sure the index has been created prior to NULLing it in the OP_NullRow opcode of a LEFT JOIN. See [forum:/forumpost/0575376e07|forum post 0575376e07]. The covering-index for WHERE_MULTI_OR optimization was added by [62678be3df35cdcb]. Test cases are in the orindex01.test module of TH3. FossilOrigin-Name: 787c76a865dc51dbca4f30432d64783199c2efb1df4619e4bbaf32182977321e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9a44b2b29f..3832754d7b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_changes64()\sand\ssqlite3_total_changes64()\sAPI\sfunctions. -D 2021-06-22T18:32:05.878 +C When\san\sindex\sis\sused\sby\sall\sbranches\sof\sthe\sWHERE_MULTI_OR\soptimization\sand\nbecomes\sa\scovering\sindex,\smake\ssure\sthe\sindex\shas\sbeen\screated\sprior\sto\nNULLing\sit\sin\sthe\sOP_NullRow\sopcode\sof\sa\sLEFT\sJOIN.\s\sSee\n[forum:/forumpost/0575376e07|forum\spost\s0575376e07].\sThe\scovering-index\sfor\nWHERE_MULTI_OR\soptimization\swas\sadded\sby\s[62678be3df35cdcb].\s\sTest\scases\sare\nin\sthe\sorindex01.test\smodule\sof\sTH3. +D 2021-06-22T23:24:58.974 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -631,7 +631,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c c8ec20a1ca161d5635a4f19c2a4efec2e006e19a8a61f272bf6bce1c80ab7436 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c 4caf843825c6292440113258fefaa6f747fd570c6915628957e42e39529988f5 +F src/where.c 07a4097fe42a01b1f99d2a136598654051f0bdcd6c17cbef7fa285a9cf21e4d2 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 @@ -1919,7 +1919,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 f662ff4746aaa43e63e20710b8cbfeeceab3183e953ac1685c41846d2e9d124c -R d7ab321cd3717ae98c57b82526dde848 -U dan -Z 21b9ccfdea30ed9e9c32e68e5722010b +P 48fdec22c966003f5577e0bf52906ef90df11e4e395723a646304e67ed976f37 +R 0c3802e30d8eb8e5ba1262b0a9261706 +U drh +Z 4d743af5a71a6dfd210821eb424bdaa1 diff --git a/manifest.uuid b/manifest.uuid index a38d536818..667e267c8a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -48fdec22c966003f5577e0bf52906ef90df11e4e395723a646304e67ed976f37 \ No newline at end of file +787c76a865dc51dbca4f30432d64783199c2efb1df4619e4bbaf32182977321e \ No newline at end of file diff --git a/src/where.c b/src/where.c index 5315520db4..467963fda5 100644 --- a/src/where.c +++ b/src/where.c @@ -5528,6 +5528,12 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ if( (ws & WHERE_INDEXED) || ((ws & WHERE_MULTI_OR) && pLevel->u.pCovidx) ){ + if( ws & WHERE_MULTI_OR ){ + Index *pIx = pLevel->u.pCovidx; + int iDb = sqlite3SchemaToIndex(db, pIx->pSchema); + sqlite3VdbeAddOp3(v, OP_ReopenIdx, pLevel->iIdxCur, pIx->tnum, iDb); + sqlite3VdbeSetP4KeyInfo(pParse, pIx); + } sqlite3VdbeAddOp1(v, OP_NullRow, pLevel->iIdxCur); } if( pLevel->op==OP_Return ){ From a261c02d44bd2dad9dad019207c00c3b0e5d00ba Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 23 Jun 2021 11:12:48 +0000 Subject: [PATCH 012/100] Fix a problem handling ORDER BY terms of the form "ORDER BY likely()" within window frames. FossilOrigin-Name: 710f75b98bb4ac5bfdfa745c1de832dd1e4d9fb387da52b2f0d1353613f5cdc3 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/window.c | 4 +--- test/window1.test | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 3832754d7b..eaca06a849 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\san\sindex\sis\sused\sby\sall\sbranches\sof\sthe\sWHERE_MULTI_OR\soptimization\sand\nbecomes\sa\scovering\sindex,\smake\ssure\sthe\sindex\shas\sbeen\screated\sprior\sto\nNULLing\sit\sin\sthe\sOP_NullRow\sopcode\sof\sa\sLEFT\sJOIN.\s\sSee\n[forum:/forumpost/0575376e07|forum\spost\s0575376e07].\sThe\scovering-index\sfor\nWHERE_MULTI_OR\soptimization\swas\sadded\sby\s[62678be3df35cdcb].\s\sTest\scases\sare\nin\sthe\sorindex01.test\smodule\sof\sTH3. -D 2021-06-22T23:24:58.974 +C Fix\sa\sproblem\shandling\sORDER\sBY\sterms\sof\sthe\sform\s"ORDER\sBY\slikely()"\swithin\swindow\sframes. +D 2021-06-23T11:12:48.590 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -635,7 +635,7 @@ F src/where.c 07a4097fe42a01b1f99d2a136598654051f0bdcd6c17cbef7fa285a9cf21e4d2 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 -F src/window.c a6d624d83b2d5b3cfb82bb437a2fbae759c928d47dc9ad1338a9419269181bb2 +F src/window.c 559961a731f67a0873744960bdeeb034a5c74cc0a09badb14bc43f74744a2a9d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test eecb0dabee4b7765a8465439d5e99429279ffba23ca74a7eae270a452799f9e7 @@ -1775,7 +1775,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 49eadb28b0bae0f916518c9983b1fb7450c198915664f323b2bfc480cc98c431 +F test/window1.test 9242d8083158d17b9b0cb8c7ecfc767987a1863c0076020b3ecb197df7d71886 F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1919,7 +1919,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 48fdec22c966003f5577e0bf52906ef90df11e4e395723a646304e67ed976f37 -R 0c3802e30d8eb8e5ba1262b0a9261706 -U drh -Z 4d743af5a71a6dfd210821eb424bdaa1 +P 787c76a865dc51dbca4f30432d64783199c2efb1df4619e4bbaf32182977321e +R 040b3a70559e632e7f4d0e77b4ed4a83 +U dan +Z a607a5f52d5e3746cd5c447f723f1e23 diff --git a/manifest.uuid b/manifest.uuid index 667e267c8a..f0c2c4a56c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -787c76a865dc51dbca4f30432d64783199c2efb1df4619e4bbaf32182977321e \ No newline at end of file +710f75b98bb4ac5bfdfa745c1de832dd1e4d9fb387da52b2f0d1353613f5cdc3 \ No newline at end of file diff --git a/src/window.c b/src/window.c index 2afa7c12ce..f33c51150a 100644 --- a/src/window.c +++ b/src/window.c @@ -908,9 +908,7 @@ static ExprList *exprListAppendList( if( bIntToNull ){ int iDummy; Expr *pSub; - for(pSub=pDup; ExprHasProperty(pSub, EP_Skip); pSub=pSub->pLeft){ - assert( pSub ); - } + pSub = sqlite3ExprSkipCollateAndLikely(pDup); if( sqlite3ExprIsInteger(pSub, &iDummy) ){ pSub->op = TK_NULL; pSub->flags &= ~(EP_IntValue|EP_IsTrue|EP_IsFalse); diff --git a/test/window1.test b/test/window1.test index 886bf468ff..8db23c55a6 100644 --- a/test/window1.test +++ b/test/window1.test @@ -2175,5 +2175,19 @@ do_catchsql_test 69.2 { SELECT * FROM t1 WHERE b <= (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a)); } {1 {misuse of aggregate: sum()}} +# 2021-06-23 +# Forum https://sqlite.org/forum/forumpost/31e0432608 +# +reset_db +do_execsql_test 70.0 { + CREATE TABLE t1(a); +} +do_execsql_test 70.1 { + SELECT substr(a,4,lag(a,7) OVER(PARTITION BY 'cf23' ORDER BY 2)) AS ca0 FROM t1 ORDER BY ca0; +} +do_execsql_test 70.2 { + SELECT substr(a,4,lag(a,7) OVER(PARTITION BY 'cf23' ORDER BY likely(2))) AS ca0 FROM t1 ORDER BY ca0; +} + finish_test From 9b9f235165bd5a1093d6568ccc658a648b998412 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 23 Jun 2021 11:39:00 +0000 Subject: [PATCH 013/100] Show CROSS JOINs in the TreeView debuggingn output. FossilOrigin-Name: 72e09b6c9b74c8226b231fec021228af6bc191fc1b5798d0ff2e893f4ba203bf --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/treeview.c | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index eaca06a849..ea9f540a60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\shandling\sORDER\sBY\sterms\sof\sthe\sform\s"ORDER\sBY\slikely()"\swithin\swindow\sframes. -D 2021-06-23T11:12:48.590 +C Show\sCROSS\sJOINs\sin\sthe\sTreeView\sdebuggingn\soutput. +D 2021-06-23T11:39:00.942 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c 21449a944d5abd3ac07b7eab76f7221e20c9480d06f01798f8dc66d9bc361769 +F src/treeview.c 306674a0ff430b00f6532baeea2eb531aa64046ac35843d80a64b8da15cec98f F src/trigger.c e0fd347b2571a2d956318cdc6d011ccca7ce862d10a0ca04188a37920ef5440c F src/update.c 56fa0458b1ffc1042629f926443e8ed44203983df3ab2b0db2ba556e6ceed68c F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 @@ -1919,7 +1919,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 787c76a865dc51dbca4f30432d64783199c2efb1df4619e4bbaf32182977321e -R 040b3a70559e632e7f4d0e77b4ed4a83 -U dan -Z a607a5f52d5e3746cd5c447f723f1e23 +P 710f75b98bb4ac5bfdfa745c1de832dd1e4d9fb387da52b2f0d1353613f5cdc3 +R deb7f56745addc69e13d52fefa0f17ad +U drh +Z 7e9741f4effaeb688f644a914016758c diff --git a/manifest.uuid b/manifest.uuid index f0c2c4a56c..6a7f5bdf50 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -710f75b98bb4ac5bfdfa745c1de832dd1e4d9fb387da52b2f0d1353613f5cdc3 \ No newline at end of file +72e09b6c9b74c8226b231fec021228af6bc191fc1b5798d0ff2e893f4ba203bf \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index c737a1b98b..673dc919ff 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -142,6 +142,8 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ } if( pItem->fg.jointype & JT_LEFT ){ sqlite3_str_appendf(&x, " LEFT-JOIN"); + }else if( pItem->fg.jointype & JT_CROSS ){ + sqlite3_str_appendf(&x, " CROSS-JOIN"); } if( pItem->fg.fromDDL ){ sqlite3_str_appendf(&x, " DDL"); From 10496f765752e4d2d89700360b2f172e11ae392d Mon Sep 17 00:00:00 2001 From: larrybr Date: Wed, 23 Jun 2021 16:07:20 +0000 Subject: [PATCH 014/100] Fully incorporate *_changes64() API improvement. FossilOrigin-Name: 6699a2f6bec9dfcdc456ff1cd8e652588b144ec28b7eac6e403a63eab61b416e --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/func.c | 8 ++++---- src/loadext.c | 3 +++ src/shell.c.in | 4 ++-- src/sqlite3ext.h | 3 +++ 6 files changed, 23 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index ea9f540a60..986f868a19 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Show\sCROSS\sJOINs\sin\sthe\sTreeView\sdebuggingn\soutput. -D 2021-06-23T11:39:00.942 +C Fully\sincorporate\s*_changes64()\sAPI\simprovement. +D 2021-06-23T16:07:20.905 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -499,7 +499,7 @@ F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf F src/expr.c 30a2abf526531ce6bd45fbc85bfec0fc3f6e5a0fb490cd2350855f2fc34dd789 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 -F src/func.c 29264c728fc02a167eabc7c30c6c7719d8c9020f7ce5795061d25cf3322ed2d8 +F src/func.c c96ac6f7c4f2d684217c4673a80446e1b50e25b5ea79366f333f484622d010a0 F src/global.c 25ba4d58476f6be29bba9d9d14f7f146b78476d3a4d75ebb8c3b736328afe0f9 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -507,7 +507,7 @@ F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 12684b3f19cd103cea97cdf14d0758196d0c646e12a898d7245141a9abfde9a4 +F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c c49a03dc832c479fbdce6f0bb51f20ac3c7c2541a956c8cba68a2f61c4d23ba6 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -545,10 +545,10 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 -F src/shell.c.in f3e91c697f33daae14923355dcadfc26bb0c1eabdb343e5508706893e017a0a6 +F src/shell.c.in 07c3c9ef05efdabd747acd0b009049ae0c5f4d4348496d5e29dcdf524e6fbd12 F src/sqlite.h.in ee3df0ee7aa8ca2364377861bfa0ebd33b86c34d212f915147df9fc6a09b980f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e +F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h fccf952bd572fe52f3bd2928982bd80933308c1118fdde27f667d0de7c77fb30 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 @@ -1919,7 +1919,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 710f75b98bb4ac5bfdfa745c1de832dd1e4d9fb387da52b2f0d1353613f5cdc3 -R deb7f56745addc69e13d52fefa0f17ad -U drh -Z 7e9741f4effaeb688f644a914016758c +P 72e09b6c9b74c8226b231fec021228af6bc191fc1b5798d0ff2e893f4ba203bf +R bf91e00e9cc16aaadb2a6f2dc21018c5 +U larrybr +Z 41681127996cac22e60cc7c5f13b9397 diff --git a/manifest.uuid b/manifest.uuid index 6a7f5bdf50..0ffc8170fa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -72e09b6c9b74c8226b231fec021228af6bc191fc1b5798d0ff2e893f4ba203bf \ No newline at end of file +6699a2f6bec9dfcdc456ff1cd8e652588b144ec28b7eac6e403a63eab61b416e \ No newline at end of file diff --git a/src/func.c b/src/func.c index 807b4574a1..bb2f6c7b4e 100644 --- a/src/func.c +++ b/src/func.c @@ -572,7 +572,7 @@ static void last_insert_rowid( ** Implementation of the changes() SQL function. ** ** IMP: R-62073-11209 The changes() SQL function is a wrapper -** around the sqlite3_changes() C/C++ function and hence follows the same +** around the sqlite3_changes64() C/C++ function and hence follows the same ** rules for counting changes. */ static void changes( @@ -587,7 +587,7 @@ static void changes( /* ** Implementation of the total_changes() SQL function. The return value is -** the same as the sqlite3_total_changes() API function. +** the same as the sqlite3_total_changes64() API function. */ static void total_changes( sqlite3_context *context, @@ -596,9 +596,9 @@ static void total_changes( ){ sqlite3 *db = sqlite3_context_db_handle(context); UNUSED_PARAMETER2(NotUsed, NotUsed2); - /* IMP: R-52756-41993 This function is a wrapper around the + /* IMP: R-52756-41993 This function was a wrapper around the ** sqlite3_total_changes() C/C++ interface. */ - sqlite3_result_int(context, sqlite3_total_changes(db)); + sqlite3_result_int64(context, sqlite3_total_changes64(db)); } /* diff --git a/src/loadext.c b/src/loadext.c index aeea837c97..29371336c4 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -480,6 +480,9 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_database_file_object, /* Version 3.34.0 and later */ sqlite3_txn_state, + /* Version 3.36.1 and later */ + sqlite3_changes64, + sqlite3_total_changes64, }; /* True if x is the directory separator character diff --git a/src/shell.c.in b/src/shell.c.in index 0f8de61a14..39f1d08b59 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10523,8 +10523,8 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ } return 1; }else if( ShellHasFlag(p, SHFLG_CountChanges) ){ - raw_printf(p->out, "changes: %3d total_changes: %d\n", - sqlite3_changes(p->db), sqlite3_total_changes(p->db)); + raw_printf(p->out, "changes: %3lld total_changes: %lld\n", + sqlite3_changes64(p->db), sqlite3_total_changes64(p->db)); } return 0; } diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index 217601fd90..98d9305240 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -337,6 +337,9 @@ struct sqlite3_api_routines { sqlite3_file *(*database_file_object)(const char*); /* Version 3.34.0 and later */ int (*txn_state)(sqlite3*,const char*); + /* Version 3.36.1 and later */ + sqlite3_int64 (*changes64)(sqlite3*); + sqlite3_int64 (*total_changes64)(sqlite3*); }; /* From c06836c3b1461afcadfb68b20cbf41f0c41d3105 Mon Sep 17 00:00:00 2001 From: larrybr Date: Wed, 23 Jun 2021 17:41:38 +0000 Subject: [PATCH 015/100] Make conditional nature of sqlite3_normalized_sql() better known. FossilOrigin-Name: 0e0ece7111945d61278e60385f883303b593ed0d64beeb951b9c49f243531628 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 986f868a19..0b1abe7100 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fully\sincorporate\s*_changes64()\sAPI\simprovement. -D 2021-06-23T16:07:20.905 +C Make\sconditional\snature\sof\ssqlite3_normalized_sql()\sbetter\sknown. +D 2021-06-23T17:41:38.452 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -546,7 +546,7 @@ F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 F src/shell.c.in 07c3c9ef05efdabd747acd0b009049ae0c5f4d4348496d5e29dcdf524e6fbd12 -F src/sqlite.h.in ee3df0ee7aa8ca2364377861bfa0ebd33b86c34d212f915147df9fc6a09b980f +F src/sqlite.h.in c1c540911a4bb6a9c8e12385a2b7b271bbb8b520c1b3ca8405d605a66f1f45c0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h fccf952bd572fe52f3bd2928982bd80933308c1118fdde27f667d0de7c77fb30 @@ -1919,7 +1919,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 72e09b6c9b74c8226b231fec021228af6bc191fc1b5798d0ff2e893f4ba203bf -R bf91e00e9cc16aaadb2a6f2dc21018c5 +P 6699a2f6bec9dfcdc456ff1cd8e652588b144ec28b7eac6e403a63eab61b416e +R 97422642c89cbcd5a06a3965ff4e42a5 U larrybr -Z 41681127996cac22e60cc7c5f13b9397 +Z 081b6dfad3e7ceb900a3ca592bf7620d diff --git a/manifest.uuid b/manifest.uuid index 0ffc8170fa..f8e64bdd7e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6699a2f6bec9dfcdc456ff1cd8e652588b144ec28b7eac6e403a63eab61b416e \ No newline at end of file +0e0ece7111945d61278e60385f883303b593ed0d64beeb951b9c49f243531628 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 28c4bf01ef..553dc8aea3 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4169,10 +4169,15 @@ int sqlite3_prepare16_v3( ** ^The string returned by sqlite3_expanded_sql(P), on the other hand, ** is obtained from [sqlite3_malloc()] and must be free by the application ** by passing it to [sqlite3_free()]. +** +** ^The sqlite3_normalized_sql() interface is only available if +** the [SQLITE_ENABLE_NORMALIZE] compile-time option is defined. */ const char *sqlite3_sql(sqlite3_stmt *pStmt); char *sqlite3_expanded_sql(sqlite3_stmt *pStmt); +#ifdef SQLITE_ENABLE_NORMALIZE const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); +#endif /* ** CAPI3REF: Determine If An SQL Statement Writes The Database From dff34ab96f12640212ef249cba899f172f7d69d4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 24 Jun 2021 18:23:54 +0000 Subject: [PATCH 016/100] Allow the SQLITE_OPEN_EXCLUSIVE flag in sqlite3_open(). Return the SQLITE_CANTOPEN_EXISTS extended code to indicate that the open failed because the database already exists. FossilOrigin-Name: d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/main.c | 1 - src/os_unix.c | 2 ++ src/shell.c.in | 2 ++ src/sqlite.h.in | 7 +++++++ 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 0b1abe7100..00633470da 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sconditional\snature\sof\ssqlite3_normalized_sql()\sbetter\sknown. -D 2021-06-23T17:41:38.452 +C Allow\sthe\sSQLITE_OPEN_EXCLUSIVE\sflag\sin\ssqlite3_open().\s\sReturn\sthe\nSQLITE_CANTOPEN_EXISTS\sextended\scode\sto\sindicate\sthat\sthe\sopen\sfailed\sbecause\nthe\sdatabase\salready\sexists. +D 2021-06-24T18:23:54.265 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -508,7 +508,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c c49a03dc832c479fbdce6f0bb51f20ac3c7c2541a956c8cba68a2f61c4d23ba6 +F src/main.c aedd8596e4dbdedacbf69fc4ff0462404effb9e6528146a1fdf4adee004053c9 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -528,7 +528,7 @@ F src/os.c 59ed1f503347e8b5434c0ce7d7d0f02a3f24a72fea8b26d0bba2de8dfaef778b F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c feac74a0ba7652c405ba30f61d9e738be717d15899f2915a129ef160a3e5b26b +F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5 F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 @@ -545,8 +545,8 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 -F src/shell.c.in 07c3c9ef05efdabd747acd0b009049ae0c5f4d4348496d5e29dcdf524e6fbd12 -F src/sqlite.h.in c1c540911a4bb6a9c8e12385a2b7b271bbb8b520c1b3ca8405d605a66f1f45c0 +F src/shell.c.in a41dd6ac58ed2edfb9967bbf774ae2418ef03e6e2a8ce9420dffd4d5681f3b6d +F src/sqlite.h.in 3411513e1aa0a07cfd669b7cf1817bb4a394ffb71ca09e30933433edbc82528e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h fccf952bd572fe52f3bd2928982bd80933308c1118fdde27f667d0de7c77fb30 @@ -1919,7 +1919,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 6699a2f6bec9dfcdc456ff1cd8e652588b144ec28b7eac6e403a63eab61b416e -R 97422642c89cbcd5a06a3965ff4e42a5 -U larrybr -Z 081b6dfad3e7ceb900a3ca592bf7620d +P 0e0ece7111945d61278e60385f883303b593ed0d64beeb951b9c49f243531628 +R d49c4e4c2feb2977a624c53673d27670 +U drh +Z a9d994e59c81c672b66c62cc7efdfd13 diff --git a/manifest.uuid b/manifest.uuid index f8e64bdd7e..880df83d62 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e0ece7111945d61278e60385f883303b593ed0d64beeb951b9c49f243531628 \ No newline at end of file +d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 \ No newline at end of file diff --git a/src/main.c b/src/main.c index f73f103f2a..e2ebb1ef2f 100644 --- a/src/main.c +++ b/src/main.c @@ -3149,7 +3149,6 @@ static int openDatabase( ** off all other flags. */ flags &= ~( SQLITE_OPEN_DELETEONCLOSE | - SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TRANSIENT_DB | diff --git a/src/os_unix.c b/src/os_unix.c index d45fdabab2..aa6b3b8e4c 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6185,6 +6185,8 @@ static int unixOpen( /* If unable to create a journal because the directory is not ** writable, change the error code to indicate that. */ rc = SQLITE_READONLY_DIRECTORY; + }else if( errno==EEXIST ){ + rc = SQLITE_CANTOPEN_EXISTS; }else if( errno!=EISDIR && isReadWrite ){ /* Failed to open the file for read/write access. Try read-only. */ flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); diff --git a/src/shell.c.in b/src/shell.c.in index 39f1d08b59..1f064fa96f 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8730,6 +8730,8 @@ static int do_meta_command(char *zLine, ShellState *p){ p->openMode = SHELL_OPEN_READONLY; }else if( optionMatch(z, "nofollow") ){ p->openFlags |= SQLITE_OPEN_NOFOLLOW; + }else if( optionMatch(z, "excl") ){ + p->openFlags |= SQLITE_OPEN_EXCLUSIVE; #ifndef SQLITE_OMIT_DESERIALIZE }else if( optionMatch(z, "deserialize") ){ p->openMode = SHELL_OPEN_DESERIALIZE; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 553dc8aea3..6dcd25d4c0 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -516,6 +516,7 @@ int sqlite3_exec( #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ #define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) +#define SQLITE_CANTOPEN_EXISTS (SQLITE_CANTOPEN | (7<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8)) @@ -3394,6 +3395,12 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ** [[OPEN_NOFOLLOW]] ^(

[SQLITE_OPEN_NOFOLLOW]
**
The database filename is not allowed to be a symbolic link
+** +** [[OPEN_EXCLUSIVE]] ^(
[SQLITE_OPEN_EXCLUSIVE]
+**
This flag causes the open to fail if the database file already +** exists. The open will only be success if this flag is used in combination +** with the SQLITE_OPEN_CREATE and SQLITE_OPEN_READWRITE flags and if +** the file does not previously exist.
** )^ ** ** If the 3rd parameter to sqlite3_open_v2() is not one of the From 83cb9eb48e2c92683fd59de787335ae6f8a9c06b Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 25 Jun 2021 00:25:38 +0000 Subject: [PATCH 017/100] Document sqlite3_wal_hook() return. FossilOrigin-Name: 8acaf7964551b4524fcdbb8d01fae7b0911508ecf6dcf23c3e0f8d8c790b78d8 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 5 +++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 00633470da..a4343b2e89 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sthe\sSQLITE_OPEN_EXCLUSIVE\sflag\sin\ssqlite3_open().\s\sReturn\sthe\nSQLITE_CANTOPEN_EXISTS\sextended\scode\sto\sindicate\sthat\sthe\sopen\sfailed\sbecause\nthe\sdatabase\salready\sexists. -D 2021-06-24T18:23:54.265 +C Document\ssqlite3_wal_hook()\sreturn. +D 2021-06-25T00:25:38.963 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -546,7 +546,7 @@ F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 F src/shell.c.in a41dd6ac58ed2edfb9967bbf774ae2418ef03e6e2a8ce9420dffd4d5681f3b6d -F src/sqlite.h.in 3411513e1aa0a07cfd669b7cf1817bb4a394ffb71ca09e30933433edbc82528e +F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h fccf952bd572fe52f3bd2928982bd80933308c1118fdde27f667d0de7c77fb30 @@ -1919,7 +1919,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 0e0ece7111945d61278e60385f883303b593ed0d64beeb951b9c49f243531628 -R d49c4e4c2feb2977a624c53673d27670 -U drh -Z a9d994e59c81c672b66c62cc7efdfd13 +P d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 +R 68a99ca98b293264fdcf19f9731a02ba +U larrybr +Z febec1d836abbd001f8ff04bf4b6b37f diff --git a/manifest.uuid b/manifest.uuid index 880df83d62..594f58e297 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 \ No newline at end of file +8acaf7964551b4524fcdbb8d01fae7b0911508ecf6dcf23c3e0f8d8c790b78d8 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 6dcd25d4c0..cad89b37b1 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -9031,8 +9031,9 @@ void sqlite3_log(int iErrCode, const char *zFormat, ...); ** ** A single database handle may have at most a single write-ahead log callback ** registered at one time. ^Calling [sqlite3_wal_hook()] replaces any -** previously registered write-ahead log callback. ^Note that the -** [sqlite3_wal_autocheckpoint()] interface and the +** previously registered write-ahead log callback. ^The return value is +** a copy of the third parameter from the previous call, if any, or 0. +** ^Note that the [sqlite3_wal_autocheckpoint()] interface and the ** [wal_autocheckpoint pragma] both invoke [sqlite3_wal_hook()] and will ** overwrite any prior [sqlite3_wal_hook()] settings. */ From 69935c0935be5a0b410aef79fa2049af1201233e Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 25 Jun 2021 11:14:10 +0000 Subject: [PATCH 018/100] Fix a bug in the ".fullschema" dot-command of the CLI brought to light by check-in [a2ddb89b206c1387] - raising an error on at attempt to access the rowid of a subquery or view. FossilOrigin-Name: 36875827a416067e1b8ffba0ff0ff88313177f8d84dd8e5bc9c23ea3f2d587ba --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a4343b2e89..e06a475420 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Document\ssqlite3_wal_hook()\sreturn. -D 2021-06-25T00:25:38.963 +C Fix\sa\sbug\sin\sthe\s".fullschema"\sdot-command\sof\sthe\sCLI\sbrought\sto\slight\sby\ncheck-in\s[a2ddb89b206c1387]\s-\sraising\san\serror\son\sat\sattempt\sto\saccess\sthe\nrowid\sof\sa\ssubquery\sor\sview. +D 2021-06-25T11:14:10.652 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 -F src/shell.c.in a41dd6ac58ed2edfb9967bbf774ae2418ef03e6e2a8ce9420dffd4d5681f3b6d +F src/shell.c.in a51de4f1f9d3e8510e095f9099c701d914968a0f20950f304745c3e0f8cf1626 F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1919,7 +1919,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 d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 -R 68a99ca98b293264fdcf19f9731a02ba -U larrybr -Z febec1d836abbd001f8ff04bf4b6b37f +P 8acaf7964551b4524fcdbb8d01fae7b0911508ecf6dcf23c3e0f8d8c790b78d8 +R aebdda5224a0a63abb78bffc26330861 +U drh +Z 8cef5f08df554ceda36b81b1c7575d49 diff --git a/manifest.uuid b/manifest.uuid index 594f58e297..068b9181d2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8acaf7964551b4524fcdbb8d01fae7b0911508ecf6dcf23c3e0f8d8c790b78d8 \ No newline at end of file +36875827a416067e1b8ffba0ff0ff88313177f8d84dd8e5bc9c23ea3f2d587ba \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 1f064fa96f..a5b90ea495 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8060,7 +8060,7 @@ static int do_meta_command(char *zLine, ShellState *p){ " FROM sqlite_schema UNION ALL" " SELECT sql, type, tbl_name, name, rowid FROM sqlite_temp_schema) " "WHERE type!='meta' AND sql NOTNULL AND name NOT LIKE 'sqlite_%' " - "ORDER BY rowid", + "ORDER BY x", callback, &data, 0 ); if( rc==SQLITE_OK ){ From 81640a226ef62dfa7e3317e223cfb6214d770220 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 25 Jun 2021 11:21:21 +0000 Subject: [PATCH 019/100] Remove a redundant "ANALYZE" line from the ".fullschema" output. FossilOrigin-Name: 7b47f420954000ce46d05adde6e91a2fbdab8dd528ebd8089cca4fcf9d8a3605 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e06a475420..c75e82f14a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sin\sthe\s".fullschema"\sdot-command\sof\sthe\sCLI\sbrought\sto\slight\sby\ncheck-in\s[a2ddb89b206c1387]\s-\sraising\san\serror\son\sat\sattempt\sto\saccess\sthe\nrowid\sof\sa\ssubquery\sor\sview. -D 2021-06-25T11:14:10.652 +C Remove\sa\sredundant\s"ANALYZE"\sline\sfrom\sthe\s".fullschema"\soutput. +D 2021-06-25T11:21:21.086 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 -F src/shell.c.in a51de4f1f9d3e8510e095f9099c701d914968a0f20950f304745c3e0f8cf1626 +F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4cc F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1919,7 +1919,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 8acaf7964551b4524fcdbb8d01fae7b0911508ecf6dcf23c3e0f8d8c790b78d8 -R aebdda5224a0a63abb78bffc26330861 +P 36875827a416067e1b8ffba0ff0ff88313177f8d84dd8e5bc9c23ea3f2d587ba +R 319bc6af402967c5f681ae21c2a771a7 U drh -Z 8cef5f08df554ceda36b81b1c7575d49 +Z 018d2a6eb739243c48cf000b81003061 diff --git a/manifest.uuid b/manifest.uuid index 068b9181d2..7bf648c5fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36875827a416067e1b8ffba0ff0ff88313177f8d84dd8e5bc9c23ea3f2d587ba \ No newline at end of file +7b47f420954000ce46d05adde6e91a2fbdab8dd528ebd8089cca4fcf9d8a3605 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index a5b90ea495..f90822e281 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8076,8 +8076,6 @@ static int do_meta_command(char *zLine, ShellState *p){ raw_printf(p->out, "/* No STAT tables available */\n"); }else{ raw_printf(p->out, "ANALYZE sqlite_schema;\n"); - sqlite3_exec(p->db, "SELECT 'ANALYZE sqlite_schema'", - callback, &data, 0); data.cMode = data.mode = MODE_Insert; data.zDestTable = "sqlite_stat1"; shell_exec(&data, "SELECT * FROM sqlite_stat1", 0); From 4422b3a64690110e7731335f59e0a0b833e4ea59 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 25 Jun 2021 14:48:24 +0000 Subject: [PATCH 020/100] The OP_ReopenIdx opcode should clear the cursor if the cursor is being reused. This prevents leaving the cursor in an initialized state which could cause problems for a subsequent OP_SeekScan opcode. Fix for ticket [6dcbfd11cf666e21] and the OP_SeekScan optimization of check-in [4a43430fd23f8835]. FossilOrigin-Name: d4bf5243f2bf0a2bc77ad12f3e1e4797cb62f2745f9d54eee5f675c3b5f80880 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 2 ++ test/in4.test | 26 ++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c75e82f14a..48c33257de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sredundant\s"ANALYZE"\sline\sfrom\sthe\s".fullschema"\soutput. -D 2021-06-25T11:21:21.086 +C The\sOP_ReopenIdx\sopcode\sshould\sclear\sthe\scursor\sif\sthe\scursor\sis\sbeing\nreused.\s\sThis\sprevents\sleaving\sthe\scursor\sin\san\sinitialized\sstate\swhich\ncould\scause\sproblems\sfor\sa\ssubsequent\sOP_SeekScan\sopcode.\nFix\sfor\sticket\s[6dcbfd11cf666e21]\sand\sthe\sOP_SeekScan\soptimization\nof\scheck-in\s[4a43430fd23f8835]. +D 2021-06-25T14:48:24.152 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,7 +616,7 @@ F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c e86894469af9c4c7824832df00f38ef727f6127080c69a7ad2f06d519c6db9aa +F src/vdbe.c 27149413d6b09684b83746eb8f26210baf50eb23925b64261b6d93119a218435 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 1fc1e3581afcd3f56bdbe930639edac84ee823c034f31da97f49c35522f4c8c2 F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 @@ -1075,7 +1075,7 @@ F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 F test/in.test 688ed2011d922d83141a45af431601738674a4c0bdde34b6351f688b82a169b3 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test addf1416fdbbcf2f082ab7974e4813f38b4759b95699a683a31c37a3fffe7b57 +F test/in4.test e09987d4f2213f9e32a558c5dee4cfa945e2ce7ec0980aae42c2ca453a8ce01a F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 @@ -1919,7 +1919,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 36875827a416067e1b8ffba0ff0ff88313177f8d84dd8e5bc9c23ea3f2d587ba -R 319bc6af402967c5f681ae21c2a771a7 +P 7b47f420954000ce46d05adde6e91a2fbdab8dd528ebd8089cca4fcf9d8a3605 +R c9ef525db14ea1f2cab6b77dc2c157fe U drh -Z 018d2a6eb739243c48cf000b81003061 +Z 1d62a11400fe9140c3b779da4524cbe7 diff --git a/manifest.uuid b/manifest.uuid index 7bf648c5fc..0cd2def447 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7b47f420954000ce46d05adde6e91a2fbdab8dd528ebd8089cca4fcf9d8a3605 \ No newline at end of file +d4bf5243f2bf0a2bc77ad12f3e1e4797cb62f2745f9d54eee5f675c3b5f80880 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index e21e0a55f0..5b42976a0e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3786,6 +3786,8 @@ case OP_ReopenIdx: { pCur = p->apCsr[pOp->p1]; if( pCur && pCur->pgnoRoot==(u32)pOp->p2 ){ assert( pCur->iDb==pOp->p3 ); /* Guaranteed by the code generator */ + assert( pCur->eCurType==CURTYPE_BTREE ); + sqlite3BtreeClearCursor(pCur->uc.pCursor); goto open_cursor_set_hints; } /* If the cursor is not currently open or is open on a different diff --git a/test/in4.test b/test/in4.test index 07bd547707..45ffa71fc5 100644 --- a/test/in4.test +++ b/test/in4.test @@ -470,4 +470,30 @@ do_execsql_test 11.2 { AND c BETWEEN 'abc' AND 'xyz'; } {/ SeekScan /} +# 2021-06-25 ticket 6dcbfd11cf666e21 +# Another problem with OP_SeekScan +# +reset_db +do_execsql_test 12.0 { + CREATE TABLE t1(a,b,c); + CREATE INDEX t1abc ON t1(a,b,c); + CREATE INDEX t1bca on t1(b,c,a); + INSERT INTO t1 VALUES(56,1119,1115); + INSERT INTO t1 VALUES(57,1147,1137); + INSERT INTO t1 VALUES(100,1050,1023); + INSERT INTO t1 VALUES(101,1050,1023); + ANALYZE sqlite_schema; + INSERT INTO sqlite_stat1 VALUES('t1','t1abc','358677 2 2 1'); + INSERT INTO sqlite_stat1 VALUES('t1','t1bca','358677 4 2 1'); + ANALYZE sqlite_schema; + SELECT * FROM t1 NOT INDEXED + WHERE (b = 1137 AND c IN (97, 98)) + OR (b = 1119 AND c IN (1115, 1023)); +} {56 1119 1115} +do_execsql_test 12.1 { + SELECT * FROM t1 + WHERE (b = 1137 AND c IN (97, 98)) + OR (b = 1119 AND c IN (1115, 1023)); +} {56 1119 1115} + finish_test From cf1e25566b5d294593fa310eb9375cc1cb406e5d Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 28 Jun 2021 15:25:17 +0000 Subject: [PATCH 021/100] When generating data for a RETURNING clause, avoid assuming cursor number 0 is available for use. FossilOrigin-Name: 4b2c59acce6ff1bb6c9c04c45c80945ae23a26588718cc20635d60f7497adabb --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/trigger.c | 1 + test/returning1.test | 14 ++++++++++++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 48c33257de..5de092c5b3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sOP_ReopenIdx\sopcode\sshould\sclear\sthe\scursor\sif\sthe\scursor\sis\sbeing\nreused.\s\sThis\sprevents\sleaving\sthe\scursor\sin\san\sinitialized\sstate\swhich\ncould\scause\sproblems\sfor\sa\ssubsequent\sOP_SeekScan\sopcode.\nFix\sfor\sticket\s[6dcbfd11cf666e21]\sand\sthe\sOP_SeekScan\soptimization\nof\scheck-in\s[4a43430fd23f8835]. -D 2021-06-25T14:48:24.152 +C When\sgenerating\sdata\sfor\sa\sRETURNING\sclause,\savoid\sassuming\scursor\snumber\s0\sis\savailable\sfor\suse. +D 2021-06-28T15:25:17.222 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -610,7 +610,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e F src/treeview.c 306674a0ff430b00f6532baeea2eb531aa64046ac35843d80a64b8da15cec98f -F src/trigger.c e0fd347b2571a2d956318cdc6d011ccca7ce862d10a0ca04188a37920ef5440c +F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 F src/update.c 56fa0458b1ffc1042629f926443e8ed44203983df3ab2b0db2ba556e6ceed68c F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 @@ -1300,7 +1300,7 @@ F test/releasetest.tcl 6f803ef0b896f8f3f4c26eb072c0399963a5987a509a64d45f5dfbc1e F test/releasetest_data.tcl f88ed29aa18366ed3956ace36c96ec6868ef5b9ee04cc05d32f4d81031e19e28 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb -F test/returning1.test 52b4ed60f104a4ce85b38417e5319b2078b2b908c71a768d539cee3c0ce8bdc9 +F test/returning1.test 6b29cb020129fc682dbef1890170606fe4e325190b8300d9ee7563640165d708 F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test 3f3a4e20401825017df7e7671e9f31b6de5fae5620c2b9b49917f52f8c160a8f F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a @@ -1919,7 +1919,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 7b47f420954000ce46d05adde6e91a2fbdab8dd528ebd8089cca4fcf9d8a3605 -R c9ef525db14ea1f2cab6b77dc2c157fe -U drh -Z 1d62a11400fe9140c3b779da4524cbe7 +P d4bf5243f2bf0a2bc77ad12f3e1e4797cb62f2745f9d54eee5f675c3b5f80880 +R fa1451caa0f45c6ae133c6c4d565c752 +U dan +Z 71577863a4009a469e681a38dfbd9444 diff --git a/manifest.uuid b/manifest.uuid index 0cd2def447..43327f3b0a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d4bf5243f2bf0a2bc77ad12f3e1e4797cb62f2745f9d54eee5f675c3b5f80880 \ No newline at end of file +4b2c59acce6ff1bb6c9c04c45c80945ae23a26588718cc20635d60f7497adabb \ No newline at end of file diff --git a/src/trigger.c b/src/trigger.c index 90e6ef4a72..c5beeb9844 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -926,6 +926,7 @@ static void codeReturningTrigger( sSelect.pSrc = &sFrom; sFrom.nSrc = 1; sFrom.a[0].pTab = pTab; + sFrom.a[0].iCursor = -1; sqlite3SelectPrep(pParse, &sSelect, 0); if( db->mallocFailed==0 && pParse->nErr==0 ){ sqlite3GenerateColumnNames(pParse, &sSelect); diff --git a/test/returning1.test b/test/returning1.test index dc4655231a..163c2b5de8 100644 --- a/test/returning1.test +++ b/test/returning1.test @@ -318,4 +318,18 @@ do_test 12.4 { lsort [array names cname] } {{"x"+"y"} *} +#------------------------------------------------------------------------- +# Based on dbsqlfuzz find crash-ffbba524cac354b2a61bfd677cec9d2a4333f49a +reset_db +do_execsql_test 13.0 { + CREATE VIRTUAL TABLE t1 USING rtree(a, b, c); + CREATE TABLE t2(x); +} + +do_execsql_test 13.1 { + INSERT INTO t1(a,b,c) VALUES(1,2,3) + RETURNING (SELECT b FROM t2); +} {{}} + + finish_test From 14a1b1c132a0a2249e46980a55e3916a819066bd Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 30 Jun 2021 11:53:21 +0000 Subject: [PATCH 022/100] Do not enforce the SQLITE_LIMIT_FUNCTION_ARG limit for internally generated SQL. This prevents problems with statements like ALTER TABLE if the function argument limit is set too low. [forum:/forumpost/17735aa21f3ddab2|Forum post 17735aa21f3ddab2]. FossilOrigin-Name: 763fdec5b3151eeab001c50e78f654cd9b4b4c10e81e50a663046a70e64d5339 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 5de092c5b3..13c4294a73 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sgenerating\sdata\sfor\sa\sRETURNING\sclause,\savoid\sassuming\scursor\snumber\s0\sis\savailable\sfor\suse. -D 2021-06-28T15:25:17.222 +C Do\snot\senforce\sthe\sSQLITE_LIMIT_FUNCTION_ARG\slimit\sfor\sinternally\sgenerated\nSQL.\s\sThis\sprevents\sproblems\swith\sstatements\slike\sALTER\sTABLE\sif\sthe\nfunction\sargument\slimit\sis\sset\stoo\slow.\n[forum:/forumpost/17735aa21f3ddab2|Forum\spost\s17735aa21f3ddab2]. +D 2021-06-30T11:53:21.401 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c 30a2abf526531ce6bd45fbc85bfec0fc3f6e5a0fb490cd2350855f2fc34dd789 +F src/expr.c d571a83580d0034697a29abbfe95a7750eb8ae7172d6e2c794b1d89ef4ef31dc F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c c96ac6f7c4f2d684217c4673a80446e1b50e25b5ea79366f333f484622d010a0 @@ -1919,7 +1919,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 d4bf5243f2bf0a2bc77ad12f3e1e4797cb62f2745f9d54eee5f675c3b5f80880 -R fa1451caa0f45c6ae133c6c4d565c752 -U dan -Z 71577863a4009a469e681a38dfbd9444 +P 4b2c59acce6ff1bb6c9c04c45c80945ae23a26588718cc20635d60f7497adabb +R 89bc87e746b6516fa7d6d328ad72bca6 +U drh +Z 155cf10bfa58b42375927d36c55cd29c diff --git a/manifest.uuid b/manifest.uuid index 43327f3b0a..d791ecf6db 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b2c59acce6ff1bb6c9c04c45c80945ae23a26588718cc20635d60f7497adabb \ No newline at end of file +763fdec5b3151eeab001c50e78f654cd9b4b4c10e81e50a663046a70e64d5339 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b751f51a6d..06c3b87cdd 100644 --- a/src/expr.c +++ b/src/expr.c @@ -986,7 +986,10 @@ Expr *sqlite3ExprFunction( sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ return 0; } - if( pList && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ + if( pList + && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] + && !pParse->nested + ){ sqlite3ErrorMsg(pParse, "too many arguments on function %T", pToken); } pNew->x.pList = pList; From c629e2178619068b14bb603428ba14a49439b91a Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 30 Jun 2021 12:11:19 +0000 Subject: [PATCH 023/100] Fix an assert() in fts5 that might fail when dealing with corrupt records. FossilOrigin-Name: 9e760e256089c0ebbf816a8de8b186f62e1ffcd6b8b0e76dab8387798cd4d0e1 --- ext/fts5/fts5_buffer.c | 5 +++-- ext/fts5/test/fts5corrupt3.test | 18 ++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index a8f3bee334..886c58957f 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -176,7 +176,7 @@ int sqlite3Fts5PoslistNext64( return 1; }else{ i64 iOff = *piOff; - int iVal; + u32 iVal; fts5FastGetVarint32(a, i, iVal); assert( iVal>=0 ); if( iVal<=1 ){ @@ -186,6 +186,7 @@ int sqlite3Fts5PoslistNext64( } fts5FastGetVarint32(a, i, iVal); iOff = ((i64)iVal) << 32; + assert( iOff>=0 ); fts5FastGetVarint32(a, i, iVal); if( iVal<2 ){ /* This is a corrupt record. So stop parsing it here. */ @@ -197,7 +198,7 @@ int sqlite3Fts5PoslistNext64( *piOff = (iOff & (i64)0x7FFFFFFF<<32)+((iOff + (iVal-2)) & 0x7FFFFFFF); } *pi = i; - assert( *piOff>=iOff ); + assert_nc( *piOff>=iOff ); return 0; } } diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 5604bca76c..67adc64ff1 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -15135,6 +15135,24 @@ do_catchsql_test 77.1 { UPDATE t1 SET B =quote(zeroblob(200)) WHERE b MATCH 'threa*thrad*tlrad*the�d'; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 78.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); + DELETE FROM t1_data; + INSERT INTO t1_data VALUES(1,X'245a2424'); + INSERT INTO t1_data VALUES(10,X'000000000101010001010101'); + INSERT INTO t1_data VALUES(137438953473,X'0000032b0230300102060102060102061f0203010203010203010832303136303630390102070102070102070101340102050102050102050101350102040102040102040207303030303030301c0204010204010204010662696e6172790306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020108636f6d70696c657201200102020201020201066462737ccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccccca2cccccccccc461740702030102030102030204656275670402020102020102020106656e61626c6507020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020523d6763632d352e342e30203230313630363039584e4f4341534526010500430f17434f4d50494c45523d6763632d352e342e3020323031363036303958525452494d0d000000240ee00004a810000fe80fe00fd80fd00fc80fc00fb80fb00fa80fa00f980f900f880f800f780f700f680f60945736502060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020201046f6d59741f0202010202010202010572747265651945030102030102030402696d010601020203060102020306010202030601120203060102020306010202030601020203060102020306010202030601020203060102020306010202010a7468726561647361666522020201020201020201047674616207020401020401020401407801060cb102010601010201060101020106010102010601010201060101020106010102010601010201060e0102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101021106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601011201060101020106010102010601010201060101020106010102041513020c124413110f47130f0c0e11100f0e100f440f1040150f'); +} + +do_execsql_test 78.1 { + CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col'); +} + +do_execsql_test 78.2 { + SELECT count(rowid) FROM t3 WHERE term>='nsocse'; +} 2 + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 13c4294a73..4d893f359c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\senforce\sthe\sSQLITE_LIMIT_FUNCTION_ARG\slimit\sfor\sinternally\sgenerated\nSQL.\s\sThis\sprevents\sproblems\swith\sstatements\slike\sALTER\sTABLE\sif\sthe\nfunction\sargument\slimit\sis\sset\stoo\slow.\n[forum:/forumpost/17735aa21f3ddab2|Forum\spost\s17735aa21f3ddab2]. -D 2021-06-30T11:53:21.401 +C Fix\san\sassert()\sin\sfts5\sthat\smight\sfail\swhen\sdealing\swith\scorrupt\srecords. +D 2021-06-30T12:11:19.208 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -115,7 +115,7 @@ F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a F ext/fts5/fts5Int.h 26c74dd5776f798436fbf604a0bf0e8de263b35b5060b05c15f9085845d9fda2 F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 -F ext/fts5/fts5_buffer.c 605f509f88c73e9ab41323cb6cf74932f936acf3f7d9c87bd0d3c599b4c90281 +F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938df59a1347f F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 9462249a3bb82d0e49b163500f9d2197c2e4cd95bf440a9bbfc3906b22ea1e1b F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 @@ -160,7 +160,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 79467b7c69a9c45ee3260507c4648d6449323aaa3c1e05b360c9479f1aa7dcce +F ext/fts5/test/fts5corrupt3.test 270cc68ff73fb5d7923619f23ef0655bf0409e83bab5790824bec20f0ee3e82e F ext/fts5/test/fts5corrupt4.test f4c08e2182a48d8b70975fd869ee5391855c06d8a0ff87b6a2529e7c5a88a1d3 F ext/fts5/test/fts5delete.test 619295b20dbc1d840b403ee07c878f52378849c3c02e44f2ee143b3e978a0aa7 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e @@ -1919,7 +1919,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 4b2c59acce6ff1bb6c9c04c45c80945ae23a26588718cc20635d60f7497adabb -R 89bc87e746b6516fa7d6d328ad72bca6 -U drh -Z 155cf10bfa58b42375927d36c55cd29c +P 763fdec5b3151eeab001c50e78f654cd9b4b4c10e81e50a663046a70e64d5339 +R 729c303f68b9dba88db1c84e664b83e4 +U dan +Z 07f3ac8a0af0bb00b72dcdaea40211f4 diff --git a/manifest.uuid b/manifest.uuid index d791ecf6db..baf1899300 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -763fdec5b3151eeab001c50e78f654cd9b4b4c10e81e50a663046a70e64d5339 \ No newline at end of file +9e760e256089c0ebbf816a8de8b186f62e1ffcd6b8b0e76dab8387798cd4d0e1 \ No newline at end of file From 90d3b24a169f764895961f1336c73d13af6c464f Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 30 Jun 2021 14:04:25 +0000 Subject: [PATCH 024/100] Fix a memory leak in fts5 that could occur when processing a query containing multiple classes of error. FossilOrigin-Name: 7c279670f544a5bb9733a88862d9e490062b07415cd790e0d6d1e2cb584d2007 --- ext/fts5/fts5_expr.c | 13 +++++-------- ext/fts5/test/fts5detail.test | 4 ++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index f3cec00be8..d1cd5bb7f1 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -135,6 +135,7 @@ void sqlite3Fts5ParseError(Fts5Parse *pParse, const char *zFmt, ...){ va_list ap; va_start(ap, zFmt); if( pParse->rc==SQLITE_OK ){ + assert( pParse->zErr==0 ); pParse->zErr = sqlite3_vmprintf(zFmt, ap); pParse->rc = SQLITE_ERROR; } @@ -2144,9 +2145,8 @@ void sqlite3Fts5ParseSetColset( ){ Fts5Colset *pFree = pColset; if( pParse->pConfig->eDetail==FTS5_DETAIL_NONE ){ - pParse->rc = SQLITE_ERROR; - pParse->zErr = sqlite3_mprintf( - "fts5: column queries are not supported (detail=none)" + sqlite3Fts5ParseError(pParse, + "fts5: column queries are not supported (detail=none)" ); }else{ fts5ParseSetColset(pParse, pExpr, pColset, &pFree); @@ -2320,13 +2320,10 @@ Fts5ExprNode *sqlite3Fts5ParseNode( || pPhrase->nTerm>1 || (pPhrase->nTerm>0 && pPhrase->aTerm[0].bFirst) ){ - assert( pParse->rc==SQLITE_OK ); - pParse->rc = SQLITE_ERROR; - assert( pParse->zErr==0 ); - pParse->zErr = sqlite3_mprintf( + sqlite3Fts5ParseError(pParse, "fts5: %s queries are not supported (detail!=full)", pNear->nPhrase==1 ? "phrase": "NEAR" - ); + ); sqlite3_free(pRet); pRet = 0; } diff --git a/ext/fts5/test/fts5detail.test b/ext/fts5/test/fts5detail.test index cf4b718ba0..267ce6187c 100644 --- a/ext/fts5/test/fts5detail.test +++ b/ext/fts5/test/fts5detail.test @@ -212,6 +212,10 @@ do_catchsql_test 4.1 { SELECT * FROM t4('a:a') } {1 {fts5: column queries are not supported (detail=none)}} +do_catchsql_test 4.2 { + SELECT * FROM t4('a:a &') +} {1 {fts5: syntax error near "&"}} + #------------------------------------------------------------------------- # Test that for the same content detail=none uses less space than # detail=col, and that detail=col uses less space than detail=full diff --git a/manifest b/manifest index 4d893f359c..3fe6b2c583 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sfts5\sthat\smight\sfail\swhen\sdealing\swith\scorrupt\srecords. -D 2021-06-30T12:11:19.208 +C Fix\sa\smemory\sleak\sin\sfts5\sthat\scould\soccur\swhen\sprocessing\sa\squery\scontaining\smultiple\sclasses\sof\serror. +D 2021-06-30T14:04:25.220 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -117,7 +117,7 @@ F ext/fts5/fts5Int.h 26c74dd5776f798436fbf604a0bf0e8de263b35b5060b05c15f9085845d F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938df59a1347f F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 -F ext/fts5/fts5_expr.c 9462249a3bb82d0e49b163500f9d2197c2e4cd95bf440a9bbfc3906b22ea1e1b +F ext/fts5/fts5_expr.c 6ea447b0cb1888110087a8c04133817b0ccf964fe22414371b0e32189a556533 F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 F ext/fts5/fts5_index.c eb1864c6abacf08d959956183a55a4f9767af76be289f2bb519bb0f197b3fd72 F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a @@ -163,7 +163,7 @@ F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec99 F ext/fts5/test/fts5corrupt3.test 270cc68ff73fb5d7923619f23ef0655bf0409e83bab5790824bec20f0ee3e82e F ext/fts5/test/fts5corrupt4.test f4c08e2182a48d8b70975fd869ee5391855c06d8a0ff87b6a2529e7c5a88a1d3 F ext/fts5/test/fts5delete.test 619295b20dbc1d840b403ee07c878f52378849c3c02e44f2ee143b3e978a0aa7 -F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e +F ext/fts5/test/fts5detail.test 54015e9c43ec4ba542cfb93268abdf280e0300f350efd08ee411284b03595cc4 F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 F ext/fts5/test/fts5dlidx.test b90852c55881b29dbac6380b274de27beae623ac4b6d567c6c8fb9cdc315a86e F ext/fts5/test/fts5doclist.test faa9e9cc3c0645fa6203667cb5f007c359447c6ee66753f71a58175c2497cacd @@ -1919,7 +1919,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 763fdec5b3151eeab001c50e78f654cd9b4b4c10e81e50a663046a70e64d5339 -R 729c303f68b9dba88db1c84e664b83e4 +P 9e760e256089c0ebbf816a8de8b186f62e1ffcd6b8b0e76dab8387798cd4d0e1 +R d8e84becbe3e499665a01229c17289ad U dan -Z 07f3ac8a0af0bb00b72dcdaea40211f4 +Z 94aad6f32f8b281da0508c0481608ec6 diff --git a/manifest.uuid b/manifest.uuid index baf1899300..9c34aa36db 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9e760e256089c0ebbf816a8de8b186f62e1ffcd6b8b0e76dab8387798cd4d0e1 \ No newline at end of file +7c279670f544a5bb9733a88862d9e490062b07415cd790e0d6d1e2cb584d2007 \ No newline at end of file From 3832ac9f515106b11f2dad1e1768664cb272ce75 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 1 Jul 2021 16:57:48 +0000 Subject: [PATCH 025/100] Import the updated nmakehlp.c file used by the TCL Extension Architecture (TEA) builds in the amalgamation tarballs. [forum:/forumpost/5a5001f20a|Forum post 5a5001f20a]. FossilOrigin-Name: 595bf95bf8884c545e85e3feee6f43503b59d3c6d69073f0aaba4473c7c61cac --- autoconf/tea/win/nmakehlp.c | 44 ++++++++++++++++++------------------- manifest | 14 ++++++------ manifest.uuid | 2 +- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/autoconf/tea/win/nmakehlp.c b/autoconf/tea/win/nmakehlp.c index 7536edee33..2dc33cc657 100644 --- a/autoconf/tea/win/nmakehlp.c +++ b/autoconf/tea/win/nmakehlp.c @@ -14,8 +14,10 @@ #define _CRT_SECURE_NO_DEPRECATE #include +#ifdef _MSC_VER #pragma comment (lib, "user32.lib") #pragma comment (lib, "kernel32.lib") +#endif #include #include @@ -37,7 +39,7 @@ /* protos */ static int CheckForCompilerFeature(const char *option); -static int CheckForLinkerFeature(const char **options, int count); +static int CheckForLinkerFeature(char **options, int count); static int IsIn(const char *string, const char *substring); static int SubstituteFile(const char *substs, const char *filename); static int QualifyPath(const char *path); @@ -54,8 +56,8 @@ typedef struct { char buffer[STATICBUFFERSIZE]; } pipeinfo; -pipeinfo Out = {INVALID_HANDLE_VALUE, '\0'}; -pipeinfo Err = {INVALID_HANDLE_VALUE, '\0'}; +pipeinfo Out = {INVALID_HANDLE_VALUE, ""}; +pipeinfo Err = {INVALID_HANDLE_VALUE, ""}; /* * exitcodes: 0 == no, 1 == yes, 2 == error @@ -273,7 +275,7 @@ CheckForCompilerFeature( "Tried to launch: \"%s\", but got error [%u]: ", cmdline, err); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS| - FORMAT_MESSAGE_MAX_WIDTH_MASK, 0L, err, 0, (LPVOID)&msg[chars], + FORMAT_MESSAGE_MAX_WIDTH_MASK, 0L, err, 0, (LPSTR)&msg[chars], (300-chars), 0); WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, lstrlen(msg), &err,NULL); return 2; @@ -326,7 +328,7 @@ CheckForCompilerFeature( static int CheckForLinkerFeature( - const char **options, + char **options, int count) { STARTUPINFO si; @@ -407,7 +409,7 @@ CheckForLinkerFeature( "Tried to launch: \"%s\", but got error [%u]: ", cmdline, err); FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS| - FORMAT_MESSAGE_MAX_WIDTH_MASK, 0L, err, 0, (LPVOID)&msg[chars], + FORMAT_MESSAGE_MAX_WIDTH_MASK, 0L, err, 0, (LPSTR)&msg[chars], (300-chars), 0); WriteFile(GetStdHandle(STD_ERROR_HANDLE), msg, lstrlen(msg), &err,NULL); return 2; @@ -503,7 +505,6 @@ GetVersionFromFile( const char *match, int numdots) { - size_t cbBuffer = 100; static char szBuffer[100]; char *szResult = NULL; FILE *fp = fopen(filename, "rt"); @@ -513,7 +514,7 @@ GetVersionFromFile( * Read data until we see our match string. */ - while (fgets(szBuffer, cbBuffer, fp) != NULL) { + while (fgets(szBuffer, sizeof(szBuffer), fp) != NULL) { LPSTR p, q; p = strstr(szBuffer, match); @@ -523,7 +524,7 @@ GetVersionFromFile( */ p += strlen(match); - while (*p && !isdigit(*p)) { + while (*p && !isdigit((unsigned char)*p)) { ++p; } @@ -532,14 +533,13 @@ GetVersionFromFile( */ q = p; - while (*q && (strchr("0123456789.ab", *q)) && ((!strchr(".ab", *q) - && (!strchr("ab", q[-1])) || --numdots))) { + while (*q && (strchr("0123456789.ab", *q)) && (((!strchr(".ab", *q) + && !strchr("ab", q[-1])) || --numdots))) { ++q; } - memcpy(szBuffer, p, q - p); - szBuffer[q-p] = 0; - szResult = szBuffer; + *q = 0; + szResult = p; break; } } @@ -562,7 +562,7 @@ typedef struct list_item_t { static list_item_t * list_insert(list_item_t **listPtrPtr, const char *key, const char *value) { - list_item_t *itemPtr = malloc(sizeof(list_item_t)); + list_item_t *itemPtr = (list_item_t *)malloc(sizeof(list_item_t)); if (itemPtr) { itemPtr->key = strdup(key); itemPtr->value = strdup(value); @@ -611,9 +611,7 @@ SubstituteFile( const char *substitutions, const char *filename) { - size_t cbBuffer = 1024; static char szBuffer[1024], szCopy[1024]; - char *szResult = NULL; list_item_t *substPtr = NULL; FILE *fp, *sp; @@ -626,7 +624,7 @@ SubstituteFile( sp = fopen(substitutions, "rt"); if (sp != NULL) { - while (fgets(szBuffer, cbBuffer, sp) != NULL) { + while (fgets(szBuffer, sizeof(szBuffer), sp) != NULL) { unsigned char *ks, *ke, *vs, *ve; ks = (unsigned char*)szBuffer; while (ks && *ks && isspace(*ks)) ++ks; @@ -657,7 +655,7 @@ SubstituteFile( * Run the substitutions over each line of the input */ - while (fgets(szBuffer, cbBuffer, fp) != NULL) { + while (fgets(szBuffer, sizeof(szBuffer), fp) != NULL) { list_item_t *p = NULL; for (p = substPtr; p != NULL; p = p->nextPtr) { char *m = strstr(szBuffer, p->key); @@ -674,7 +672,7 @@ SubstituteFile( memcpy(szBuffer, szCopy, sizeof(szCopy)); } } - printf(szBuffer); + printf("%s", szBuffer); } list_free(&substPtr); @@ -725,7 +723,8 @@ static int LocateDependencyHelper(const char *dir, const char *keypath) { HANDLE hSearch; char path[MAX_PATH+1]; - int dirlen, keylen, ret; + size_t dirlen; + int keylen, ret; WIN32_FIND_DATA finfo; if (dir == NULL || keypath == NULL) @@ -792,7 +791,8 @@ static int LocateDependencyHelper(const char *dir, const char *keypath) */ static int LocateDependency(const char *keypath) { - int i, ret; + size_t i; + int ret; static const char *paths[] = {"..", "..\\..", "..\\..\\.."}; for (i = 0; i < (sizeof(paths)/sizeof(paths[0])); ++i) { diff --git a/manifest b/manifest index 3fe6b2c583..6abfadbd82 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sin\sfts5\sthat\scould\soccur\swhen\sprocessing\sa\squery\scontaining\smultiple\sclasses\sof\serror. -D 2021-06-30T14:04:25.220 +C Import\sthe\supdated\snmakehlp.c\sfile\sused\sby\sthe\sTCL\sExtension\sArchitecture\s(TEA)\nbuilds\sin\sthe\samalgamation\starballs.\n[forum:/forumpost/5a5001f20a|Forum\spost\s5a5001f20a]. +D 2021-07-01T16:57:48.827 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -29,7 +29,7 @@ F autoconf/tea/pkgIndex.tcl.in 3ef61715cf1c7bdcff56947ffadb26bc991ca39d F autoconf/tea/tclconfig/install-sh bdd5e293591621ae60d9824d86a4b1c5f22c3d00 F autoconf/tea/tclconfig/tcl.m4 66ddf0a5d5e4b1d29bff472c0985fd7fa89d0fb5 F autoconf/tea/win/makefile.vc a5ff708245260c2794c6aaa0151efe5403d5896566eaf096747be0d9075284e4 -F autoconf/tea/win/nmakehlp.c 190bf8b40f6f90eeb6cbc1e5c13a19fc7ad870e479e0314c88174f71bf9e28a7 +F autoconf/tea/win/nmakehlp.c b01f822eabbe1ed2b64e70882d97d48402b42d2689a1ea00342d1a1a7eaa19cb F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc @@ -1919,7 +1919,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 9e760e256089c0ebbf816a8de8b186f62e1ffcd6b8b0e76dab8387798cd4d0e1 -R d8e84becbe3e499665a01229c17289ad -U dan -Z 94aad6f32f8b281da0508c0481608ec6 +P 7c279670f544a5bb9733a88862d9e490062b07415cd790e0d6d1e2cb584d2007 +R ea4df91ece4d61dc769c7d82973a118f +U drh +Z 7ad010d3e1df58bf34aaee6bf80c92a4 diff --git a/manifest.uuid b/manifest.uuid index 9c34aa36db..412a429af9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c279670f544a5bb9733a88862d9e490062b07415cd790e0d6d1e2cb584d2007 \ No newline at end of file +595bf95bf8884c545e85e3feee6f43503b59d3c6d69073f0aaba4473c7c61cac \ No newline at end of file From b9248ef5c7b5409ab39189e3d29951348f4a53ee Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 1 Jul 2021 18:19:17 +0000 Subject: [PATCH 026/100] Allow unqualified "rowid" references to be used in join queries, provided that only one of the source objects has a rowid. FossilOrigin-Name: d4097364c511709b1874881a0c036640777d1f724165416adf6f53a41f8c6e40 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/resolve.c | 7 ++++--- test/autoindex5.test | 6 +++++- test/rowid.test | 30 ++++++++++++++++++++++++++++++ 5 files changed, 49 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 6abfadbd82..ef07b5fdb8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Import\sthe\supdated\snmakehlp.c\sfile\sused\sby\sthe\sTCL\sExtension\sArchitecture\s(TEA)\nbuilds\sin\sthe\samalgamation\starballs.\n[forum:/forumpost/5a5001f20a|Forum\spost\s5a5001f20a]. -D 2021-07-01T16:57:48.827 +C Allow\sunqualified\s"rowid"\sreferences\sto\sbe\sused\sin\sjoin\squeries,\sprovided\sthat\sonly\sone\sof\sthe\ssource\sobjects\shas\sa\srowid. +D 2021-07-01T18:19:17.704 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 +F src/resolve.c 73c7177a20a7e40d3eb2eebf6e4b129e7c1bff2c9047919860bd6e20efd3b2f7 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4cc @@ -699,7 +699,7 @@ F test/autoindex1.test fe27af92eaf884bd9c38f94be3e8afa04ec494e5eefb189902026181a F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2d13958a5617e987624a428d7aed91bf51f322b49b476e3573fadec697ce6da5 F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test ee0aa95e3f44190347a29a672c3d4ecf042e3f33c5fa3dc29f0ab6be057bbded +F test/autoindex5.test 2ee94f033b87ca0160e08d81034c507aff8e230df2627f0304fa309b2fee19a3 F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 F test/avfs.test 0c3a38e03cccb0fc3127838462dc05dc3f4c1480d770c084b388304c25de3652 @@ -1307,7 +1307,7 @@ F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a F test/round1.test 768018b04522ca420b1aba8a24bd76091d269f3bce3902af3ec6ebcee41ab21e F test/rowallock.test 3f88ec6819489d0b2341c7a7528ae17c053ab7cc F test/rowhash.test 0bc1d31415e4575d10cacf31e1a66b5cc0f8be81 -F test/rowid.test bfbd7b97d9267660be3c8f28507c4ed7f205196b8877c0db42df347c2e8845e3 +F test/rowid.test e29025be95baf6b32f0d5edef59a7633028325896a98f1caa8019559ca910350 F test/rowvalue.test 37effea4dd83555ea969a9461dfcffb25e6731a5db7c388e232410999c100853 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 @@ -1919,7 +1919,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 7c279670f544a5bb9733a88862d9e490062b07415cd790e0d6d1e2cb584d2007 -R ea4df91ece4d61dc769c7d82973a118f -U drh -Z 7ad010d3e1df58bf34aaee6bf80c92a4 +P 595bf95bf8884c545e85e3feee6f43503b59d3c6d69073f0aaba4473c7c61cac +R b40ea640e783bee9c07b7a6c7eb2888d +U dan +Z 23ae68986931e08e3c9295a66ca57f7c diff --git a/manifest.uuid b/manifest.uuid index 412a429af9..7cf3822d93 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -595bf95bf8884c545e85e3feee6f43503b59d3c6d69073f0aaba4473c7c61cac \ No newline at end of file +d4097364c511709b1874881a0c036640777d1f724165416adf6f53a41f8c6e40 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 93e10b6e44..936a7587f5 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -331,9 +331,6 @@ static int lookupName( sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); } } - if( 0==(cntTab++) ){ - pMatch = pItem; - } hCol = sqlite3StrIHash(zCol); for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){ @@ -352,6 +349,10 @@ static int lookupName( break; } } + if( 0==cnt && VisibleRowid(pTab) ){ + cntTab++; + pMatch = pItem; + } } if( pMatch ){ pExpr->iTable = pMatch->iCursor; diff --git a/test/autoindex5.test b/test/autoindex5.test index 36695d7f74..aa8dec27d9 100644 --- a/test/autoindex5.test +++ b/test/autoindex5.test @@ -123,6 +123,10 @@ do_execsql_test 2.1 { SELECT sum(z) FROM vvv WHERE x='aaa' ) FROM one; } {8.0} + +# At one point the following was returning "no such column: rowid". This +# was incorrect - "rowid" matches against the rowid of table t1 in this +# query. do_catchsql_test 2.2 { DROP TABLE t1; CREATE TABLE t1(aaa); @@ -136,7 +140,7 @@ do_catchsql_test 2.2 { ) WHERE bbb = 1 ) ); -} {1 {no such column: rowid}} +} {0 9} # Ticket https://www.sqlite.org/src/info/787fa716be3a7f65 # Segfault due to multiple uses of the same subquery where the diff --git a/test/rowid.test b/test/rowid.test index f4fa1ce8dc..4327004d31 100644 --- a/test/rowid.test +++ b/test/rowid.test @@ -18,6 +18,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix rowid # Basic ROWID functionality tests. # @@ -786,5 +787,34 @@ do_execsql_test rowid-15.2 { ); } {1 {}} +#------------------------------------------------------------------------- +# Check that an unqualified "rowid" can be used in join queries so long +# as only one of the source objects has a rowid column. +# +reset_db +do_execsql_test 16.0 { + CREATE TABLE t1(x); + CREATE TABLE t2(y PRIMARY KEY) WITHOUT ROWID; + CREATE VIEW v1 AS SELECT x FROM t1; + CREATE TABLE t3(z); + + INSERT INTO t1(rowid, x) VALUES(1, 1); + INSERT INTO t2(y) VALUES(2); + INSERT INTO t3(rowid, z) VALUES(3, 3); +} + +do_execsql_test 16.1 { SELECT rowid FROM t1, t2; } {1} +do_execsql_test 16.2 { SELECT rowid FROM t1, v1; } {1} +do_execsql_test 16.3 { SELECT rowid FROM t3, v1; } {3} +do_execsql_test 16.4 { SELECT rowid FROM t3, (SELECT 123); } {3} + +do_execsql_test 16.5 { SELECT rowid FROM t2, t1; } {1} +do_execsql_test 16.6 { SELECT rowid FROM v1, t1; } {1} +do_execsql_test 16.7 { SELECT rowid FROM v1, t3; } {3} +do_execsql_test 16.8 { SELECT rowid FROM (SELECT 123), t3; } {3} + +do_catchsql_test 16.5 { SELECT rowid FROM t1, t3; } {1 {no such column: rowid}} + + finish_test From 4d466698a2832d0908c2324ebf4e83f30d58e402 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 2 Jul 2021 12:08:12 +0000 Subject: [PATCH 027/100] Fix a harmless assertion fault discovered by [https://oss-fuzz.com/testcase-detail/5517690440646656|OSSFuzz]. The assertion fault is harmless because the assert() checks a condition that that is harmless if false and the assert() is disabled in production builds. FossilOrigin-Name: 79443aabe1db8cc2ff9537fde0dac0e858eae3f3848ee9cc1b8fba47b824bf08 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 2 +- test/altertab.test | 12 ++++++++++++ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index ef07b5fdb8..998af80842 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sunqualified\s"rowid"\sreferences\sto\sbe\sused\sin\sjoin\squeries,\sprovided\sthat\sonly\sone\sof\sthe\ssource\sobjects\shas\sa\srowid. -D 2021-07-01T18:19:17.704 +C Fix\sa\sharmless\sassertion\sfault\sdiscovered\sby\n[https://oss-fuzz.com/testcase-detail/5517690440646656|OSSFuzz].\s\sThe\nassertion\sfault\sis\sharmless\sbecause\sthe\sassert()\schecks\sa\scondition\sthat\nthat\sis\sharmless\sif\sfalse\sand\sthe\sassert()\sis\sdisabled\sin\sproduction\nbuilds. +D 2021-07-02T12:08:12.748 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 73c7177a20a7e40d3eb2eebf6e4b129e7c1bff2c9047919860bd6e20efd3b2f7 +F src/resolve.c 628bf06ebf7792c4d6c97a365a80010f669160c00c28376c23e0ca9ff4875f4f F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4cc @@ -658,7 +658,7 @@ F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74 F test/altermalloc2.test ca3ebc01670d9313953a2b7628d8cc00dc5ea9988f229b3cbbbe1cca506dae45 F test/altermalloc3.test 059841a3de6b6780efd9f0b30bf1d9b4443c555f68d39975cbcac2583167b239 F test/alterqf.test 67568ad152db8c1187b15633b801242cf960f1beafc51261a3d1725d910baeb2 -F test/altertab.test 466b9757630d68455080690b6e99c5ff11b199df4b3530e17f3df10a63aa05d3 +F test/altertab.test a13e11cb1933575002367613b1094f0eeb31f493e4bd9ebeca73279fe00c85e7 F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b F test/altertab3.test 2b82fa2236a3a91553d53ae5555d8e723c7eec174c41f1fa62ff497355398479 F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f @@ -1919,7 +1919,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 595bf95bf8884c545e85e3feee6f43503b59d3c6d69073f0aaba4473c7c61cac -R b40ea640e783bee9c07b7a6c7eb2888d -U dan -Z 23ae68986931e08e3c9295a66ca57f7c +P d4097364c511709b1874881a0c036640777d1f724165416adf6f53a41f8c6e40 +R 06d8a058c123567f74b029ea10d56275 +U drh +Z 88dce2abcd7b7311d16c48742670267b diff --git a/manifest.uuid b/manifest.uuid index 7cf3822d93..df577c8c4e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d4097364c511709b1874881a0c036640777d1f724165416adf6f53a41f8c6e40 \ No newline at end of file +79443aabe1db8cc2ff9537fde0dac0e858eae3f3848ee9cc1b8fba47b824bf08 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 936a7587f5..ca6224f092 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -303,7 +303,7 @@ static int lookupName( u8 hCol; pTab = pItem->pTab; assert( pTab!=0 && pTab->zName!=0 ); - assert( pTab->nCol>0 ); + assert( pTab->nCol>0 || pParse->nErr ); if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){ int hit = 0; pEList = pItem->pSelect->pEList; diff --git a/test/altertab.test b/test/altertab.test index 079a382d8b..aa979d645f 100644 --- a/test/altertab.test +++ b/test/altertab.test @@ -968,4 +968,16 @@ do_execsql_test 31.3 { ALTER TABLE t1x RENAME q TO x; } +# 2021-07-02 OSSFuzz https://oss-fuzz.com/testcase-detail/5517690440646656 +# Bad assert() statement +# +reset_db +do_catchsql_test 32.0 { + CREATE TABLE t1(x); + CREATE TRIGGER r1 BEFORE INSERT ON t1 BEGIN + UPDATE t1 SET x=x FROM (SELECT*); + END; + ALTER TABLE t1 RENAME TO x; +} {1 {error in trigger r1: no tables specified}} + finish_test From dd51365408391e457b0d37d1cdf87b56622b5673 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 2 Jul 2021 12:25:30 +0000 Subject: [PATCH 028/100] Put ALWAYS() on a branch that is always true due to [d4097364c511709b]. Fix a testcase precondition associated with the same check-in. FossilOrigin-Name: 55e2fbebb0a2c9991feef46f31e79b82a24de272aae836bf4d3c06ee06ef1a70 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 2 +- test/returning1.test | 3 ++- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 998af80842..68a6826008 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\sassertion\sfault\sdiscovered\sby\n[https://oss-fuzz.com/testcase-detail/5517690440646656|OSSFuzz].\s\sThe\nassertion\sfault\sis\sharmless\sbecause\sthe\sassert()\schecks\sa\scondition\sthat\nthat\sis\sharmless\sif\sfalse\sand\sthe\sassert()\sis\sdisabled\sin\sproduction\nbuilds. -D 2021-07-02T12:08:12.748 +C Put\sALWAYS()\son\sa\sbranch\sthat\sis\salways\strue\sdue\sto\s[d4097364c511709b].\nFix\sa\stestcase\sprecondition\sassociated\swith\sthe\ssame\scheck-in. +D 2021-07-02T12:25:30.181 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 628bf06ebf7792c4d6c97a365a80010f669160c00c28376c23e0ca9ff4875f4f +F src/resolve.c b379c5ffe3b692e9c64fa37817cc0efa204b7c9468a818309dde85fd132d9d81 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4cc @@ -1300,7 +1300,7 @@ F test/releasetest.tcl 6f803ef0b896f8f3f4c26eb072c0399963a5987a509a64d45f5dfbc1e F test/releasetest_data.tcl f88ed29aa18366ed3956ace36c96ec6868ef5b9ee04cc05d32f4d81031e19e28 F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb -F test/returning1.test 6b29cb020129fc682dbef1890170606fe4e325190b8300d9ee7563640165d708 +F test/returning1.test f96c7245f6ac16038e802760cd90b93479369939a8a7a44e2329ee5aed28239c F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test 3f3a4e20401825017df7e7671e9f31b6de5fae5620c2b9b49917f52f8c160a8f F test/rollbackfault.test 0e646aeab8840c399cfbfa43daab46fd609cf04a @@ -1919,7 +1919,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 d4097364c511709b1874881a0c036640777d1f724165416adf6f53a41f8c6e40 -R 06d8a058c123567f74b029ea10d56275 +P 79443aabe1db8cc2ff9537fde0dac0e858eae3f3848ee9cc1b8fba47b824bf08 +R a94b1a132c62d42da273f13c87956435 U drh -Z 88dce2abcd7b7311d16c48742670267b +Z f0e0de42e2a789ea61733a3dc3ade20b diff --git a/manifest.uuid b/manifest.uuid index df577c8c4e..b8407c7029 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -79443aabe1db8cc2ff9537fde0dac0e858eae3f3848ee9cc1b8fba47b824bf08 \ No newline at end of file +55e2fbebb0a2c9991feef46f31e79b82a24de272aae836bf4d3c06ee06ef1a70 \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index ca6224f092..3bf84d3223 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -475,7 +475,7 @@ static int lookupName( && pMatch && (pNC->ncFlags & (NC_IdxExpr|NC_GenCol))==0 && sqlite3IsRowid(zCol) - && VisibleRowid(pMatch->pTab) + && ALWAYS(VisibleRowid(pMatch->pTab)) ){ cnt = 1; pExpr->iColumn = -1; diff --git a/test/returning1.test b/test/returning1.test index 163c2b5de8..c64e72f723 100644 --- a/test/returning1.test +++ b/test/returning1.test @@ -318,6 +318,7 @@ do_test 12.4 { lsort [array names cname] } {{"x"+"y"} *} +ifcapable rtree { #------------------------------------------------------------------------- # Based on dbsqlfuzz find crash-ffbba524cac354b2a61bfd677cec9d2a4333f49a reset_db @@ -330,6 +331,6 @@ do_execsql_test 13.1 { INSERT INTO t1(a,b,c) VALUES(1,2,3) RETURNING (SELECT b FROM t2); } {{}} - +} ;# end ifcapable rtree finish_test From 5c46a7e5555fb72c94698b21ef8490083243edb0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 3 Jul 2021 02:55:47 +0000 Subject: [PATCH 029/100] In the PRAGMA foreign_key_check, ensure that sufficient registers are allocated for the virtual machine, even if one or more foreign keys reuses the same column multiple times and has more columns than the table it is part of. [forum:/forumpost/a6b0c05277|Forum post a6b0c05277]. FossilOrigin-Name: 68db1ff9c44fa9c37690ce55ad304d4263ba6fac490063d9e08470de6c17cfe6 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pragma.c | 1 + test/fkey1.test | 13 +++++++++++++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 68a6826008..40a5aa83a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Put\sALWAYS()\son\sa\sbranch\sthat\sis\salways\strue\sdue\sto\s[d4097364c511709b].\nFix\sa\stestcase\sprecondition\sassociated\swith\sthe\ssame\scheck-in. -D 2021-07-02T12:25:30.181 +C In\sthe\sPRAGMA\sforeign_key_check,\sensure\sthat\ssufficient\sregisters\sare\nallocated\sfor\sthe\svirtual\smachine,\seven\sif\sone\sor\smore\sforeign\skeys\sreuses\nthe\ssame\scolumn\smultiple\stimes\sand\shas\smore\scolumns\sthan\sthe\stable\sit\sis\spart\nof.\s\s[forum:/forumpost/a6b0c05277|Forum\spost\sa6b0c05277]. +D 2021-07-03T02:55:47.684 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -537,7 +537,7 @@ F src/parse.y 8920f4444957d7827ca458029b2e41ffa32dd3b72917be0b52cae0aace3eadb5 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f -F src/pragma.c eb42cb9bec189cf18cef5d8fcae56e13bb73ef2b019b198fb48740ced81bce95 +F src/pragma.c e74fbc64dcf4985bf11f8366ca3e37df1db1b211f42f25270b461c118411a512 F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b @@ -899,7 +899,7 @@ F test/filter1.test 6c483ecf7886c8843a8612c021aa23f33c581f584151f251842b3a3592c9 F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b -F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 +F test/fkey1.test a0a38fc7f1b88497a355e2931115395fd43dc20cfb317e39c5bf4e11bedea199 F test/fkey2.test 1063d65e5923c054cfb8f0555a92a3ae0fa8c067275a33ee1715bd856cdb304c F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d @@ -1919,7 +1919,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 79443aabe1db8cc2ff9537fde0dac0e858eae3f3848ee9cc1b8fba47b824bf08 -R a94b1a132c62d42da273f13c87956435 +P 55e2fbebb0a2c9991feef46f31e79b82a24de272aae836bf4d3c06ee06ef1a70 +R 6361a08fc6d48a70d5a532fc3e15d75a U drh -Z f0e0de42e2a789ea61733a3dc3ade20b +Z e9d1bfeaf7de1edba9fbe2d83f57c7d8 diff --git a/manifest.uuid b/manifest.uuid index b8407c7029..ae2f2c4709 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55e2fbebb0a2c9991feef46f31e79b82a24de272aae836bf4d3c06ee06ef1a70 \ No newline at end of file +68db1ff9c44fa9c37690ce55ad304d4263ba6fac490063d9e08470de6c17cfe6 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 84f29c2fd5..4f9b8d913b 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1466,6 +1466,7 @@ void sqlite3Pragma( sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j); sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); } + if( regRow+j>pParse->nMem ) pParse->nMem = regRow+j; /* Generate code to query the parent index for a matching parent ** key. If a match is found, jump to addrOk. */ diff --git a/test/fkey1.test b/test/fkey1.test index fa87335888..d094ff449a 100644 --- a/test/fkey1.test +++ b/test/fkey1.test @@ -222,5 +222,18 @@ do_execsql_test 6.2 { INSERT INTO c1 VALUES(1); } {} +# 2021-07-03 https://sqlite.org/forum/forumpost/a6b0c05277 +# Failure to allocate enough registers in the VDBE for a +# PRAGMA foreign_key_check when the foreign key has more +# columns than the table. +# +reset_db +do_execsql_test 7.1 { + PRAGMA foreign_keys=OFF; + CREATE TABLE t1(a,b,c,FOREIGN KEY(a,a,a,a,a,a,a,a,a,a,a,a,a,a) REFERENCES t0); + INSERT INTO t1 VALUES(1,2,3); + PRAGMA foreign_key_check; +} {t1 1 t0 0} + finish_test From 24384d88d670da1e5609c782669b104cfe1fe37c Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 3 Jul 2021 18:57:40 +0000 Subject: [PATCH 030/100] Fix a (harmless) typo in a comment. No code changes. FossilOrigin-Name: d2b9b8daa3b87c3dba1329e2f2f44b60d6b5bb9a49d741045aa20cc7813446b2 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 40a5aa83a1..bae44dce49 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sPRAGMA\sforeign_key_check,\sensure\sthat\ssufficient\sregisters\sare\nallocated\sfor\sthe\svirtual\smachine,\seven\sif\sone\sor\smore\sforeign\skeys\sreuses\nthe\ssame\scolumn\smultiple\stimes\sand\shas\smore\scolumns\sthan\sthe\stable\sit\sis\spart\nof.\s\s[forum:/forumpost/a6b0c05277|Forum\spost\sa6b0c05277]. -D 2021-07-03T02:55:47.684 +C Fix\sa\s(harmless)\stypo\sin\sa\scomment.\s\sNo\scode\schanges. +D 2021-07-03T18:57:40.326 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -505,7 +505,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 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 +F src/insert.c d560dc585c50e01b015cbf924c173de88f61c8c85b3d1adb9d4865b92fff2d72 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c aedd8596e4dbdedacbf69fc4ff0462404effb9e6528146a1fdf4adee004053c9 @@ -1919,7 +1919,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 55e2fbebb0a2c9991feef46f31e79b82a24de272aae836bf4d3c06ee06ef1a70 -R 6361a08fc6d48a70d5a532fc3e15d75a +P 68db1ff9c44fa9c37690ce55ad304d4263ba6fac490063d9e08470de6c17cfe6 +R ef095c3d03da44ce5f668f94092bc2d9 U drh -Z e9d1bfeaf7de1edba9fbe2d83f57c7d8 +Z 288b71fb8ffb2328973607c231545eec diff --git a/manifest.uuid b/manifest.uuid index ae2f2c4709..53108d0c5f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -68db1ff9c44fa9c37690ce55ad304d4263ba6fac490063d9e08470de6c17cfe6 \ No newline at end of file +d2b9b8daa3b87c3dba1329e2f2f44b60d6b5bb9a49d741045aa20cc7813446b2 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 1ed0b43156..63ffa5edd0 100644 --- a/src/insert.c +++ b/src/insert.c @@ -113,7 +113,7 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ ** Compute the affinity string for table pTab, if it has not already been ** computed. As an optimization, omit trailing SQLITE_AFF_BLOB affinities. ** -** If the affinity exists (if it is no entirely SQLITE_AFF_BLOB values) and +** If the affinity exists (if it is not entirely SQLITE_AFF_BLOB values) and ** if iReg>0 then code an OP_Affinity opcode that will set the affinities ** for register iReg and following. Or if affinities exists and iReg==0, ** then just set the P4 operand of the previous opcode (which should be From 4a4e02bc52815acc088702122f8ef4fab27df11c Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 4 Jul 2021 22:33:08 +0000 Subject: [PATCH 031/100] Enhance the treeview debugging mechanism so that it correctly deals with TK_ROW expression nodes. FossilOrigin-Name: e87fdb6514b6f6775a5a36ca0ec5c920eeaba9e3b842dffa327e970b27cd036d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 9 +++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index bae44dce49..167298d25f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\s(harmless)\stypo\sin\sa\scomment.\s\sNo\scode\schanges. -D 2021-07-03T18:57:40.326 +C Enhance\sthe\streeview\sdebugging\smechanism\sso\sthat\sit\scorrectly\sdeals\swith\nTK_ROW\sexpression\snodes. +D 2021-07-04T22:33:08.770 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c 306674a0ff430b00f6532baeea2eb531aa64046ac35843d80a64b8da15cec98f +F src/treeview.c 6c1dbbc1140c4acb2248db19caf43819be6d3ec1d374ec497d2890c442bf7e4c F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 F src/update.c 56fa0458b1ffc1042629f926443e8ed44203983df3ab2b0db2ba556e6ceed68c F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 @@ -1919,7 +1919,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 68db1ff9c44fa9c37690ce55ad304d4263ba6fac490063d9e08470de6c17cfe6 -R ef095c3d03da44ce5f668f94092bc2d9 +P d2b9b8daa3b87c3dba1329e2f2f44b60d6b5bb9a49d741045aa20cc7813446b2 +R 609c183d475a913dd24e3c87f3c64788 U drh -Z 288b71fb8ffb2328973607c231545eec +Z 06a5f6147855dc1f11121575b77f39d6 diff --git a/manifest.uuid b/manifest.uuid index 53108d0c5f..d1f7b67648 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2b9b8daa3b87c3dba1329e2f2f44b60d6b5bb9a49d741045aa20cc7813446b2 \ No newline at end of file +e87fdb6514b6f6775a5a36ca0ec5c920eeaba9e3b842dffa327e970b27cd036d \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index 673dc919ff..222d4b0987 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -716,6 +716,15 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ sqlite3TreeViewExpr(pView, &tmp, 0); break; } + case TK_ROW: { + if( pExpr->iColumn<=0 ){ + sqlite3TreeViewLine(pView, "First FROM table rowid"); + }else{ + sqlite3TreeViewLine(pView, "First FROM table column %d", + pExpr->iColumn-1); + } + break; + } default: { sqlite3TreeViewLine(pView, "op=%d", pExpr->op); break; From 105c4b5cedea28a1d06f5331b64b002ebda0e93b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 5 Jul 2021 00:07:39 +0000 Subject: [PATCH 032/100] Fix an incorrect comment on testcase misc1-27.0. No changes to code. FossilOrigin-Name: 49829ae3229b7c7c7adeaa970a84aebd5157bc93b38fd6d80d86cc03f5fdde6f --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/misc1.test | 9 ++++++++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 167298d25f..1a3fc19f1b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\streeview\sdebugging\smechanism\sso\sthat\sit\scorrectly\sdeals\swith\nTK_ROW\sexpression\snodes. -D 2021-07-04T22:33:08.770 +C Fix\san\sincorrect\scomment\son\stestcase\smisc1-27.0.\s\sNo\schanges\sto\scode. +D 2021-07-05T00:07:39.333 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1200,7 +1200,7 @@ F test/minmax.test 0015e5cd5e7af48bb3364f26d9f3a9cdbea2a442d4774281c39e2229591b7 F test/minmax2.test cf9311babb6f0518d04e42fd6a42c619531c4309a9dd790a2c4e9b3bc595e0de F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87 -F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 +F test/misc1.test e3fa5732080cc9a2b77bd5dd4ebb55bd6785b02565f8806092686b83ac58d600 F test/misc2.test 71e746af479119386ac2ed7ab7d81d99970e75b49ffd3e8efffee100b4b5f350 F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e @@ -1919,7 +1919,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 d2b9b8daa3b87c3dba1329e2f2f44b60d6b5bb9a49d741045aa20cc7813446b2 -R 609c183d475a913dd24e3c87f3c64788 +P e87fdb6514b6f6775a5a36ca0ec5c920eeaba9e3b842dffa327e970b27cd036d +R 389f03ccb1a382c69b94dc83b230b2b0 U drh -Z 06a5f6147855dc1f11121575b77f39d6 +Z 310dc77b27d9638577d1119dcb3f50a7 diff --git a/manifest.uuid b/manifest.uuid index d1f7b67648..37238af70d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e87fdb6514b6f6775a5a36ca0ec5c920eeaba9e3b842dffa327e970b27cd036d \ No newline at end of file +49829ae3229b7c7c7adeaa970a84aebd5157bc93b38fd6d80d86cc03f5fdde6f \ No newline at end of file diff --git a/test/misc1.test b/test/misc1.test index c14a31ebd7..758d4082e0 100644 --- a/test/misc1.test +++ b/test/misc1.test @@ -728,7 +728,14 @@ do_execsql_test misc1-26.0 { # 2017-12-29 # # The following behaviors (duplicate column names on an INSERT or UPDATE) -# are undocumented. These tests are added to ensure that historical behavior +# are undocumented. <<--- Not so. There is a long-standing requirement +# in lang_update.in to say that when the columns to be updated appear more +# than once in an UPDATE statement that only the rightmost expression is used. +# See e_update-1.6.* for the tests. This is unfortunate, since omitting +# that requirement would greatly simplify the fix to the problem identified +# by forum post https://sqlite.org/forum/info/16ca0e9f32c38567 +# +# These tests are added to ensure that historical behavior # does not change accidentally. # # For duplication columns on an INSERT, the first value is used. From 10f08270e11937aa43ef62fcfb0f9650a7eb4deb Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 5 Jul 2021 01:11:26 +0000 Subject: [PATCH 033/100] Ensure that TK_SELECT_COLUMN Expr nodes always have their iTable field set to to the number of columns in the vector. This is not strictly necessary. It just simplifies the state description and make the code easier to reason about. FossilOrigin-Name: 026f08d4cff19a95e0f38f2ef431cacd65c7c77ed92e30d7f2ded84651f47150 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 19 +++++++++---------- src/sqliteInt.h | 2 +- src/treeview.c | 3 ++- src/whereexpr.c | 4 ++-- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index 1a3fc19f1b..aaed353b1f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sincorrect\scomment\son\stestcase\smisc1-27.0.\s\sNo\schanges\sto\scode. -D 2021-07-05T00:07:39.333 +C Ensure\sthat\sTK_SELECT_COLUMN\sExpr\snodes\salways\shave\stheir\siTable\sfield\sset\sto\nto\sthe\snumber\sof\scolumns\sin\sthe\svector.\sThis\sis\snot\sstrictly\snecessary.\sIt\njust\ssimplifies\sthe\sstate\sdescription\sand\smake\sthe\scode\seasier\sto\sreason\sabout. +D 2021-07-05T01:11:26.068 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c d571a83580d0034697a29abbfe95a7750eb8ae7172d6e2c794b1d89ef4ef31dc +F src/expr.c 2d40c29e10ed37b1969ddb1616b598c30e318e8694686ab9209cbec31c310613 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c c96ac6f7c4f2d684217c4673a80446e1b50e25b5ea79366f333f484622d010a0 @@ -549,7 +549,7 @@ F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4c F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h fccf952bd572fe52f3bd2928982bd80933308c1118fdde27f667d0de7c77fb30 +F src/sqliteInt.h 6cfa7b73801657c89155a02e748ba538b8bb12fe6f4e8143c74f055d55e1190d F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -609,7 +609,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c 6c1dbbc1140c4acb2248db19caf43819be6d3ec1d374ec497d2890c442bf7e4c +F src/treeview.c f34b02f379a99bdfd24971810765fe0993e6aa2bcd7e3fa5af8a54f353b429fc F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 F src/update.c 56fa0458b1ffc1042629f926443e8ed44203983df3ab2b0db2ba556e6ceed68c F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 @@ -634,7 +634,7 @@ F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 07a4097fe42a01b1f99d2a136598654051f0bdcd6c17cbef7fa285a9cf21e4d2 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f -F src/whereexpr.c 5a9c9f5d2dac4bcdcaae3035034b4667523f731df228e0bb1d4efc669efa9da5 +F src/whereexpr.c 2bfb1cd24b9b63fc5e32b9b85f2b3f88765bdac2aab51102d94d1fb56ec2917b F src/window.c 559961a731f67a0873744960bdeeb034a5c74cc0a09badb14bc43f74744a2a9d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1919,7 +1919,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 e87fdb6514b6f6775a5a36ca0ec5c920eeaba9e3b842dffa327e970b27cd036d -R 389f03ccb1a382c69b94dc83b230b2b0 +P 49829ae3229b7c7c7adeaa970a84aebd5157bc93b38fd6d80d86cc03f5fdde6f +R 074e3a063f98e309829563ef30773d9b U drh -Z 310dc77b27d9638577d1119dcb3f50a7 +Z 460e3b0de88173af039daa4e60e46cf6 diff --git a/manifest.uuid b/manifest.uuid index 37238af70d..e6480bc7f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -49829ae3229b7c7c7adeaa970a84aebd5157bc93b38fd6d80d86cc03f5fdde6f \ No newline at end of file +026f08d4cff19a95e0f38f2ef431cacd65c7c77ed92e30d7f2ded84651f47150 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 06c3b87cdd..e5f02f0488 100644 --- a/src/expr.c +++ b/src/expr.c @@ -71,6 +71,8 @@ char sqlite3ExprAffinity(const Expr *pExpr){ #endif if( op==TK_SELECT_COLUMN ){ assert( pExpr->pLeft->flags&EP_xIsSelect ); + assert( pExpr->iColumn < pExpr->iTable ); + assert( pExpr->iTable==pExpr->pLeft->x.pSelect->pEList->nExpr ); return sqlite3ExprAffinity( pExpr->pLeft->x.pSelect->pEList->a[pExpr->iColumn].pExpr ); @@ -481,7 +483,8 @@ Expr *sqlite3VectorFieldSubexpr(Expr *pVector, int i){ Expr *sqlite3ExprForVectorField( Parse *pParse, /* Parsing context */ Expr *pVector, /* The vector. List of expressions or a sub-SELECT */ - int iField /* Which column of the vector to return */ + int iField, /* Which column of the vector to return */ + int nField /* Total number of columns in the vector */ ){ Expr *pRet; if( pVector->op==TK_SELECT ){ @@ -504,10 +507,10 @@ Expr *sqlite3ExprForVectorField( */ pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0); if( pRet ){ + pRet->iTable = nField; pRet->iColumn = iField; pRet->pLeft = pVector; } - assert( pRet==0 || pRet->iTable==0 ); }else{ if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; pRet = sqlite3ExprDup(pParse->db, pVector, 0); @@ -1781,11 +1784,9 @@ ExprList *sqlite3ExprListAppendVector( } for(i=0; inId; i++){ - Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i); + Expr *pSubExpr = sqlite3ExprForVectorField(pParse, pExpr, i, pColumns->nId); assert( pSubExpr!=0 || db->mallocFailed ); - assert( pSubExpr==0 || pSubExpr->iTable==0 ); if( pSubExpr==0 ) continue; - pSubExpr->iTable = pColumns->nId; pList = sqlite3ExprListAppend(pParse, pList, pSubExpr); if( pList ){ assert( pList->nExpr==iFirst+i+1 ); @@ -4375,11 +4376,9 @@ expr_code_doover: if( pExpr->pLeft->iTable==0 ){ pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); } - assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT - || pExpr->pLeft->op==TK_ERROR ); - if( pExpr->iTable!=0 - && pExpr->iTable!=(n = sqlite3ExprVectorSize(pExpr->pLeft)) - ){ + assert( pExpr->pLeft->op==TK_SELECT || pExpr->pLeft->op==TK_ERROR ); + n = sqlite3ExprVectorSize(pExpr->pLeft); + if( pExpr->iTable!=n ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pExpr->iTable, n); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6906d7ed57..fea5ddd3a0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -5191,7 +5191,7 @@ int sqlite3DbstatRegister(sqlite3*); int sqlite3ExprVectorSize(Expr *pExpr); int sqlite3ExprIsVector(Expr *pExpr); Expr *sqlite3VectorFieldSubexpr(Expr*, int); -Expr *sqlite3ExprForVectorField(Parse*,Expr*,int); +Expr *sqlite3ExprForVectorField(Parse*,Expr*,int,int); void sqlite3VectorErrorMsg(Parse*, Expr*); #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS diff --git a/src/treeview.c b/src/treeview.c index 222d4b0987..b6f5c529d4 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -699,7 +699,8 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ break; } case TK_SELECT_COLUMN: { - sqlite3TreeViewLine(pView, "SELECT-COLUMN %d", pExpr->iColumn); + sqlite3TreeViewLine(pView, "SELECT-COLUMN %d of [0..%d]", + pExpr->iColumn, pExpr->iTable-1); sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0); break; } diff --git a/src/whereexpr.c b/src/whereexpr.c index 31f2ea438e..b9aa702e22 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1341,8 +1341,8 @@ static void exprAnalyze( for(i=0; ipLeft, i); - Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i); + Expr *pLeft = sqlite3ExprForVectorField(pParse, pExpr->pLeft, i, nLeft); + Expr *pRight = sqlite3ExprForVectorField(pParse, pExpr->pRight, i, nLeft); pNew = sqlite3PExpr(pParse, pExpr->op, pLeft, pRight); transferJoinMarkings(pNew, pExpr); From e46292a9203e83558353f285ee8fdc07667c01db Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 5 Jul 2021 02:40:29 +0000 Subject: [PATCH 034/100] Improved rebustness in sqlite3ExprListDup() when it contains a vector assignment from an UPDATE where the initial term is omitted. This can happen during a UNION ALL query flattening while processing a virtual table update in which the first term of the vector is repeated. [forum:/forumpost/16ca0e9f32|Forum post 16ca0e9f32]. FossilOrigin-Name: 2547cfe38f8fb35109b3fc5bdfada387fe4b2b8a304156b704ab7f03f1f71198 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/expr.c | 24 ++++++++++++------------ src/treeview.c | 5 +++-- test/fuzzdata8.db | Bin 2502656 -> 2503680 bytes test/vtab1.test | 14 ++++++++++++++ 6 files changed, 39 insertions(+), 24 deletions(-) diff --git a/manifest b/manifest index aaed353b1f..fff16cfa52 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sTK_SELECT_COLUMN\sExpr\snodes\salways\shave\stheir\siTable\sfield\sset\sto\nto\sthe\snumber\sof\scolumns\sin\sthe\svector.\sThis\sis\snot\sstrictly\snecessary.\sIt\njust\ssimplifies\sthe\sstate\sdescription\sand\smake\sthe\scode\seasier\sto\sreason\sabout. -D 2021-07-05T01:11:26.068 +C Improved\srebustness\sin\ssqlite3ExprListDup()\swhen\sit\scontains\sa\svector\sassignment\nfrom\san\sUPDATE\swhere\sthe\sinitial\sterm\sis\somitted.\s\sThis\scan\shappen\sduring\sa\nUNION\sALL\squery\sflattening\swhile\sprocessing\sa\svirtual\stable\supdate\sin\swhich\nthe\sfirst\sterm\sof\sthe\svector\sis\srepeated.\n[forum:/forumpost/16ca0e9f32|Forum\spost\s16ca0e9f32]. +D 2021-07-05T02:40:29.435 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c 2d40c29e10ed37b1969ddb1616b598c30e318e8694686ab9209cbec31c310613 +F src/expr.c 5c532072d91855d1b91b2581c2d4447e517932713f583ed02020b7129f1cfbd7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c c96ac6f7c4f2d684217c4673a80446e1b50e25b5ea79366f333f484622d010a0 @@ -609,7 +609,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c f34b02f379a99bdfd24971810765fe0993e6aa2bcd7e3fa5af8a54f353b429fc +F src/treeview.c ce7a3da38caba094c78d888d2366f749ea33dc8cbafb04218b57768fb8669a6c F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 F src/update.c 56fa0458b1ffc1042629f926443e8ed44203983df3ab2b0db2ba556e6ceed68c F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 @@ -1057,7 +1057,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db a44fe27989a002c0c9b554923ecf933b9f16750c1c0bb187a04f5beee0802aa6 +F test/fuzzdata8.db da92a0e336bf34ae89e407b375aaa57581b73b5f8f99b4de5e2557f64a3ca33c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1685,7 +1685,7 @@ F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 F test/view.test ea88361d5e9bc8eabf9f573185a16aea73a885be9b6c6a95ae84908913416a80 F test/view2.test db32c8138b5b556f610b35dfddd38c5a58a292f07fda5281eedb0851b2672679 -F test/vtab1.test 99c0c13b5336ca7f87f137459de144b2f396bb8563fbd602e46bfaa425e3d8cc +F test/vtab1.test e5760911437a97f5887f41ed37d6b124b2c4d8f7dc6ab4e08be8c0dff75b34e8 F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 @@ -1919,7 +1919,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 49829ae3229b7c7c7adeaa970a84aebd5157bc93b38fd6d80d86cc03f5fdde6f -R 074e3a063f98e309829563ef30773d9b +P 026f08d4cff19a95e0f38f2ef431cacd65c7c77ed92e30d7f2ded84651f47150 +R 370a07f45c8536f9b9e4e0469f767d7e U drh -Z 460e3b0de88173af039daa4e60e46cf6 +Z 4f1da44a75ffa77140a4f27e7fbced11 diff --git a/manifest.uuid b/manifest.uuid index e6480bc7f4..3ecd262408 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -026f08d4cff19a95e0f38f2ef431cacd65c7c77ed92e30d7f2ded84651f47150 \ No newline at end of file +2547cfe38f8fb35109b3fc5bdfada387fe4b2b8a304156b704ab7f03f1f71198 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index e5f02f0488..637ac9131a 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1400,7 +1400,6 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){ if( !ExprHasProperty(p, EP_TokenOnly|EP_Leaf) ){ if( pNew->op==TK_SELECT_COLUMN ){ pNew->pLeft = p->pLeft; - assert( p->iColumn==0 || p->pRight==0 ); assert( p->pRight==0 || p->pRight==p->pLeft || ExprHasProperty(p->pLeft, EP_Subquery) ); }else{ @@ -1498,7 +1497,8 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ ExprList *pNew; struct ExprList_item *pItem, *pOldItem; int i; - Expr *pPriorSelectCol = 0; + Expr *pPriorSelectColOld = 0; + Expr *pPriorSelectColNew = 0; assert( db!=0 ); if( p==0 ) return 0; pNew = sqlite3DbMallocRawNN(db, sqlite3DbMallocSize(db, p)); @@ -1515,17 +1515,17 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, ExprList *p, int flags){ && pOldExpr->op==TK_SELECT_COLUMN && (pNewExpr = pItem->pExpr)!=0 ){ - assert( pNewExpr->iColumn==0 || i>0 ); - if( pNewExpr->iColumn==0 ){ - assert( pOldExpr->pLeft==pOldExpr->pRight - || ExprHasProperty(pOldExpr->pLeft, EP_Subquery) ); - pPriorSelectCol = pNewExpr->pLeft = pNewExpr->pRight; + if( pNewExpr->pRight ){ + pPriorSelectColOld = pOldExpr->pRight; + pPriorSelectColNew = pNewExpr->pRight; + pNewExpr->pLeft = pNewExpr->pRight; }else{ - assert( i>0 ); - assert( pItem[-1].pExpr!=0 ); - assert( pNewExpr->iColumn==pItem[-1].pExpr->iColumn+1 ); - assert( pPriorSelectCol==pItem[-1].pExpr->pLeft ); - pNewExpr->pLeft = pPriorSelectCol; + if( pOldExpr->pLeft!=pPriorSelectColOld ){ + pPriorSelectColOld = pOldExpr->pLeft; + pPriorSelectColNew = sqlite3ExprDup(db, pPriorSelectColOld, flags); + pNewExpr->pRight = pPriorSelectColNew; + } + pNewExpr->pLeft = pPriorSelectColNew; } } pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); diff --git a/src/treeview.c b/src/treeview.c index b6f5c529d4..165ceb537a 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -699,8 +699,9 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ break; } case TK_SELECT_COLUMN: { - sqlite3TreeViewLine(pView, "SELECT-COLUMN %d of [0..%d]", - pExpr->iColumn, pExpr->iTable-1); + sqlite3TreeViewLine(pView, "SELECT-COLUMN %d of [0..%d]%s", + pExpr->iColumn, pExpr->iTable-1, + pExpr->pRight==pExpr->pLeft ? " (SELECT-owner)" : ""); sqlite3TreeViewSelect(pView, pExpr->pLeft->x.pSelect, 0); break; } diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 7e6764af0b237cb400f472116ec469a0fd9e8b91..f3a67bc7048bd937145827b4645940bd52ec2404 100644 GIT binary patch delta 38230 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 bZAndu6#$RAziG-$QS6Us{r(m0GC2M(=loET delta 38090 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 diff --git a/test/vtab1.test b/test/vtab1.test index 3d2e233366..0934ef502a 100644 --- a/test/vtab1.test +++ b/test/vtab1.test @@ -1558,4 +1558,18 @@ ifcapable fts3 { } } +# 2021-07-04 https://sqlite.org/forum/forumpost/16ca0e9f32 +# Yu Liang crash involving UPDATE on a virtual table with +# a duplicate column in a vector changeset and invoking the +# query flattener for UNION ALL. +# +reset_db +register_echo_module db +do_catchsql_test 25.0 { + CREATE TABLE t0(a); + CREATE VIRTUAL TABLE t1 USING echo(t0); + WITH t3(a) AS (SELECT * FROM t1 UNION ALL SELECT * FROM t1) + UPDATE t1 SET (a,a) = (SELECT 1, 0) FROM t3; +} {1 {target object/alias may not appear in FROM clause: t1}} + finish_test From 5daf69e5f4277085ed44c76930f777cf415edff3 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Jul 2021 11:27:13 +0000 Subject: [PATCH 035/100] Allow sub-queries in the FROM clause of an UPDATE...FROM statement to access the object being updated without using an alias, as is required in the parent query. FossilOrigin-Name: 740cb43025449b7d7b47a97ad00885e54b7701cbcb14f4a50c7523022e3936d5 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/select.c | 17 ++++++++++++++--- src/sqliteInt.h | 2 +- src/update.c | 2 +- test/upfrom2.test | 16 ++++++++++++++++ test/vtab1.test | 2 +- 7 files changed, 45 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index fff16cfa52..66e4413327 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\srebustness\sin\ssqlite3ExprListDup()\swhen\sit\scontains\sa\svector\sassignment\nfrom\san\sUPDATE\swhere\sthe\sinitial\sterm\sis\somitted.\s\sThis\scan\shappen\sduring\sa\nUNION\sALL\squery\sflattening\swhile\sprocessing\sa\svirtual\stable\supdate\sin\swhich\nthe\sfirst\sterm\sof\sthe\svector\sis\srepeated.\n[forum:/forumpost/16ca0e9f32|Forum\spost\s16ca0e9f32]. -D 2021-07-05T02:40:29.435 +C Allow\ssub-queries\sin\sthe\sFROM\sclause\sof\san\sUPDATE...FROM\sstatement\sto\saccess\sthe\sobject\sbeing\supdated\swithout\susing\san\salias,\sas\sis\srequired\sin\sthe\sparent\squery. +D 2021-07-05T11:27:13.620 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,12 +544,12 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b379c5ffe3b692e9c64fa37817cc0efa204b7c9468a818309dde85fd132d9d81 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 +F src/select.c 1c1230aaa4e5979edd3c5a9f7a90ab856a302cca4962e8a7d08f42dd2e7e1a49 F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4cc F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 6cfa7b73801657c89155a02e748ba538b8bb12fe6f4e8143c74f055d55e1190d +F src/sqliteInt.h bb5868a443be017a2701bff26a7eb934b5390adef6322ff36ae4e41d3d036b81 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -611,7 +611,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e F src/treeview.c ce7a3da38caba094c78d888d2366f749ea33dc8cbafb04218b57768fb8669a6c F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 -F src/update.c 56fa0458b1ffc1042629f926443e8ed44203983df3ab2b0db2ba556e6ceed68c +F src/update.c ff10c7ca6dc9007cdebb3eee6630e87639ef9f949ccb574c34f9d34c52c32fb9 F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 @@ -1660,7 +1660,7 @@ F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f8473 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upfrom1.tcl 8859d9d437f03b44174c4524a7a734a391fd4526fcff65be08285dafc9dc9041 F test/upfrom1.test 8cb06689e99cd707d884faa16da0e8eb26ff658bb01c47ddf72fadade666e6e1 -F test/upfrom2.test f92e47bfc35e9410d3e8716ee626384e89ad026c55fd6148508ca9d707521673 +F test/upfrom2.test 88d39cb755db5789541e645d4e2764abc697a56958f28a3f8451a0e9342bbd6b F test/upfrom3.test 6130f24ebf97f5ea865e5d2a14a2d543fe5428a62e87cc60f62d875e45c1f5f0 F test/upfromfault.test 3a10075a0043f0c4fad6614b2c371f88a8ba5a4acab68b907438413865d6a8d6 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 @@ -1685,7 +1685,7 @@ F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 F test/view.test ea88361d5e9bc8eabf9f573185a16aea73a885be9b6c6a95ae84908913416a80 F test/view2.test db32c8138b5b556f610b35dfddd38c5a58a292f07fda5281eedb0851b2672679 -F test/vtab1.test e5760911437a97f5887f41ed37d6b124b2c4d8f7dc6ab4e08be8c0dff75b34e8 +F test/vtab1.test 772c94825d455dffc5da34dcf4b648d8a23887616185fa024a472bf745e56df8 F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 @@ -1919,7 +1919,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 026f08d4cff19a95e0f38f2ef431cacd65c7c77ed92e30d7f2ded84651f47150 -R 370a07f45c8536f9b9e4e0469f767d7e -U drh -Z 4f1da44a75ffa77140a4f27e7fbced11 +P 2547cfe38f8fb35109b3fc5bdfada387fe4b2b8a304156b704ab7f03f1f71198 +R 3e8d3cb17bf6ee799e7e5bba55fb6114 +U dan +Z 5d47dc2f76359fb6048332e2e7229d64 diff --git a/manifest.uuid b/manifest.uuid index 3ecd262408..68cfb10ea1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2547cfe38f8fb35109b3fc5bdfada387fe4b2b8a304156b704ab7f03f1f71198 \ No newline at end of file +740cb43025449b7d7b47a97ad00885e54b7701cbcb14f4a50c7523022e3936d5 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 7d8fd5939d..d36839264d 100644 --- a/src/select.c +++ b/src/select.c @@ -6286,11 +6286,16 @@ int sqlite3Select( } #endif - /* If the SF_UpdateFrom flag is set, then this function is being called + /* If the SF_UFSrcCheck flag is set, then this function is being called ** as part of populating the temp table for an UPDATE...FROM statement. ** In this case, it is an error if the target object (pSrc->a[0]) name - ** or alias is duplicated within FROM clause (pSrc->a[1..n]). */ - if( p->selFlags & SF_UpdateFrom ){ + ** or alias is duplicated within FROM clause (pSrc->a[1..n]). + ** + ** Postgres disallows this case too. The reason is that some other + ** systems handle this case differently, and not all the same way, + ** which is just confusing. To avoid this, we follow PG's lead and + ** disallow it altogether. */ + if( p->selFlags & SF_UFSrcCheck ){ SrcItem *p0 = &p->pSrc->a[0]; for(i=1; ipSrc->nSrc; i++){ SrcItem *p1 = &p->pSrc->a[i]; @@ -6302,6 +6307,12 @@ int sqlite3Select( goto select_end; } } + + /* Clear the SF_UFSrcCheck flag. The check has already been performed, + ** and leaving this flag set can cause errors if a compound sub-query + ** in p->pSrc is flattened into this query and this function called + ** again as part of compound SELECT processing. */ + p->selFlags &= ~SF_UFSrcCheck; } if( pDest->eDest==SRT_Output ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index fea5ddd3a0..b5fbff6454 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3210,7 +3210,7 @@ struct Select { #define SF_WinRewrite 0x0100000 /* Window function rewrite accomplished */ #define SF_View 0x0200000 /* SELECT statement is a view */ #define SF_NoopOrderBy 0x0400000 /* ORDER BY is ignored for this query */ -#define SF_UpdateFrom 0x0800000 /* Statement is an UPDATE...FROM */ +#define SF_UFSrcCheck 0x0800000 /* Check pSrc as required by UPDATE...FROM */ #define SF_PushDown 0x1000000 /* SELECT has be modified by push-down opt */ #define SF_MultiPart 0x2000000 /* Has multiple incompatible PARTITIONs */ #define SF_CopyCte 0x4000000 /* SELECT statement is a copy of a CTE */ diff --git a/src/update.c b/src/update.c index 132232724a..45f332bf37 100644 --- a/src/update.c +++ b/src/update.c @@ -259,7 +259,7 @@ static void updateFromSelect( } } pSelect = sqlite3SelectNew(pParse, pList, - pSrc, pWhere2, pGrp, 0, pOrderBy2, SF_UpdateFrom|SF_IncludeHidden, pLimit2 + pSrc, pWhere2, pGrp, 0, pOrderBy2, SF_UFSrcCheck|SF_IncludeHidden, pLimit2 ); sqlite3SelectDestInit(&dest, eDest, iEph); dest.iSDParm2 = (pPk ? pPk->nKeyCol : -1); diff --git a/test/upfrom2.test b/test/upfrom2.test index 81c847a604..a1f00953e6 100644 --- a/test/upfrom2.test +++ b/test/upfrom2.test @@ -365,5 +365,21 @@ foreach {tn update nm} { "1 {target object/alias may not appear in FROM clause: $nm}" } +#-------------------------------------------------------------------------- +reset_db +do_execsql_test 6.0 { + CREATE TABLE t1(a); +} + +do_execsql_test 6.1 { + UPDATE t1 SET a = 1 FROM ( + SELECT * FROM t1 + ) +} {} +do_execsql_test 6.2 { + UPDATE t1 SET a = 1 FROM ( + SELECT * FROM t1 UNION ALL SELECT * FROM t1 + ) +} {} finish_test diff --git a/test/vtab1.test b/test/vtab1.test index 0934ef502a..7a55703089 100644 --- a/test/vtab1.test +++ b/test/vtab1.test @@ -1570,6 +1570,6 @@ do_catchsql_test 25.0 { CREATE VIRTUAL TABLE t1 USING echo(t0); WITH t3(a) AS (SELECT * FROM t1 UNION ALL SELECT * FROM t1) UPDATE t1 SET (a,a) = (SELECT 1, 0) FROM t3; -} {1 {target object/alias may not appear in FROM clause: t1}} +} {0 {}} finish_test From 0f56f891dd8f7e27295f52b4abaef207624f8782 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Jul 2021 17:15:38 +0000 Subject: [PATCH 036/100] Revert [5204c2c4a7b73a64], restoring the old pre-processor logic for determining the availability of the __atomic_store_n()/__atomic_load_n() primitives. FossilOrigin-Name: e690abb9e4e189c41182ac813115d55d811135013f5ce94ec0c45a547597f8ad --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 3 +-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 66e4413327..a93cdd7e1d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\ssub-queries\sin\sthe\sFROM\sclause\sof\san\sUPDATE...FROM\sstatement\sto\saccess\sthe\sobject\sbeing\supdated\swithout\susing\san\salias,\sas\sis\srequired\sin\sthe\sparent\squery. -D 2021-07-05T11:27:13.620 +C Revert\s[5204c2c4a7b73a64],\srestoring\sthe\sold\spre-processor\slogic\sfor\sdetermining\sthe\savailability\sof\sthe\s__atomic_store_n()/__atomic_load_n()\sprimitives. +D 2021-07-05T17:15:38.183 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4c F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h bb5868a443be017a2701bff26a7eb934b5390adef6322ff36ae4e41d3d036b81 +F src/sqliteInt.h 72bdf367026290b4a631779127de4d50fc2b1b59066342beabaf80a11555aaf7 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1919,7 +1919,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 2547cfe38f8fb35109b3fc5bdfada387fe4b2b8a304156b704ab7f03f1f71198 -R 3e8d3cb17bf6ee799e7e5bba55fb6114 +P 740cb43025449b7d7b47a97ad00885e54b7701cbcb14f4a50c7523022e3936d5 +R c38bc63b0e4c77ae43be3b1d873807d7 U dan -Z 5d47dc2f76359fb6048332e2e7229d64 +Z 5c6f4318a3def93e7f66935738dec11e diff --git a/manifest.uuid b/manifest.uuid index 68cfb10ea1..646f207796 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -740cb43025449b7d7b47a97ad00885e54b7701cbcb14f4a50c7523022e3936d5 \ No newline at end of file +e690abb9e4e189c41182ac813115d55d811135013f5ce94ec0c45a547597f8ad \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b5fbff6454..442128adca 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -214,8 +214,7 @@ #ifndef __has_extension # define __has_extension(x) 0 /* compatibility with non-clang compilers */ #endif -#if GCC_VERSION>=4007000 || \ - (__has_extension(c_atomic) && __has_extension(c_atomic_store_n)) +#if GCC_VERSION>=4007000 || __has_extension(c_atomic) # define AtomicLoad(PTR) __atomic_load_n((PTR),__ATOMIC_RELAXED) # define AtomicStore(PTR,VAL) __atomic_store_n((PTR),(VAL),__ATOMIC_RELAXED) #else From a612c1c9bccae286f3bcd938f70dbbaa106e62ad Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 5 Jul 2021 18:37:37 +0000 Subject: [PATCH 037/100] Add the ATOMIC_INTRINSICS compile-time output output. Move sqlite3Int.h in front of ctime.c so that default values that are not overridden are shown in PRAGMA compile-time option output. FossilOrigin-Name: e306952690bfb140e2c404a74b05ff2d070c487f7e52c62d62a004505fba0e15 --- manifest | 20 +-- manifest.uuid | 2 +- src/ctime.c | 356 ++++++++++++++++++++++---------------------- src/sqliteInt.h | 2 + tool/mkctimec.tcl | 4 +- tool/mksqlite3c.tcl | 2 +- 6 files changed, 194 insertions(+), 192 deletions(-) diff --git a/manifest b/manifest index a93cdd7e1d..8570dba9d8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Revert\s[5204c2c4a7b73a64],\srestoring\sthe\sold\spre-processor\slogic\sfor\sdetermining\sthe\savailability\sof\sthe\s__atomic_store_n()/__atomic_load_n()\sprimitives. -D 2021-07-05T17:15:38.183 +C Add\sthe\sATOMIC_INTRINSICS\scompile-time\soutput\soutput.\s\sMove\ssqlite3Int.h\nin\sfront\sof\sctime.c\sso\sthat\sdefault\svalues\sthat\sare\snot\soverridden\sare\nshown\sin\sPRAGMA\scompile-time\soption\soutput. +D 2021-07-05T18:37:37.729 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -491,7 +491,7 @@ F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c 3052b6b05ed9ef547a3dd66b8e01bfa9d582e78752ad6ed327da84652641e038 +F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c @@ -549,7 +549,7 @@ F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4c F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 72bdf367026290b4a631779127de4d50fc2b1b59066342beabaf80a11555aaf7 +F src/sqliteInt.h b5e0732368e4a4f925b7994538cd3fd3b85027a1c4dcadf3fc944b36f35ce8cd F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1846,7 +1846,7 @@ F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8 F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x -F tool/mkctimec.tcl 06b0d503ee0e6c2d4abe83563b43d4925a12e31ec9fb3249ce39661f53fbd1ce +F tool/mkctimec.tcl 5ef1891ed3d0e8143ff39bad7c01ed60c2817a2fb2d9a09487f7ccad2df621e4 F tool/mkkeywordhash.c 08b6e4d7a482a7f37a9a0032e7ba968e26624a027b6b2e9ba589be6f5e3d8c2c F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c @@ -1857,7 +1857,7 @@ F tool/mkshellc.tcl 5fe7e518112b262e25726f248c0f33dd153192867453984b6af0a76a88e9 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 00c4c0382eb000153182da2bee2547ca05554eeeed10177efe5894c54e4e6d4d +F tool/mksqlite3c.tcl b4a930a4c3f8f43273cde45a459eb8881479be3c2845526c92b2513a4995aab8 F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 @@ -1919,7 +1919,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 740cb43025449b7d7b47a97ad00885e54b7701cbcb14f4a50c7523022e3936d5 -R c38bc63b0e4c77ae43be3b1d873807d7 -U dan -Z 5c6f4318a3def93e7f66935738dec11e +P e690abb9e4e189c41182ac813115d55d811135013f5ce94ec0c45a547597f8ad +R a2ccd00a396f9ce88779c0faa6b62ebe +U drh +Z bd5982e15977a466d333a20a1806f8f8 diff --git a/manifest.uuid b/manifest.uuid index 646f207796..0dacbe7748 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e690abb9e4e189c41182ac813115d55d811135013f5ce94ec0c45a547597f8ad \ No newline at end of file +e306952690bfb140e2c404a74b05ff2d070c487f7e52c62d62a004505fba0e15 \ No newline at end of file diff --git a/src/ctime.c b/src/ctime.c index fa69216c6d..de68ea7f57 100644 --- a/src/ctime.c +++ b/src/ctime.c @@ -13,7 +13,6 @@ ** This file implements routines used to report what compile-time options ** SQLite was built with. */ - #ifndef SQLITE_OMIT_COMPILEOPTION_DIAGS /* IMP: R-16824-07538 */ /* @@ -35,6 +34,7 @@ ** comma. e.g. (-DSQLITE_DEFAULT_LOOKASIDE="100,100") */ #define CTIMEOPT_VAL2_(opt1,opt2) #opt1 "," #opt2 #define CTIMEOPT_VAL2(opt) CTIMEOPT_VAL2_(opt) +#include "sqliteInt.h" /* ** An array of names of all compile-time options. This array should @@ -49,13 +49,13 @@ static const char * const sqlite3azCompileOpt[] = { /* ** BEGIN CODE GENERATED BY tool/mkctime.tcl */ -#if SQLITE_32BIT_ROWID +#ifdef SQLITE_32BIT_ROWID "32BIT_ROWID", #endif -#if SQLITE_4_BYTE_ALIGNED_MALLOC +#ifdef SQLITE_4_BYTE_ALIGNED_MALLOC "4_BYTE_ALIGNED_MALLOC", #endif -#if SQLITE_64BIT_STATS +#ifdef SQLITE_64BIT_STATS "64BIT_STATS", #endif #ifdef SQLITE_ALLOW_COVERING_INDEX_SCAN @@ -63,19 +63,22 @@ static const char * const sqlite3azCompileOpt[] = { "ALLOW_COVERING_INDEX_SCAN=" CTIMEOPT_VAL(SQLITE_ALLOW_COVERING_INDEX_SCAN), # endif #endif -#if SQLITE_ALLOW_URI_AUTHORITY +#ifdef SQLITE_ALLOW_URI_AUTHORITY "ALLOW_URI_AUTHORITY", #endif +#ifdef SQLITE_ATOMIC_INTRINSICS + "ATOMIC_INTRINSICS=" CTIMEOPT_VAL(SQLITE_ATOMIC_INTRINSICS), +#endif #ifdef SQLITE_BITMASK_TYPE "BITMASK_TYPE=" CTIMEOPT_VAL(SQLITE_BITMASK_TYPE), #endif -#if SQLITE_BUG_COMPATIBLE_20160819 +#ifdef SQLITE_BUG_COMPATIBLE_20160819 "BUG_COMPATIBLE_20160819", #endif -#if SQLITE_CASE_SENSITIVE_LIKE +#ifdef SQLITE_CASE_SENSITIVE_LIKE "CASE_SENSITIVE_LIKE", #endif -#if SQLITE_CHECK_PAGES +#ifdef SQLITE_CHECK_PAGES "CHECK_PAGES", #endif #if defined(__clang__) && defined(__clang_major__) @@ -87,22 +90,22 @@ static const char * const sqlite3azCompileOpt[] = { #elif defined(__GNUC__) && defined(__VERSION__) "COMPILER=gcc-" __VERSION__, #endif -#if SQLITE_COVERAGE_TEST +#ifdef SQLITE_COVERAGE_TEST "COVERAGE_TEST", #endif -#if SQLITE_DEBUG +#ifdef SQLITE_DEBUG "DEBUG", #endif -#if SQLITE_DEFAULT_AUTOMATIC_INDEX +#ifdef SQLITE_DEFAULT_AUTOMATIC_INDEX "DEFAULT_AUTOMATIC_INDEX", #endif -#if SQLITE_DEFAULT_AUTOVACUUM +#ifdef SQLITE_DEFAULT_AUTOVACUUM "DEFAULT_AUTOVACUUM", #endif #ifdef SQLITE_DEFAULT_CACHE_SIZE "DEFAULT_CACHE_SIZE=" CTIMEOPT_VAL(SQLITE_DEFAULT_CACHE_SIZE), #endif -#if SQLITE_DEFAULT_CKPTFULLFSYNC +#ifdef SQLITE_DEFAULT_CKPTFULLFSYNC "DEFAULT_CKPTFULLFSYNC", #endif #ifdef SQLITE_DEFAULT_FILE_FORMAT @@ -111,7 +114,7 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_DEFAULT_FILE_PERMISSIONS "DEFAULT_FILE_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_FILE_PERMISSIONS), #endif -#if SQLITE_DEFAULT_FOREIGN_KEYS +#ifdef SQLITE_DEFAULT_FOREIGN_KEYS "DEFAULT_FOREIGN_KEYS", #endif #ifdef SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT @@ -140,7 +143,7 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_DEFAULT_PROXYDIR_PERMISSIONS "DEFAULT_PROXYDIR_PERMISSIONS=" CTIMEOPT_VAL(SQLITE_DEFAULT_PROXYDIR_PERMISSIONS), #endif -#if SQLITE_DEFAULT_RECURSIVE_TRIGGERS +#ifdef SQLITE_DEFAULT_RECURSIVE_TRIGGERS "DEFAULT_RECURSIVE_TRIGGERS", #endif #ifdef SQLITE_DEFAULT_ROWEST @@ -161,196 +164,196 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_DEFAULT_WORKER_THREADS "DEFAULT_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_DEFAULT_WORKER_THREADS), #endif -#if SQLITE_DIRECT_OVERFLOW_READ +#ifdef SQLITE_DIRECT_OVERFLOW_READ "DIRECT_OVERFLOW_READ", #endif -#if SQLITE_DISABLE_DIRSYNC +#ifdef SQLITE_DISABLE_DIRSYNC "DISABLE_DIRSYNC", #endif -#if SQLITE_DISABLE_FTS3_UNICODE +#ifdef SQLITE_DISABLE_FTS3_UNICODE "DISABLE_FTS3_UNICODE", #endif -#if SQLITE_DISABLE_FTS4_DEFERRED +#ifdef SQLITE_DISABLE_FTS4_DEFERRED "DISABLE_FTS4_DEFERRED", #endif -#if SQLITE_DISABLE_INTRINSIC +#ifdef SQLITE_DISABLE_INTRINSIC "DISABLE_INTRINSIC", #endif -#if SQLITE_DISABLE_LFS +#ifdef SQLITE_DISABLE_LFS "DISABLE_LFS", #endif -#if SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS +#ifdef SQLITE_DISABLE_PAGECACHE_OVERFLOW_STATS "DISABLE_PAGECACHE_OVERFLOW_STATS", #endif -#if SQLITE_DISABLE_SKIPAHEAD_DISTINCT +#ifdef SQLITE_DISABLE_SKIPAHEAD_DISTINCT "DISABLE_SKIPAHEAD_DISTINCT", #endif #ifdef SQLITE_ENABLE_8_3_NAMES "ENABLE_8_3_NAMES=" CTIMEOPT_VAL(SQLITE_ENABLE_8_3_NAMES), #endif -#if SQLITE_ENABLE_API_ARMOR +#ifdef SQLITE_ENABLE_API_ARMOR "ENABLE_API_ARMOR", #endif -#if SQLITE_ENABLE_ATOMIC_WRITE +#ifdef SQLITE_ENABLE_ATOMIC_WRITE "ENABLE_ATOMIC_WRITE", #endif -#if SQLITE_ENABLE_BATCH_ATOMIC_WRITE +#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE "ENABLE_BATCH_ATOMIC_WRITE", #endif -#if SQLITE_ENABLE_BYTECODE_VTAB +#ifdef SQLITE_ENABLE_BYTECODE_VTAB "ENABLE_BYTECODE_VTAB", #endif #ifdef SQLITE_ENABLE_CEROD "ENABLE_CEROD=" CTIMEOPT_VAL(SQLITE_ENABLE_CEROD), #endif -#if SQLITE_ENABLE_COLUMN_METADATA +#ifdef SQLITE_ENABLE_COLUMN_METADATA "ENABLE_COLUMN_METADATA", #endif -#if SQLITE_ENABLE_COLUMN_USED_MASK +#ifdef SQLITE_ENABLE_COLUMN_USED_MASK "ENABLE_COLUMN_USED_MASK", #endif -#if SQLITE_ENABLE_COSTMULT +#ifdef SQLITE_ENABLE_COSTMULT "ENABLE_COSTMULT", #endif -#if SQLITE_ENABLE_CURSOR_HINTS +#ifdef SQLITE_ENABLE_CURSOR_HINTS "ENABLE_CURSOR_HINTS", #endif -#if SQLITE_ENABLE_DBPAGE_VTAB +#ifdef SQLITE_ENABLE_DBPAGE_VTAB "ENABLE_DBPAGE_VTAB", #endif -#if SQLITE_ENABLE_DBSTAT_VTAB +#ifdef SQLITE_ENABLE_DBSTAT_VTAB "ENABLE_DBSTAT_VTAB", #endif -#if SQLITE_ENABLE_EXPENSIVE_ASSERT +#ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT "ENABLE_EXPENSIVE_ASSERT", #endif -#if SQLITE_ENABLE_EXPLAIN_COMMENTS +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS "ENABLE_EXPLAIN_COMMENTS", #endif -#if SQLITE_ENABLE_FTS3 +#ifdef SQLITE_ENABLE_FTS3 "ENABLE_FTS3", #endif -#if SQLITE_ENABLE_FTS3_PARENTHESIS +#ifdef SQLITE_ENABLE_FTS3_PARENTHESIS "ENABLE_FTS3_PARENTHESIS", #endif -#if SQLITE_ENABLE_FTS3_TOKENIZER +#ifdef SQLITE_ENABLE_FTS3_TOKENIZER "ENABLE_FTS3_TOKENIZER", #endif -#if SQLITE_ENABLE_FTS4 +#ifdef SQLITE_ENABLE_FTS4 "ENABLE_FTS4", #endif -#if SQLITE_ENABLE_FTS5 +#ifdef SQLITE_ENABLE_FTS5 "ENABLE_FTS5", #endif -#if SQLITE_ENABLE_GEOPOLY +#ifdef SQLITE_ENABLE_GEOPOLY "ENABLE_GEOPOLY", #endif -#if SQLITE_ENABLE_HIDDEN_COLUMNS +#ifdef SQLITE_ENABLE_HIDDEN_COLUMNS "ENABLE_HIDDEN_COLUMNS", #endif -#if SQLITE_ENABLE_ICU +#ifdef SQLITE_ENABLE_ICU "ENABLE_ICU", #endif -#if SQLITE_ENABLE_IOTRACE +#ifdef SQLITE_ENABLE_IOTRACE "ENABLE_IOTRACE", #endif -#if SQLITE_ENABLE_JSON1 +#ifdef SQLITE_ENABLE_JSON1 "ENABLE_JSON1", #endif -#if SQLITE_ENABLE_LOAD_EXTENSION +#ifdef SQLITE_ENABLE_LOAD_EXTENSION "ENABLE_LOAD_EXTENSION", #endif #ifdef SQLITE_ENABLE_LOCKING_STYLE "ENABLE_LOCKING_STYLE=" CTIMEOPT_VAL(SQLITE_ENABLE_LOCKING_STYLE), #endif -#if SQLITE_ENABLE_MATH_FUNCTIONS +#ifdef SQLITE_ENABLE_MATH_FUNCTIONS "ENABLE_MATH_FUNCTIONS", #endif -#if SQLITE_ENABLE_MEMORY_MANAGEMENT +#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT "ENABLE_MEMORY_MANAGEMENT", #endif -#if SQLITE_ENABLE_MEMSYS3 +#ifdef SQLITE_ENABLE_MEMSYS3 "ENABLE_MEMSYS3", #endif -#if SQLITE_ENABLE_MEMSYS5 +#ifdef SQLITE_ENABLE_MEMSYS5 "ENABLE_MEMSYS5", #endif -#if SQLITE_ENABLE_MULTIPLEX +#ifdef SQLITE_ENABLE_MULTIPLEX "ENABLE_MULTIPLEX", #endif -#if SQLITE_ENABLE_NORMALIZE +#ifdef SQLITE_ENABLE_NORMALIZE "ENABLE_NORMALIZE", #endif -#if SQLITE_ENABLE_NULL_TRIM +#ifdef SQLITE_ENABLE_NULL_TRIM "ENABLE_NULL_TRIM", #endif -#if SQLITE_ENABLE_OFFSET_SQL_FUNC +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC "ENABLE_OFFSET_SQL_FUNC", #endif -#if SQLITE_ENABLE_OVERSIZE_CELL_CHECK +#ifdef SQLITE_ENABLE_OVERSIZE_CELL_CHECK "ENABLE_OVERSIZE_CELL_CHECK", #endif -#if SQLITE_ENABLE_PREUPDATE_HOOK +#ifdef SQLITE_ENABLE_PREUPDATE_HOOK "ENABLE_PREUPDATE_HOOK", #endif -#if SQLITE_ENABLE_QPSG +#ifdef SQLITE_ENABLE_QPSG "ENABLE_QPSG", #endif -#if SQLITE_ENABLE_RBU +#ifdef SQLITE_ENABLE_RBU "ENABLE_RBU", #endif -#if SQLITE_ENABLE_RTREE +#ifdef SQLITE_ENABLE_RTREE "ENABLE_RTREE", #endif -#if SQLITE_ENABLE_SELECTTRACE +#ifdef SQLITE_ENABLE_SELECTTRACE "ENABLE_SELECTTRACE", #endif -#if SQLITE_ENABLE_SESSION +#ifdef SQLITE_ENABLE_SESSION "ENABLE_SESSION", #endif -#if SQLITE_ENABLE_SNAPSHOT +#ifdef SQLITE_ENABLE_SNAPSHOT "ENABLE_SNAPSHOT", #endif -#if SQLITE_ENABLE_SORTER_REFERENCES +#ifdef SQLITE_ENABLE_SORTER_REFERENCES "ENABLE_SORTER_REFERENCES", #endif -#if SQLITE_ENABLE_SQLLOG +#ifdef SQLITE_ENABLE_SQLLOG "ENABLE_SQLLOG", #endif -#if SQLITE_ENABLE_STAT4 +#ifdef SQLITE_ENABLE_STAT4 "ENABLE_STAT4", #endif -#if SQLITE_ENABLE_STMTVTAB +#ifdef SQLITE_ENABLE_STMTVTAB "ENABLE_STMTVTAB", #endif -#if SQLITE_ENABLE_STMT_SCANSTATUS +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS "ENABLE_STMT_SCANSTATUS", #endif -#if SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION +#ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION "ENABLE_UNKNOWN_SQL_FUNCTION", #endif -#if SQLITE_ENABLE_UNLOCK_NOTIFY +#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY "ENABLE_UNLOCK_NOTIFY", #endif -#if SQLITE_ENABLE_UPDATE_DELETE_LIMIT +#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT "ENABLE_UPDATE_DELETE_LIMIT", #endif -#if SQLITE_ENABLE_URI_00_ERROR +#ifdef SQLITE_ENABLE_URI_00_ERROR "ENABLE_URI_00_ERROR", #endif -#if SQLITE_ENABLE_VFSTRACE +#ifdef SQLITE_ENABLE_VFSTRACE "ENABLE_VFSTRACE", #endif -#if SQLITE_ENABLE_WHERETRACE +#ifdef SQLITE_ENABLE_WHERETRACE "ENABLE_WHERETRACE", #endif -#if SQLITE_ENABLE_ZIPVFS +#ifdef SQLITE_ENABLE_ZIPVFS "ENABLE_ZIPVFS", #endif -#if SQLITE_EXPLAIN_ESTIMATED_ROWS +#ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS "EXPLAIN_ESTIMATED_ROWS", #endif -#if SQLITE_EXTRA_IFNULLROW +#ifdef SQLITE_EXTRA_IFNULLROW "EXTRA_IFNULLROW", #endif #ifdef SQLITE_EXTRA_INIT @@ -362,10 +365,10 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_FTS3_MAX_EXPR_DEPTH "FTS3_MAX_EXPR_DEPTH=" CTIMEOPT_VAL(SQLITE_FTS3_MAX_EXPR_DEPTH), #endif -#if SQLITE_FTS5_ENABLE_TEST_MI +#ifdef SQLITE_FTS5_ENABLE_TEST_MI "FTS5_ENABLE_TEST_MI", #endif -#if SQLITE_FTS5_NO_WITHOUT_ROWID +#ifdef SQLITE_FTS5_NO_WITHOUT_ROWID "FTS5_NO_WITHOUT_ROWID", #endif #if HAVE_ISNAN || SQLITE_HAVE_ISNAN @@ -376,28 +379,28 @@ static const char * const sqlite3azCompileOpt[] = { "HOMEGROWN_RECURSIVE_MUTEX=" CTIMEOPT_VAL(SQLITE_HOMEGROWN_RECURSIVE_MUTEX), # endif #endif -#if SQLITE_IGNORE_AFP_LOCK_ERRORS +#ifdef SQLITE_IGNORE_AFP_LOCK_ERRORS "IGNORE_AFP_LOCK_ERRORS", #endif -#if SQLITE_IGNORE_FLOCK_LOCK_ERRORS +#ifdef SQLITE_IGNORE_FLOCK_LOCK_ERRORS "IGNORE_FLOCK_LOCK_ERRORS", #endif -#if SQLITE_INLINE_MEMCPY +#ifdef SQLITE_INLINE_MEMCPY "INLINE_MEMCPY", #endif -#if SQLITE_INT64_TYPE +#ifdef SQLITE_INT64_TYPE "INT64_TYPE", #endif #ifdef SQLITE_INTEGRITY_CHECK_ERROR_MAX "INTEGRITY_CHECK_ERROR_MAX=" CTIMEOPT_VAL(SQLITE_INTEGRITY_CHECK_ERROR_MAX), #endif -#if SQLITE_LIKE_DOESNT_MATCH_BLOBS +#ifdef SQLITE_LIKE_DOESNT_MATCH_BLOBS "LIKE_DOESNT_MATCH_BLOBS", #endif -#if SQLITE_LOCK_TRACE +#ifdef SQLITE_LOCK_TRACE "LOCK_TRACE", #endif -#if SQLITE_LOG_CACHE_SPILL +#ifdef SQLITE_LOG_CACHE_SPILL "LOG_CACHE_SPILL", #endif #ifdef SQLITE_MALLOC_SOFT_LIMIT @@ -460,190 +463,187 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_MAX_WORKER_THREADS "MAX_WORKER_THREADS=" CTIMEOPT_VAL(SQLITE_MAX_WORKER_THREADS), #endif -#if SQLITE_MEMDEBUG +#ifdef SQLITE_MEMDEBUG "MEMDEBUG", #endif -#if SQLITE_MIXED_ENDIAN_64BIT_FLOAT +#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT "MIXED_ENDIAN_64BIT_FLOAT", #endif -#if SQLITE_MMAP_READWRITE +#ifdef SQLITE_MMAP_READWRITE "MMAP_READWRITE", #endif -#if SQLITE_MUTEX_NOOP +#ifdef SQLITE_MUTEX_NOOP "MUTEX_NOOP", #endif -#if SQLITE_MUTEX_OMIT +#ifdef SQLITE_MUTEX_OMIT "MUTEX_OMIT", #endif -#if SQLITE_MUTEX_PTHREADS +#ifdef SQLITE_MUTEX_PTHREADS "MUTEX_PTHREADS", #endif -#if SQLITE_MUTEX_W32 +#ifdef SQLITE_MUTEX_W32 "MUTEX_W32", #endif -#if SQLITE_NEED_ERR_NAME +#ifdef SQLITE_NEED_ERR_NAME "NEED_ERR_NAME", #endif -#if SQLITE_NOINLINE - "NOINLINE", -#endif -#if SQLITE_NO_SYNC +#ifdef SQLITE_NO_SYNC "NO_SYNC", #endif -#if SQLITE_OMIT_ALTERTABLE +#ifdef SQLITE_OMIT_ALTERTABLE "OMIT_ALTERTABLE", #endif -#if SQLITE_OMIT_ANALYZE +#ifdef SQLITE_OMIT_ANALYZE "OMIT_ANALYZE", #endif -#if SQLITE_OMIT_ATTACH +#ifdef SQLITE_OMIT_ATTACH "OMIT_ATTACH", #endif -#if SQLITE_OMIT_AUTHORIZATION +#ifdef SQLITE_OMIT_AUTHORIZATION "OMIT_AUTHORIZATION", #endif -#if SQLITE_OMIT_AUTOINCREMENT +#ifdef SQLITE_OMIT_AUTOINCREMENT "OMIT_AUTOINCREMENT", #endif -#if SQLITE_OMIT_AUTOINIT +#ifdef SQLITE_OMIT_AUTOINIT "OMIT_AUTOINIT", #endif -#if SQLITE_OMIT_AUTOMATIC_INDEX +#ifdef SQLITE_OMIT_AUTOMATIC_INDEX "OMIT_AUTOMATIC_INDEX", #endif -#if SQLITE_OMIT_AUTORESET +#ifdef SQLITE_OMIT_AUTORESET "OMIT_AUTORESET", #endif -#if SQLITE_OMIT_AUTOVACUUM +#ifdef SQLITE_OMIT_AUTOVACUUM "OMIT_AUTOVACUUM", #endif -#if SQLITE_OMIT_BETWEEN_OPTIMIZATION +#ifdef SQLITE_OMIT_BETWEEN_OPTIMIZATION "OMIT_BETWEEN_OPTIMIZATION", #endif -#if SQLITE_OMIT_BLOB_LITERAL +#ifdef SQLITE_OMIT_BLOB_LITERAL "OMIT_BLOB_LITERAL", #endif -#if SQLITE_OMIT_CAST +#ifdef SQLITE_OMIT_CAST "OMIT_CAST", #endif -#if SQLITE_OMIT_CHECK +#ifdef SQLITE_OMIT_CHECK "OMIT_CHECK", #endif -#if SQLITE_OMIT_COMPLETE +#ifdef SQLITE_OMIT_COMPLETE "OMIT_COMPLETE", #endif -#if SQLITE_OMIT_COMPOUND_SELECT +#ifdef SQLITE_OMIT_COMPOUND_SELECT "OMIT_COMPOUND_SELECT", #endif -#if SQLITE_OMIT_CONFLICT_CLAUSE +#ifdef SQLITE_OMIT_CONFLICT_CLAUSE "OMIT_CONFLICT_CLAUSE", #endif -#if SQLITE_OMIT_CTE +#ifdef SQLITE_OMIT_CTE "OMIT_CTE", #endif #if defined(SQLITE_OMIT_DATETIME_FUNCS) || defined(SQLITE_OMIT_FLOATING_POINT) "OMIT_DATETIME_FUNCS", #endif -#if SQLITE_OMIT_DECLTYPE +#ifdef SQLITE_OMIT_DECLTYPE "OMIT_DECLTYPE", #endif -#if SQLITE_OMIT_DEPRECATED +#ifdef SQLITE_OMIT_DEPRECATED "OMIT_DEPRECATED", #endif -#if SQLITE_OMIT_DESERIALIZE +#ifdef SQLITE_OMIT_DESERIALIZE "OMIT_DESERIALIZE", #endif -#if SQLITE_OMIT_DISKIO +#ifdef SQLITE_OMIT_DISKIO "OMIT_DISKIO", #endif -#if SQLITE_OMIT_EXPLAIN +#ifdef SQLITE_OMIT_EXPLAIN "OMIT_EXPLAIN", #endif -#if SQLITE_OMIT_FLAG_PRAGMAS +#ifdef SQLITE_OMIT_FLAG_PRAGMAS "OMIT_FLAG_PRAGMAS", #endif -#if SQLITE_OMIT_FLOATING_POINT +#ifdef SQLITE_OMIT_FLOATING_POINT "OMIT_FLOATING_POINT", #endif -#if SQLITE_OMIT_FOREIGN_KEY +#ifdef SQLITE_OMIT_FOREIGN_KEY "OMIT_FOREIGN_KEY", #endif -#if SQLITE_OMIT_GET_TABLE +#ifdef SQLITE_OMIT_GET_TABLE "OMIT_GET_TABLE", #endif -#if SQLITE_OMIT_HEX_INTEGER +#ifdef SQLITE_OMIT_HEX_INTEGER "OMIT_HEX_INTEGER", #endif -#if SQLITE_OMIT_INCRBLOB +#ifdef SQLITE_OMIT_INCRBLOB "OMIT_INCRBLOB", #endif -#if SQLITE_OMIT_INTEGRITY_CHECK +#ifdef SQLITE_OMIT_INTEGRITY_CHECK "OMIT_INTEGRITY_CHECK", #endif -#if SQLITE_OMIT_INTROSPECTION_PRAGMAS +#ifdef SQLITE_OMIT_INTROSPECTION_PRAGMAS "OMIT_INTROSPECTION_PRAGMAS", #endif -#if SQLITE_OMIT_LIKE_OPTIMIZATION +#ifdef SQLITE_OMIT_LIKE_OPTIMIZATION "OMIT_LIKE_OPTIMIZATION", #endif -#if SQLITE_OMIT_LOAD_EXTENSION +#ifdef SQLITE_OMIT_LOAD_EXTENSION "OMIT_LOAD_EXTENSION", #endif -#if SQLITE_OMIT_LOCALTIME +#ifdef SQLITE_OMIT_LOCALTIME "OMIT_LOCALTIME", #endif -#if SQLITE_OMIT_LOOKASIDE +#ifdef SQLITE_OMIT_LOOKASIDE "OMIT_LOOKASIDE", #endif -#if SQLITE_OMIT_MEMORYDB +#ifdef SQLITE_OMIT_MEMORYDB "OMIT_MEMORYDB", #endif -#if SQLITE_OMIT_OR_OPTIMIZATION +#ifdef SQLITE_OMIT_OR_OPTIMIZATION "OMIT_OR_OPTIMIZATION", #endif -#if SQLITE_OMIT_PAGER_PRAGMAS +#ifdef SQLITE_OMIT_PAGER_PRAGMAS "OMIT_PAGER_PRAGMAS", #endif -#if SQLITE_OMIT_PARSER_TRACE +#ifdef SQLITE_OMIT_PARSER_TRACE "OMIT_PARSER_TRACE", #endif -#if SQLITE_OMIT_POPEN +#ifdef SQLITE_OMIT_POPEN "OMIT_POPEN", #endif -#if SQLITE_OMIT_PRAGMA +#ifdef SQLITE_OMIT_PRAGMA "OMIT_PRAGMA", #endif -#if SQLITE_OMIT_PROGRESS_CALLBACK +#ifdef SQLITE_OMIT_PROGRESS_CALLBACK "OMIT_PROGRESS_CALLBACK", #endif -#if SQLITE_OMIT_QUICKBALANCE +#ifdef SQLITE_OMIT_QUICKBALANCE "OMIT_QUICKBALANCE", #endif -#if SQLITE_OMIT_REINDEX +#ifdef SQLITE_OMIT_REINDEX "OMIT_REINDEX", #endif -#if SQLITE_OMIT_SCHEMA_PRAGMAS +#ifdef SQLITE_OMIT_SCHEMA_PRAGMAS "OMIT_SCHEMA_PRAGMAS", #endif -#if SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS +#ifdef SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS "OMIT_SCHEMA_VERSION_PRAGMAS", #endif -#if SQLITE_OMIT_SHARED_CACHE +#ifdef SQLITE_OMIT_SHARED_CACHE "OMIT_SHARED_CACHE", #endif -#if SQLITE_OMIT_SHUTDOWN_DIRECTORIES +#ifdef SQLITE_OMIT_SHUTDOWN_DIRECTORIES "OMIT_SHUTDOWN_DIRECTORIES", #endif -#if SQLITE_OMIT_SUBQUERY +#ifdef SQLITE_OMIT_SUBQUERY "OMIT_SUBQUERY", #endif -#if SQLITE_OMIT_TCL_VARIABLE +#ifdef SQLITE_OMIT_TCL_VARIABLE "OMIT_TCL_VARIABLE", #endif -#if SQLITE_OMIT_TEMPDB +#ifdef SQLITE_OMIT_TEMPDB "OMIT_TEMPDB", #endif -#if SQLITE_OMIT_TEST_CONTROL +#ifdef SQLITE_OMIT_TEST_CONTROL "OMIT_TEST_CONTROL", #endif #ifdef SQLITE_OMIT_TRACE @@ -651,37 +651,37 @@ static const char * const sqlite3azCompileOpt[] = { "OMIT_TRACE=" CTIMEOPT_VAL(SQLITE_OMIT_TRACE), # endif #endif -#if SQLITE_OMIT_TRIGGER +#ifdef SQLITE_OMIT_TRIGGER "OMIT_TRIGGER", #endif -#if SQLITE_OMIT_TRUNCATE_OPTIMIZATION +#ifdef SQLITE_OMIT_TRUNCATE_OPTIMIZATION "OMIT_TRUNCATE_OPTIMIZATION", #endif -#if SQLITE_OMIT_UTF16 +#ifdef SQLITE_OMIT_UTF16 "OMIT_UTF16", #endif -#if SQLITE_OMIT_VACUUM +#ifdef SQLITE_OMIT_VACUUM "OMIT_VACUUM", #endif -#if SQLITE_OMIT_VIEW +#ifdef SQLITE_OMIT_VIEW "OMIT_VIEW", #endif -#if SQLITE_OMIT_VIRTUALTABLE +#ifdef SQLITE_OMIT_VIRTUALTABLE "OMIT_VIRTUALTABLE", #endif -#if SQLITE_OMIT_WAL +#ifdef SQLITE_OMIT_WAL "OMIT_WAL", #endif -#if SQLITE_OMIT_WSD +#ifdef SQLITE_OMIT_WSD "OMIT_WSD", #endif -#if SQLITE_OMIT_XFER_OPT +#ifdef SQLITE_OMIT_XFER_OPT "OMIT_XFER_OPT", #endif -#if SQLITE_PCACHE_SEPARATE_HEADER +#ifdef SQLITE_PCACHE_SEPARATE_HEADER "PCACHE_SEPARATE_HEADER", #endif -#if SQLITE_PERFORMANCE_TRACE +#ifdef SQLITE_PERFORMANCE_TRACE "PERFORMANCE_TRACE", #endif #ifdef SQLITE_POWERSAFE_OVERWRITE @@ -689,28 +689,28 @@ static const char * const sqlite3azCompileOpt[] = { "POWERSAFE_OVERWRITE=" CTIMEOPT_VAL(SQLITE_POWERSAFE_OVERWRITE), # endif #endif -#if SQLITE_PREFER_PROXY_LOCKING +#ifdef SQLITE_PREFER_PROXY_LOCKING "PREFER_PROXY_LOCKING", #endif -#if SQLITE_PROXY_DEBUG +#ifdef SQLITE_PROXY_DEBUG "PROXY_DEBUG", #endif -#if SQLITE_REVERSE_UNORDERED_SELECTS +#ifdef SQLITE_REVERSE_UNORDERED_SELECTS "REVERSE_UNORDERED_SELECTS", #endif -#if SQLITE_RTREE_INT_ONLY +#ifdef SQLITE_RTREE_INT_ONLY "RTREE_INT_ONLY", #endif -#if SQLITE_SECURE_DELETE +#ifdef SQLITE_SECURE_DELETE "SECURE_DELETE", #endif -#if SQLITE_SMALL_STACK +#ifdef SQLITE_SMALL_STACK "SMALL_STACK", #endif #ifdef SQLITE_SORTER_PMASZ "SORTER_PMASZ=" CTIMEOPT_VAL(SQLITE_SORTER_PMASZ), #endif -#if SQLITE_SOUNDEX +#ifdef SQLITE_SOUNDEX "SOUNDEX", #endif #ifdef SQLITE_STAT4_SAMPLES @@ -719,7 +719,7 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_STMTJRNL_SPILL "STMTJRNL_SPILL=" CTIMEOPT_VAL(SQLITE_STMTJRNL_SPILL), #endif -#if SQLITE_SUBSTR_COMPATIBILITY +#ifdef SQLITE_SUBSTR_COMPATIBILITY "SUBSTR_COMPATIBILITY", #endif #if (!defined(SQLITE_WIN32_MALLOC) \ @@ -728,13 +728,13 @@ static const char * const sqlite3azCompileOpt[] = { ) || defined(SQLITE_SYSTEM_MALLOC) "SYSTEM_MALLOC", #endif -#if SQLITE_TCL +#ifdef SQLITE_TCL "TCL", #endif #ifdef SQLITE_TEMP_STORE "TEMP_STORE=" CTIMEOPT_VAL(SQLITE_TEMP_STORE), #endif -#if SQLITE_TEST +#ifdef SQLITE_TEST "TEST", #endif #if defined(SQLITE_THREADSAFE) @@ -744,31 +744,31 @@ static const char * const sqlite3azCompileOpt[] = { #else "THREADSAFE=1", #endif -#if SQLITE_UNLINK_AFTER_CLOSE +#ifdef SQLITE_UNLINK_AFTER_CLOSE "UNLINK_AFTER_CLOSE", #endif -#if SQLITE_UNTESTABLE +#ifdef SQLITE_UNTESTABLE "UNTESTABLE", #endif -#if SQLITE_USER_AUTHENTICATION +#ifdef SQLITE_USER_AUTHENTICATION "USER_AUTHENTICATION", #endif -#if SQLITE_USE_ALLOCA +#ifdef SQLITE_USE_ALLOCA "USE_ALLOCA", #endif -#if SQLITE_USE_FCNTL_TRACE +#ifdef SQLITE_USE_FCNTL_TRACE "USE_FCNTL_TRACE", #endif -#if SQLITE_USE_URI +#ifdef SQLITE_USE_URI "USE_URI", #endif -#if SQLITE_VDBE_COVERAGE +#ifdef SQLITE_VDBE_COVERAGE "VDBE_COVERAGE", #endif -#if SQLITE_WIN32_MALLOC +#ifdef SQLITE_WIN32_MALLOC "WIN32_MALLOC", #endif -#if SQLITE_ZERO_MALLOC +#ifdef SQLITE_ZERO_MALLOC "ZERO_MALLOC", #endif /* diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 442128adca..23eccd8fcb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -215,9 +215,11 @@ # define __has_extension(x) 0 /* compatibility with non-clang compilers */ #endif #if GCC_VERSION>=4007000 || __has_extension(c_atomic) +# define SQLITE_ATOMIC_INTRINSICS 1 # define AtomicLoad(PTR) __atomic_load_n((PTR),__ATOMIC_RELAXED) # define AtomicStore(PTR,VAL) __atomic_store_n((PTR),(VAL),__ATOMIC_RELAXED) #else +# define SQLITE_ATOMIC_INTRINSICS 0 # define AtomicLoad(PTR) (*(PTR)) # define AtomicStore(PTR,VAL) (*(PTR) = (VAL)) #endif diff --git a/tool/mkctimec.tcl b/tool/mkctimec.tcl index 2f15ac9fb7..6294609451 100644 --- a/tool/mkctimec.tcl +++ b/tool/mkctimec.tcl @@ -120,7 +120,6 @@ set boolean_defnil_options { SQLITE_MUTEX_PTHREADS SQLITE_MUTEX_W32 SQLITE_NEED_ERR_NAME - SQLITE_NOINLINE SQLITE_NO_SYNC SQLITE_OMIT_ALTERTABLE SQLITE_OMIT_ANALYZE @@ -216,6 +215,7 @@ set value2_options { # and is a single scalar. # set value_options { + SQLITE_ATOMIC_INTRINSICS SQLITE_BITMASK_TYPE SQLITE_DEFAULT_CACHE_SIZE SQLITE_DEFAULT_FILE_FORMAT @@ -330,7 +330,7 @@ foreach name_defval $boolean_defnnz_options { foreach b $boolean_defnil_options { set name [trim_name $b] set options($name) [subst { -#if $b +#ifdef $b "$name", #endif }] diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 41cf8aa95c..054e0fd1b9 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -303,8 +303,8 @@ proc copy_file {filename} { # inlining opportunities. # foreach file { - ctime.c sqliteInt.h + ctime.c global.c status.c From b9324fea07d4c0fb570ccefaa0cd85f45be3a01f Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Jul 2021 19:01:09 +0000 Subject: [PATCH 038/100] Do not allow writes to an fts5 table if there are any open fts5vocab cursors. FossilOrigin-Name: c49a6ed78a917d4972e048e2a9bbe4d400691f97ce7e022f0e4436ceaed7fb73 --- ext/fts5/fts5Int.h | 1 + ext/fts5/fts5_main.c | 16 ++- ext/fts5/fts5_vocab.c | 2 + ext/fts5/test/fts5corrupt3.test | 213 ++++++++++++++++++++++++++++++++ manifest | 20 +-- manifest.uuid | 2 +- 6 files changed, 242 insertions(+), 12 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index c639f9b57e..88eee83aee 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -564,6 +564,7 @@ int sqlite3Fts5GetTokenizer( Fts5Table *sqlite3Fts5TableFromCsrid(Fts5Global*, i64); int sqlite3Fts5FlushToDisk(Fts5Table*); +void sqlite3Fts5VocabLock(Fts5Table*, int); /* ** End of interface to code in fts5.c. diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 3dea6cafcb..fa6904aabd 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -117,6 +117,7 @@ struct Fts5FullTable { Fts5Storage *pStorage; /* Document store */ Fts5Global *pGlobal; /* Global (connection wide) data */ Fts5Cursor *pSortCsr; /* Sort data from this cursor */ + int nVocabLock; /* Number of locks held by fts5vocab csrs */ #ifdef SQLITE_DEBUG struct Fts5TransactionState ts; #endif @@ -1634,7 +1635,9 @@ static int fts5UpdateMethod( assert( pTab->p.pConfig->pzErrmsg==0 ); pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; - /* Put any active cursors into REQUIRE_SEEK state. */ + /* Return an error if there are any fts5vocab cursors open. Put any active + ** fts5 cursors into REQUIRE_SEEK state. */ + if( pTab->nVocabLock ) return SQLITE_LOCKED; fts5TripCursors(pTab); eType0 = sqlite3_value_type(apVal[0]); @@ -2558,6 +2561,17 @@ int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ return sqlite3Fts5StorageSync(((Fts5FullTable*)pTab)->pStorage); } +/* +** Take (bUnlock==0) or release (bUnlock==1) a vocab lock on the table +** passed as the only argument. It is not possible to modify the +** structure of the table if there are one or more vocab locks. +*/ +void sqlite3Fts5VocabLock(Fts5Table *pVtab, int bUnlock){ + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + pTab->nVocabLock += (bUnlock ? -1 : +1); + assert( pTab->nVocabLock>=0 ); +} + /* ** The xSavepoint() method. ** diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index 48aa6939c8..16550236f6 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -382,6 +382,7 @@ static int fts5VocabOpenMethod( pCsr->pStmt = pStmt; pCsr->aCnt = (i64*)&pCsr[1]; pCsr->aDoc = &pCsr->aCnt[pFts5->pConfig->nCol]; + sqlite3Fts5VocabLock(pFts5, 0); }else{ sqlite3_finalize(pStmt); } @@ -407,6 +408,7 @@ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ static int fts5VocabCloseMethod(sqlite3_vtab_cursor *pCursor){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; fts5VocabResetCursor(pCsr); + sqlite3Fts5VocabLock(pCsr->pFts5, 1); sqlite3Fts5BufferFree(&pCsr->term); sqlite3_finalize(pCsr->pStmt); sqlite3_free(pCsr); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 67adc64ff1..22bd086ec2 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -15153,6 +15153,219 @@ do_execsql_test 78.2 { SELECT count(rowid) FROM t3 WHERE term>='nsocse'; } 2 +#------------------------------------------------------------------------- +reset_db +do_test 79.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename sql053282.txt.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 06 0d b6 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d b5 00 00 00 00 00 00 ...k............ +| 3504: 00 00 00 00 00 00 56 07 06 17 1f 1f 01 7d 74 61 ......V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 01 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 12 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 01 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 05 f1 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 01 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 00 00 00 00 00 .......h.O...... +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 2c 00000XRTRIM...., +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 5a 69 53 35 58 42 49 NABLE MEMZiS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 3f d8 .#..ENABLE FTS?. +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 55 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e UAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 46 CASE.......DEBUF +| 3968: e8 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d .RTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 62 63 2d 35 2e 34 2e OMPILER=gbc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f bb 1f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 00 00 00 00 .X.P.H.@.8.0.... +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 0a 83 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end sql053282.txt.db +}]} {} + +do_execsql_test 79.1 { + CREATE VIRTUAL TABLE t2 USING fts5vocab('t1','row'); +} + +do_catchsql_test 79.2 { + INSERT INTO t1(t1) SELECT 'merge' FROM t2; +} {1 {database table is locked}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 8570dba9d8..1597e13051 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sATOMIC_INTRINSICS\scompile-time\soutput\soutput.\s\sMove\ssqlite3Int.h\nin\sfront\sof\sctime.c\sso\sthat\sdefault\svalues\sthat\sare\snot\soverridden\sare\nshown\sin\sPRAGMA\scompile-time\soption\soutput. -D 2021-07-05T18:37:37.729 +C Do\snot\sallow\swrites\sto\san\sfts5\stable\sif\sthere\sare\sany\sopen\sfts5vocab\scursors. +D 2021-07-05T19:01:09.054 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -113,14 +113,14 @@ F ext/fts3/unicode/mkunicode.tcl d5aebf022fa4577ee8cdf27468f0d847879993959101f6d F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a -F ext/fts5/fts5Int.h 26c74dd5776f798436fbf604a0bf0e8de263b35b5060b05c15f9085845d9fda2 +F ext/fts5/fts5Int.h cc824fe126e8d87e5a6f9893d18e063fd341b7171c8d0a87ca8fd987f72e8953 F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938df59a1347f F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 6ea447b0cb1888110087a8c04133817b0ccf964fe22414371b0e32189a556533 F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 F ext/fts5/fts5_index.c eb1864c6abacf08d959956183a55a4f9767af76be289f2bb519bb0f197b3fd72 -F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a +F ext/fts5/fts5_main.c 3c9d42bef0e6df2fd0fdda0ae58c71fb9fc1e10e18019d8e5da146e9bf064754 F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -128,7 +128,7 @@ F ext/fts5/fts5_test_tok.c a2bed8edb25f6432e8cdb62aad5916935c19dba8dac2b8324950c F ext/fts5/fts5_tokenize.c 5e251efb0f1af99a25ed50010ba6b1ad1250aca5921af1988fdcabe5ebc3cb43 F ext/fts5/fts5_unicode2.c eca63dbc797f8ff0572e97caf4631389c0ab900d6364861b915bdd4735973f00 F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 7a071833064dc8bca236c3c323e56aac36f583aa2c46ce916d52e31ce87462c9 +F ext/fts5/fts5_vocab.c 68d55d31c0c3f80ffcad9cda056e0d5da3959225cb555cbd6e8f8d61f9fcdb48 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 @@ -160,7 +160,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 270cc68ff73fb5d7923619f23ef0655bf0409e83bab5790824bec20f0ee3e82e +F ext/fts5/test/fts5corrupt3.test 6bf58259387847de3e9c41f4d5d8f5d1390748cf0c142dc5ff90fec42426b71d F ext/fts5/test/fts5corrupt4.test f4c08e2182a48d8b70975fd869ee5391855c06d8a0ff87b6a2529e7c5a88a1d3 F ext/fts5/test/fts5delete.test 619295b20dbc1d840b403ee07c878f52378849c3c02e44f2ee143b3e978a0aa7 F ext/fts5/test/fts5detail.test 54015e9c43ec4ba542cfb93268abdf280e0300f350efd08ee411284b03595cc4 @@ -1919,7 +1919,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 e690abb9e4e189c41182ac813115d55d811135013f5ce94ec0c45a547597f8ad -R a2ccd00a396f9ce88779c0faa6b62ebe -U drh -Z bd5982e15977a466d333a20a1806f8f8 +P e306952690bfb140e2c404a74b05ff2d070c487f7e52c62d62a004505fba0e15 +R 97f692da529fbbc0053b9965bcfd2834 +U dan +Z 35b3ccac90623680edbe1ba22c3e426c diff --git a/manifest.uuid b/manifest.uuid index 0dacbe7748..c8f8f60c70 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e306952690bfb140e2c404a74b05ff2d070c487f7e52c62d62a004505fba0e15 \ No newline at end of file +c49a6ed78a917d4972e048e2a9bbe4d400691f97ce7e022f0e4436ceaed7fb73 \ No newline at end of file From 9289f5103df03e794808e2224657ac7688106936 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 6 Jul 2021 20:44:32 +0000 Subject: [PATCH 039/100] Handle " IN (, ...)" in the same way as " IN (VALUES(, , ...)". FossilOrigin-Name: 981d230ece98ce89502dab02aa44f73699a9d0e4fce3e9e9dfd47444a5a9990f --- manifest | 19 +++++----- manifest.uuid | 2 +- src/expr.c | 49 ++++++++++++++++++++++++++ src/parse.y | 29 +++++++++------- src/sqliteInt.h | 1 + test/rowvalueA.test | 77 +++++++++++++++++++++++++++++++++++++++++ test/rowvaluefault.test | 18 ++++++++++ 7 files changed, 173 insertions(+), 22 deletions(-) create mode 100644 test/rowvalueA.test diff --git a/manifest b/manifest index 1597e13051..727760136a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\swrites\sto\san\sfts5\stable\sif\sthere\sare\sany\sopen\sfts5vocab\scursors. -D 2021-07-05T19:01:09.054 +C Handle\s"\sIN\s(,\s\s...)"\sin\sthe\ssame\sway\sas\s"\sIN\s(VALUES(,\s,\s...)". +D 2021-07-06T20:44:32.552 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c 5c532072d91855d1b91b2581c2d4447e517932713f583ed02020b7129f1cfbd7 +F src/expr.c ab3935a79da7f0aa0f2f26b16a7fdee527cd21e457876f1d53f009c472a43226 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c c96ac6f7c4f2d684217c4673a80446e1b50e25b5ea79366f333f484622d010a0 @@ -533,7 +533,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 8920f4444957d7827ca458029b2e41ffa32dd3b72917be0b52cae0aace3eadb5 +F src/parse.y 50ef70ca8c7797a405139bbf92ee34812eaa4c0aff10822792672940de424e36 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f @@ -549,7 +549,7 @@ F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4c F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h b5e0732368e4a4f925b7994538cd3fd3b85027a1c4dcadf3fc944b36f35ce8cd +F src/sqliteInt.h c78fbfc341832bad59299bfc1f932a48e3631d652ae7f443fed969d7c2de76ad F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1317,7 +1317,8 @@ F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf6f2dba F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 F test/rowvalue9.test cb5380df82dca9db463081e26952c1e097b34fc2c2ac87453970c048d97df687 -F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 +F test/rowvalueA.test 1e73cc7d35491bb46352adaade23cecc9add6094434d85445a3251fc20079ebe +F test/rowvaluefault.test 1dbe9e2a57c4b1a2ee4fb78c7a08c13d4c62885125019713190594aa4847f740 F test/rowvaluevtab.test cd9747bb3f308086944c07968f547ad6b05022e698d80b9ffbdfe09ce0b8da6f F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 @@ -1919,7 +1920,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 e306952690bfb140e2c404a74b05ff2d070c487f7e52c62d62a004505fba0e15 -R 97f692da529fbbc0053b9965bcfd2834 +P c49a6ed78a917d4972e048e2a9bbe4d400691f97ce7e022f0e4436ceaed7fb73 +R 088831e8438f8281d3a5f02f1fe2374b U dan -Z 35b3ccac90623680edbe1ba22c3e426c +Z e8e70fe2aaf0c6a219c124f4d93d407b diff --git a/manifest.uuid b/manifest.uuid index c8f8f60c70..66bb1c993e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c49a6ed78a917d4972e048e2a9bbe4d400691f97ce7e022f0e4436ceaed7fb73 \ No newline at end of file +981d230ece98ce89502dab02aa44f73699a9d0e4fce3e9e9dfd47444a5a9990f \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 637ac9131a..8351723f0d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -945,6 +945,55 @@ void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pSelect){ } } +/* +** Expression list pEList is a list of vector values. This function +** converts the contents of pEList to a VALUES(...) Select statement +** returning 1 row for each element of the list. If there are any +** non-vector expressions in the list, the corresponding row returned +** by the values statement contains a single column, the value of +** the non-vector expression itself. +** +** For example, the expression list: +** +** ( (1, 2), 3, (3, 4, 5) ) +** +** is translated to: +** +** VALUES(1, 2), (3), (3, 4, 5) +** +** This is used as part of processing IN(...) expressions with a list +** of vectors on the RHS. e.g. "... IN ((1,2), (3,4), (5,6))". +*/ +Select *sqlite3ExprListToValues(Parse *pParse, ExprList *pEList){ + int ii; + Select *pRet = 0; + for(ii=0; iinExpr; ii++){ + Select *pSel; + ExprList *pList; + Expr *pExpr = pEList->a[ii].pExpr; + if( pExpr->op==TK_VECTOR ){ + pList = pExpr->x.pList; + pExpr->x.pList = 0; + }else{ + pList = sqlite3ExprListAppend(pParse, 0, pExpr); + pEList->a[ii].pExpr = 0; + } + pSel = sqlite3SelectNew(pParse, pList, 0, 0, 0, 0, 0, SF_Values, 0); + if( pSel ){ + if( pRet ){ + pSel->op = TK_ALL; + pSel->pPrior = pRet; + } + pRet = pSel; + } + } + + if( pRet && pRet->pPrior ){ + pRet->selFlags |= SF_MultiValue; + } + sqlite3ExprListDelete(pParse->db, pEList); + return pRet; +} /* ** Join two expressions using an AND operator. If either expression is diff --git a/src/parse.y b/src/parse.y index 359b02bc4e..efc390ca03 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1254,20 +1254,25 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { */ sqlite3ExprUnmapAndDelete(pParse, A); A = sqlite3Expr(pParse->db, TK_INTEGER, N ? "1" : "0"); - }else if( Y->nExpr==1 && sqlite3ExprIsConstant(Y->a[0].pExpr) ){ - Expr *pRHS = Y->a[0].pExpr; - Y->a[0].pExpr = 0; - sqlite3ExprListDelete(pParse->db, Y); - pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0); - A = sqlite3PExpr(pParse, TK_EQ, A, pRHS); - if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); }else{ - A = sqlite3PExpr(pParse, TK_IN, A, 0); - if( A ){ - A->x.pList = Y; - sqlite3ExprSetHeightAndFlags(pParse, A); - }else{ + Expr *pRHS = Y->a[0].pExpr; + if( Y->nExpr==1 && sqlite3ExprIsConstant(pRHS) && pRHS->op!=TK_VECTOR ){ + Y->a[0].pExpr = 0; sqlite3ExprListDelete(pParse->db, Y); + pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0); + A = sqlite3PExpr(pParse, TK_EQ, A, pRHS); + }else{ + A = sqlite3PExpr(pParse, TK_IN, A, 0); + if( pRHS->op==TK_VECTOR || A==0 ){ + Select *pRHS = sqlite3ExprListToValues(pParse, Y); + if( pRHS ){ + parserDoubleLinkSelect(pParse, pRHS); + sqlite3PExprAddSelect(pParse, A, pRHS); + } + }else{ + A->x.pList = Y; + sqlite3ExprSetHeightAndFlags(pParse, A); + } } if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 23eccd8fcb..935ee09535 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4324,6 +4324,7 @@ void sqlite3ExprDeferredDelete(Parse*, Expr*); void sqlite3ExprUnmapAndDelete(Parse*, Expr*); ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); +Select *sqlite3ExprListToValues(Parse*, ExprList*); void sqlite3ExprListSetSortOrder(ExprList*,int,int); void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); diff --git a/test/rowvalueA.test b/test/rowvalueA.test new file mode 100644 index 0000000000..5cd33d4bda --- /dev/null +++ b/test/rowvalueA.test @@ -0,0 +1,77 @@ +# 2021 July 6 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix rowvalueA + +do_execsql_test 1.0 { + SELECT (1, 2) IN ( (3, 4), (5, 6), (1, 3) ); +} {0} + +do_execsql_test 1.1 { + SELECT (1, 2) IN ( (3, 4), (5, 6), (1, 2) ); +} {1} + +do_execsql_test 1.2 { + SELECT (1, 2) IN ( (3, 2) ); +} {0} + +do_execsql_test 1.3 { + SELECT (1, 2) IN ( (1, 2) ); +} {1} + +do_execsql_test 1.4 { + SELECT (1, 2) IN ( ); +} {0} + +do_execsql_test 1.5 { + SELECT (1, 2) NOT IN ( ); +} {1} + +for {set ii 0} {$ii < 2000} {incr ii} { + lappend L "($ii, $ii)" +} + +do_execsql_test 1.6.1 " + SELECT (400,400) IN ( [join $L ,] ) +" 1 + +do_execsql_test 1.6.2 " + SELECT (1500,1500) IN ( [join $L ,] ) +" 1 + +do_execsql_test 1.6.2 " + SELECT (1500,1499) IN ( [join $L ,] ) +" 0 + +#------------------------------------------------------------------------- + +do_catchsql_test 2.0 { + SELECT (1, 2) IN ( (1, 2), (3, 4, 5), (5, 6) ) +} {1 {all VALUES must have the same number of terms}} + +do_catchsql_test 2.1 { + SELECT (1, 2) IN ( (1, 2), 4, (5, 6) ) +} {1 {all VALUES must have the same number of terms}} + +do_catchsql_test 2.2 { + SELECT (1, 2, 3) IN ( (1, 2), (3, 4), (5, 6) ) +} {1 {sub-select returns 2 columns - expected 3}} + +do_catchsql_test 2.3 { + SELECT 2 IN ( (1, 2), (3, 4), (5, 6) ) +} {1 {sub-select returns 2 columns - expected 1}} + +finish_test + diff --git a/test/rowvaluefault.test b/test/rowvaluefault.test index ac1b236ba4..3ca5b34183 100644 --- a/test/rowvaluefault.test +++ b/test/rowvaluefault.test @@ -68,4 +68,22 @@ do_faultsim_test 6 -faults oom* -body { faultsim_test_result {0 {2 3}} } +do_faultsim_test 7 -faults oom* -body { + execsql { + SELECT fou FROM xyz + WHERE (one, two, thr) IN ( ('a','b','c'), ('A','A','A'), (1,2,3) ); + } +} -test { + faultsim_test_result {0 1} +} + +do_faultsim_test 8 -faults oom* -body { + execsql { + SELECT fou FROM xyz + WHERE two IN ( ('a','b','c'), ('A','A','A'), (1,2,3) ); + } +} -test { + faultsim_test_result {1 {sub-select returns 3 columns - expected 1}} +} + finish_test From cc516af4cc35c8db816aed7c69f7aef7d663e78e Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Jul 2021 11:51:03 +0000 Subject: [PATCH 040/100] Instead of disallowing writes to fts5 tables if there are fts5vocab cursors open on them (commit [c49a6ed7]), abort any fts5vocab queries if the on-disk structure of the fts5 table changes. FossilOrigin-Name: 9dbdc9001e3258e71ca995fbcdebf66ab95890ded87fa7125c6cb4bd43010aaf --- ext/fts5/fts5Int.h | 4 +++- ext/fts5/fts5_index.c | 16 ++++++++++++++++ ext/fts5/fts5_main.c | 16 +--------------- ext/fts5/fts5_vocab.c | 12 +++++++++--- ext/fts5/test/fts5corrupt3.test | 2 +- ext/fts5/test/fts5vocab2.test | 23 +++++++++++++++++++++++ manifest | 22 +++++++++++----------- manifest.uuid | 2 +- 8 files changed, 65 insertions(+), 32 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 88eee83aee..b264a391bc 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -435,6 +435,9 @@ void sqlite3Fts5IndexCloseReader(Fts5Index*); */ const char *sqlite3Fts5IterTerm(Fts5IndexIter*, int*); int sqlite3Fts5IterNextScan(Fts5IndexIter*); +void *sqlite3Fts5StructureRef(Fts5Index*); +void sqlite3Fts5StructureRelease(void*); +int sqlite3Fts5StructureTest(Fts5Index*, void*); /* @@ -564,7 +567,6 @@ int sqlite3Fts5GetTokenizer( Fts5Table *sqlite3Fts5TableFromCsrid(Fts5Global*, i64); int sqlite3Fts5FlushToDisk(Fts5Table*); -void sqlite3Fts5VocabLock(Fts5Table*, int); /* ** End of interface to code in fts5.c. diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 7cc0d46acc..613ceaf2b6 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -821,6 +821,22 @@ static void fts5StructureRef(Fts5Structure *pStruct){ pStruct->nRef++; } +void *sqlite3Fts5StructureRef(Fts5Index *p){ + fts5StructureRef(p->pStruct); + return (void*)p->pStruct; +} +void sqlite3Fts5StructureRelease(void *p){ + if( p ){ + fts5StructureRelease((Fts5Structure*)p); + } +} +int sqlite3Fts5StructureTest(Fts5Index *p, void *pStruct){ + if( p->pStruct!=(Fts5Structure*)pStruct ){ + return SQLITE_ABORT; + } + return SQLITE_OK; +} + /* ** Deserialize and return the structure record currently stored in serialized ** form within buffer pData/nData. diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index fa6904aabd..3dea6cafcb 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -117,7 +117,6 @@ struct Fts5FullTable { Fts5Storage *pStorage; /* Document store */ Fts5Global *pGlobal; /* Global (connection wide) data */ Fts5Cursor *pSortCsr; /* Sort data from this cursor */ - int nVocabLock; /* Number of locks held by fts5vocab csrs */ #ifdef SQLITE_DEBUG struct Fts5TransactionState ts; #endif @@ -1635,9 +1634,7 @@ static int fts5UpdateMethod( assert( pTab->p.pConfig->pzErrmsg==0 ); pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; - /* Return an error if there are any fts5vocab cursors open. Put any active - ** fts5 cursors into REQUIRE_SEEK state. */ - if( pTab->nVocabLock ) return SQLITE_LOCKED; + /* Put any active cursors into REQUIRE_SEEK state. */ fts5TripCursors(pTab); eType0 = sqlite3_value_type(apVal[0]); @@ -2561,17 +2558,6 @@ int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ return sqlite3Fts5StorageSync(((Fts5FullTable*)pTab)->pStorage); } -/* -** Take (bUnlock==0) or release (bUnlock==1) a vocab lock on the table -** passed as the only argument. It is not possible to modify the -** structure of the table if there are one or more vocab locks. -*/ -void sqlite3Fts5VocabLock(Fts5Table *pVtab, int bUnlock){ - Fts5FullTable *pTab = (Fts5FullTable*)pVtab; - pTab->nVocabLock += (bUnlock ? -1 : +1); - assert( pTab->nVocabLock>=0 ); -} - /* ** The xSavepoint() method. ** diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index 16550236f6..148af565e1 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -60,6 +60,7 @@ struct Fts5VocabCursor { int bEof; /* True if this cursor is at EOF */ Fts5IndexIter *pIter; /* Term/rowid iterator object */ + void *pStruct; /* From sqlite3Fts5StructureRef() */ int nLeTerm; /* Size of zLeTerm in bytes */ char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */ @@ -382,7 +383,6 @@ static int fts5VocabOpenMethod( pCsr->pStmt = pStmt; pCsr->aCnt = (i64*)&pCsr[1]; pCsr->aDoc = &pCsr->aCnt[pFts5->pConfig->nCol]; - sqlite3Fts5VocabLock(pFts5, 0); }else{ sqlite3_finalize(pStmt); } @@ -394,6 +394,8 @@ static int fts5VocabOpenMethod( static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ pCsr->rowid = 0; sqlite3Fts5IterClose(pCsr->pIter); + sqlite3Fts5StructureRelease(pCsr->pStruct); + pCsr->pStruct = 0; pCsr->pIter = 0; sqlite3_free(pCsr->zLeTerm); pCsr->nLeTerm = -1; @@ -408,7 +410,6 @@ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ static int fts5VocabCloseMethod(sqlite3_vtab_cursor *pCursor){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; fts5VocabResetCursor(pCsr); - sqlite3Fts5VocabLock(pCsr->pFts5, 1); sqlite3Fts5BufferFree(&pCsr->term); sqlite3_finalize(pCsr->pStmt); sqlite3_free(pCsr); @@ -472,9 +473,11 @@ static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab; - int rc = SQLITE_OK; int nCol = pCsr->pFts5->pConfig->nCol; + int rc; + rc = sqlite3Fts5StructureTest(pCsr->pFts5->pIndex, pCsr->pStruct); + if( rc!=SQLITE_OK ) return rc; pCsr->rowid++; if( pTab->eType==FTS5_VOCAB_INSTANCE ){ @@ -648,6 +651,9 @@ static int fts5VocabFilterMethod( if( rc==SQLITE_OK ){ Fts5Index *pIndex = pCsr->pFts5->pIndex; rc = sqlite3Fts5IndexQuery(pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); + if( rc==SQLITE_OK ){ + pCsr->pStruct = sqlite3Fts5StructureRef(pIndex); + } } if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){ rc = fts5VocabInstanceNewTerm(pCsr); diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index 22bd086ec2..adfaa6d85b 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -15364,7 +15364,7 @@ do_execsql_test 79.1 { do_catchsql_test 79.2 { INSERT INTO t1(t1) SELECT 'merge' FROM t2; -} {1 {database table is locked}} +} {1 {query aborted}} sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/ext/fts5/test/fts5vocab2.test b/ext/fts5/test/fts5vocab2.test index 45d657146f..e736303cf4 100644 --- a/ext/fts5/test/fts5vocab2.test +++ b/ext/fts5/test/fts5vocab2.test @@ -234,4 +234,27 @@ ifcapable fts3 { } {1 {no such fts5 table: main.nosuchtable}} } +#------------------------------------------------------------------------- +# Check that the fts5 table cannot be written while there are vocab +# cursors open. +reset_db +do_execsql_test 5.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a); + CREATE VIRTUAL TABLE v1 USING fts5vocab(t1, instance); + INSERT INTO t1 VALUES('one'), ('two'), ('three'), ('four'); +} + +do_test 5.1 { + list [catch { + db eval { SELECT * FROM v1 } { + db eval {INSERT INTO t1 VALUES('five')} + } + } msg] $msg +} {1 {query aborted}} + +do_execsql_test 5.2 { + SELECT * FROM t1 +} {one two three four five} finish_test + + diff --git a/manifest b/manifest index 727760136a..f078e742ad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Handle\s"\sIN\s(,\s\s...)"\sin\sthe\ssame\sway\sas\s"\sIN\s(VALUES(,\s,\s...)". -D 2021-07-06T20:44:32.552 +C Instead\sof\sdisallowing\swrites\sto\sfts5\stables\sif\sthere\sare\sfts5vocab\scursors\sopen\son\sthem\s(commit\s[c49a6ed7]),\sabort\sany\sfts5vocab\squeries\sif\sthe\son-disk\sstructure\sof\sthe\sfts5\stable\schanges. +D 2021-07-07T11:51:03.885 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -113,14 +113,14 @@ F ext/fts3/unicode/mkunicode.tcl d5aebf022fa4577ee8cdf27468f0d847879993959101f6d F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h c132a9323f22a972c4c93a8d5a3d901113a6e612faf30ca8e695788438c5ca2a -F ext/fts5/fts5Int.h cc824fe126e8d87e5a6f9893d18e063fd341b7171c8d0a87ca8fd987f72e8953 +F ext/fts5/fts5Int.h 49c1ef3aa6edabd235ce57bc3749453078d69aa02171fe3f361bcf159d1ebd62 F ext/fts5/fts5_aux.c f558e1fb9f0f86a4f7489e258c162e1f947de5ff2709087fbb465fddb7092f98 F ext/fts5/fts5_buffer.c 89a51b37c4aa1c02c1ec24c18c55196c0693b29a752fedfd036938df59a1347f F ext/fts5/fts5_config.c 8336d0ff6db0933f63cfec8ae0ab76e68393259cbccc0b46e1f79f7fa1842ff3 F ext/fts5/fts5_expr.c 6ea447b0cb1888110087a8c04133817b0ccf964fe22414371b0e32189a556533 F ext/fts5/fts5_hash.c 1aa93c9b5f461afba66701ee226297dc78402b3bdde81e90a10de5fe3df14959 -F ext/fts5/fts5_index.c eb1864c6abacf08d959956183a55a4f9767af76be289f2bb519bb0f197b3fd72 -F ext/fts5/fts5_main.c 3c9d42bef0e6df2fd0fdda0ae58c71fb9fc1e10e18019d8e5da146e9bf064754 +F ext/fts5/fts5_index.c 75249b8218dac9c9e7d62362e2be414c1399fdc380c838e5512e2042967b38c8 +F ext/fts5/fts5_main.c 35ebbcae681a4a40027c47bc2e94d7e7c81e331dc406bb9b23c546454ee8f98a F ext/fts5/fts5_storage.c 58ba71e6cd3d43a5735815e7956ee167babb4d2cbfe206905174792af4d09d75 F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -128,7 +128,7 @@ F ext/fts5/fts5_test_tok.c a2bed8edb25f6432e8cdb62aad5916935c19dba8dac2b8324950c F ext/fts5/fts5_tokenize.c 5e251efb0f1af99a25ed50010ba6b1ad1250aca5921af1988fdcabe5ebc3cb43 F ext/fts5/fts5_unicode2.c eca63dbc797f8ff0572e97caf4631389c0ab900d6364861b915bdd4735973f00 F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 68d55d31c0c3f80ffcad9cda056e0d5da3959225cb555cbd6e8f8d61f9fcdb48 +F ext/fts5/fts5_vocab.c 925a05c891edf6abd0ac4fdf4dc998c4c13bf6612d0b6c4102157bc459c0c86b F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 @@ -160,7 +160,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 213506436fb2c87567b8e31f6d43ab30aab99354cec74ed679f22aad0cdbf283 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test 6bf58259387847de3e9c41f4d5d8f5d1390748cf0c142dc5ff90fec42426b71d +F ext/fts5/test/fts5corrupt3.test 0e473620582a53ac61f468f364db8a151c1e18d2a879b16439d172c12c4c9828 F ext/fts5/test/fts5corrupt4.test f4c08e2182a48d8b70975fd869ee5391855c06d8a0ff87b6a2529e7c5a88a1d3 F ext/fts5/test/fts5delete.test 619295b20dbc1d840b403ee07c878f52378849c3c02e44f2ee143b3e978a0aa7 F ext/fts5/test/fts5detail.test 54015e9c43ec4ba542cfb93268abdf280e0300f350efd08ee411284b03595cc4 @@ -229,7 +229,7 @@ F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db638 F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a F ext/fts5/test/fts5vocab.test 7ed80d9af1ddaaa1637da05e406327b5aac250848bc604c1c1cc667908b87760 -F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 +F ext/fts5/test/fts5vocab2.test c0a8397523561eb780b4f439e75d4969fade0ac40bc73e0c8fd2f3e065111161 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl c0d43c8590656f8240e622b00957b3a0facc49482411a9fdc2870b45c0c82f9f F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 @@ -1920,7 +1920,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 c49a6ed78a917d4972e048e2a9bbe4d400691f97ce7e022f0e4436ceaed7fb73 -R 088831e8438f8281d3a5f02f1fe2374b +P 981d230ece98ce89502dab02aa44f73699a9d0e4fce3e9e9dfd47444a5a9990f +R 91d740a235eafc0a31ee5704cdc62cbc U dan -Z e8e70fe2aaf0c6a219c124f4d93d407b +Z 274ccaf9ffc17905402a8367ad18dcac diff --git a/manifest.uuid b/manifest.uuid index 66bb1c993e..0843895d4a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -981d230ece98ce89502dab02aa44f73699a9d0e4fce3e9e9dfd47444a5a9990f \ No newline at end of file +9dbdc9001e3258e71ca995fbcdebf66ab95890ded87fa7125c6cb4bd43010aaf \ No newline at end of file From 74777f994d5735e0fb3020ef24f3d0229cdc7ca2 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Jul 2021 13:53:55 +0000 Subject: [PATCH 041/100] Improve the error message in cases where there is a row-value on the LHS of an IN() operator, the RHS is a list (not a sub-select) and at least one element of the list is not a row-value with the correct number of elements. FossilOrigin-Name: 6b22f4e71dbc14c887ebbda67095b5faaa8079cac87cd4ab5a2ae90c71cd9633 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/expr.c | 34 +++++++++++++++++----------------- src/parse.y | 9 ++++++--- src/sqliteInt.h | 2 +- test/rowvalueA.test | 8 ++++---- test/rowvaluefault.test | 4 ++-- 7 files changed, 41 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index f078e742ad..458352c186 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Instead\sof\sdisallowing\swrites\sto\sfts5\stables\sif\sthere\sare\sfts5vocab\scursors\sopen\son\sthem\s(commit\s[c49a6ed7]),\sabort\sany\sfts5vocab\squeries\sif\sthe\son-disk\sstructure\sof\sthe\sfts5\stable\schanges. -D 2021-07-07T11:51:03.885 +C Improve\sthe\serror\smessage\sin\scases\swhere\sthere\sis\sa\srow-value\son\sthe\sLHS\sof\san\sIN()\soperator,\sthe\sRHS\sis\sa\slist\s(not\sa\ssub-select)\sand\sat\sleast\sone\selement\sof\sthe\slist\sis\snot\sa\srow-value\swith\sthe\scorrect\snumber\sof\selements. +D 2021-07-07T13:53:55.754 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c ab3935a79da7f0aa0f2f26b16a7fdee527cd21e457876f1d53f009c472a43226 +F src/expr.c 69ec84d79404ce9ae0712516cdf8ce724366c4b71bd22021ef28e952d9a3c44c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c c96ac6f7c4f2d684217c4673a80446e1b50e25b5ea79366f333f484622d010a0 @@ -533,7 +533,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 50ef70ca8c7797a405139bbf92ee34812eaa4c0aff10822792672940de424e36 +F src/parse.y 62388bd7323ce1b76b219de0a0974789224d98fc14cfccb08dd98524ccd693c3 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f @@ -549,7 +549,7 @@ F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4c F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h c78fbfc341832bad59299bfc1f932a48e3631d652ae7f443fed969d7c2de76ad +F src/sqliteInt.h db26ff390e4c74a86a30cbf14653a133e3e14a2146a2b7ac2cc17f3b1d8798ae F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1317,8 +1317,8 @@ F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf6f2dba F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 F test/rowvalue9.test cb5380df82dca9db463081e26952c1e097b34fc2c2ac87453970c048d97df687 -F test/rowvalueA.test 1e73cc7d35491bb46352adaade23cecc9add6094434d85445a3251fc20079ebe -F test/rowvaluefault.test 1dbe9e2a57c4b1a2ee4fb78c7a08c13d4c62885125019713190594aa4847f740 +F test/rowvalueA.test 51f79b6098c193f838168752c9640f4eae6c63346bf64b5bed4f4e22fe2c71d0 +F test/rowvaluefault.test 963ae9cdaed30a85a29668dd514e639f3556cae903ee9f172ea972d511c54fff F test/rowvaluevtab.test cd9747bb3f308086944c07968f547ad6b05022e698d80b9ffbdfe09ce0b8da6f F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 @@ -1920,7 +1920,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 981d230ece98ce89502dab02aa44f73699a9d0e4fce3e9e9dfd47444a5a9990f -R 91d740a235eafc0a31ee5704cdc62cbc +P 9dbdc9001e3258e71ca995fbcdebf66ab95890ded87fa7125c6cb4bd43010aaf +R 3de711d2b347ff8ce75f48cf9bf28e2e U dan -Z 274ccaf9ffc17905402a8367ad18dcac +Z b6fba9efd0310badf0c0e8e9ddd045f1 diff --git a/manifest.uuid b/manifest.uuid index 0843895d4a..41dd42e166 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9dbdc9001e3258e71ca995fbcdebf66ab95890ded87fa7125c6cb4bd43010aaf \ No newline at end of file +6b22f4e71dbc14c887ebbda67095b5faaa8079cac87cd4ab5a2ae90c71cd9633 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 8351723f0d..44abb58e51 100644 --- a/src/expr.c +++ b/src/expr.c @@ -948,37 +948,37 @@ void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pSelect){ /* ** Expression list pEList is a list of vector values. This function ** converts the contents of pEList to a VALUES(...) Select statement -** returning 1 row for each element of the list. If there are any -** non-vector expressions in the list, the corresponding row returned -** by the values statement contains a single column, the value of -** the non-vector expression itself. +** returning 1 row for each element of the list. For example, the +** expression list: ** -** For example, the expression list: +** ( (1,2), (3,4) (5,6) ) ** -** ( (1, 2), 3, (3, 4, 5) ) +** is translated to the equivalent of: ** -** is translated to: +** VALUES(1,2), (3,4), (5,6) ** -** VALUES(1, 2), (3), (3, 4, 5) +** Each of the vector values in pEList must contain exactly nElem terms. +** If a list element that is not a vector or does not contain nElem terms, +** an error message is left in pParse. ** ** This is used as part of processing IN(...) expressions with a list ** of vectors on the RHS. e.g. "... IN ((1,2), (3,4), (5,6))". */ -Select *sqlite3ExprListToValues(Parse *pParse, ExprList *pEList){ +Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprList *pEList){ int ii; Select *pRet = 0; for(ii=0; iinExpr; ii++){ Select *pSel; - ExprList *pList; Expr *pExpr = pEList->a[ii].pExpr; - if( pExpr->op==TK_VECTOR ){ - pList = pExpr->x.pList; - pExpr->x.pList = 0; - }else{ - pList = sqlite3ExprListAppend(pParse, 0, pExpr); - pEList->a[ii].pExpr = 0; + int nExprElem = sqlite3ExprVectorSize(pExpr); + if( nExprElem!=nElem ){ + sqlite3ErrorMsg(pParse, "IN(...) element has %d term%s - expected %d", + nExprElem, nExprElem>1?"s":"", nElem + ); + break; } - pSel = sqlite3SelectNew(pParse, pList, 0, 0, 0, 0, 0, SF_Values, 0); + pSel = sqlite3SelectNew(pParse, pExpr->x.pList, 0, 0, 0, 0, 0, SF_Values,0); + pExpr->x.pList = 0; if( pSel ){ if( pRet ){ pSel->op = TK_ALL; diff --git a/src/parse.y b/src/parse.y index efc390ca03..7a03873362 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1256,15 +1256,18 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { A = sqlite3Expr(pParse->db, TK_INTEGER, N ? "1" : "0"); }else{ Expr *pRHS = Y->a[0].pExpr; - if( Y->nExpr==1 && sqlite3ExprIsConstant(pRHS) && pRHS->op!=TK_VECTOR ){ + if( Y->nExpr==1 && sqlite3ExprIsConstant(pRHS) && A->op!=TK_VECTOR ){ Y->a[0].pExpr = 0; sqlite3ExprListDelete(pParse->db, Y); pRHS = sqlite3PExpr(pParse, TK_UPLUS, pRHS, 0); A = sqlite3PExpr(pParse, TK_EQ, A, pRHS); }else{ A = sqlite3PExpr(pParse, TK_IN, A, 0); - if( pRHS->op==TK_VECTOR || A==0 ){ - Select *pRHS = sqlite3ExprListToValues(pParse, Y); + if( A==0 ){ + sqlite3ExprListDelete(pParse->db, Y); + }else if( A->pLeft->op==TK_VECTOR ){ + int nExpr = A->pLeft->x.pList->nExpr; + Select *pRHS = sqlite3ExprListToValues(pParse, nExpr, Y); if( pRHS ){ parserDoubleLinkSelect(pParse, pRHS); sqlite3PExprAddSelect(pParse, A, pRHS); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 935ee09535..4d92703f14 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4324,7 +4324,7 @@ void sqlite3ExprDeferredDelete(Parse*, Expr*); void sqlite3ExprUnmapAndDelete(Parse*, Expr*); ExprList *sqlite3ExprListAppend(Parse*,ExprList*,Expr*); ExprList *sqlite3ExprListAppendVector(Parse*,ExprList*,IdList*,Expr*); -Select *sqlite3ExprListToValues(Parse*, ExprList*); +Select *sqlite3ExprListToValues(Parse*, int, ExprList*); void sqlite3ExprListSetSortOrder(ExprList*,int,int); void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); diff --git a/test/rowvalueA.test b/test/rowvalueA.test index 5cd33d4bda..dc5a7a014b 100644 --- a/test/rowvalueA.test +++ b/test/rowvalueA.test @@ -59,19 +59,19 @@ do_execsql_test 1.6.2 " do_catchsql_test 2.0 { SELECT (1, 2) IN ( (1, 2), (3, 4, 5), (5, 6) ) -} {1 {all VALUES must have the same number of terms}} +} {1 {IN(...) element has 3 terms - expected 2}} do_catchsql_test 2.1 { SELECT (1, 2) IN ( (1, 2), 4, (5, 6) ) -} {1 {all VALUES must have the same number of terms}} +} {1 {IN(...) element has 1 term - expected 2}} do_catchsql_test 2.2 { SELECT (1, 2, 3) IN ( (1, 2), (3, 4), (5, 6) ) -} {1 {sub-select returns 2 columns - expected 3}} +} {1 {IN(...) element has 2 terms - expected 3}} do_catchsql_test 2.3 { SELECT 2 IN ( (1, 2), (3, 4), (5, 6) ) -} {1 {sub-select returns 2 columns - expected 1}} +} {1 {row value misused}} finish_test diff --git a/test/rowvaluefault.test b/test/rowvaluefault.test index 3ca5b34183..a06ef886e9 100644 --- a/test/rowvaluefault.test +++ b/test/rowvaluefault.test @@ -80,10 +80,10 @@ do_faultsim_test 7 -faults oom* -body { do_faultsim_test 8 -faults oom* -body { execsql { SELECT fou FROM xyz - WHERE two IN ( ('a','b','c'), ('A','A','A'), (1,2,3) ); + WHERE (two, one) IN ( ('a','b','c'), ('A','A','A'), (1,2,3) ); } } -test { - faultsim_test_result {1 {sub-select returns 3 columns - expected 1}} + faultsim_test_result {1 {IN(...) element has 3 terms - expected 2}} } finish_test From 2931a66ecebd60277efe019b920e0e1e96721aee Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Jul 2021 15:52:44 +0000 Subject: [PATCH 042/100] Fix a recently introduced segfault that might occur if a sub-select were used as a term on the RHS of an IN(...) operator for which the LHS is a row-value. FossilOrigin-Name: f586c06a5d03943db32add4d3d058a5aa09c819870b29cd8b54cf69433a8cdb1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 458352c186..56a2a6bdc4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\serror\smessage\sin\scases\swhere\sthere\sis\sa\srow-value\son\sthe\sLHS\sof\san\sIN()\soperator,\sthe\sRHS\sis\sa\slist\s(not\sa\ssub-select)\sand\sat\sleast\sone\selement\sof\sthe\slist\sis\snot\sa\srow-value\swith\sthe\scorrect\snumber\sof\selements. -D 2021-07-07T13:53:55.754 +C Fix\sa\srecently\sintroduced\ssegfault\sthat\smight\soccur\sif\sa\ssub-select\swere\sused\sas\sa\sterm\son\sthe\sRHS\sof\san\sIN(...)\soperator\sfor\swhich\sthe\sLHS\sis\sa\srow-value. +D 2021-07-07T15:52:44.574 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c 69ec84d79404ce9ae0712516cdf8ce724366c4b71bd22021ef28e952d9a3c44c +F src/expr.c 62b6d0ac8ee30a4749b78b7b75ae951a911a5d49321af5fe41c05af4df9e7537 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c c96ac6f7c4f2d684217c4673a80446e1b50e25b5ea79366f333f484622d010a0 @@ -1920,7 +1920,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 9dbdc9001e3258e71ca995fbcdebf66ab95890ded87fa7125c6cb4bd43010aaf -R 3de711d2b347ff8ce75f48cf9bf28e2e +P 6b22f4e71dbc14c887ebbda67095b5faaa8079cac87cd4ab5a2ae90c71cd9633 +R 2f5c851e73952219f058fe70670ea883 U dan -Z b6fba9efd0310badf0c0e8e9ddd045f1 +Z c96972b6a62814c17f8f6aa2467bed52 diff --git a/manifest.uuid b/manifest.uuid index 41dd42e166..9ad70da7c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b22f4e71dbc14c887ebbda67095b5faaa8079cac87cd4ab5a2ae90c71cd9633 \ No newline at end of file +f586c06a5d03943db32add4d3d058a5aa09c819870b29cd8b54cf69433a8cdb1 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 44abb58e51..4ad1902d25 100644 --- a/src/expr.c +++ b/src/expr.c @@ -967,10 +967,11 @@ void sqlite3PExprAddSelect(Parse *pParse, Expr *pExpr, Select *pSelect){ Select *sqlite3ExprListToValues(Parse *pParse, int nElem, ExprList *pEList){ int ii; Select *pRet = 0; + assert( nElem>1 ); for(ii=0; iinExpr; ii++){ Select *pSel; Expr *pExpr = pEList->a[ii].pExpr; - int nExprElem = sqlite3ExprVectorSize(pExpr); + int nExprElem = (pExpr->op==TK_VECTOR ? pExpr->x.pList->nExpr : 1); if( nExprElem!=nElem ){ sqlite3ErrorMsg(pParse, "IN(...) element has %d term%s - expected %d", nExprElem, nExprElem>1?"s":"", nElem From 4f16ff9d06a1a879f826ffd2203c0abd0bcab32c Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 7 Jul 2021 16:48:24 +0000 Subject: [PATCH 043/100] Follow-up to [68db1ff9c44fa9c3]: The number of registers needed by PRAGMA foreign_key_check was increased too late for an assert() deep down inside of sqlite3ExprCode(). So move the size increase a little earlier. [forum:/forumpost/79c9e4797d|Forum post 79c9e4797d]. FossilOrigin-Name: 7072404ad0267b8ee774b2804ea59ea28e29316521d76d76a701595e51d1be97 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/pragma.c | 2 +- test/fkey1.test | 6 ++++++ 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 56a2a6bdc4..a7607a1025 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\srecently\sintroduced\ssegfault\sthat\smight\soccur\sif\sa\ssub-select\swere\sused\sas\sa\sterm\son\sthe\sRHS\sof\san\sIN(...)\soperator\sfor\swhich\sthe\sLHS\sis\sa\srow-value. -D 2021-07-07T15:52:44.574 +C Follow-up\sto\s[68db1ff9c44fa9c3]:\s\sThe\snumber\sof\sregisters\sneeded\sby\nPRAGMA\sforeign_key_check\swas\sincreased\stoo\slate\sfor\san\sassert()\sdeep\ndown\sinside\sof\ssqlite3ExprCode().\s\sSo\smove\sthe\ssize\sincrease\sa\slittle\nearlier.\n[forum:/forumpost/79c9e4797d|Forum\spost\s79c9e4797d]. +D 2021-07-07T16:48:24.382 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -537,7 +537,7 @@ F src/parse.y 62388bd7323ce1b76b219de0a0974789224d98fc14cfccb08dd98524ccd693c3 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f -F src/pragma.c e74fbc64dcf4985bf11f8366ca3e37df1db1b211f42f25270b461c118411a512 +F src/pragma.c 9fe75aa29e8706a2cf6b9c1600ac05a2efc55c44ce719b65aa45d10ff58acc9d F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b @@ -899,7 +899,7 @@ F test/filter1.test 6c483ecf7886c8843a8612c021aa23f33c581f584151f251842b3a3592c9 F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b -F test/fkey1.test a0a38fc7f1b88497a355e2931115395fd43dc20cfb317e39c5bf4e11bedea199 +F test/fkey1.test 03503639d266d565db90ee3b8fe211ba446624030ac4eb24895cec265e9631d0 F test/fkey2.test 1063d65e5923c054cfb8f0555a92a3ae0fa8c067275a33ee1715bd856cdb304c F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d @@ -1920,7 +1920,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 6b22f4e71dbc14c887ebbda67095b5faaa8079cac87cd4ab5a2ae90c71cd9633 -R 2f5c851e73952219f058fe70670ea883 -U dan -Z c96972b6a62814c17f8f6aa2467bed52 +P f586c06a5d03943db32add4d3d058a5aa09c819870b29cd8b54cf69433a8cdb1 +R 1e2ab0b571f6af295ffe5d3c314f1294 +U drh +Z 9f0157c1df421495cc816917f7595608 diff --git a/manifest.uuid b/manifest.uuid index 9ad70da7c8..f3ec8d42a1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f586c06a5d03943db32add4d3d058a5aa09c819870b29cd8b54cf69433a8cdb1 \ No newline at end of file +7072404ad0267b8ee774b2804ea59ea28e29316521d76d76a701595e51d1be97 \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 4f9b8d913b..e0cf5ced50 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1461,12 +1461,12 @@ void sqlite3Pragma( ** regRow..regRow+n. If any of the child key values are NULL, this ** row cannot cause an FK violation. Jump directly to addrOk in ** this case. */ + if( regRow+pFK->nCol>pParse->nMem ) pParse->nMem = regRow+pFK->nCol; for(j=0; jnCol; j++){ int iCol = aiCols ? aiCols[j] : pFK->aCol[j].iFrom; sqlite3ExprCodeGetColumnOfTable(v, pTab, 0, iCol, regRow+j); sqlite3VdbeAddOp2(v, OP_IsNull, regRow+j, addrOk); VdbeCoverage(v); } - if( regRow+j>pParse->nMem ) pParse->nMem = regRow+j; /* Generate code to query the parent index for a matching parent ** key. If a match is found, jump to addrOk. */ diff --git a/test/fkey1.test b/test/fkey1.test index d094ff449a..13635db987 100644 --- a/test/fkey1.test +++ b/test/fkey1.test @@ -223,6 +223,7 @@ do_execsql_test 6.2 { } {} # 2021-07-03 https://sqlite.org/forum/forumpost/a6b0c05277 +# 2021-07-07 https://sqlite.org/forum/forumpost/79c9e4797d # Failure to allocate enough registers in the VDBE for a # PRAGMA foreign_key_check when the foreign key has more # columns than the table. @@ -234,6 +235,11 @@ do_execsql_test 7.1 { INSERT INTO t1 VALUES(1,2,3); PRAGMA foreign_key_check; } {t1 1 t0 0} +do_execsql_test 7.2 { + DROP TABLE t1; + CREATE TABLE t1(a,b,c AS(1),d, FOREIGN KEY(c,d,b,a,b,d,b,c) REFERENCES t0); + PRAGMA foreign_key_check; +} {} finish_test From 7098859031abd66110d3e69e6a88472868297f61 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 7 Jul 2021 19:40:18 +0000 Subject: [PATCH 044/100] Fix a harmless compiler warning - duplicate local variable named "pRHS". FossilOrigin-Name: 5bc05faf279e0c98be83cb6d56f669a60ff515c8244fca6280991ed0dc5e7ae7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/parse.y | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index a7607a1025..4a1d425751 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Follow-up\sto\s[68db1ff9c44fa9c3]:\s\sThe\snumber\sof\sregisters\sneeded\sby\nPRAGMA\sforeign_key_check\swas\sincreased\stoo\slate\sfor\san\sassert()\sdeep\ndown\sinside\sof\ssqlite3ExprCode().\s\sSo\smove\sthe\ssize\sincrease\sa\slittle\nearlier.\n[forum:/forumpost/79c9e4797d|Forum\spost\s79c9e4797d]. -D 2021-07-07T16:48:24.382 +C Fix\sa\sharmless\scompiler\swarning\s-\sduplicate\slocal\svariable\snamed\s"pRHS". +D 2021-07-07T19:40:18.184 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 62388bd7323ce1b76b219de0a0974789224d98fc14cfccb08dd98524ccd693c3 +F src/parse.y 6d90c816edf65e99fb978c3b5486df5e661c3534347efac2842b80eb02263e68 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f @@ -1920,7 +1920,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 f586c06a5d03943db32add4d3d058a5aa09c819870b29cd8b54cf69433a8cdb1 -R 1e2ab0b571f6af295ffe5d3c314f1294 +P 7072404ad0267b8ee774b2804ea59ea28e29316521d76d76a701595e51d1be97 +R 1be7d03e27aa073e31e902cdae6fc97a U drh -Z 9f0157c1df421495cc816917f7595608 +Z 3f25e8f9f004c2bac41112687f415810 diff --git a/manifest.uuid b/manifest.uuid index f3ec8d42a1..26c466cea6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7072404ad0267b8ee774b2804ea59ea28e29316521d76d76a701595e51d1be97 \ No newline at end of file +5bc05faf279e0c98be83cb6d56f669a60ff515c8244fca6280991ed0dc5e7ae7 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 7a03873362..1e07825589 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1267,10 +1267,10 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { sqlite3ExprListDelete(pParse->db, Y); }else if( A->pLeft->op==TK_VECTOR ){ int nExpr = A->pLeft->x.pList->nExpr; - Select *pRHS = sqlite3ExprListToValues(pParse, nExpr, Y); - if( pRHS ){ - parserDoubleLinkSelect(pParse, pRHS); - sqlite3PExprAddSelect(pParse, A, pRHS); + Select *pSelectRHS = sqlite3ExprListToValues(pParse, nExpr, Y); + if( pSelectRHS ){ + parserDoubleLinkSelect(pParse, pSelectRHS); + sqlite3PExprAddSelect(pParse, A, pSelectRHS); } }else{ A->x.pList = Y; From 9d41caf361ea37e7bb91c3e0635bd9dca9f06040 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 7 Jul 2021 19:44:32 +0000 Subject: [PATCH 045/100] Fix a harmless compiler warning in the "fuzzcheck" test program. FossilOrigin-Name: 8c432642572c8c4b7251f413def0725b3b8e9e7fe10230aa0aabe86b58e5902d --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4a1d425751..091888b3a5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\s-\sduplicate\slocal\svariable\snamed\s"pRHS". -D 2021-07-07T19:40:18.184 +C Fix\sa\sharmless\scompiler\swarning\sin\sthe\s"fuzzcheck"\stest\sprogram. +D 2021-07-07T19:44:32.000 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1049,7 +1049,7 @@ F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 37f09efcd982048694d8b06fa3ef817df17f2a82e90af85cb3fb8eddd0f57ec4 +F test/fuzzcheck.c 2295d04576264ef8d1aa5adf689fa0b774aede30c565cd6cb11772bf66361b69 F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1920,7 +1920,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 7072404ad0267b8ee774b2804ea59ea28e29316521d76d76a701595e51d1be97 -R 1be7d03e27aa073e31e902cdae6fc97a +P 5bc05faf279e0c98be83cb6d56f669a60ff515c8244fca6280991ed0dc5e7ae7 +R d0f6dc65d71cb7fb1236a5ce0cb825e4 U drh -Z 3f25e8f9f004c2bac41112687f415810 +Z 9d91a738af940d242f9894375fc29625 diff --git a/manifest.uuid b/manifest.uuid index 26c466cea6..748213b830 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5bc05faf279e0c98be83cb6d56f669a60ff515c8244fca6280991ed0dc5e7ae7 \ No newline at end of file +8c432642572c8c4b7251f413def0725b3b8e9e7fe10230aa0aabe86b58e5902d \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 3020086a24..dc5269481b 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1785,7 +1785,7 @@ int main(int argc, char **argv){ while( rc==0 && fgets(zLine,sizeof(zLine),stdin)!=0 ){ size_t kk = strlen(zLine); while( kk>0 && zLine[kk-1]<=' ' ) kk--; - sqlite3_bind_text(pStmt, 1, zLine, kk, SQLITE_STATIC); + sqlite3_bind_text(pStmt, 1, zLine, (int)kk, SQLITE_STATIC); if( verboseFlag ) printf("loading %.*s\n", (int)kk, zLine); sqlite3_step(pStmt); rc = sqlite3_reset(pStmt); From 77ea22300b5bcc0961be5c2578a262d91917cf1f Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 8 Jul 2021 12:12:39 +0000 Subject: [PATCH 046/100] Fix an issue with the SQLite Expert extension when a column has no collating sequence. [forum:/forumpost/78165fa250|Forum post 78165fa250]. FossilOrigin-Name: b1e0c22ec981cf5f8a6597abc6711b1a25019dd51de31129fbc504d3dc743bb4 --- ext/expert/sqlite3expert.c | 14 +++++++++----- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/ext/expert/sqlite3expert.c b/ext/expert/sqlite3expert.c index 863c6a3409..15077f5cbf 100644 --- a/ext/expert/sqlite3expert.c +++ b/ext/expert/sqlite3expert.c @@ -690,11 +690,13 @@ static int idxGetTableInfo( rc = idxPrintfPrepareStmt(db, &p1, pzErrmsg, "PRAGMA table_xinfo=%Q", zTab); while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ const char *zCol = (const char*)sqlite3_column_text(p1, 1); + const char *zColSeq = 0; nByte += 1 + STRLEN(zCol); rc = sqlite3_table_column_metadata( - db, "main", zTab, zCol, 0, &zCol, 0, 0, 0 + db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0 ); - nByte += 1 + STRLEN(zCol); + if( zColSeq==0 ) zColSeq = "binary"; + nByte += 1 + STRLEN(zColSeq); nCol++; nPk += (sqlite3_column_int(p1, 5)>0); } @@ -714,6 +716,7 @@ static int idxGetTableInfo( nCol = 0; while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(p1) ){ const char *zCol = (const char*)sqlite3_column_text(p1, 1); + const char *zColSeq = 0; int nCopy = STRLEN(zCol) + 1; pNew->aCol[nCol].zName = pCsr; pNew->aCol[nCol].iPk = (sqlite3_column_int(p1, 5)==1 && nPk==1); @@ -721,12 +724,13 @@ static int idxGetTableInfo( pCsr += nCopy; rc = sqlite3_table_column_metadata( - db, "main", zTab, zCol, 0, &zCol, 0, 0, 0 + db, "main", zTab, zCol, 0, &zColSeq, 0, 0, 0 ); if( rc==SQLITE_OK ){ - nCopy = STRLEN(zCol) + 1; + if( zColSeq==0 ) zColSeq = "binary"; + nCopy = STRLEN(zColSeq) + 1; pNew->aCol[nCol].zColl = pCsr; - memcpy(pCsr, zCol, nCopy); + memcpy(pCsr, zColSeq, nCopy); pCsr += nCopy; } diff --git a/manifest b/manifest index 091888b3a5..e0a44eea1f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\scompiler\swarning\sin\sthe\s"fuzzcheck"\stest\sprogram. -D 2021-07-07T19:44:32.000 +C Fix\san\sissue\swith\sthe\sSQLite\sExpert\sextension\swhen\sa\scolumn\shas\sno\ncollating\ssequence.\n[forum:/forumpost/78165fa250|Forum\spost\s78165fa250]. +D 2021-07-08T12:12:39.946 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -51,7 +51,7 @@ F ext/async/sqlite3async.h 46b47c79357b97ad85d20d2795942c0020dc20c532114a4980828 F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 F ext/expert/expert1.test 6703fd74711daf8230240680b0a348d0720e28819b602701adfbd32457fdcddd -F ext/expert/sqlite3expert.c de51b187c629a4c4264d5de0b77862641e11426f7a963a92abf2d4077085fc8c +F ext/expert/sqlite3expert.c fdcd3bd969351c4e860a1368a6ab64bc4c94d2d89396805b28853a514d06fd92 F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e @@ -1920,7 +1920,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 5bc05faf279e0c98be83cb6d56f669a60ff515c8244fca6280991ed0dc5e7ae7 -R d0f6dc65d71cb7fb1236a5ce0cb825e4 +P 8c432642572c8c4b7251f413def0725b3b8e9e7fe10230aa0aabe86b58e5902d +R 071d661bdc6fd21184ca44df9d313bc9 U drh -Z 9d91a738af940d242f9894375fc29625 +Z 1681065afffdc03570a282c19a0930fc diff --git a/manifest.uuid b/manifest.uuid index 748213b830..43a5120cf5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c432642572c8c4b7251f413def0725b3b8e9e7fe10230aa0aabe86b58e5902d \ No newline at end of file +b1e0c22ec981cf5f8a6597abc6711b1a25019dd51de31129fbc504d3dc743bb4 \ No newline at end of file From bd24e8faa37592c02fc4e7c1fded2e6bd924e8a4 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Jul 2021 18:29:25 +0000 Subject: [PATCH 047/100] Preserve and return to the user any error message returned by a failed xConnect() call on an eponymous virtual table that prevents a query from being compiled. FossilOrigin-Name: bbbbeb59a6a14b94dcbaf218cbcfbd39feba4a1df5b37c0e1a955391393eeec4 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/build.c | 1 + src/vtab.c | 6 +++--- test/bestindex1.test | 3 +++ 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index e0a44eea1f..3c3e173867 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\swith\sthe\sSQLite\sExpert\sextension\swhen\sa\scolumn\shas\sno\ncollating\ssequence.\n[forum:/forumpost/78165fa250|Forum\spost\s78165fa250]. -D 2021-07-08T12:12:39.946 +C Preserve\sand\sreturn\sto\sthe\suser\sany\serror\smessage\sreturned\sby\sa\sfailed\sxConnect()\scall\son\san\seponymous\svirtual\stable\sthat\sprevents\sa\squery\sfrom\sbeing\scompiled. +D 2021-07-08T18:29:25.913 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c ea28944f65b04f771e7aa5d614d406faa1bde5fe4ce882e2ead73049f03ed568 +F src/build.c 98e23c9197fd4c979f7d59360bd3b0050b37e683e078715f6f2fbfef77971f0d F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -626,7 +626,7 @@ F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb724 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c -F src/vtab.c b928405ccb66040fc6c3a11eaa93ddb02cbf20f9ab6860b301b222b9b50dc089 +F src/vtab.c 3a9a6ae1fd14f7c00af184233cb9f3bced89ae277a75a312f85fb77297a3cdfa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c c8ec20a1ca161d5635a4f19c2a4efec2e006e19a8a61f272bf6bce1c80ab7436 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a @@ -714,7 +714,7 @@ F test/backup_malloc.test 0c9abdf74c51e7bedb66d504cd684f28d4bd4027 F test/badutf.test d5360fc31f643d37a973ab0d8b4fb85799c3169f F test/badutf2.test f310fd3b24a491b6b77bccdf14923b85d6ebcce751068c180d93a6b8ff854399 F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c -F test/bestindex1.test 2e92e046148b3f8a2be62af9c0f307413547a33677af0df159c0fcc76e5134a2 +F test/bestindex1.test 7cc626f1f4a7483bb6b38487d467db4477083be5cd93958aeda5d5127640dc81 F test/bestindex2.test 60266e2854055788459cbfd86cef575601eabe74a2c61faba72601739fea4398 F test/bestindex3.test e061a6ed0f519beee037ba7e7a4c37f80c8a7e4a303e2559ed1f760e4b0235eb F test/bestindex4.test 82250e7dcc6d5b15244edc9d6554b1760583af1b8548c2a255a1c4f28e744c0e @@ -1920,7 +1920,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 8c432642572c8c4b7251f413def0725b3b8e9e7fe10230aa0aabe86b58e5902d -R 071d661bdc6fd21184ca44df9d313bc9 -U drh -Z 1681065afffdc03570a282c19a0930fc +P b1e0c22ec981cf5f8a6597abc6711b1a25019dd51de31129fbc504d3dc743bb4 +R 1cb77db1445fe50c7a7de69e9dbf5037 +U dan +Z 508b782908ee6fdd030763447f8aaf0f diff --git a/manifest.uuid b/manifest.uuid index 43a5120cf5..394dc57c74 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1e0c22ec981cf5f8a6597abc6711b1a25019dd51de31129fbc504d3dc743bb4 \ No newline at end of file +bbbbeb59a6a14b94dcbaf218cbcfbd39feba4a1df5b37c0e1a955391393eeec4 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 5bf5680d46..00fa447957 100644 --- a/src/build.c +++ b/src/build.c @@ -453,6 +453,7 @@ Table *sqlite3LocateTable( pMod = sqlite3PragmaVtabRegister(db, zName); } if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + testcase( pMod->pEpoTab==0 ); return pMod->pEpoTab; } } diff --git a/src/vtab.c b/src/vtab.c index c9dcadae4b..1a9457c24d 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -1190,8 +1190,9 @@ void sqlite3VtabMakeWritable(Parse *pParse, Table *pTab){ /* ** Check to see if virtual table module pMod can be have an eponymous ** virtual table instance. If it can, create one if one does not already -** exist. Return non-zero if the eponymous virtual table instance exists -** when this routine returns, and return zero if it does not exist. +** exist. Return non-zero if either the eponymous virtual table instance +** exists when this routine returns or if an attempt to create it failed +** and an error message was left in pParse. ** ** An eponymous virtual table instance is one that is named after its ** module, and more importantly, does not require a CREATE VIRTUAL TABLE @@ -1230,7 +1231,6 @@ int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ sqlite3ErrorMsg(pParse, "%s", zErr); sqlite3DbFree(db, zErr); sqlite3VtabEponymousTableClear(db, pMod); - return 0; } return 1; } diff --git a/test/bestindex1.test b/test/bestindex1.test index 0d69469943..e93d7349dd 100644 --- a/test/bestindex1.test +++ b/test/bestindex1.test @@ -323,5 +323,8 @@ do_test 4.1 { ] ] +do_catchsql_test 5.0 { + SELECT * FROM tcl('abc'); +} {1 {wrong number of arguments}} finish_test From f382e1dc591af80c3fbd10ca2b46bb27f1cade1c Mon Sep 17 00:00:00 2001 From: larrybr Date: Thu, 8 Jul 2021 22:12:27 +0000 Subject: [PATCH 048/100] Allow library build to #include a user-specified header. FossilOrigin-Name: 71e6490bbe59939cd15f0094e507dd8a2e167fdd8de675c3ebfeaf528a01f87a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 10 ++++++++++ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 3c3e173867..c2521c1032 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Preserve\sand\sreturn\sto\sthe\suser\sany\serror\smessage\sreturned\sby\sa\sfailed\sxConnect()\scall\son\san\seponymous\svirtual\stable\sthat\sprevents\sa\squery\sfrom\sbeing\scompiled. -D 2021-07-08T18:29:25.913 +C Allow\slibrary\sbuild\sto\s#include\sa\suser-specified\sheader. +D 2021-07-08T22:12:27.683 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4c F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h db26ff390e4c74a86a30cbf14653a133e3e14a2146a2b7ac2cc17f3b1d8798ae +F src/sqliteInt.h 41bba374a1797ce97932cafae0d153c9bfa75f70b1f2edabd60744834ca338b2 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1920,7 +1920,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 b1e0c22ec981cf5f8a6597abc6711b1a25019dd51de31129fbc504d3dc743bb4 -R 1cb77db1445fe50c7a7de69e9dbf5037 -U dan -Z 508b782908ee6fdd030763447f8aaf0f +P bbbbeb59a6a14b94dcbaf218cbcfbd39feba4a1df5b37c0e1a955391393eeec4 +R 7a0084a89c3729caea4e26b874edb80a +U larrybr +Z 6d4a1f40a829e2673520015ba017e1f0 diff --git a/manifest.uuid b/manifest.uuid index 394dc57c74..db698fb63c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bbbbeb59a6a14b94dcbaf218cbcfbd39feba4a1df5b37c0e1a955391393eeec4 \ No newline at end of file +71e6490bbe59939cd15f0094e507dd8a2e167fdd8de675c3ebfeaf528a01f87a \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 4d92703f14..b19325d703 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -181,6 +181,16 @@ # define _USE_32BIT_TIME_T #endif +/* Optionally #include a user-defined header, whereby compilation options +** may be set prior to where they take effect, but after platform setup. +** If SQLITE_CUSTOM_INC=? is defined, its value names the #include file. +*/ +#ifdef SQLITE_CUSTOM_INC +# define INC_STRINGIFY_(f) #f +# define INC_STRINGIFY(f) INC_STRINGIFY_(f) +# include INC_STRINGIFY(SQLITE_CUSTOM_INC) +#endif + /* The public SQLite interface. The _FILE_OFFSET_BITS macro must appear ** first in QNX. Also, the _USE_32BIT_TIME_T macro must appear first for ** MinGW. From b523159f4054a532474701a575e226e2f4e1a12a Mon Sep 17 00:00:00 2001 From: mistachkin Date: Thu, 8 Jul 2021 23:35:20 +0000 Subject: [PATCH 049/100] Rename optional SQLITE_CUSTOM_INC define to SQLITE_CUSTOM_INCLUDE. FossilOrigin-Name: 060aec37accae858ced5b081a2ff76dccdd8f8bcefc63d1fe2e7478257c69e76 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 7 ++++--- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index c2521c1032..ef4b109f46 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\slibrary\sbuild\sto\s#include\sa\suser-specified\sheader. -D 2021-07-08T22:12:27.683 +C Rename\soptional\sSQLITE_CUSTOM_INC\sdefine\sto\sSQLITE_CUSTOM_INCLUDE. +D 2021-07-08T23:35:20.867 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4c F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 41bba374a1797ce97932cafae0d153c9bfa75f70b1f2edabd60744834ca338b2 +F src/sqliteInt.h 129619232aa632fa85db7792bfe4b378ed28d3361bf9cbcdb4522353fd04b89b F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1920,7 +1920,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 bbbbeb59a6a14b94dcbaf218cbcfbd39feba4a1df5b37c0e1a955391393eeec4 -R 7a0084a89c3729caea4e26b874edb80a -U larrybr -Z 6d4a1f40a829e2673520015ba017e1f0 +P 71e6490bbe59939cd15f0094e507dd8a2e167fdd8de675c3ebfeaf528a01f87a +R 51883f0b3802300d245d2b5832e9f8cd +U mistachkin +Z a08768035297a355b998597449342f70 diff --git a/manifest.uuid b/manifest.uuid index db698fb63c..cec8d9f71b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -71e6490bbe59939cd15f0094e507dd8a2e167fdd8de675c3ebfeaf528a01f87a \ No newline at end of file +060aec37accae858ced5b081a2ff76dccdd8f8bcefc63d1fe2e7478257c69e76 \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b19325d703..81774c1f01 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -183,12 +183,13 @@ /* Optionally #include a user-defined header, whereby compilation options ** may be set prior to where they take effect, but after platform setup. -** If SQLITE_CUSTOM_INC=? is defined, its value names the #include file. +** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include +** file. */ -#ifdef SQLITE_CUSTOM_INC +#ifdef SQLITE_CUSTOM_INCLUDE # define INC_STRINGIFY_(f) #f # define INC_STRINGIFY(f) INC_STRINGIFY_(f) -# include INC_STRINGIFY(SQLITE_CUSTOM_INC) +# include INC_STRINGIFY(SQLITE_CUSTOM_INCLUDE) #endif /* The public SQLite interface. The _FILE_OFFSET_BITS macro must appear From a13c0c73c53e3896e8c682b562d761147116a765 Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 9 Jul 2021 00:12:05 +0000 Subject: [PATCH 050/100] Allow CLI shell build to #include same user-specified header as library build. FossilOrigin-Name: eb8af9a494fb68c0a1c600b3ac71467645b51b296fc6e2116d7d855319d59a59 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 12 ++++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ef4b109f46..37dbcf347e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rename\soptional\sSQLITE_CUSTOM_INC\sdefine\sto\sSQLITE_CUSTOM_INCLUDE. -D 2021-07-08T23:35:20.867 +C Allow\sCLI\sshell\sbuild\sto\s#include\ssame\suser-specified\sheader\sas\slibrary\sbuild. +D 2021-07-09T00:12:05.614 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c b379c5ffe3b692e9c64fa37817cc0efa204b7c9468a818309dde85fd132d9d81 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 1c1230aaa4e5979edd3c5a9f7a90ab856a302cca4962e8a7d08f42dd2e7e1a49 -F src/shell.c.in 699910739eb7296fd47be19db71f6e5d15d0760f4352c62639d4d6cc7bd8d4cc +F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1920,7 +1920,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 71e6490bbe59939cd15f0094e507dd8a2e167fdd8de675c3ebfeaf528a01f87a -R 51883f0b3802300d245d2b5832e9f8cd -U mistachkin -Z a08768035297a355b998597449342f70 +P 060aec37accae858ced5b081a2ff76dccdd8f8bcefc63d1fe2e7478257c69e76 +R 50583abc677d1e775bb177169ec30e48 +U larrybr +Z c9015fea980b646abec4bd4e9aaa109a diff --git a/manifest.uuid b/manifest.uuid index cec8d9f71b..6ea12ee95b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -060aec37accae858ced5b081a2ff76dccdd8f8bcefc63d1fe2e7478257c69e76 \ No newline at end of file +eb8af9a494fb68c0a1c600b3ac71467645b51b296fc6e2116d7d855319d59a59 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index f90822e281..248bc0dc0e 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -17,6 +17,18 @@ #define _CRT_SECURE_NO_WARNINGS #endif +/* +** Optionally #include a user-defined header, whereby compilation options +** may be set prior to where they take effect, but after platform setup. +** If SQLITE_CUSTOM_INCLUDE=? is defined, its value names the #include +** file. Note that this macro has a like effect on sqlite3.c compilation. +*/ +#ifdef SQLITE_CUSTOM_INCLUDE +# define INC_STRINGIFY_(f) #f +# define INC_STRINGIFY(f) INC_STRINGIFY_(f) +# include INC_STRINGIFY(SQLITE_CUSTOM_INCLUDE) +#endif + /* ** Determine if we are dealing with WinRT, which provides only a subset of ** the full Win32 API. From f33e7795b3905b3dd278d5ec5c777af7a348dcd7 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 9 Jul 2021 11:52:53 +0000 Subject: [PATCH 051/100] Add the usual "#ifdef __cplusplus" magic to header file ext/misc/carray.h. Also update carray.h/carray.c to use SQLITE_API in the usual way. FossilOrigin-Name: 0f97c2a459bfadc2fe19e710e8845039b4434010656d311074b9594b02d0826a --- ext/misc/carray.c | 30 +++++++++++++++++------------- ext/misc/carray.h | 29 ++++++++++++++++++++++++++++- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 54 insertions(+), 23 deletions(-) diff --git a/ext/misc/carray.c b/ext/misc/carray.c index b8cda21bc7..43d714689c 100644 --- a/ext/misc/carray.c +++ b/ext/misc/carray.c @@ -56,14 +56,24 @@ SQLITE_EXTENSION_INIT1 #include #include - + /* Allowed values for the mFlags parameter to sqlite3_carray_bind(). ** Must exactly match the definitions in carray.h. */ -#define CARRAY_INT32 0 /* Data is 32-bit signed integers */ -#define CARRAY_INT64 1 /* Data is 64-bit signed integers */ -#define CARRAY_DOUBLE 2 /* Data is doubles */ -#define CARRAY_TEXT 3 /* Data is char* */ +#ifndef CARRAY_INT32 +# define CARRAY_INT32 0 /* Data is 32-bit signed integers */ +# define CARRAY_INT64 1 /* Data is 64-bit signed integers */ +# define CARRAY_DOUBLE 2 /* Data is doubles */ +# define CARRAY_TEXT 3 /* Data is char* */ +#endif + +#ifndef SQLITE_API +# ifdef _WIN32 +# define SQLITE_API __declspec(dllexport) +# else +# define SQLITE_API +# endif +#endif #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -400,10 +410,7 @@ static void carrayBindDel(void *pPtr){ ** Invoke this interface in order to bind to the single-argument ** version of CARRAY(). */ -#ifdef _WIN32 -__declspec(dllexport) -#endif -int sqlite3_carray_bind( +SQLITE_API int sqlite3_carray_bind( sqlite3_stmt *pStmt, int idx, void *aData, @@ -498,10 +505,7 @@ static void inttoptrFunc( #endif /* SQLITE_OMIT_VIRTUALTABLE */ -#ifdef _WIN32 -__declspec(dllexport) -#endif -int sqlite3_carray_init( +SQLITE_API int sqlite3_carray_init( sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi diff --git a/ext/misc/carray.h b/ext/misc/carray.h index e490bf24cd..63df0066b5 100644 --- a/ext/misc/carray.h +++ b/ext/misc/carray.h @@ -1,12 +1,32 @@ /* +** 2020-11-17 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** ** Interface definitions for the CARRAY table-valued function ** extension. */ +#ifndef _CARRAY_H +#define _CARRAY_H + +#include "sqlite3.h" /* Required for error code definitions */ + +#ifdef __cplusplus +extern "C" { +#endif + /* Use this interface to bind an array to the single-argument version ** of CARRAY(). */ -int sqlite3_carray_bind( +SQLITE_API int sqlite3_carray_bind( sqlite3_stmt *pStmt, /* Statement to be bound */ int i, /* Parameter index */ void *aData, /* Pointer to array data */ @@ -21,3 +41,10 @@ int sqlite3_carray_bind( #define CARRAY_INT64 1 /* Data is 64-bit signed integers */ #define CARRAY_DOUBLE 2 /* Data is doubles */ #define CARRAY_TEXT 3 /* Data is char* */ + +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + +#endif /* ifndef _CARRAY_H */ + diff --git a/manifest b/manifest index 37dbcf347e..5254c5394e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sCLI\sshell\sbuild\sto\s#include\ssame\suser-specified\sheader\sas\slibrary\sbuild. -D 2021-07-09T00:12:05.614 +C Add\sthe\susual\s"#ifdef\s__cplusplus"\smagic\sto\sheader\sfile\sext/misc/carray.h.\sAlso\supdate\scarray.h/carray.c\sto\suse\sSQLITE_API\sin\sthe\susual\sway. +D 2021-07-09T11:52:53.967 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -289,8 +289,8 @@ F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a2 F ext/misc/appendvfs.c 9642c7a194a2a25dca7ad3e36af24a0a46d7702168c4ad7e59c9f9b0e16a3824 F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c d28ce349b40054eaa9473e835837bad7a71deec33ba13e39f963d50933bfa0f9 -F ext/misc/carray.c b75a0f207391038bf1540d3372f482a95c3613511c7c474db51ede1196321c7c -F ext/misc/carray.h de74ac70b2338f416723f7d538026e8ec0b7f1d388319f8f140c9a4d7677f02e +F ext/misc/carray.c af9c4b3de67f87eb00644c3bb874b77e5917422b8d2c3ffc2853a118668501fa +F ext/misc/carray.h d2b1b12486d531367c37832d3d0dad34eea4bdd83ed839d445521ef01f0bc4e3 F ext/misc/cksumvfs.c b42ef52eaaa510d54ec320c87bea149e934a3b06cd232be2093562bf669bd572 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c 6dafd7f4348eecc7be9e920d4b419d1fb2af75d938cd9c59a20cfe8beb2f22b9 @@ -1920,7 +1920,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 060aec37accae858ced5b081a2ff76dccdd8f8bcefc63d1fe2e7478257c69e76 -R 50583abc677d1e775bb177169ec30e48 -U larrybr -Z c9015fea980b646abec4bd4e9aaa109a +P eb8af9a494fb68c0a1c600b3ac71467645b51b296fc6e2116d7d855319d59a59 +R 4921ff9c6662da771dcaa161286cae4d +U dan +Z a202a1f73cdb865aaa148dd68fbda945 diff --git a/manifest.uuid b/manifest.uuid index 6ea12ee95b..ff5ad7c1a3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eb8af9a494fb68c0a1c600b3ac71467645b51b296fc6e2116d7d855319d59a59 \ No newline at end of file +0f97c2a459bfadc2fe19e710e8845039b4434010656d311074b9594b02d0826a \ No newline at end of file From 62f560f805db23e0619740c730e737c9989e75ec Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 9 Jul 2021 13:52:01 +0000 Subject: [PATCH 052/100] Enhance the sqlite3_create_function() interfaces to assume a value of SQLITE_UTF8 is presented with a nonsense value for the preferred encoding. This is undocumented behavior added for robustness. FossilOrigin-Name: c1bb5cff527af6a97b025d646581c68ac9b56924ae199f86964026a7bc9724fd --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/main.c | 37 ++++++++++++++++++++++++------------- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index 5254c5394e..634c8b0085 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\susual\s"#ifdef\s__cplusplus"\smagic\sto\sheader\sfile\sext/misc/carray.h.\sAlso\supdate\scarray.h/carray.c\sto\suse\sSQLITE_API\sin\sthe\susual\sway. -D 2021-07-09T11:52:53.967 +C Enhance\sthe\ssqlite3_create_function()\sinterfaces\sto\sassume\sa\svalue\sof\nSQLITE_UTF8\sis\spresented\swith\sa\snonsense\svalue\sfor\sthe\spreferred\sencoding.\nThis\sis\sundocumented\sbehavior\sadded\sfor\srobustness. +D 2021-07-09T13:52:01.084 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -508,7 +508,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c d560dc585c50e01b015cbf924c173de88f61c8c85b3d1adb9d4865b92fff2d72 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c aedd8596e4dbdedacbf69fc4ff0462404effb9e6528146a1fdf4adee004053c9 +F src/main.c 6df43445e0c0c45642aff43726c0b2d42fcbb73c0c5a1e805c3b5b3c9b4eb106 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1920,7 +1920,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 eb8af9a494fb68c0a1c600b3ac71467645b51b296fc6e2116d7d855319d59a59 -R 4921ff9c6662da771dcaa161286cae4d -U dan -Z a202a1f73cdb865aaa148dd68fbda945 +P 0f97c2a459bfadc2fe19e710e8845039b4434010656d311074b9594b02d0826a +R 7868302cf3bc690aec9205f019a549f7 +U drh +Z f8eef76cb448b8627630bf5bdf905136 diff --git a/manifest.uuid b/manifest.uuid index ff5ad7c1a3..cd3ae0f9ee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0f97c2a459bfadc2fe19e710e8845039b4434010656d311074b9594b02d0826a \ No newline at end of file +c1bb5cff527af6a97b025d646581c68ac9b56924ae199f86964026a7bc9724fd \ No newline at end of file diff --git a/src/main.c b/src/main.c index e2ebb1ef2f..ca796b12c7 100644 --- a/src/main.c +++ b/src/main.c @@ -1854,22 +1854,33 @@ int sqlite3CreateFunc( ** If SQLITE_ANY is specified, add three versions of the function ** to the hash table. */ - if( enc==SQLITE_UTF16 ){ - enc = SQLITE_UTF16NATIVE; - }else if( enc==SQLITE_ANY ){ - int rc; - rc = sqlite3CreateFunc(db, zFunctionName, nArg, - (SQLITE_UTF8|extraFlags)^SQLITE_FUNC_UNSAFE, - pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); - if( rc==SQLITE_OK ){ + switch( enc ){ + case SQLITE_UTF16: + enc = SQLITE_UTF16NATIVE; + break; + case SQLITE_ANY: { + int rc; rc = sqlite3CreateFunc(db, zFunctionName, nArg, - (SQLITE_UTF16LE|extraFlags)^SQLITE_FUNC_UNSAFE, + (SQLITE_UTF8|extraFlags)^SQLITE_FUNC_UNSAFE, pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); + if( rc==SQLITE_OK ){ + rc = sqlite3CreateFunc(db, zFunctionName, nArg, + (SQLITE_UTF16LE|extraFlags)^SQLITE_FUNC_UNSAFE, + pUserData, xSFunc, xStep, xFinal, xValue, xInverse, pDestructor); + } + if( rc!=SQLITE_OK ){ + return rc; + } + enc = SQLITE_UTF16BE; + break; } - if( rc!=SQLITE_OK ){ - return rc; - } - enc = SQLITE_UTF16BE; + case SQLITE_UTF8: + case SQLITE_UTF16LE: + case SQLITE_UTF16BE: + break; + default: + enc = SQLITE_UTF8; + break; } #else enc = SQLITE_UTF8; From 8eed58478677dd9f61920af4df97e86d1b789552 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 9 Jul 2021 14:59:12 +0000 Subject: [PATCH 053/100] Fix an assert() that might fail if sqlite3_create_function_v2() is invoked with NULL xStep and xFinal callbacks and a non-NULL xDestroy. FossilOrigin-Name: ab1550a608684b6b9104b555a975482cfabca5053b7d7dcc60d63a0e3a8d707d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/main.c | 2 +- test/func3.test | 8 ++++++++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 634c8b0085..50089e82aa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\ssqlite3_create_function()\sinterfaces\sto\sassume\sa\svalue\sof\nSQLITE_UTF8\sis\spresented\swith\sa\snonsense\svalue\sfor\sthe\spreferred\sencoding.\nThis\sis\sundocumented\sbehavior\sadded\sfor\srobustness. -D 2021-07-09T13:52:01.084 +C Fix\san\sassert()\sthat\smight\sfail\sif\ssqlite3_create_function_v2()\sis\sinvoked\swith\sNULL\sxStep\sand\sxFinal\scallbacks\sand\sa\snon-NULL\sxDestroy. +D 2021-07-09T14:59:12.343 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -508,7 +508,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c d560dc585c50e01b015cbf924c173de88f61c8c85b3d1adb9d4865b92fff2d72 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c 6df43445e0c0c45642aff43726c0b2d42fcbb73c0c5a1e805c3b5b3c9b4eb106 +F src/main.c 5d024b9b96d9c6809e66b7f4864c3745bc8caf2a6af3b27dc0f05328f4439dfd F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -1037,7 +1037,7 @@ F test/fts4upfrom.test f25835162c989dffd5e2ef91ec24c4848cc9973093e2d492d1c7b32af F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test 77f6ea02c97d9ea64074461d347276a75df22d2cf51045a40f90857569e985f0 F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f -F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 +F test/func3.test 600a632c305a88f3946d38f9a51efe145c989b2e13bd2b2a488db47fe76bab6a F test/func4.test 2285fb5792d593fef442358763f0fd9de806eda47dbc7a5934df57ffdc484c31 F test/func5.test 863e6d1bd0013d09c17236f8a13ea34008dd857d87d85a13a673960e4c25d82a F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c @@ -1920,7 +1920,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 0f97c2a459bfadc2fe19e710e8845039b4434010656d311074b9594b02d0826a -R 7868302cf3bc690aec9205f019a549f7 -U drh -Z f8eef76cb448b8627630bf5bdf905136 +P c1bb5cff527af6a97b025d646581c68ac9b56924ae199f86964026a7bc9724fd +R 2f585f1a71d6f5a7312cf10f6b97e250 +U dan +Z 417b62b479932df1736f5199ded86ec1 diff --git a/manifest.uuid b/manifest.uuid index cd3ae0f9ee..1f814b7629 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1bb5cff527af6a97b025d646581c68ac9b56924ae199f86964026a7bc9724fd \ No newline at end of file +ab1550a608684b6b9104b555a975482cfabca5053b7d7dcc60d63a0e3a8d707d \ No newline at end of file diff --git a/src/main.c b/src/main.c index ca796b12c7..fc0fa6ad16 100644 --- a/src/main.c +++ b/src/main.c @@ -1977,7 +1977,7 @@ static int createFunctionApi( xSFunc, xStep, xFinal, xValue, xInverse, pArg ); if( pArg && pArg->nRef==0 ){ - assert( rc!=SQLITE_OK ); + assert( rc!=SQLITE_OK || (xStep==0 && xFinal==0) ); xDestroy(p); sqlite3_free(pArg); } diff --git a/test/func3.test b/test/func3.test index a535bae7b9..0221a0dfd6 100644 --- a/test/func3.test +++ b/test/func3.test @@ -198,6 +198,14 @@ do_test func3-5.59 { } [db eval {EXPLAIN SELECT min(1.0+'2.0',4*11)}] +# Test the outcome of specifying NULL xStep and xFinal pointers (normally +# used to delete any existing function) and a non-NULL xDestroy when there +# is no existing function to destroy. +# +do_test func3-6.0 { + sqlite3_create_function_v2 db nofunc 1 utf8 +} {} + finish_test From a73c306065e0a31d972e94cfbb1b3246a125a057 Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 9 Jul 2021 23:12:42 +0000 Subject: [PATCH 054/100] Clarify comment on sqlite3.h's interface decaration macros. FossilOrigin-Name: 7cb09aef49c0b98c0c5e332d953a2eeb71ae9e243b1e37ab1c8ed4af15d46f50 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 50089e82aa..a354ffea57 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\smight\sfail\sif\ssqlite3_create_function_v2()\sis\sinvoked\swith\sNULL\sxStep\sand\sxFinal\scallbacks\sand\sa\snon-NULL\sxDestroy. -D 2021-07-09T14:59:12.343 +C Clarify\scomment\son\ssqlite3.h's\sinterface\sdecaration\smacros. +D 2021-07-09T23:12:42.486 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -546,7 +546,7 @@ F src/resolve.c b379c5ffe3b692e9c64fa37817cc0efa204b7c9468a818309dde85fd132d9d81 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 1c1230aaa4e5979edd3c5a9f7a90ab856a302cca4962e8a7d08f42dd2e7e1a49 F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 -F src/sqlite.h.in ecf5aa981da30c33da3e9f353bf3ebf055d3c380c80d6a4f954e58d18ccd6df1 +F src/sqlite.h.in 8ddae2ca8a31132336c385cd7b938fbcadf5ed57873dbe529d3c75d28241685b F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h 129619232aa632fa85db7792bfe4b378ed28d3361bf9cbcdb4522353fd04b89b @@ -1920,7 +1920,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 c1bb5cff527af6a97b025d646581c68ac9b56924ae199f86964026a7bc9724fd -R 2f585f1a71d6f5a7312cf10f6b97e250 -U dan -Z 417b62b479932df1736f5199ded86ec1 +P ab1550a608684b6b9104b555a975482cfabca5053b7d7dcc60d63a0e3a8d707d +R ccb396cfbaef0a2b4107a89e839d38ef +U larrybr +Z 05b6e9c94023ac4e996b4a1256a4c2d0 diff --git a/manifest.uuid b/manifest.uuid index 1f814b7629..44b147f611 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ab1550a608684b6b9104b555a975482cfabca5053b7d7dcc60d63a0e3a8d707d \ No newline at end of file +7cb09aef49c0b98c0c5e332d953a2eeb71ae9e243b1e37ab1c8ed4af15d46f50 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index cad89b37b1..cdf9e5c0d0 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -43,7 +43,9 @@ extern "C" { /* -** Provide the ability to override linkage features of the interface. +** Facilitate override of interface linkage and calling conventions. +** Be aware that some or many of these next few defined macros may +** not be used within this particular translation of sqlite.h.in . */ #ifndef SQLITE_EXTERN # define SQLITE_EXTERN extern From 4b1c3eb5f9a5b8d4c709d17d7eeadc40e97b7d2a Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 13 Jul 2021 01:45:04 +0000 Subject: [PATCH 055/100] Amalgamation has #line directives by default. Minor mksqlite3c.tcl changes FossilOrigin-Name: ba3eff71973064cbc0ddf51aa822a246c162bbb65387e9523692c60e5340acda --- Makefile.in | 3 +- configure | 22 ++++++++++++++ manifest | 19 +++++++----- manifest.uuid | 2 +- tool/mksqlite3c.tcl | 74 ++++++++++++++++++++++----------------------- 5 files changed, 72 insertions(+), 48 deletions(-) diff --git a/Makefile.in b/Makefile.in index 2795ffa9e8..d04d81c164 100644 --- a/Makefile.in +++ b/Makefile.in @@ -165,6 +165,7 @@ LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL) ############################################################################### USE_AMALGAMATION = @USE_AMALGAMATION@ +AMALGAMATION_LINE_TAGS = @AMALGAMATION_LINE_TAGS@ # Object files for the SQLite library (non-amalgamation). # @@ -756,7 +757,7 @@ mptest: mptester$(TEXE) touch .target_source sqlite3.c: .target_source $(TOP)/tool/mksqlite3c.tcl - $(TCLSH_CMD) $(TOP)/tool/mksqlite3c.tcl + $(TCLSH_CMD) $(TOP)/tool/mksqlite3c.tcl $(AMALGAMATION_LINE_TAGS) cp tsrc/sqlite3ext.h . cp $(TOP)/ext/session/sqlite3session.h . diff --git a/configure b/configure index 542ee5a1fe..52d8a120b2 100755 --- a/configure +++ b/configure @@ -774,6 +774,7 @@ USE_GCOV OPT_FEATURE_FLAGS HAVE_ZLIB USE_AMALGAMATION +AMALGAMATION_LINE_TAGS TARGET_DEBUG TARGET_HAVE_EDITLINE TARGET_HAVE_READLINE @@ -902,6 +903,7 @@ with_readline_lib with_readline_inc enable_debug enable_amalgamation +amalgamation_line_tags enable_load_extension enable_math enable_all @@ -10305,6 +10307,13 @@ done # USE_AMALGAMATION=1 +######### +# By default, amalgamation sqlite3.c will have #line directives. +# This is a build option not shown by ./configure --help +# To control it, use configure option: amalgamation_line_tags=? +# where ? is no to suppress #line directives or yes to create them. +AMALGAMATION_LINE_TAGS=--linemacros=1 + ######### # See whether we can run specific tclsh versions known to work well; # if not, then we fall back to plain tclsh. @@ -11275,6 +11284,19 @@ if test "${enable_amalgamation}" = "no" ; then USE_AMALGAMATION=0 fi +######## +# See whether --disable +if test "${amalgamation_line_tags+set}" = set; then : + enableval=$amalgamation_line_tags; +fi + +if test "${amalgamation_line_tags}" = "yes" ; then + AMALGAMATION_LINE_TAGS=--linemacros=1 +fi +if test "${amalgamation_line_tags}" = "no" ; then + AMALGAMATION_LINE_TAGS=--linemacros=0 +fi + ######### # Look for zlib. Only needed by extensions and by the sqlite3.exe shell diff --git a/manifest b/manifest index a354ffea57..6b80d1d47c 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Clarify\scomment\son\ssqlite3.h's\sinterface\sdecaration\smacros. -D 2021-07-09T23:12:42.486 +C Amalgamation\shas\s#line\sdirectives\sby\sdefault.\sMinor\smksqlite3c.tcl\schanges +D 2021-07-13T01:45:04.109 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in ff5ac24ec9cb700135ee4453fa14c18ea371e94250d3673bda1f2cb56e1108ce +F Makefile.in 31b3f386d47577c610dedf116aa5deab039c749d36b7735e9bc01a6f31c90f2b F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc 8285e1ea7264f32b08702866d69dd127c0f663bbc2002323d853c68c27c6b6e4 F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 @@ -34,7 +34,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 9712ea724ff2a1d48fadcf04b29fa1852f325792462c55f4fc71ab972653b20d x +F configure 0c8ec49c8c57e549748fd3c9df50f997272649fdba3be5b91ebf9f2546856157 x F configure.ac 4e4b58b32f88c8da9914a2f2c3158f80e69907eccc019fcc7e3ba14ffd91c640 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -1858,7 +1858,7 @@ F tool/mkshellc.tcl 5fe7e518112b262e25726f248c0f33dd153192867453984b6af0a76a88e9 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl b4a930a4c3f8f43273cde45a459eb8881479be3c2845526c92b2513a4995aab8 +F tool/mksqlite3c.tcl bfbdf3661d82a9d5913a52dfa8d78b2a069a8af1a4b457162609bd6b55700de0 F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 @@ -1920,7 +1920,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 ab1550a608684b6b9104b555a975482cfabca5053b7d7dcc60d63a0e3a8d707d -R ccb396cfbaef0a2b4107a89e839d38ef +P 7cb09aef49c0b98c0c5e332d953a2eeb71ae9e243b1e37ab1c8ed4af15d46f50 +R 6df1eb2d72698e3e5d1e65e62fb29077 +T *branch * line_tags +T *sym-line_tags * +T -sym-trunk * U larrybr -Z 05b6e9c94023ac4e996b4a1256a4c2d0 +Z 26f306c76e23d1272de3ca395f0d82ae diff --git a/manifest.uuid b/manifest.uuid index 44b147f611..84b3831a8c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cb09aef49c0b98c0c5e332d953a2eeb71ae9e243b1e37ab1c8ed4af15d46f50 \ No newline at end of file +ba3eff71973064cbc0ddf51aa822a246c162bbb65387e9523692c60e5340acda \ No newline at end of file diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 054e0fd1b9..ad2488d83f 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -17,31 +17,52 @@ # After the "tsrc" directory has been created and populated, run # this script: # -# tclsh mksqlite3c.tcl --srcdir $SRC +# tclsh mksqlite3c.tcl # # The amalgamated SQLite code will be written into sqlite3.c # +set help {Usage: tclsh mksqlite3c.tcl + where is zero or more of the following with these effects: + --nostatic => Do not generate with compile-time modifiable linkage. + --linemacros=? => Insert #line directives into the output or not. (1 or 0) + --useapicall => Prepend functions with SQLITE_APICALL or SQLITE_CDECL. + --srcdir $SRC => Specify the directory containing constituent sources. + --help => See this. +} + # Begin by reading the "sqlite3.h" header file. Extract the version number # from in this file. The version number is needed to generate the header # comment of the amalgamation. # + set addstatic 1 -set linemacros 0 +set linemacros 1 set useapicall 0 +set srcdir tsrc + for {set i 0} {$i<[llength $argv]} {incr i} { set x [lindex $argv $i] - if {[regexp {^-+nostatic$} $x]} { + if {[regexp {^-?-nostatic$} $x]} { set addstatic 0 - } elseif {[regexp {^-+linemacros} $x]} { - set linemacros 1 - } elseif {[regexp {^-+useapicall} $x]} { + } elseif {[regexp {^-?-linemacros=([01])$} $x ma ulm]} { + set linemacros $ulm + } elseif {[regexp {^-?-useapicall$} $x]} { set useapicall 1 + } elseif {[regexp {^-?-srcdir$} $x]} { + incr i + if {$i==[llength $argv]} { + error "No argument following $x" + } + set srcdir [lindex $argv $i] + } elseif {[regexp {^-?-((help)|\?)$} $x]} { + puts $help + exit 0 } else { error "unknown command-line option: $x" } } -set in [open tsrc/sqlite3.h] +set in [open $srcdir/sqlite3.h] set cnt 0 set VERSION ????? while {![eof $in]} { @@ -94,7 +115,7 @@ if {$addstatic} { # # then set the SQLITE_UDL_CAPABLE_PARSER flag in the amalgamation. # -set in [open tsrc/parse.c] +set in [open $srcdir/parse.c] if {[regexp {ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT} [read $in]]} { puts $out "#define SQLITE_UDL_CAPABLE_PARSER 1" } @@ -182,7 +203,7 @@ proc section_comment {text} { # proc copy_file {filename} { global seen_hdr available_hdr varonly_hdr cdecllist out - global addstatic linemacros useapicall + global addstatic linemacros useapicall srcdir set ln 0 set tail [file tail $filename] section_comment "Begin file $tail" @@ -204,7 +225,7 @@ proc copy_file {filename} { set available_hdr($hdr) 0 } section_comment "Include $hdr in the middle of $tail" - copy_file tsrc/$hdr + copy_file $srcdir/$hdr section_comment "Continuing where we left off in $tail" if {$linemacros} {puts $out "#line [expr {$ln+1}] \"$filename\""} } else { @@ -255,7 +276,7 @@ proc copy_file {filename} { } } append line $funcname $rest - if {$funcname=="sqlite3_sourceid" && !$linemacros} { + if {$funcname=="sqlite3_sourceid"} { # The sqlite3_sourceid() routine is synthesized at the end of # the amalgamation puts $out "/* $line */" @@ -417,36 +438,13 @@ foreach file { fts5.c stmt.c } { - copy_file tsrc/$file + copy_file $srcdir/$file } -# Synthesize an alternative sqlite3_sourceid() implementation that -# that tries to detects changes in the amalgamation source text -# and modify returns a modified source-id if changes are detected. -# -# The only detection mechanism we have is the __LINE__ macro. So only -# edits that changes the number of lines of source code are detected. -# -if {!$linemacros} { - flush $out - set in2 [open sqlite3.c] - set cnt 0 - set oldsrcid {} - while {![eof $in2]} { - incr cnt - gets $in2 line - if {[regexp {^#define SQLITE_SOURCE_ID } $line]} {set oldsrcid $line} - } - close $in2 - regsub {[0-9a-flt]{4}"} $oldsrcid {alt2"} oldsrcid - puts $out \ -"#if __LINE__!=[expr {$cnt+0}] -#undef SQLITE_SOURCE_ID -$oldsrcid -#endif -/* Return the source-id for this library */ +puts $out \ +"/* Return the source-id for this library */ SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }" -} + puts $out \ "/************************** End of sqlite3.c ******************************/" From f1cacb76b74a9e1f207e21fa6f15cbb15d6ec9fa Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 13 Jul 2021 11:30:46 +0000 Subject: [PATCH 056/100] Do not attempt to run Tcl sessions tests unless both SQLITE_ENABLE_PREUPDATE_HOOK and SQLITE_ENABLE_SESSIONS are defined. FossilOrigin-Name: 385db794477e046b5dde726489375786d7565b113084f6e730efb050b08f9a6e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/test_config.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a354ffea57..0657e74438 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Clarify\scomment\son\ssqlite3.h's\sinterface\sdecaration\smacros. -D 2021-07-09T23:12:42.486 +C Do\snot\sattempt\sto\srun\sTcl\ssessions\stests\sunless\sboth\sSQLITE_ENABLE_PREUPDATE_HOOK\sand\sSQLITE_ENABLE_SESSIONS\sare\sdefined. +D 2021-07-13T11:30:46.013 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -569,7 +569,7 @@ F src/test_backup.c bf5da90c9926df0a4b941f2d92825a01bbe090a0 F src/test_bestindex.c 78809f11026f18a93fcfd798d9479cba37e1201c830260bf1edc674b2fa9b857 F src/test_blob.c ae4a0620b478548afb67963095a7417cd06a4ec0a56adb453542203bfdcb31ce F src/test_btree.c 8b2dc8b8848cf3a4db93f11578f075e82252a274 -F src/test_config.c 9c8e12823c46082a01765addf43be9309889f4e9dfb5a512a6c974e1c4efb413 +F src/test_config.c 284c29912736f68b0a583a920bf63fd8f9125dffb8a75cb0676e58502b2f7908 F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 F src/test_devsym.c aff2255ea290d7718da08af30cdf18e470ff7325a5eff63e0057b1496ed66593 @@ -1920,7 +1920,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 ab1550a608684b6b9104b555a975482cfabca5053b7d7dcc60d63a0e3a8d707d -R ccb396cfbaef0a2b4107a89e839d38ef -U larrybr -Z 05b6e9c94023ac4e996b4a1256a4c2d0 +P 7cb09aef49c0b98c0c5e332d953a2eeb71ae9e243b1e37ab1c8ed4af15d46f50 +R ffe5fcedbe611fc5d143174623ac9c96 +U dan +Z 4dfdb08b45660ff4713e22026b265656 diff --git a/manifest.uuid b/manifest.uuid index 44b147f611..713c3371de 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cb09aef49c0b98c0c5e332d953a2eeb71ae9e243b1e37ab1c8ed4af15d46f50 \ No newline at end of file +385db794477e046b5dde726489375786d7565b113084f6e730efb050b08f9a6e \ No newline at end of file diff --git a/src/test_config.c b/src/test_config.c index 86e4df38f7..acf98e36d8 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -589,7 +589,7 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "schema_version", "1", TCL_GLOBAL_ONLY); #endif -#ifdef SQLITE_ENABLE_SESSION +#if defined(SQLITE_ENABLE_SESSION) && defined(SQLITE_ENABLE_PREUPDATE_HOOK) Tcl_SetVar2(interp, "sqlite_options", "session", "1", TCL_GLOBAL_ONLY); #else Tcl_SetVar2(interp, "sqlite_options", "session", "0", TCL_GLOBAL_ONLY); From 06a0ea9a681338d5165703ec5eb6601301df56fb Mon Sep 17 00:00:00 2001 From: larrybr Date: Tue, 13 Jul 2021 20:55:26 +0000 Subject: [PATCH 057/100] Get correct #line tags into amalgamation for other builds too. FossilOrigin-Name: 999eb80018f1bb8a8ad73483610400faf5fb37b1be446ce30edbf7028340f50b --- Makefile.msc | 11 ++++++----- main.mk | 3 ++- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 4f20c0c0c1..2b369d7b09 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -235,8 +235,9 @@ DEBUG = 0 !ENDIF # <> -# Disable use of the --linemacros argument to the mksqlite3c.tcl tool, which -# is used to build the amalgamation. +# By default, use --line_tags=1 argument to the mksqlite3c.tcl tool, which +# is used to build the amalgamation. This can be turned off to ease debug +# of the amalgamation away from the source tree. # !IFNDEF NO_LINEMACROS NO_LINEMACROS = 0 @@ -787,10 +788,10 @@ MKSQLITE3C_TOOL = $(TOP)\tool\mksqlite3c.tcl !ENDIF !IFNDEF MKSQLITE3C_ARGS -!IF $(DEBUG)>1 && $(NO_LINEMACROS)==0 -MKSQLITE3C_ARGS = --linemacros +!IF $(NO_LINEMACROS)==0 +MKSQLITE3C_ARGS = --line_tags=1 !ELSE -MKSQLITE3C_ARGS = +MKSQLITE3C_ARGS = --line_tags=0 !ENDIF !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0 MKSQLITE3C_ARGS = $(MKSQLITE3C_ARGS) --useapicall diff --git a/main.mk b/main.mk index 16d72ff924..152202cefc 100644 --- a/main.mk +++ b/main.mk @@ -1,3 +1,4 @@ + ############################################################################### # The following macros should be defined before this script is # invoked: @@ -663,7 +664,7 @@ sqlite3ext.h: target_source cp tsrc/sqlite3ext.h . sqlite3.c-debug: target_source $(TOP)/tool/mksqlite3c.tcl - tclsh $(TOP)/tool/mksqlite3c.tcl --linemacros + tclsh $(TOP)/tool/mksqlite3c.tcl --line_tags=1 echo '#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c cat sqlite3.c >>tclsqlite3.c echo '#endif /* USE_SYSTEM_SQLITE */' >>tclsqlite3.c diff --git a/manifest b/manifest index 935a4ad9f9..023e749344 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Get\s#line\stags\sinto\samalgamation,\ssubject\sto\sconfigure. -D 2021-07-13T11:59:17.680 +C Get\scorrect\s#line\stags\sinto\samalgamation\sfor\sother\sbuilds\stoo. +D 2021-07-13T20:55:26.417 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 31b3f386d47577c610dedf116aa5deab039c749d36b7735e9bc01a6f31c90f2b F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 8285e1ea7264f32b08702866d69dd127c0f663bbc2002323d853c68c27c6b6e4 +F Makefile.msc a44ead80b4676506954d27c2de6a4d669153f2f7967dedf588b6d9c7c5f46edc F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -466,7 +466,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk c0c95f0aa2e3b731eb0c5a85869d4d6abef91647ec8e87a4013059bd1b910c0a +F main.mk 6e3aceeb728ac72a6c265e24817166c4eb126e17cc49d419591b53372d9db817 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1920,7 +1920,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 385db794477e046b5dde726489375786d7565b113084f6e730efb050b08f9a6e 9327f73c1b87fb9ca78e261d16b092763f497bb9c6f9784a33eabdc961b06343 -R dbca2ff374fa12dc1b7d55e8c48721d1 +P 5d81b598a7cd2cea2553fdf6ca38d2f65f0f1b2d5a8eea8a01c1800f68aa2422 +R 8047cbd4c8070d900b13d435b1c9a26f U larrybr -Z 63da48257739363f6cf3cff556a25d79 +Z cd87850b5562004651d7c32e14873964 diff --git a/manifest.uuid b/manifest.uuid index 31c27e4dfb..bf85853f3f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d81b598a7cd2cea2553fdf6ca38d2f65f0f1b2d5a8eea8a01c1800f68aa2422 \ No newline at end of file +999eb80018f1bb8a8ad73483610400faf5fb37b1be446ce30edbf7028340f50b \ No newline at end of file From 696555d7b5e7aa7468109901f73308461cb3ab9f Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 13 Jul 2021 21:59:22 +0000 Subject: [PATCH 058/100] Further revisions to #line handling for amalgamation builds. FossilOrigin-Name: 9a84321229ad499ee0f7c85732c2728afb4476c72073a510401a559dda9be38f --- Makefile.in | 4 ++-- Makefile.msc | 8 ++++---- configure | 20 ++++++++++---------- main.mk | 2 +- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- tool/mksqlite3c.tcl | 19 ++++++++++--------- 7 files changed, 39 insertions(+), 38 deletions(-) diff --git a/Makefile.in b/Makefile.in index d04d81c164..c771b5bada 100644 --- a/Makefile.in +++ b/Makefile.in @@ -165,7 +165,7 @@ LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL) ############################################################################### USE_AMALGAMATION = @USE_AMALGAMATION@ -AMALGAMATION_LINE_TAGS = @AMALGAMATION_LINE_TAGS@ +AMALGAMATION_LINE_MACROS = @AMALGAMATION_LINE_MACROS@ # Object files for the SQLite library (non-amalgamation). # @@ -757,7 +757,7 @@ mptest: mptester$(TEXE) touch .target_source sqlite3.c: .target_source $(TOP)/tool/mksqlite3c.tcl - $(TCLSH_CMD) $(TOP)/tool/mksqlite3c.tcl $(AMALGAMATION_LINE_TAGS) + $(TCLSH_CMD) $(TOP)/tool/mksqlite3c.tcl $(AMALGAMATION_LINE_MACROS) cp tsrc/sqlite3ext.h . cp $(TOP)/ext/session/sqlite3session.h . diff --git a/Makefile.msc b/Makefile.msc index 2b369d7b09..7fd43055ec 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -235,7 +235,7 @@ DEBUG = 0 !ENDIF # <> -# By default, use --line_tags=1 argument to the mksqlite3c.tcl tool, which +# By default, use --linemacros=1 argument to the mksqlite3c.tcl tool, which # is used to build the amalgamation. This can be turned off to ease debug # of the amalgamation away from the source tree. # @@ -788,10 +788,10 @@ MKSQLITE3C_TOOL = $(TOP)\tool\mksqlite3c.tcl !ENDIF !IFNDEF MKSQLITE3C_ARGS -!IF $(NO_LINEMACROS)==0 -MKSQLITE3C_ARGS = --line_tags=1 +!IF $(DEBUG)>1 && $(NO_LINEMACROS)==0 +MKSQLITE3C_ARGS = --linemacros=1 !ELSE -MKSQLITE3C_ARGS = --line_tags=0 +MKSQLITE3C_ARGS = --linemacros=0 !ENDIF !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0 MKSQLITE3C_ARGS = $(MKSQLITE3C_ARGS) --useapicall diff --git a/configure b/configure index 9ec5ed9005..30f3ed7de0 100755 --- a/configure +++ b/configure @@ -774,7 +774,7 @@ USE_GCOV OPT_FEATURE_FLAGS HAVE_ZLIB USE_AMALGAMATION -AMALGAMATION_LINE_TAGS +AMALGAMATION_LINE_MACROS TARGET_DEBUG TARGET_HAVE_EDITLINE TARGET_HAVE_READLINE @@ -903,7 +903,7 @@ with_readline_lib with_readline_inc enable_debug enable_amalgamation -amalgamation_line_tags +amalgamation_line_macros enable_load_extension enable_math enable_all @@ -10310,9 +10310,9 @@ USE_AMALGAMATION=1 ######### # By default, amalgamation sqlite3.c will have #line directives. # This is a build option not shown by ./configure --help -# To control it, use configure option: amalgamation_line_tags=? +# To control it, use configure option: amalgamation_line_macros=? # where ? is no to suppress #line directives or yes to create them. -AMALGAMATION_LINE_TAGS=--line_tags=1 +AMALGAMATION_LINE_MACROS=--linemacros=1 ######### # See whether we can run specific tclsh versions known to work well; @@ -11286,15 +11286,15 @@ fi ######## # See whether --disable -if test "${amalgamation_line_tags+set}" = set; then : - enableval=$amalgamation_line_tags; +if test "${amalgamation_line_macros+set}" = set; then : + enableval=$amalgamation_line_macros; fi -if test "${amalgamation_line_tags}" = "yes" ; then - AMALGAMATION_LINE_TAGS=--line_tags=1 +if test "${amalgamation_line_macros}" = "yes" ; then + AMALGAMATION_LINE_MACROS=--linemacros=1 fi -if test "${amalgamation_line_tags}" = "no" ; then - AMALGAMATION_LINE_TAGS=--line_tags=0 +if test "${amalgamation_line_macros}" = "no" ; then + AMALGAMATION_LINE_MACROS=--linemacros=0 fi diff --git a/main.mk b/main.mk index 152202cefc..64c25a5139 100644 --- a/main.mk +++ b/main.mk @@ -664,7 +664,7 @@ sqlite3ext.h: target_source cp tsrc/sqlite3ext.h . sqlite3.c-debug: target_source $(TOP)/tool/mksqlite3c.tcl - tclsh $(TOP)/tool/mksqlite3c.tcl --line_tags=1 + tclsh $(TOP)/tool/mksqlite3c.tcl --linemacros=1 echo '#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c cat sqlite3.c >>tclsqlite3.c echo '#endif /* USE_SYSTEM_SQLITE */' >>tclsqlite3.c diff --git a/manifest b/manifest index 023e749344..8d184cc0c8 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Get\scorrect\s#line\stags\sinto\samalgamation\sfor\sother\sbuilds\stoo. -D 2021-07-13T20:55:26.417 +C Further\srevisions\sto\s#line\shandling\sfor\samalgamation\sbuilds. +D 2021-07-13T21:59:22.649 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 31b3f386d47577c610dedf116aa5deab039c749d36b7735e9bc01a6f31c90f2b +F Makefile.in 83c348515cb62f6f2a2ddf3fd014113ff20564b776e1a614079722c88c6ff43d F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc a44ead80b4676506954d27c2de6a4d669153f2f7967dedf588b6d9c7c5f46edc +F Makefile.msc d481375cd138e705f749dad2549b2f80d5d76e23132c5fc9be337f7416cb9fc8 F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -34,7 +34,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 6d4409696c9f91a4a9108123ea52b97d8f2b4f056565e0a4ab62f899944f3acb x +F configure b392a2f2a44673f1e31a5bb266a08256a5bb1428e71fd8c6fbc90f60a88286fe x F configure.ac 4e4b58b32f88c8da9914a2f2c3158f80e69907eccc019fcc7e3ba14ffd91c640 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -466,7 +466,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 6e3aceeb728ac72a6c265e24817166c4eb126e17cc49d419591b53372d9db817 +F main.mk 200bf75c882c4822ea722840fc5212f22e5e18773851352c2a0d077958de8b7f F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1858,7 +1858,7 @@ F tool/mkshellc.tcl 5fe7e518112b262e25726f248c0f33dd153192867453984b6af0a76a88e9 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl e5d1c5b61f530e9307f7dc9c2880ebe5d0578cb3817d8223933f24ca8a74cc2d +F tool/mksqlite3c.tcl 8127f4c2b11078f9dc4956fa1401291b6d6dd81e41a4fd3f74a9710ab16a791c F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 @@ -1920,7 +1920,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 5d81b598a7cd2cea2553fdf6ca38d2f65f0f1b2d5a8eea8a01c1800f68aa2422 -R 8047cbd4c8070d900b13d435b1c9a26f -U larrybr -Z cd87850b5562004651d7c32e14873964 +P 999eb80018f1bb8a8ad73483610400faf5fb37b1be446ce30edbf7028340f50b +R f35bd0cfcf360e047d19fadb646cae86 +U mistachkin +Z d52b02f968087a7fee10f230044f7d8b diff --git a/manifest.uuid b/manifest.uuid index bf85853f3f..176f226770 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -999eb80018f1bb8a8ad73483610400faf5fb37b1be446ce30edbf7028340f50b \ No newline at end of file +9a84321229ad499ee0f7c85732c2728afb4476c72073a510401a559dda9be38f \ No newline at end of file diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index afb9740d2b..863eeba801 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -25,11 +25,11 @@ set help {Usage: tclsh mksqlite3c.tcl where is zero or more of the following with these effects: --nostatic => Do not generate with compile-time modifiable linkage. - --line_tags=? => Emit #line directives into output or not. (? = 1 or 0) + --linemacros=? => Emit #line directives into output or not. (? = 1 or 0) --useapicall => Prepend functions with SQLITE_APICALL or SQLITE_CDECL. --srcdir $SRC => Specify the directory containing constituent sources. --help => See this. - The value setting options default to --line_tags=1 and '--srcdir tsrc' . + The value setting options default to --linemacros=1 and '--srcdir tsrc' . } # Begin by reading the "sqlite3.h" header file. Extract the version number @@ -38,7 +38,7 @@ set help {Usage: tclsh mksqlite3c.tcl # set addstatic 1 -set line_tags 1 +set linemacros 1 set useapicall 0 set srcdir tsrc @@ -46,8 +46,9 @@ for {set i 0} {$i<[llength $argv]} {incr i} { set x [lindex $argv $i] if {[regexp {^-?-nostatic$} $x]} { set addstatic 0 - } elseif {[regexp {^-?-line_tags=([01])$} $x ma ulm]} { - set line_tags $ulm + } elseif {[regexp {^-?-linemacros(?:=([01]))?$} $x ma ulm]} { + if {$ulm == ""} {set ulm 1} + set linemacros $ulm } elseif {[regexp {^-?-useapicall$} $x]} { set useapicall 1 } elseif {[regexp {^-?-srcdir$} $x]} { @@ -204,11 +205,11 @@ proc section_comment {text} { # proc copy_file {filename} { global seen_hdr available_hdr varonly_hdr cdecllist out - global addstatic line_tags useapicall srcdir + global addstatic linemacros useapicall srcdir set ln 0 set tail [file tail $filename] section_comment "Begin file $tail" - if {$line_tags} {puts $out "#line 1 \"$filename\""} + if {$linemacros} {puts $out "#line 1 \"$filename\""} set in [open $filename r] set varpattern {^[a-zA-Z][a-zA-Z_0-9 *]+(sqlite3[_a-zA-Z0-9]+)(\[|;| =)} set declpattern {([a-zA-Z][a-zA-Z_0-9 ]+ \**)(sqlite3[_a-zA-Z0-9]+)(\(.*)} @@ -228,7 +229,7 @@ proc copy_file {filename} { section_comment "Include $hdr in the middle of $tail" copy_file $srcdir/$hdr section_comment "Continuing where we left off in $tail" - if {$line_tags} {puts $out "#line [expr {$ln+1}] \"$filename\""} + if {$linemacros} {puts $out "#line [expr {$ln+1}] \"$filename\""} } else { # Comment out the entire line, replacing any nested comment # begin/end markers with the harmless substring "**". @@ -250,7 +251,7 @@ proc copy_file {filename} { } } elseif {[regexp {^#ifdef __cplusplus} $line]} { puts $out "#if 0" - } elseif {!$line_tags && [regexp {^#line} $line]} { + } elseif {!$linemacros && [regexp {^#line} $line]} { # Skip #line directives. } elseif {$addstatic && ![regexp {^(static|typedef|SQLITE_PRIVATE)} $line]} { From acae2b485ea7325c6031102f5ad58e9f282cb214 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 13 Jul 2021 22:49:02 +0000 Subject: [PATCH 059/100] Enhance comments pertaining to the interface linkage / calling convention macros. FossilOrigin-Name: c378e99250fe06fae8ca40c62185b607f004d6806e07dbb9f964dd849b4e55f8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 25 +++++++++++++++++++++++-- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8d184cc0c8..218b1abbf1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\srevisions\sto\s#line\shandling\sfor\samalgamation\sbuilds. -D 2021-07-13T21:59:22.649 +C Enhance\scomments\spertaining\sto\sthe\sinterface\slinkage\s/\scalling\sconvention\smacros. +D 2021-07-13T22:49:02.204 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -546,7 +546,7 @@ F src/resolve.c b379c5ffe3b692e9c64fa37817cc0efa204b7c9468a818309dde85fd132d9d81 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 1c1230aaa4e5979edd3c5a9f7a90ab856a302cca4962e8a7d08f42dd2e7e1a49 F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 -F src/sqlite.h.in 8ddae2ca8a31132336c385cd7b938fbcadf5ed57873dbe529d3c75d28241685b +F src/sqlite.h.in a5d5641afa335226231231c7b6e424de327f17577d9e8aeaaaab78d9bbbcf381 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h 129619232aa632fa85db7792bfe4b378ed28d3361bf9cbcdb4522353fd04b89b @@ -1920,7 +1920,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 999eb80018f1bb8a8ad73483610400faf5fb37b1be446ce30edbf7028340f50b -R f35bd0cfcf360e047d19fadb646cae86 +P 9a84321229ad499ee0f7c85732c2728afb4476c72073a510401a559dda9be38f +R 3789b43d6e6200974e3100b41a3c444f U mistachkin -Z d52b02f968087a7fee10f230044f7d8b +Z eb61d76fb75de1f468d1b3d6692793bb diff --git a/manifest.uuid b/manifest.uuid index 176f226770..f6b958ea40 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a84321229ad499ee0f7c85732c2728afb4476c72073a510401a559dda9be38f \ No newline at end of file +c378e99250fe06fae8ca40c62185b607f004d6806e07dbb9f964dd849b4e55f8 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index cdf9e5c0d0..73c1adeae1 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -44,8 +44,29 @@ extern "C" { /* ** Facilitate override of interface linkage and calling conventions. -** Be aware that some or many of these next few defined macros may -** not be used within this particular translation of sqlite.h.in . +** Be aware that these macros may not be used within this particular +** translation of the amalgamation and its associated header file. +** +** The SQLITE_EXTERN and SQLITE_API macros are used to instruct the +** compiler that the target identifier should have external linkage. +** +** The SQLITE_CDECL macro is used to set the calling convention for +** public functions that accept a variable number of arguments. +** +** The SQLITE_APICALL macro is used to set the calling convention for +** public functions that accept a fixed number of arguments. +** +** The SQLITE_STDCALL macro is no longer used and is now deprecated. +** +** The SQLITE_CALLBACK macro is used to set the calling convention for +** function pointers. +** +** The SQLITE_SYSAPI macro is used to set the calling convention for +** functions provided by the operating system. +** +** Currently, the SQLITE_CDECL, SQLITE_APICALL, SQLITE_CALLBACK, and +** SQLITE_SYSAPI macros are used only when building for environments +** that require non-default calling conventions. */ #ifndef SQLITE_EXTERN # define SQLITE_EXTERN extern From 20235e56f71b38788dd2e113eebdc6d564ff1bbc Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 14 Jul 2021 21:18:31 +0000 Subject: [PATCH 060/100] Fix a use-after-free error in ioerr.test caused by an error in test code. FossilOrigin-Name: 1594056aab068b9fae82f6b885828c7127d9bedcc37c4340486e32791bc87c7a --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/tester.tcl | 32 +++++++++++++++++--------------- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 218b1abbf1..8d6d4c6f24 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\scomments\spertaining\sto\sthe\sinterface\slinkage\s/\scalling\sconvention\smacros. -D 2021-07-13T22:49:02.204 +C Fix\sa\suse-after-free\serror\sin\sioerr.test\scaused\sby\san\serror\sin\stest\scode. +D 2021-07-14T21:18:31.520 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1454,7 +1454,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl 19d2a19a6dd55a2b4e2b943963959a05a2c088495dd5f5274b04e0494ce86d66 +F test/tester.tcl 0b7957eb669371250008a5e1fef5902257905fd6d560e8834be1ac4a0620063a F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1920,7 +1920,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 9a84321229ad499ee0f7c85732c2728afb4476c72073a510401a559dda9be38f -R 3789b43d6e6200974e3100b41a3c444f -U mistachkin -Z eb61d76fb75de1f468d1b3d6692793bb +P c378e99250fe06fae8ca40c62185b607f004d6806e07dbb9f964dd849b4e55f8 +R 5dc9e7510bb681a9844c30d96bdfacf1 +U dan +Z ab55d4571a2b3927d12f63db9cd8ac86 diff --git a/manifest.uuid b/manifest.uuid index f6b958ea40..ca45e83989 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c378e99250fe06fae8ca40c62185b607f004d6806e07dbb9f964dd849b4e55f8 \ No newline at end of file +1594056aab068b9fae82f6b885828c7127d9bedcc37c4340486e32791bc87c7a \ No newline at end of file diff --git a/test/tester.tcl b/test/tester.tcl index 304808b6bc..d7dc21157a 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -1904,21 +1904,23 @@ proc do_ioerr_test {testname args} { set ::sqlite_io_error_hardhit 0 set r [catch $::ioerrorbody msg] set ::errseen $r - set rc [sqlite3_errcode $::DB] - if {$::ioerropts(-erc)} { - # If we are in extended result code mode, make sure all of the - # IOERRs we get back really do have their extended code values. - # If an extended result code is returned, the sqlite3_errcode - # TCLcommand will return a string of the form: SQLITE_IOERR+nnnn - # where nnnn is a number - if {[regexp {^SQLITE_IOERR} $rc] && ![regexp {IOERR\+\d} $rc]} { - return $rc - } - } else { - # If we are not in extended result code mode, make sure no - # extended error codes are returned. - if {[regexp {\+\d} $rc]} { - return $rc + if {[info commands db]!=""} { + set rc [sqlite3_errcode db] + if {$::ioerropts(-erc)} { + # If we are in extended result code mode, make sure all of the + # IOERRs we get back really do have their extended code values. + # If an extended result code is returned, the sqlite3_errcode + # TCLcommand will return a string of the form: SQLITE_IOERR+nnnn + # where nnnn is a number + if {[regexp {^SQLITE_IOERR} $rc] && ![regexp {IOERR\+\d} $rc]} { + return $rc + } + } else { + # If we are not in extended result code mode, make sure no + # extended error codes are returned. + if {[regexp {\+\d} $rc]} { + return $rc + } } } # The test repeats as long as $::go is non-zero. $::go starts out From 480f5e3e6e70e803b35ddeab947988a89b0163a0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 15 Jul 2021 16:39:42 +0000 Subject: [PATCH 061/100] Change references to the schema table in sqlite3_analyzer to the new SQLITE_SCHEMA name. FossilOrigin-Name: 3beb77d6a792d07ca605ec8e5402b8a305860cba4044fcafeed00b9fa862fa16 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/spaceanal.tcl | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 8d6d4c6f24..7bb4e1d07c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\suse-after-free\serror\sin\sioerr.test\scaused\sby\san\serror\sin\stest\scode. -D 2021-07-14T21:18:31.520 +C Change\sreferences\sto\sthe\sschema\stable\sin\ssqlite3_analyzer\sto\sthe\snew\nSQLITE_SCHEMA\sname. +D 2021-07-15T16:39:42.407 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1877,7 +1877,7 @@ F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a80 F tool/showstat4.c 0682ebea7abf4d3657f53c4a243f2e7eab48eab344ed36a94bb75dcd19a5c2a1 F tool/showwal.c ad9d768f96ca6199ad3a8c9562d679680bd032dd01204ea3e5ea6fb931d81847 F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe -F tool/spaceanal.tcl a95036b36622e25cffd65a55b22d6af53dfbbff0de02d45dd0059bb3c9978609 +F tool/spaceanal.tcl 1b5be34c6223cb1af06da2a10fb77863eb869b1962d055820b0a11cf2336ab45 F tool/speed-check.sh 8ba7c7c0dba37e664679974f5954f2282275271a5b92f890756e282df0bfc458 F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e @@ -1920,7 +1920,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 c378e99250fe06fae8ca40c62185b607f004d6806e07dbb9f964dd849b4e55f8 -R 5dc9e7510bb681a9844c30d96bdfacf1 -U dan -Z ab55d4571a2b3927d12f63db9cd8ac86 +P 1594056aab068b9fae82f6b885828c7127d9bedcc37c4340486e32791bc87c7a +R 559c73747c40f0a1a7e76968f3947fcc +U drh +Z 82febd786cf0b2a285b7ed5af3f23080 diff --git a/manifest.uuid b/manifest.uuid index ca45e83989..e28955bcd3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1594056aab068b9fae82f6b885828c7127d9bedcc37c4340486e32791bc87c7a \ No newline at end of file +3beb77d6a792d07ca605ec8e5402b8a305860cba4044fcafeed00b9fa862fa16 \ No newline at end of file diff --git a/tool/spaceanal.tcl b/tool/spaceanal.tcl index e026a90efd..d0c5e65e38 100644 --- a/tool/spaceanal.tcl +++ b/tool/spaceanal.tcl @@ -731,7 +731,7 @@ Pages of auto-vacuum overhead Number of tables in the database - The number of tables in the database, including the SQLITE_MASTER table + The number of tables in the database, including the SQLITE_SCHEMA table used to store schema information. Number of indices @@ -754,7 +754,7 @@ Size of the file in bytes Bytes of user payload stored The total number of bytes of user payload stored in the database. The - schema information in the SQLITE_MASTER table is not counted when + schema information in the SQLITE_SCHEMA table is not counted when computing this number. The percentage at the right shows the payload divided by the total file size. From bb301231788a7ca2292005ecf8d924dbf122f2d2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 15 Jul 2021 19:29:43 +0000 Subject: [PATCH 062/100] Attempt to omit ORDER BY clauses from FROM-clause subqueries if those ORDER BY clauses do not affect the output. See [forum:/forumpost/2d76f2bcf65d256a|forum thread 2d76f2bcf65d256a] for discussion. This can help the query flattener in some cases, resulting in faster query plans. The current implemention does not always work. FossilOrigin-Name: ef97c3e7c3ea2cf1a4db6591328fe7ce3f1d189afc2d578159135824ec89e620 --- manifest | 23 ++++++++++------- manifest.uuid | 2 +- src/func.c | 9 ++++--- src/resolve.c | 25 +++++++++++------- src/select.c | 25 ++++++++++++++++++ src/sqliteInt.h | 69 +++++++++++++++++++++++++++---------------------- src/window.c | 2 +- 7 files changed, 98 insertions(+), 57 deletions(-) diff --git a/manifest b/manifest index 7bb4e1d07c..71e6789069 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sreferences\sto\sthe\sschema\stable\sin\ssqlite3_analyzer\sto\sthe\snew\nSQLITE_SCHEMA\sname. -D 2021-07-15T16:39:42.407 +C Attempt\sto\somit\sORDER\sBY\sclauses\sfrom\sFROM-clause\ssubqueries\sif\sthose\sORDER\sBY\nclauses\sdo\snot\saffect\sthe\soutput.\s\sSee\n[forum:/forumpost/2d76f2bcf65d256a|forum\sthread\s2d76f2bcf65d256a]\sfor\ndiscussion.\s\sThis\scan\shelp\sthe\squery\sflattener\sin\nsome\scases,\sresulting\sin\sfaster\squery\splans.\s\sThe\scurrent\simplemention\sdoes\nnot\salways\swork. +D 2021-07-15T19:29:43.004 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -499,7 +499,7 @@ F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf F src/expr.c 62b6d0ac8ee30a4749b78b7b75ae951a911a5d49321af5fe41c05af4df9e7537 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 -F src/func.c c96ac6f7c4f2d684217c4673a80446e1b50e25b5ea79366f333f484622d010a0 +F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c F src/global.c 25ba4d58476f6be29bba9d9d14f7f146b78476d3a4d75ebb8c3b736328afe0f9 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 @@ -542,14 +542,14 @@ F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c b379c5ffe3b692e9c64fa37817cc0efa204b7c9468a818309dde85fd132d9d81 +F src/resolve.c 9b54a60702c35b3efbeb5d0439a94d67c4cb93a896e1afa89f21d7a9d183a071 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 1c1230aaa4e5979edd3c5a9f7a90ab856a302cca4962e8a7d08f42dd2e7e1a49 +F src/select.c cc61c6b86617387803d67994fec6131365f6a049399aa28b11028ad0b4ee53b8 F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 F src/sqlite.h.in a5d5641afa335226231231c7b6e424de327f17577d9e8aeaaaab78d9bbbcf381 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 129619232aa632fa85db7792bfe4b378ed28d3361bf9cbcdb4522353fd04b89b +F src/sqliteInt.h 74ca9667448fa7aaadcb91bd3fd22732c7f7e05903a53429e653a4a01e4c8efd F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -635,7 +635,7 @@ F src/where.c 07a4097fe42a01b1f99d2a136598654051f0bdcd6c17cbef7fa285a9cf21e4d2 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 2bfb1cd24b9b63fc5e32b9b85f2b3f88765bdac2aab51102d94d1fb56ec2917b -F src/window.c 559961a731f67a0873744960bdeeb034a5c74cc0a09badb14bc43f74744a2a9d +F src/window.c 420167512050a0dfc0f0115b9f0c7d299da9759c9bb2ae83a61fb8d730a5707f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test eecb0dabee4b7765a8465439d5e99429279ffba23ca74a7eae270a452799f9e7 @@ -1920,7 +1920,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 1594056aab068b9fae82f6b885828c7127d9bedcc37c4340486e32791bc87c7a -R 559c73747c40f0a1a7e76968f3947fcc +P 3beb77d6a792d07ca605ec8e5402b8a305860cba4044fcafeed00b9fa862fa16 +R be1da55dd559418ff2dfd4ecbe7a006e +T *branch * omit-subquery-order-by +T *sym-omit-subquery-order-by * +T -sym-trunk * U drh -Z 82febd786cf0b2a285b7ed5af3f23080 +Z fa9c090cb9dd3863cd70130aca6f84ef diff --git a/manifest.uuid b/manifest.uuid index e28955bcd3..efbb411e0e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3beb77d6a792d07ca605ec8e5402b8a305860cba4044fcafeed00b9fa862fa16 \ No newline at end of file +ef97c3e7c3ea2cf1a4db6591328fe7ce3f1d189afc2d578159135824ec89e620 \ No newline at end of file diff --git a/src/func.c b/src/func.c index bb2f6c7b4e..f79b541718 100644 --- a/src/func.c +++ b/src/func.c @@ -2160,11 +2160,11 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(min, -1, 0, 1, minmaxFunc ), FUNCTION(min, 0, 0, 1, 0 ), WAGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, - SQLITE_FUNC_MINMAX ), + SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ), FUNCTION(max, -1, 1, 1, minmaxFunc ), FUNCTION(max, 0, 1, 1, 0 ), WAGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, - SQLITE_FUNC_MINMAX ), + SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ), FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF), FUNCTION2(length, 1, 0, 0, lengthFunc, SQLITE_FUNC_LENGTH), FUNCTION(instr, 2, 0, 0, instrFunc ), @@ -2200,9 +2200,10 @@ void sqlite3RegisterBuiltinFunctions(void){ WAGGREGATE(total, 1,0,0, sumStep,totalFinalize,totalFinalize,sumInverse, 0), WAGGREGATE(avg, 1,0,0, sumStep, avgFinalize, avgFinalize, sumInverse, 0), WAGGREGATE(count, 0,0,0, countStep, - countFinalize, countFinalize, countInverse, SQLITE_FUNC_COUNT ), + countFinalize, countFinalize, countInverse, + SQLITE_FUNC_COUNT|SQLITE_FUNC_ANYORDER ), WAGGREGATE(count, 1,0,0, countStep, - countFinalize, countFinalize, countInverse, 0 ), + countFinalize, countFinalize, countInverse, SQLITE_FUNC_ANYORDER ), WAGGREGATE(group_concat, 1, 0, 0, groupConcatStep, groupConcatFinalize, groupConcatValue, groupConcatInverse, 0), WAGGREGATE(group_concat, 2, 0, 0, groupConcatStep, diff --git a/src/resolve.c b/src/resolve.c index 3bf84d3223..955148a2f5 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1087,9 +1087,12 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ assert( pDef!=0 || IN_RENAME_OBJECT ); if( pNC2 && pDef ){ assert( SQLITE_FUNC_MINMAX==NC_MinMaxAgg ); + assert( SQLITE_FUNC_ANYORDER==NC_OrderAgg ); testcase( (pDef->funcFlags & SQLITE_FUNC_MINMAX)!=0 ); - pNC2->ncFlags |= NC_HasAgg | (pDef->funcFlags & SQLITE_FUNC_MINMAX); - + testcase( (pDef->funcFlags & SQLITE_FUNC_ANYORDER)!=0 ); + pNC2->ncFlags |= NC_HasAgg + | ((pDef->funcFlags^SQLITE_FUNC_ANYORDER) + & (SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER)); } } pNC->ncFlags |= savedAllowFlags; @@ -1676,7 +1679,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ pGroupBy = p->pGroupBy; if( pGroupBy || (sNC.ncFlags & NC_HasAgg)!=0 ){ assert( NC_MinMaxAgg==SF_MinMaxAgg ); - p->selFlags |= SF_Aggregate | (sNC.ncFlags&NC_MinMaxAgg); + assert( NC_OrderAgg==SF_OrderByReqd ); + p->selFlags |= SF_Aggregate | (sNC.ncFlags&(NC_MinMaxAgg|NC_OrderAgg)); }else{ sNC.ncFlags &= ~NC_AllowAgg; } @@ -1859,8 +1863,8 @@ int sqlite3ResolveExprNames( Walker w; if( pExpr==0 ) return SQLITE_OK; - savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); - pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); w.pParse = pNC->pParse; w.xExprCallback = resolveExprStep; w.xSelectCallback = (pNC->ncFlags & NC_NoSelect) ? 0 : resolveSelectStep; @@ -1903,8 +1907,8 @@ int sqlite3ResolveExprListNames( w.xSelectCallback = resolveSelectStep; w.xSelectCallback2 = 0; w.u.pNC = pNC; - savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); - pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + savedHasAgg = pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); for(i=0; inExpr; i++){ Expr *pExpr = pList->a[i].pExpr; if( pExpr==0 ) continue; @@ -1922,10 +1926,11 @@ int sqlite3ResolveExprListNames( assert( EP_Win==NC_HasWin ); testcase( pNC->ncFlags & NC_HasAgg ); testcase( pNC->ncFlags & NC_HasWin ); - if( pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin) ){ + if( pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg) ){ ExprSetProperty(pExpr, pNC->ncFlags & (NC_HasAgg|NC_HasWin) ); - savedHasAgg |= pNC->ncFlags & (NC_HasAgg|NC_MinMaxAgg|NC_HasWin); - pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin); + savedHasAgg |= pNC->ncFlags & + (NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); + pNC->ncFlags &= ~(NC_HasAgg|NC_MinMaxAgg|NC_HasWin|NC_OrderAgg); } if( w.pParse->nErr>0 ) return WRC_Abort; } diff --git a/src/select.c b/src/select.c index d36839264d..a6513afca5 100644 --- a/src/select.c +++ b/src/select.c @@ -6384,6 +6384,31 @@ int sqlite3Select( if( (pSub->selFlags & SF_Aggregate)!=0 ) continue; assert( pSub->pGroupBy==0 ); + /* If a FROM-clause subquery has an ORDER BY clause that is not + ** really doing anything, then delete it now so that it does not + ** interfere with query flattening. + ** + ** Beware of these cases where the ORDER BY clause may not be safely + ** omitted: + ** + ** (1) There is also a LIMIT clause + ** (2) The subquery was added to help with window-function + ** processing + ** (3) The outer query uses an aggregate function other than + ** the built-in count(), min(), or max(). + */ + if( pSub->pOrderBy!=0 + && pSub->pLimit==0 /* Condition (1) */ + && (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */ + && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) */ + && OptimizationEnabled(db, SQLITE_OmitOrderBy) + ){ + SELECTTRACE(0x100,pParse,p, + ("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1)); + sqlite3ExprListDelete(db, pSub->pOrderBy); + pSub->pOrderBy = 0; + } + /* If the outer query contains a "complex" result set (that is, ** if the result set of the outer query uses functions or subqueries) ** and if the subquery contains an ORDER BY clause and if diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 81774c1f01..7d0b7ecb37 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1744,6 +1744,7 @@ struct sqlite3 { #define SQLITE_PropagateConst 0x00008000 /* The constant propagation opt */ #define SQLITE_MinMaxOpt 0x00010000 /* The min/max optimization */ #define SQLITE_SeekScan 0x00020000 /* The OP_SeekScan optimization */ +#define SQLITE_OmitOrderBy 0x00040000 /* Omit pointless ORDER BY */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* @@ -1823,12 +1824,13 @@ struct FuncDestructor { ** are assert() statements in the code to verify this. ** ** Value constraints (enforced via assert()): -** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg -** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG -** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG -** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API -** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API -** SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS +** SQLITE_FUNC_MINMAX == NC_MinMaxAgg == SF_MinMaxAgg +** SQLITE_FUNC_ANYORDER == NC_OrderAgg == SF_OrderByReqd +** SQLITE_FUNC_LENGTH == OPFLAG_LENGTHARG +** SQLITE_FUNC_TYPEOF == OPFLAG_TYPEOFARG +** SQLITE_FUNC_CONSTANT == SQLITE_DETERMINISTIC from the API +** SQLITE_FUNC_DIRECT == SQLITE_DIRECTONLY from the API +** SQLITE_FUNC_UNSAFE == SQLITE_INNOCUOUS ** SQLITE_FUNC_ENCMASK depends on SQLITE_UTF* macros in the API */ #define SQLITE_FUNC_ENCMASK 0x0003 /* SQLITE_UTF8, SQLITE_UTF16BE or UTF16LE */ @@ -1853,6 +1855,7 @@ struct FuncDestructor { #define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */ #define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */ #define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */ +#define SQLITE_FUNC_ANYORDER 0x08000000 /* count/min/max aggregate */ /* Identifier numbers for each in-line function */ #define INLINEFUNC_coalesce 0 @@ -3088,31 +3091,33 @@ struct NameContext { ** Allowed values for the NameContext, ncFlags field. ** ** Value constraints (all checked via assert()): -** NC_HasAgg == SF_HasAgg == EP_Agg -** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX +** NC_HasAgg == SF_HasAgg == EP_Agg +** NC_MinMaxAgg == SF_MinMaxAgg == SQLITE_FUNC_MINMAX +** NC_OrderAgg == SF_OrderByReqd == SQLITE_FUNC_ANYORDER ** NC_HasWin == EP_Win ** */ -#define NC_AllowAgg 0x00001 /* Aggregate functions are allowed here */ -#define NC_PartIdx 0x00002 /* True if resolving a partial index WHERE */ -#define NC_IsCheck 0x00004 /* True if resolving a CHECK constraint */ -#define NC_GenCol 0x00008 /* True for a GENERATED ALWAYS AS clause */ -#define NC_HasAgg 0x00010 /* One or more aggregate functions seen */ -#define NC_IdxExpr 0x00020 /* True if resolving columns of CREATE INDEX */ -#define NC_SelfRef 0x0002e /* Combo: PartIdx, isCheck, GenCol, and IdxExpr */ -#define NC_VarSelect 0x00040 /* A correlated subquery has been seen */ -#define NC_UEList 0x00080 /* True if uNC.pEList is used */ -#define NC_UAggInfo 0x00100 /* True if uNC.pAggInfo is used */ -#define NC_UUpsert 0x00200 /* True if uNC.pUpsert is used */ -#define NC_UBaseReg 0x00400 /* True if uNC.iBaseReg is used */ -#define NC_MinMaxAgg 0x01000 /* min/max aggregates seen. See note above */ -#define NC_Complex 0x02000 /* True if a function or subquery seen */ -#define NC_AllowWin 0x04000 /* Window functions are allowed here */ -#define NC_HasWin 0x08000 /* One or more window functions seen */ -#define NC_IsDDL 0x10000 /* Resolving names in a CREATE statement */ -#define NC_InAggFunc 0x20000 /* True if analyzing arguments to an agg func */ -#define NC_FromDDL 0x40000 /* SQL text comes from sqlite_schema */ -#define NC_NoSelect 0x80000 /* Do not descend into sub-selects */ +#define NC_AllowAgg 0x000001 /* Aggregate functions are allowed here */ +#define NC_PartIdx 0x000002 /* True if resolving a partial index WHERE */ +#define NC_IsCheck 0x000004 /* True if resolving a CHECK constraint */ +#define NC_GenCol 0x000008 /* True for a GENERATED ALWAYS AS clause */ +#define NC_HasAgg 0x000010 /* One or more aggregate functions seen */ +#define NC_IdxExpr 0x000020 /* True if resolving columns of CREATE INDEX */ +#define NC_SelfRef 0x00002e /* Combo: PartIdx, isCheck, GenCol, and IdxExpr */ +#define NC_VarSelect 0x000040 /* A correlated subquery has been seen */ +#define NC_UEList 0x000080 /* True if uNC.pEList is used */ +#define NC_UAggInfo 0x000100 /* True if uNC.pAggInfo is used */ +#define NC_UUpsert 0x000200 /* True if uNC.pUpsert is used */ +#define NC_UBaseReg 0x000400 /* True if uNC.iBaseReg is used */ +#define NC_MinMaxAgg 0x001000 /* min/max aggregates seen. See note above */ +#define NC_Complex 0x002000 /* True if a function or subquery seen */ +#define NC_AllowWin 0x004000 /* Window functions are allowed here */ +#define NC_HasWin 0x008000 /* One or more window functions seen */ +#define NC_IsDDL 0x010000 /* Resolving names in a CREATE statement */ +#define NC_InAggFunc 0x020000 /* True if analyzing arguments to an agg func */ +#define NC_FromDDL 0x040000 /* SQL text comes from sqlite_schema */ +#define NC_NoSelect 0x080000 /* Do not descend into sub-selects */ +#define NC_OrderAgg 0x8000000 /* Has an aggregate other than count/min/max */ /* ** An instance of the following object describes a single ON CONFLICT @@ -3195,9 +3200,10 @@ struct Select { ** "Select Flag". ** ** Value constraints (all checked via assert()) -** SF_HasAgg == NC_HasAgg -** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX -** SF_FixedLimit == WHERE_USE_LIMIT +** SF_HasAgg == NC_HasAgg +** SF_MinMaxAgg == NC_MinMaxAgg == SQLITE_FUNC_MINMAX +** SF_OrderByReqd == NC_OrderAgg == SQLITE_FUNC_ANYORDER +** SF_FixedLimit == WHERE_USE_LIMIT */ #define SF_Distinct 0x0000001 /* Output should be DISTINCT */ #define SF_All 0x0000002 /* Includes the ALL keyword */ @@ -3226,6 +3232,7 @@ struct Select { #define SF_PushDown 0x1000000 /* SELECT has be modified by push-down opt */ #define SF_MultiPart 0x2000000 /* Has multiple incompatible PARTITIONs */ #define SF_CopyCte 0x4000000 /* SELECT statement is a copy of a CTE */ +#define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be purged */ /* ** The results of a SELECT can be distributed in several ways, as defined diff --git a/src/window.c b/src/window.c index f33c51150a..4a05392ad8 100644 --- a/src/window.c +++ b/src/window.c @@ -1070,7 +1070,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ Table *pTab2; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); - pSub->selFlags |= SF_Expanded; + pSub->selFlags |= SF_Expanded|SF_OrderByReqd; pTab2 = sqlite3ResultSetOfSelect(pParse, pSub, SQLITE_AFF_NONE); pSub->selFlags |= (selFlags & SF_Aggregate); if( pTab2==0 ){ From e13dfe4b19628c1d7b25eb155aa8c6abf614f926 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Thu, 15 Jul 2021 23:34:14 +0000 Subject: [PATCH 063/100] By default, do not emit #line directives in the amalgamation. FossilOrigin-Name: bacfa93677fbe014737fab7dbdb4e7a168a310bc5b914b17896ae2a48435c7b1 --- configure | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- tool/mksqlite3c.tcl | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/configure b/configure index 30f3ed7de0..8da48f587a 100755 --- a/configure +++ b/configure @@ -10312,7 +10312,7 @@ USE_AMALGAMATION=1 # This is a build option not shown by ./configure --help # To control it, use configure option: amalgamation_line_macros=? # where ? is no to suppress #line directives or yes to create them. -AMALGAMATION_LINE_MACROS=--linemacros=1 +AMALGAMATION_LINE_MACROS=--linemacros=0 ######### # See whether we can run specific tclsh versions known to work well; diff --git a/manifest b/manifest index 7bb4e1d07c..011650c27d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sreferences\sto\sthe\sschema\stable\sin\ssqlite3_analyzer\sto\sthe\snew\nSQLITE_SCHEMA\sname. -D 2021-07-15T16:39:42.407 +C By\sdefault,\sdo\snot\semit\s#line\sdirectives\sin\sthe\samalgamation. +D 2021-07-15T23:34:14.480 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -34,7 +34,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure b392a2f2a44673f1e31a5bb266a08256a5bb1428e71fd8c6fbc90f60a88286fe x +F configure e8003577b8c433cf61371d27d4beeca3a3ed37611a504ff5f4d4286923b87d03 x F configure.ac 4e4b58b32f88c8da9914a2f2c3158f80e69907eccc019fcc7e3ba14ffd91c640 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -1858,7 +1858,7 @@ F tool/mkshellc.tcl 5fe7e518112b262e25726f248c0f33dd153192867453984b6af0a76a88e9 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 8127f4c2b11078f9dc4956fa1401291b6d6dd81e41a4fd3f74a9710ab16a791c +F tool/mksqlite3c.tcl cf5686da672bc2e62cf868b7d53fc9a2aebf1b0e497164cbb9f647ec724ce0b2 F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 @@ -1920,7 +1920,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 1594056aab068b9fae82f6b885828c7127d9bedcc37c4340486e32791bc87c7a -R 559c73747c40f0a1a7e76968f3947fcc -U drh -Z 82febd786cf0b2a285b7ed5af3f23080 +P 3beb77d6a792d07ca605ec8e5402b8a305860cba4044fcafeed00b9fa862fa16 +R daf164cb48477e7248acc5698977e210 +U mistachkin +Z 68baf9b3461559a5c1573182f5e84392 diff --git a/manifest.uuid b/manifest.uuid index e28955bcd3..7c267ab8e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3beb77d6a792d07ca605ec8e5402b8a305860cba4044fcafeed00b9fa862fa16 \ No newline at end of file +bacfa93677fbe014737fab7dbdb4e7a168a310bc5b914b17896ae2a48435c7b1 \ No newline at end of file diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 863eeba801..f9c40f6609 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -38,7 +38,7 @@ set help {Usage: tclsh mksqlite3c.tcl # set addstatic 1 -set linemacros 1 +set linemacros 0 set useapicall 0 set srcdir tsrc From 0fb78f0cca4eedc1f2e68fc7fa3395ab6d46576a Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 16 Jul 2021 01:19:19 +0000 Subject: [PATCH 064/100] Get the "omit ORDER BY in FROM-clause subqueries" optimization working for the core test cases. FossilOrigin-Name: e31c5888659ffd4c6d8b68627123df3bbb84bb010b7766b0a74877bf3ba1e52b --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/select.c | 14 +++++++++++--- src/update.c | 1 + 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 71e6789069..0764582fb3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Attempt\sto\somit\sORDER\sBY\sclauses\sfrom\sFROM-clause\ssubqueries\sif\sthose\sORDER\sBY\nclauses\sdo\snot\saffect\sthe\soutput.\s\sSee\n[forum:/forumpost/2d76f2bcf65d256a|forum\sthread\s2d76f2bcf65d256a]\sfor\ndiscussion.\s\sThis\scan\shelp\sthe\squery\sflattener\sin\nsome\scases,\sresulting\sin\sfaster\squery\splans.\s\sThe\scurrent\simplemention\sdoes\nnot\salways\swork. -D 2021-07-15T19:29:43.004 +C Get\sthe\s"omit\sORDER\sBY\sin\sFROM-clause\ssubqueries"\soptimization\sworking\sfor\sthe\ncore\stest\scases. +D 2021-07-16T01:19:19.310 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 9b54a60702c35b3efbeb5d0439a94d67c4cb93a896e1afa89f21d7a9d183a071 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c cc61c6b86617387803d67994fec6131365f6a049399aa28b11028ad0b4ee53b8 +F src/select.c 0c783511b5f35b37d971dcd653c554d21f74d7cb63a4979991a61d068480c40f F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 F src/sqlite.h.in a5d5641afa335226231231c7b6e424de327f17577d9e8aeaaaab78d9bbbcf381 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -611,7 +611,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e F src/treeview.c ce7a3da38caba094c78d888d2366f749ea33dc8cbafb04218b57768fb8669a6c F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 -F src/update.c ff10c7ca6dc9007cdebb3eee6630e87639ef9f949ccb574c34f9d34c52c32fb9 +F src/update.c 30465f9accc854e8a7932b413578027fbb68186132abbb36e01d2022473fc83d F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 @@ -1920,10 +1920,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 3beb77d6a792d07ca605ec8e5402b8a305860cba4044fcafeed00b9fa862fa16 -R be1da55dd559418ff2dfd4ecbe7a006e -T *branch * omit-subquery-order-by -T *sym-omit-subquery-order-by * -T -sym-trunk * +P ef97c3e7c3ea2cf1a4db6591328fe7ce3f1d189afc2d578159135824ec89e620 +R f27eb88a1585b6967c8257fe374701ea U drh -Z fa9c090cb9dd3863cd70130aca6f84ef +Z 493c03b78cdd1bd0aeff046f5ac8dff0 diff --git a/manifest.uuid b/manifest.uuid index efbb411e0e..58e9bee337 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ef97c3e7c3ea2cf1a4db6591328fe7ce3f1d189afc2d578159135824ec89e620 \ No newline at end of file +e31c5888659ffd4c6d8b68627123df3bbb84bb010b7766b0a74877bf3ba1e52b \ No newline at end of file diff --git a/src/select.c b/src/select.c index a6513afca5..e0ac9db97b 100644 --- a/src/select.c +++ b/src/select.c @@ -6386,7 +6386,8 @@ int sqlite3Select( /* If a FROM-clause subquery has an ORDER BY clause that is not ** really doing anything, then delete it now so that it does not - ** interfere with query flattening. + ** interfere with query flattening. See the discussion at + ** https://sqlite.org/forum/forumpost/2d76f2bcf65d256a ** ** Beware of these cases where the ORDER BY clause may not be safely ** omitted: @@ -6394,13 +6395,20 @@ int sqlite3Select( ** (1) There is also a LIMIT clause ** (2) The subquery was added to help with window-function ** processing - ** (3) The outer query uses an aggregate function other than + ** (3) The subquery is in the FROM clause of an UPDATE + ** (4) The outer query uses an aggregate function other than ** the built-in count(), min(), or max(). + ** (5) The ORDER BY isn't going to accomplish anything because + ** one of: + ** (a) The outer query has a different ORDER BY clause + ** (b) The subquery is part of a join + ** See forum post 062d576715d277c8 */ if( pSub->pOrderBy!=0 + && (p->pOrderBy!=0 || pTabList->nSrc>1) /* Condition (5) */ && pSub->pLimit==0 /* Condition (1) */ && (pSub->selFlags & SF_OrderByReqd)==0 /* Condition (2) */ - && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) */ + && (p->selFlags & SF_OrderByReqd)==0 /* Condition (3) and (4) */ && OptimizationEnabled(db, SQLITE_OmitOrderBy) ){ SELECTTRACE(0x100,pParse,p, diff --git a/src/update.c b/src/update.c index 45f332bf37..c5a01f8969 100644 --- a/src/update.c +++ b/src/update.c @@ -261,6 +261,7 @@ static void updateFromSelect( pSelect = sqlite3SelectNew(pParse, pList, pSrc, pWhere2, pGrp, 0, pOrderBy2, SF_UFSrcCheck|SF_IncludeHidden, pLimit2 ); + if( pSelect ) pSelect->selFlags |= SF_OrderByReqd; sqlite3SelectDestInit(&dest, eDest, iEph); dest.iSDParm2 = (pPk ? pPk->nKeyCol : -1); sqlite3Select(pParse, pSelect, &dest); From 111c3cc9fb1cdcbdb66bbe858732cacaf3a9482d Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 16 Jul 2021 15:30:19 +0000 Subject: [PATCH 065/100] Fix the "main.mk" makefile so that "series.c" is a dependency of "shell.c". FossilOrigin-Name: ff959917918495ef352ce48c240b1de6da162f2a5e76e37dcc53fa50bce27642 --- main.mk | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/main.mk b/main.mk index 64c25a5139..eb45de8238 100644 --- a/main.mk +++ b/main.mk @@ -749,6 +749,7 @@ SHELL_SRC = \ $(TOP)/ext/misc/fileio.c \ $(TOP)/ext/misc/ieee754.c \ $(TOP)/ext/misc/regexp.c \ + $(TOP)/ext/misc/series.c \ $(TOP)/ext/misc/shathree.c \ $(TOP)/ext/misc/sqlar.c \ $(TOP)/ext/misc/uint.c \ diff --git a/manifest b/manifest index 011650c27d..82fdd292ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C By\sdefault,\sdo\snot\semit\s#line\sdirectives\sin\sthe\samalgamation. -D 2021-07-15T23:34:14.480 +C Fix\sthe\s"main.mk"\smakefile\sso\sthat\s"series.c"\sis\sa\sdependency\sof\s"shell.c". +D 2021-07-16T15:30:19.396 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -466,7 +466,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 200bf75c882c4822ea722840fc5212f22e5e18773851352c2a0d077958de8b7f +F main.mk 4e075c9618c06c55d1cc723087b0722f384247b6b8db1ac2cb161f864c953c97 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1920,7 +1920,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 3beb77d6a792d07ca605ec8e5402b8a305860cba4044fcafeed00b9fa862fa16 -R daf164cb48477e7248acc5698977e210 -U mistachkin -Z 68baf9b3461559a5c1573182f5e84392 +P bacfa93677fbe014737fab7dbdb4e7a168a310bc5b914b17896ae2a48435c7b1 +R c8ff11932c350e983e9fb8ccf092c387 +U drh +Z fd34dc6395fc4ba0b62b54a8700203f9 diff --git a/manifest.uuid b/manifest.uuid index 7c267ab8e0..312c0f7513 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bacfa93677fbe014737fab7dbdb4e7a168a310bc5b914b17896ae2a48435c7b1 \ No newline at end of file +ff959917918495ef352ce48c240b1de6da162f2a5e76e37dcc53fa50bce27642 \ No newline at end of file From e46ec734c7d709d773e75827378747ef298cc05a Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 16 Jul 2021 17:04:17 +0000 Subject: [PATCH 066/100] Modify the generate_series() table-valued functions so that its first argument (the START value) is required. Throw an error if that argument is not supplied. In this was the series.c loadable extension can be used as a demonstration of how to code an xBestIndex function to require certain parameters. Compile with -DZERO_ARGUMENT_GENERATE_SERIES to obtain the legacy behavior. FossilOrigin-Name: 459d85a2898d6a53f43b4ad48d2f39edd1bbe37a4f97426a5d666c39c52576a4 --- ext/misc/series.c | 18 ++++++++++++++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- test/tabfunc01.test | 10 ++++++++-- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/ext/misc/series.c b/ext/misc/series.c index a4e92ace88..08e1829b8c 100644 --- a/ext/misc/series.c +++ b/ext/misc/series.c @@ -323,11 +323,12 @@ static int seriesFilter( ** (8) output in descending order */ static int seriesBestIndex( - sqlite3_vtab *tabUnused, + sqlite3_vtab *pVTab, sqlite3_index_info *pIdxInfo ){ int i, j; /* Loop over constraints */ int idxNum = 0; /* The query plan bitmask */ + int bStartSeen = 0; /* EQ constraint seen on the START column */ int unusableMask = 0; /* Mask of unusable constraints */ int nArg = 0; /* Number of arguments that seriesFilter() expects */ int aIdx[3]; /* Constraints on start, stop, and step */ @@ -337,7 +338,7 @@ static int seriesBestIndex( ** are the last three columns in the virtual table. */ assert( SERIES_COLUMN_STOP == SERIES_COLUMN_START+1 ); assert( SERIES_COLUMN_STEP == SERIES_COLUMN_START+2 ); - (void)tabUnused; + aIdx[0] = aIdx[1] = aIdx[2] = -1; pConstraint = pIdxInfo->aConstraint; for(i=0; inConstraint; i++, pConstraint++){ @@ -347,6 +348,7 @@ static int seriesBestIndex( iCol = pConstraint->iColumn - SERIES_COLUMN_START; assert( iCol>=0 && iCol<=2 ); iMask = 1 << iCol; + if( iCol==0 ) bStartSeen = 1; if( pConstraint->usable==0 ){ unusableMask |= iMask; continue; @@ -361,6 +363,18 @@ static int seriesBestIndex( pIdxInfo->aConstraintUsage[j].omit = !SQLITE_SERIES_CONSTRAINT_VERIFY; } } + /* The current generate_column() implementation requires at least one + ** argument (the START value). Legacy versions assumed START=0 if the + ** first argument was omitted. Compile with -DZERO_ARGUMENT_GENERATE_SERIES + ** to obtain the legacy behavior */ +#ifndef ZERO_ARGUMENT_GENERATE_SERIES + if( !bStartSeen ){ + sqlite3_free(pVTab->zErrMsg); + pVTab->zErrMsg = sqlite3_mprintf( + "first argument to \"generate_series()\" missing or unusable"); + return SQLITE_ERROR; + } +#endif if( (unusableMask & ~idxNum)!=0 ){ /* The start, stop, and step columns are inputs. Therefore if there ** are unusable constraints on any of start, stop, or step then diff --git a/manifest b/manifest index 82fdd292ec..d7a7bff296 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\s"main.mk"\smakefile\sso\sthat\s"series.c"\sis\sa\sdependency\sof\s"shell.c". -D 2021-07-16T15:30:19.396 +C Modify\sthe\sgenerate_series()\stable-valued\sfunctions\sso\sthat\sits\sfirst\nargument\s(the\sSTART\svalue)\sis\srequired.\s\sThrow\san\serror\sif\sthat\sargument\nis\snot\ssupplied.\s\sIn\sthis\swas\sthe\sseries.c\sloadable\sextension\scan\sbe\sused\nas\sa\sdemonstration\sof\show\sto\scode\san\sxBestIndex\sfunction\sto\srequire\scertain\nparameters.\s\sCompile\swith\s-DZERO_ARGUMENT_GENERATE_SERIES\sto\sobtain\sthe\nlegacy\sbehavior. +D 2021-07-16T17:04:17.942 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -319,7 +319,7 @@ F ext/misc/regexp.c 5853b0e5ed40c47f7ded2b0bf2ff73796f7cb21543089c5f07308e003264 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 -F ext/misc/series.c c6bd5d249e5199a1b55aeee4d0e6576ff3a68702fc475dbd64503a32903516c7 +F ext/misc/series.c 233804fd4e07de94ecae42b487fb38bbd819b249114bb34bb46f227c8c7111df F ext/misc/sha1.c c8f2253c8792ffab9517695ea7d88c079f0395a5505eefef5c8198fe184ed5ac F ext/misc/shathree.c e984f31731de4cf302a0386be5fe664580f63d8204c47b9b41cc4b997745f9ec F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 @@ -1442,7 +1442,7 @@ F test/sync.test 89539f4973c010eda5638407e71ca7fddbcd8e0594f4c9980229f804d433309 F test/sync2.test 8f9f7d4f6d5be8ca8941a8dadcc4299e558cb6a1ff653a9469146c7a76ef2039 F test/syscall.test a39d9a36f852ae6e4800f861bc2f2e83f68bbc2112d9399931ecfadeabd2d69d F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test acb5be558868c65d8cf3495539fff23093d77139eb1e4e8c4580568099f98645 +F test/tabfunc01.test d6821e7042e5653104dac0c63d75eff24a2415ab1889fc68b5db7fde59464c59 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 @@ -1920,7 +1920,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 bacfa93677fbe014737fab7dbdb4e7a168a310bc5b914b17896ae2a48435c7b1 -R c8ff11932c350e983e9fb8ccf092c387 +P ff959917918495ef352ce48c240b1de6da162f2a5e76e37dcc53fa50bce27642 +R aa3d348b2c34c0c9b3d3fd2a8d2ce220 U drh -Z fd34dc6395fc4ba0b62b54a8700203f9 +Z 4342f932cf72c33e96387442e529227b diff --git a/manifest.uuid b/manifest.uuid index 312c0f7513..e8c7b1ff07 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ff959917918495ef352ce48c240b1de6da162f2a5e76e37dcc53fa50bce27642 \ No newline at end of file +459d85a2898d6a53f43b4ad48d2f39edd1bbe37a4f97426a5d666c39c52576a4 \ No newline at end of file diff --git a/test/tabfunc01.test b/test/tabfunc01.test index 797267b338..d3d93792da 100644 --- a/test/tabfunc01.test +++ b/test/tabfunc01.test @@ -32,8 +32,14 @@ do_execsql_test tabfunc01-1.1b { PRAGMA table_xinfo(generate_series); } {0 value {} 0 {} 0 0 1 start {} 0 {} 0 1 2 stop {} 0 {} 0 1 3 step {} 0 {} 0 1} do_execsql_test tabfunc01-1.2 { - SELECT *, '|' FROM generate_series LIMIT 5; + SELECT *, '|' FROM generate_series(0) LIMIT 5; } {0 | 1 | 2 | 3 | 4 |} +do_catchsql_test tabfunc01-1.2b { + SELECT *, '|' FROM generate_series LIMIT 5; +} {1 {first argument to "generate_series()" missing or unusable}} +do_catchsql_test tabfunc01-1.2c { + SELECT *, '|' FROM generate_series(value) LIMIT 5; +} {1 {first argument to "generate_series()" missing or unusable}} do_catchsql_test tabfunc01-1.3 { CREATE VIRTUAL TABLE t1 USING generate_series; } {1 {no such module: generate_series}} @@ -104,7 +110,7 @@ do_execsql_test tabfunc01-2.2 { } {2 1 | 2 2 | 3 1 | 3 2 | 3 3 |} do_execsql_test tabfunc01-2.50 { - SELECT * FROM generate_series() LIMIT 5; + SELECT * FROM generate_series(0) LIMIT 5; } {0 1 2 3 4} do_execsql_test tabfunc01-3.1 { From d51a2d8b8f227c71c81c1116a2ea8d61c5f8d4bb Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 16 Jul 2021 17:11:21 +0000 Subject: [PATCH 067/100] De-typo sqlite3_expanded_sql() doc FossilOrigin-Name: 56b0f5418dad34d1e83d53741916e2a38a5448369031d959b8a44867774be657 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d7a7bff296..867598a0d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\sthe\sgenerate_series()\stable-valued\sfunctions\sso\sthat\sits\sfirst\nargument\s(the\sSTART\svalue)\sis\srequired.\s\sThrow\san\serror\sif\sthat\sargument\nis\snot\ssupplied.\s\sIn\sthis\swas\sthe\sseries.c\sloadable\sextension\scan\sbe\sused\nas\sa\sdemonstration\sof\show\sto\scode\san\sxBestIndex\sfunction\sto\srequire\scertain\nparameters.\s\sCompile\swith\s-DZERO_ARGUMENT_GENERATE_SERIES\sto\sobtain\sthe\nlegacy\sbehavior. -D 2021-07-16T17:04:17.942 +C De-typo\ssqlite3_expanded_sql()\sdoc +D 2021-07-16T17:11:21.925 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -546,7 +546,7 @@ F src/resolve.c b379c5ffe3b692e9c64fa37817cc0efa204b7c9468a818309dde85fd132d9d81 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 1c1230aaa4e5979edd3c5a9f7a90ab856a302cca4962e8a7d08f42dd2e7e1a49 F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 -F src/sqlite.h.in a5d5641afa335226231231c7b6e424de327f17577d9e8aeaaaab78d9bbbcf381 +F src/sqlite.h.in f716b8a9fb30c6928752fd75b3f824e8ac4d225d31494029dee8454aeb9aa01a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h 129619232aa632fa85db7792bfe4b378ed28d3361bf9cbcdb4522353fd04b89b @@ -1920,7 +1920,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 ff959917918495ef352ce48c240b1de6da162f2a5e76e37dcc53fa50bce27642 -R aa3d348b2c34c0c9b3d3fd2a8d2ce220 -U drh -Z 4342f932cf72c33e96387442e529227b +P 459d85a2898d6a53f43b4ad48d2f39edd1bbe37a4f97426a5d666c39c52576a4 +R 586dff70e9760c1426027997891782a1 +U larrybr +Z 508402e0d81680ab955ec6d0adae92e8 diff --git a/manifest.uuid b/manifest.uuid index e8c7b1ff07..524955bd4f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -459d85a2898d6a53f43b4ad48d2f39edd1bbe37a4f97426a5d666c39c52576a4 \ No newline at end of file +56b0f5418dad34d1e83d53741916e2a38a5448369031d959b8a44867774be657 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 73c1adeae1..3ac46fb55a 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4197,7 +4197,7 @@ int sqlite3_prepare16_v3( ** are managed by SQLite and are automatically freed when the prepared ** statement is finalized. ** ^The string returned by sqlite3_expanded_sql(P), on the other hand, -** is obtained from [sqlite3_malloc()] and must be free by the application +** is obtained from [sqlite3_malloc()] and must be freed by the application ** by passing it to [sqlite3_free()]. ** ** ^The sqlite3_normalized_sql() interface is only available if From ee612e2a5df430b35f7937704a0f109bea71dc40 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 16 Jul 2021 20:16:19 +0000 Subject: [PATCH 068/100] Minor comment improvements. FossilOrigin-Name: 6854b5919beefa43da21ba739e82d583183c8cdfe5dd63e27a810ac1ffe2330b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/resolve.c | 2 +- src/sqliteInt.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 0764582fb3..4a30fc798b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Get\sthe\s"omit\sORDER\sBY\sin\sFROM-clause\ssubqueries"\soptimization\sworking\sfor\sthe\ncore\stest\scases. -D 2021-07-16T01:19:19.310 +C Minor\scomment\simprovements. +D 2021-07-16T20:16:19.970 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,14 +542,14 @@ F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 9b54a60702c35b3efbeb5d0439a94d67c4cb93a896e1afa89f21d7a9d183a071 +F src/resolve.c ea205123fba6bb254666f50b6c220270913eae54eb03d263abaa432c703f5857 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 0c783511b5f35b37d971dcd653c554d21f74d7cb63a4979991a61d068480c40f F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 F src/sqlite.h.in a5d5641afa335226231231c7b6e424de327f17577d9e8aeaaaab78d9bbbcf381 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 74ca9667448fa7aaadcb91bd3fd22732c7f7e05903a53429e653a4a01e4c8efd +F src/sqliteInt.h a71d18dc76a2768ec2b7671b5b5996a8725677bf77a987b451323b4451099061 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1920,7 +1920,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 ef97c3e7c3ea2cf1a4db6591328fe7ce3f1d189afc2d578159135824ec89e620 -R f27eb88a1585b6967c8257fe374701ea +P e31c5888659ffd4c6d8b68627123df3bbb84bb010b7766b0a74877bf3ba1e52b +R 2b5d3bf35c291d863ff2cdabf1b23aa4 U drh -Z 493c03b78cdd1bd0aeff046f5ac8dff0 +Z 8fd4496f447f68e71867e0b05442b99f diff --git a/manifest.uuid b/manifest.uuid index 58e9bee337..3a27d75dee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e31c5888659ffd4c6d8b68627123df3bbb84bb010b7766b0a74877bf3ba1e52b \ No newline at end of file +6854b5919beefa43da21ba739e82d583183c8cdfe5dd63e27a810ac1ffe2330b \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 955148a2f5..ae5a574056 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1635,7 +1635,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ p->pOrderBy = 0; } - /* Recursively resolve names in all subqueries + /* Recursively resolve names in all subqueries in the FROM clause */ for(i=0; ipSrc->nSrc; i++){ SrcItem *pItem = &p->pSrc->a[i]; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 7d0b7ecb37..6f02a5184c 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3232,7 +3232,7 @@ struct Select { #define SF_PushDown 0x1000000 /* SELECT has be modified by push-down opt */ #define SF_MultiPart 0x2000000 /* Has multiple incompatible PARTITIONs */ #define SF_CopyCte 0x4000000 /* SELECT statement is a copy of a CTE */ -#define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be purged */ +#define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be omitted */ /* ** The results of a SELECT can be distributed in several ways, as defined From 05de5048b4e531eeb455dd8c3fa287e591eee6a0 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 19 Jul 2021 03:38:13 +0000 Subject: [PATCH 069/100] Fix minor spacing issues in the MSVC makefile. FossilOrigin-Name: d78c272b3966cc1b12bc7e83fbe909a3c517d553a942d7f1c07bddf69f2e2164 --- Makefile.msc | 8 ++++---- manifest | 15 +++++++-------- manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 7fd43055ec..b1b4e22cd6 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2209,11 +2209,11 @@ SHELL_SRC = \ $(TOP)\src\shell.c.in \ $(TOP)\ext\misc\appendvfs.c \ $(TOP)\ext\misc\completion.c \ - $(TOP)\ext\misc\decimal.c \ + $(TOP)\ext\misc\decimal.c \ $(TOP)\ext\misc\fileio.c \ - $(TOP)\ext\misc\ieee754.c \ - $(TOP)\ext\misc\regexp.c \ - $(TOP)\ext\misc\series.c \ + $(TOP)\ext\misc\ieee754.c \ + $(TOP)\ext\misc\regexp.c \ + $(TOP)\ext\misc\series.c \ $(TOP)\ext\misc\shathree.c \ $(TOP)\ext\misc\uint.c \ $(TOP)\ext\expert\sqlite3expert.c \ diff --git a/manifest b/manifest index 304acc49f7..9f23e74798 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Try\sto\somit\sthe\sORDER\sBY\sclause\sin\ssubqueries\sif\sdoing\sso\sdoes\snot\schange\nthe\sresult\sin\sany\sway.\sSee\n[forum:/forumpost/2d76f2bcf65d256a|Forum\spost\s2d76f2bcf65d256a]\sfor\ndetails\sand\shistory. -D 2021-07-16T22:43:00.597 +C Fix\sminor\sspacing\sissues\sin\sthe\sMSVC\smakefile. +D 2021-07-19T03:38:13.243 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 83c348515cb62f6f2a2ddf3fd014113ff20564b776e1a614079722c88c6ff43d F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc d481375cd138e705f749dad2549b2f80d5d76e23132c5fc9be337f7416cb9fc8 +F Makefile.msc f889e0dcf8668cccac0c68be2ea09fc585dd40ac44ca37e9fb15638ee9315a92 F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1920,8 +1920,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 56b0f5418dad34d1e83d53741916e2a38a5448369031d959b8a44867774be657 6854b5919beefa43da21ba739e82d583183c8cdfe5dd63e27a810ac1ffe2330b -R 6e75e47df06fbba5ca701a4a4bf4039e -T +closed 6854b5919beefa43da21ba739e82d583183c8cdfe5dd63e27a810ac1ffe2330b -U drh -Z f23b8c5ab82b5bff69635213de4f5afb +P 85ddaf1b59a19cbd9efe7724a163b30c14bafabfaf2cfced07b463e76f73e494 +R 4eef8627720563ebb21acd0bdf777bd1 +U mistachkin +Z 3b091060036ec0c06d6ff58dfb637bd5 diff --git a/manifest.uuid b/manifest.uuid index b1da6c4a23..06510e881a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -85ddaf1b59a19cbd9efe7724a163b30c14bafabfaf2cfced07b463e76f73e494 \ No newline at end of file +d78c272b3966cc1b12bc7e83fbe909a3c517d553a942d7f1c07bddf69f2e2164 \ No newline at end of file From 73983658c98ab2a474d26c8c0284e99af5f79428 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Jul 2021 14:00:29 +0000 Subject: [PATCH 070/100] In defensive mode, allow statements that write to shadow tables to be prepared from with virtual-table xSync() calls. FossilOrigin-Name: c8601d83fbecf84ca7991d339449b380deb5a7620dc84756a91c2880f030b423 --- ext/fts5/test/fts5misc.test | 29 +++++++++++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 1 + 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index 9abc92b23f..e354d20e2c 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -323,5 +323,34 @@ do_execsql_test 12.3 { SELECT * FROM t2 JOIN ft USING (ft) } {3 4 b b} +#------------------------------------------------------------------------- +# Forum post https://sqlite.org/forum/forumpost/21127c1160 +# +reset_db +sqlite3_db_config db DEFENSIVE 1 + +do_execsql_test 13.0 { + CREATE TABLE a (id INTEGER PRIMARY KEY, name TEXT); + CREATE VIRTUAL TABLE b USING fts5(name); + CREATE TRIGGER a_trigger AFTER INSERT ON a BEGIN + INSERT INTO b (name) VALUES ('foo'); + END; +} + +do_test 13.1 { + set ::STMT [ + sqlite3_prepare db "INSERT INTO a VALUES (1, 'foo') RETURNING id;" -1 dummy + ] + sqlite3_step $::STMT +} {SQLITE_ROW} + +do_test 13.2 { + sqlite3_finalize $::STMT +} {SQLITE_OK} + +do_test 13.3 { + sqlite3_errmsg db +} {not an error} + finish_test diff --git a/manifest b/manifest index 9f23e74798..c4eeee5ecd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sminor\sspacing\sissues\sin\sthe\sMSVC\smakefile. -D 2021-07-19T03:38:13.243 +C In\sdefensive\smode,\sallow\sstatements\sthat\swrite\sto\sshadow\stables\sto\sbe\sprepared\sfrom\swith\svirtual-table\sxSync()\scalls. +D 2021-07-19T14:00:29.519 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -193,7 +193,7 @@ F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc27826807405 F ext/fts5/test/fts5matchinfo.test 10c9a6f7fe61fb132299c4183c012770b10c4d5c2f2edb6df0b6607f683d737a F ext/fts5/test/fts5merge.test e92a8db28b45931e7a9c7b1bbd36101692759d00274df74d83fd29d25d53b3a6 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 088ac5f0f5de1ad45b0f83197ab5263bcae8130156cdc901bff2375ff2b8af86 +F ext/fts5/test/fts5misc.test 4d7d20372242cc618688de029b87d897d09fa1640302c254abee63cf3ffa2c10 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 98e23c9197fd4c979f7d59360bd3b0050b37e683e078715f6f2fbfef77971f0d +F src/build.c a27511863001ba088afd5e19efc9c37ea660983bd6ddf012def10f6cc4456a01 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -1920,7 +1920,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 85ddaf1b59a19cbd9efe7724a163b30c14bafabfaf2cfced07b463e76f73e494 -R 4eef8627720563ebb21acd0bdf777bd1 -U mistachkin -Z 3b091060036ec0c06d6ff58dfb637bd5 +P d78c272b3966cc1b12bc7e83fbe909a3c517d553a942d7f1c07bddf69f2e2164 +R db28e0ca4ea83a622e82068e2a2a636b +U dan +Z 8b08dd57f21b0e772cbc6de26df5a8fe diff --git a/manifest.uuid b/manifest.uuid index 06510e881a..7e93b98bd8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d78c272b3966cc1b12bc7e83fbe909a3c517d553a942d7f1c07bddf69f2e2164 \ No newline at end of file +c8601d83fbecf84ca7991d339449b380deb5a7620dc84756a91c2880f030b423 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 00fa447957..4eca21a3f7 100644 --- a/src/build.c +++ b/src/build.c @@ -3181,6 +3181,7 @@ int sqlite3ReadOnlyShadowTables(sqlite3 *db){ if( (db->flags & SQLITE_Defensive)!=0 && db->pVtabCtx==0 && db->nVdbeExec==0 + && !sqlite3VtabInSync(db) ){ return 1; } From bb2d2a50f9bbeacb83ca7d8d1e2fe08d4f5e9580 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 19 Jul 2021 16:49:13 +0000 Subject: [PATCH 071/100] Updates so that "threadtest3[.exe]" can be built for windows with MSVC. FossilOrigin-Name: 4ce585fb07274284e3add6adcb66ed06e4b109584704d1ec7152bf43ca8d5d85 --- Makefile.msc | 11 +++++ manifest | 16 ++++---- manifest.uuid | 2 +- test/threadtest3.c | 95 ++++++++++++++++++++++++++++++++++--------- test/tt3_checkpoint.c | 4 +- 5 files changed, 98 insertions(+), 30 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index b1b4e22cd6..57ddbe7854 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2586,6 +2586,17 @@ rbu.exe: $(TOP)\ext\rbu\rbu.c $(TOP)\ext\rbu\sqlite3rbu.c $(SQLITE3C) $(SQLITE3H $(LTLINK) $(NO_WARN) -DSQLITE_ENABLE_RBU \ $(TOP)\ext\rbu\rbu.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + +THREADTEST3_SRC = $(TOP)\test\threadtest3.c \ + $(TOP)\test\tt3_checkpoint.c \ + $(TOP)\test\tt3_index.c \ + $(TOP)\test\tt3_vacuum.c \ + $(TOP)\test\tt3_stress.c \ + $(TOP)\test\tt3_lookaside1.c + +threadtest3.exe: sqlite3.obj $(THREADTEST3_SRC) $(TOP)/src/test_multiplex.c + $(LTLINK) $(TOP)\test\threadtest3.c $(TOP)\src\test_multiplex.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + LSMDIR=$(TOP)\ext\lsm1 !INCLUDE $(LSMDIR)\Makefile.msc diff --git a/manifest b/manifest index c4eeee5ecd..c28c4a8667 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C In\sdefensive\smode,\sallow\sstatements\sthat\swrite\sto\sshadow\stables\sto\sbe\sprepared\sfrom\swith\svirtual-table\sxSync()\scalls. -D 2021-07-19T14:00:29.519 +C Updates\sso\sthat\s"threadtest3[.exe]"\scan\sbe\sbuilt\sfor\swindows\swith\sMSVC. +D 2021-07-19T16:49:13.643 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 83c348515cb62f6f2a2ddf3fd014113ff20564b776e1a614079722c88c6ff43d F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc f889e0dcf8668cccac0c68be2ea09fc585dd40ac44ca37e9fb15638ee9315a92 +F Makefile.msc be23161cf225f0574c34b866ade20824bef4e5473e924e0941fe954ccb253286 F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1465,7 +1465,7 @@ F test/thread2.test f35d2106452b77523b3a2b7d1dcde2e5ee8f9e46 F test/thread_common.tcl 334639cadcb9f912bf82aa73f49efd5282e6cadd F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b F test/threadtest2.c a70a8e94bef23339d34226eb9521015ef99f4df8 -F test/threadtest3.c e63013af10cf236c7610eb06d33bde08c861806dc64be811940ff4d9ddd34a4f +F test/threadtest3.c fee869dba633f8403a7eef03bb038a3fc45f0814b9f829ea79a914fcc11f0218 F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 F test/threadtest5.c 9b4d782c58d8915d7e955ff8051f3d03628bda0d33b82971ea8c0f2f2808c421 F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90 @@ -1639,7 +1639,7 @@ F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123 F test/triggerG.test 2b816093c91ba73c733cfa8aedcc210ad819d72a98b1da30768a3c56505233e9 F test/triggerupfrom.test d1f9e56090408115c522bee626cc33a2f3370f627a5e341d832589d72e3aa271 F test/trustschema1.test 4e970aef0bfe0cee139703cc7209d0e0f07725d999b180ba50770f49edef1494 -F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 +F test/tt3_checkpoint.c ac7ca661d739280c89d9c253897df64a59a49369bd1247207ac0f655b622579d F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 F test/tt3_shared.c b37d22defc944a2ac4c91c927fd06c1d48cd51e2ce9d004fe868625bd2399f93 @@ -1920,7 +1920,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 d78c272b3966cc1b12bc7e83fbe909a3c517d553a942d7f1c07bddf69f2e2164 -R db28e0ca4ea83a622e82068e2a2a636b +P c8601d83fbecf84ca7991d339449b380deb5a7620dc84756a91c2880f030b423 +R e7c3798c4e8afbc59f637b8a384b4003 U dan -Z 8b08dd57f21b0e772cbc6de26df5a8fe +Z 4507211c89102df26f9a64f266826b29 diff --git a/manifest.uuid b/manifest.uuid index 7e93b98bd8..7723021063 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c8601d83fbecf84ca7991d339449b380deb5a7620dc84756a91c2880f030b423 \ No newline at end of file +4ce585fb07274284e3add6adcb66ed06e4b109584704d1ec7152bf43ca8d5d85 \ No newline at end of file diff --git a/test/threadtest3.c b/test/threadtest3.c index 41c0fb9ac6..f427324a23 100644 --- a/test/threadtest3.c +++ b/test/threadtest3.c @@ -78,15 +78,31 @@ #include -#include -#include -#include -#include -#include -#include -#include -#include -#include + +#ifdef _WIN32 +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +# include +# include +# include +# include +# include + +# define O_BINARY 0 +#endif #include "test_multiplex.h" @@ -436,8 +452,13 @@ struct Thread { int iTid; /* Thread number within test */ void* pArg; /* Pointer argument passed by caller */ +#ifdef _WIN32 + uintptr_t winTid; /* Thread handle */ +#else pthread_t tid; /* Thread id */ +#endif char *(*xProc)(int, void*); /* Thread main proc */ + char *zRes; /* Value returned by xProc */ Thread *pNext; /* Next in this list of threads */ }; @@ -471,9 +492,13 @@ static void print_and_free_err(Error *p){ static void system_error(Error *pErr, int iSys){ pErr->rc = iSys; +#if _WIN32 + pErr->zErr = sqlite3_mprintf("%s", strerror(iSys)); +#else pErr->zErr = (char *)sqlite3_malloc(512); strerror_r(iSys, pErr->zErr, 512); pErr->zErr[511] = '\0'; +#endif } static void sqlite_error( @@ -512,7 +537,7 @@ static void clear_error_x( } static int busyhandler(void *pArg, int n){ - usleep(10*1000); + sqlite3_sleep(10); return 1; } @@ -749,10 +774,20 @@ static void integrity_check_x( } } +#ifdef _WIN32 +static unsigned __stdcall launch_thread_main(void *pArg){ + Thread *p = (Thread *)pArg; + p->zRes = p->xProc(p->iTid, p->pArg); + _endthreadex(0); + return 0; /* NOT REACHED */ +} +#else static void *launch_thread_main(void *pArg){ Thread *p = (Thread *)pArg; - return (void *)p->xProc(p->iTid, p->pArg); + p->zRes = p->xProc(p->iTid, p->pArg); + return 0; } +#endif static void launch_thread_x( Error *pErr, /* IN/OUT: Error code */ @@ -771,7 +806,13 @@ static void launch_thread_x( p->pArg = pArg; p->xProc = xProc; +#ifdef _WIN32 + rc = SQLITE_OK; + p->winTid = _beginthreadex(0, 0, launch_thread_main, (void*)p, 0, 0); + if( p->winTid==0 ) rc = errno ? errno : rc; +#else rc = pthread_create(&p->tid, NULL, launch_thread_main, (void *)p); +#endif if( rc!=0 ){ system_error(pErr, rc); sqlite3_free(p); @@ -790,28 +831,44 @@ static void join_all_threads_x( Thread *pNext; for(p=pThreads->pThread; p; p=pNext){ void *ret; - pNext = p->pNext; int rc; + pNext = p->pNext; + +#ifdef _WIN32 + do { + rc = WaitForSingleObjectEx((HANDLE)p->winTid, INFINITE, TRUE); + }while( rc==WAIT_IO_COMPLETION ); + CloseHandle((HANDLE)p->winTid); +#else rc = pthread_join(p->tid, &ret); +#endif + if( rc!=0 ){ if( pErr->rc==SQLITE_OK ) system_error(pErr, rc); }else{ - printf("Thread %d says: %s\n", p->iTid, (ret==0 ? "..." : (char *)ret)); + printf("Thread %d says: %s\n", p->iTid, (p->zRes==0 ? "..." : p->zRes)); fflush(stdout); } + sqlite3_free(p->zRes); sqlite3_free(p); } pThreads->pThread = 0; } +#ifdef _WIN32 +# define THREADTEST3_STAT _stat +#else +# define THREADTEST3_STAT stat +#endif + static i64 filesize_x( Error *pErr, const char *zFile ){ i64 iRet = 0; if( pErr->rc==SQLITE_OK ){ - struct stat sStat; - if( stat(zFile, &sStat) ){ + struct THREADTEST3_STAT sStat; + if( THREADTEST3_STAT(zFile, &sStat) ){ iRet = -1; }else{ iRet = sStat.st_size; @@ -836,12 +893,12 @@ static void filecopy_x( int fd2; unlink(zTo); - fd1 = open(zFrom, O_RDONLY); + fd1 = open(zFrom, O_RDONLY|O_BINARY); if( fd1<0 ){ system_error(pErr, errno); return; } - fd2 = open(zTo, O_RDWR|O_CREAT|O_EXCL, 0644); + fd2 = open(zTo, O_RDWR|O_CREAT|O_EXCL|O_BINARY, 0644); if( fd2<0 ){ system_error(pErr, errno); close(fd1); @@ -967,7 +1024,7 @@ static char *walthread1_ckpt_thread(int iTid, void *pArg){ opendb(&err, &db, "test.db", 0); while( !timetostop(&err) ){ - usleep(500*1000); + sqlite3_sleep(500); execsql(&err, &db, "PRAGMA wal_checkpoint"); if( err.rc==SQLITE_OK ) nCkpt++; clear_error(&err, SQLITE_BUSY); @@ -1415,7 +1472,7 @@ static void dynamic_triggers(int nMs){ launch_thread(&err, &threads, dynamic_triggers_2, 0); launch_thread(&err, &threads, dynamic_triggers_2, 0); - sleep(2); + sqlite3_sleep(2*1000); sqlite3_enable_shared_cache(0); launch_thread(&err, &threads, dynamic_triggers_2, 0); diff --git a/test/tt3_checkpoint.c b/test/tt3_checkpoint.c index 060a698211..ec9d0727e6 100644 --- a/test/tt3_checkpoint.c +++ b/test/tt3_checkpoint.c @@ -75,7 +75,7 @@ static char *checkpoint_starvation_reader(int iTid, void *pArg){ i64 iCount1, iCount2; sql_script(&err, &db, "BEGIN"); iCount1 = execsql_i64(&err, &db, "SELECT count(x) FROM t1"); - usleep(CHECKPOINT_STARVATION_READMS*1000); + sqlite3_sleep(CHECKPOINT_STARVATION_READMS); iCount2 = execsql_i64(&err, &db, "SELECT count(x) FROM t1"); sql_script(&err, &db, "COMMIT"); @@ -107,7 +107,7 @@ static void checkpoint_starvation_main(int nMs, CheckpointStarvationCtx *p){ for(i=0; i<4; i++){ launch_thread(&err, &threads, checkpoint_starvation_reader, 0); - usleep(CHECKPOINT_STARVATION_READMS*1000/4); + sqlite3_sleep(CHECKPOINT_STARVATION_READMS/4); } sqlite3_wal_hook(db.db, checkpoint_starvation_walhook, (void *)p); From de3246176bcce89de803ae298afd455648a6a57f Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 19 Jul 2021 20:52:31 +0000 Subject: [PATCH 072/100] More precision in comparing integers and floating point values while processing the integer primary key for OP_SeekGE and similar. [forum:/forumpost/2bdb86a068|Forum post 2bdb86a068]. FossilOrigin-Name: f9c6426de3b413ff8fcf04a00931ca5f123f996c572b35181af114afa8d811d7 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/vdbe.c | 8 +++++--- src/vdbeInt.h | 1 + src/vdbeaux.c | 2 +- test/where.test | 15 +++++++++++++++ 6 files changed, 33 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index c28c4a8667..7bb2b8c7ad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Updates\sso\sthat\s"threadtest3[.exe]"\scan\sbe\sbuilt\sfor\swindows\swith\sMSVC. -D 2021-07-19T16:49:13.643 +C More\sprecision\sin\scomparing\sintegers\sand\sfloating\spoint\svalues\swhile\nprocessing\sthe\sinteger\sprimary\skey\sfor\sOP_SeekGE\sand\ssimilar.\n[forum:/forumpost/2bdb86a068|Forum\spost\s2bdb86a068]. +D 2021-07-19T20:52:31.773 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -616,11 +616,11 @@ F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 -F src/vdbe.c 27149413d6b09684b83746eb8f26210baf50eb23925b64261b6d93119a218435 +F src/vdbe.c b73a5ec9940185eb001ff8cff2cfd429bb438c7e89f2885e0bfdb56c3ff13386 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe -F src/vdbeInt.h 1fc1e3581afcd3f56bdbe930639edac84ee823c034f31da97f49c35522f4c8c2 +F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 -F src/vdbeaux.c 23f9800742b11eb6d1d775fd332a88252e44e9f7ba94b826e211a5d9dbfe0ced +F src/vdbeaux.c 564622045316eb2eed1370714426e81ab96d86e7894a368e80a83e0baff23346 F src/vdbeblob.c c6b8db50b227f66fb404215732068df76485b5b433e5f9d4d9ac27410b218193 F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 @@ -1746,7 +1746,7 @@ F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2a F test/walvfs.test bccb3e0d235ef85e276f491d34db32c9ada1ea67be8d9f10aabe7b30319ec656 F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec F test/wapptest.tcl 899594e25684861d5b0c0880fb012364def50ef8097041b8ddf74be5ba7fa270 x -F test/where.test 4f7a3939e5190845ef42142031a1819070f65e065e6a840a09adc54dccfef01f +F test/where.test 0be35396a509439d1c38919381feaed3d1e820e08254d246f96e499c5cbf8565 F test/where2.test 03c21a11e7b90e2845fc3c8b4002fc44cc2797fa74c86ee47d70bd7ea4f29ed6 F test/where3.test 5b4ffc0ac2ea0fe92f02b1244b7531522fe4d7bccf6fa8741d54e82c10e67753 F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 @@ -1920,7 +1920,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 c8601d83fbecf84ca7991d339449b380deb5a7620dc84756a91c2880f030b423 -R e7c3798c4e8afbc59f637b8a384b4003 -U dan -Z 4507211c89102df26f9a64f266826b29 +P 4ce585fb07274284e3add6adcb66ed06e4b109584704d1ec7152bf43ca8d5d85 +R 000488406edbffc8806e75458a922494 +U drh +Z 26015d8f2da64898ae34fc3a47735d30 diff --git a/manifest.uuid b/manifest.uuid index 7723021063..bfd7a78e8b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4ce585fb07274284e3add6adcb66ed06e4b109584704d1ec7152bf43ca8d5d85 \ No newline at end of file +f9c6426de3b413ff8fcf04a00931ca5f123f996c572b35181af114afa8d811d7 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 5b42976a0e..cfcd62266a 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4275,6 +4275,7 @@ case OP_SeekGT: { /* jump, in3, group */ /* If the P3 value could not be converted into an integer without ** loss of information, then special processing is required... */ if( (newType & (MEM_Int|MEM_IntReal))==0 ){ + int c; if( (newType & MEM_Real)==0 ){ if( (newType & MEM_Null) || oc>=OP_SeekGE ){ VdbeBranchTaken(1,2); @@ -4284,7 +4285,8 @@ case OP_SeekGT: { /* jump, in3, group */ if( rc!=SQLITE_OK ) goto abort_due_to_error; goto seek_not_found; } - }else + } + c = sqlite3IntFloatCompare(iKey, pIn3->u.r); /* If the approximation iKey is larger than the actual real search ** term, substitute >= for > and < for <=. e.g. if the search term @@ -4293,7 +4295,7 @@ case OP_SeekGT: { /* jump, in3, group */ ** (x > 4.9) -> (x >= 5) ** (x <= 4.9) -> (x < 5) */ - if( pIn3->u.r<(double)iKey ){ + if( c>0 ){ assert( OP_SeekGE==(OP_SeekGT-1) ); assert( OP_SeekLT==(OP_SeekLE-1) ); assert( (OP_SeekLE & 0x0001)==(OP_SeekGT & 0x0001) ); @@ -4302,7 +4304,7 @@ case OP_SeekGT: { /* jump, in3, group */ /* If the approximation iKey is smaller than the actual real search ** term, substitute <= for < and > for >=. */ - else if( pIn3->u.r>(double)iKey ){ + else if( c<0 ){ assert( OP_SeekLE==(OP_SeekLT+1) ); assert( OP_SeekGT==(OP_SeekGE+1) ); assert( (OP_SeekLT & 0x0001)==(OP_SeekGE & 0x0001) ); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 4a41c43a52..763c4ed094 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -533,6 +533,7 @@ int sqlite3VdbeMemIsRowSet(const Mem*); int sqlite3VdbeMemSetRowSet(Mem*); int sqlite3VdbeMemMakeWriteable(Mem*); int sqlite3VdbeMemStringify(Mem*, u8, u8); +int sqlite3IntFloatCompare(i64,double); i64 sqlite3VdbeIntValue(Mem*); int sqlite3VdbeMemIntegerify(Mem*); double sqlite3VdbeRealValue(Mem*); diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 7f08b5d25b..5c9ab11c7d 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -4285,7 +4285,7 @@ SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem *pB2){ ** number. Return negative, zero, or positive if the first (i64) is less than, ** equal to, or greater than the second (double). */ -static int sqlite3IntFloatCompare(i64 i, double r){ +int sqlite3IntFloatCompare(i64 i, double r){ if( sizeof(LONGDOUBLE_TYPE)>8 ){ LONGDOUBLE_TYPE x = (LONGDOUBLE_TYPE)i; testcase( x=0 AND '-1'<=t1.c0 FROM t1; } {1} +# 2021-07-19 https://sqlite.org/forum/forumpost/2bdb86a068 +# Lose of precision when doing comparisons between integer and +# floating point values that are near 9223372036854775807 in the +# OP_SeekGE opcode (and similar). +# +reset_db +do_execsql_test where-27.1 { + CREATE TABLE t1(a INTEGER PRIMARY KEY); + INSERT INTO t1(a) VALUES(9223372036854775807); + SELECT 1 FROM t1 WHERE a>=(9223372036854775807+1); +} {} +do_execsql_test where-27.2 { + SELECT a>=9223372036854775807+1 FROM t1; +} {0} + finish_test From f5b70d06eac76742b052864d25d59caa3d64ce7d Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 20 Jul 2021 00:18:22 +0000 Subject: [PATCH 073/100] Fix compilation of 'threadtest3' for some older versions of MSVC. FossilOrigin-Name: b5ede6a68891820bd5b6d051b1b641bc1cd49104cad2466db184134d14f58f5b --- Makefile.msc | 20 ++++++++++---------- manifest | 18 +++++++++--------- manifest.uuid | 2 +- test/threadtest3.c | 2 ++ test/tt3_vacuum.c | 2 +- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 57ddbe7854..6a7f2a3a75 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2586,16 +2586,16 @@ rbu.exe: $(TOP)\ext\rbu\rbu.c $(TOP)\ext\rbu\sqlite3rbu.c $(SQLITE3C) $(SQLITE3H $(LTLINK) $(NO_WARN) -DSQLITE_ENABLE_RBU \ $(TOP)\ext\rbu\rbu.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) +THREADTEST3_SRC = \ + $(TOP)\test\threadtest3.c \ + $(TOP)\test\tt3_checkpoint.c \ + $(TOP)\test\tt3_index.c \ + $(TOP)\test\tt3_vacuum.c \ + $(TOP)\test\tt3_stress.c \ + $(TOP)\test\tt3_lookaside1.c -THREADTEST3_SRC = $(TOP)\test\threadtest3.c \ - $(TOP)\test\tt3_checkpoint.c \ - $(TOP)\test\tt3_index.c \ - $(TOP)\test\tt3_vacuum.c \ - $(TOP)\test\tt3_stress.c \ - $(TOP)\test\tt3_lookaside1.c - -threadtest3.exe: sqlite3.obj $(THREADTEST3_SRC) $(TOP)/src/test_multiplex.c - $(LTLINK) $(TOP)\test\threadtest3.c $(TOP)\src\test_multiplex.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) +threadtest3.exe: $(THREADTEST3_SRC) $(TOP)\src\test_multiplex.c $(SQLITE3C) $(SQLITE3H) + $(LTLINK) $(NO_WARN) $(TOP)\test\threadtest3.c $(TOP)\src\test_multiplex.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) LSMDIR=$(TOP)\ext\lsm1 !INCLUDE $(LSMDIR)\Makefile.msc @@ -2634,7 +2634,7 @@ clean: del /Q sqlite-*-output.vsix 2>NUL del /Q fuzzershell.exe fuzzcheck.exe sqldiff.exe dbhash.exe 2>NUL del /Q sqltclsh.* 2>NUL - del /Q dbfuzz.exe sessionfuzz.exe 2>NUL + del /Q dbfuzz.exe sessionfuzz.exe threadtest3.exe 2>NUL del /Q kvtest.exe ossshell.exe scrub.exe 2>NUL del /Q showshm.exe sqlite3_checker.* sqlite3_expert.exe 2>NUL del /Q fts5.* fts5parse.* 2>NUL diff --git a/manifest b/manifest index 7bb2b8c7ad..7a8f5db481 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C More\sprecision\sin\scomparing\sintegers\sand\sfloating\spoint\svalues\swhile\nprocessing\sthe\sinteger\sprimary\skey\sfor\sOP_SeekGE\sand\ssimilar.\n[forum:/forumpost/2bdb86a068|Forum\spost\s2bdb86a068]. -D 2021-07-19T20:52:31.773 +C Fix\scompilation\sof\s'threadtest3'\sfor\ssome\solder\sversions\sof\sMSVC. +D 2021-07-20T00:18:22.983 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 83c348515cb62f6f2a2ddf3fd014113ff20564b776e1a614079722c88c6ff43d F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc be23161cf225f0574c34b866ade20824bef4e5473e924e0941fe954ccb253286 +F Makefile.msc 7dc32ba195639311ef4fa3d8f8ec218de37fde12d7ef5a33e9a7de921b0025ca F README.md 27fb76aa7eb57ed63a53bbba7292b6bf71f51125554f79f16b5d040edd1e6110 F VERSION c6595fef606851f2bc3ebed6a7386c73751835fc909feab7c093739fa4b3c1d1 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1465,7 +1465,7 @@ F test/thread2.test f35d2106452b77523b3a2b7d1dcde2e5ee8f9e46 F test/thread_common.tcl 334639cadcb9f912bf82aa73f49efd5282e6cadd F test/threadtest1.c 6029d9c5567db28e6dc908a0c63099c3ba6c383b F test/threadtest2.c a70a8e94bef23339d34226eb9521015ef99f4df8 -F test/threadtest3.c fee869dba633f8403a7eef03bb038a3fc45f0814b9f829ea79a914fcc11f0218 +F test/threadtest3.c 655bff6c0895ec03f014126aa65e808fac9aae8c5a7a7da58a510cbe8b43b781 F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 F test/threadtest5.c 9b4d782c58d8915d7e955ff8051f3d03628bda0d33b82971ea8c0f2f2808c421 F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90 @@ -1644,7 +1644,7 @@ F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 F test/tt3_shared.c b37d22defc944a2ac4c91c927fd06c1d48cd51e2ce9d004fe868625bd2399f93 F test/tt3_stress.c f9a769ca8b026ecc76ee93ca8c9700a5619f8e51c581107c4053ba6ac97f616f -F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 +F test/tt3_vacuum.c 71b254cde1fc49d6c8c44efd54f4668f3e57d7b3a8f4601ade069f75a999ba39 F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a @@ -1920,7 +1920,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 4ce585fb07274284e3add6adcb66ed06e4b109584704d1ec7152bf43ca8d5d85 -R 000488406edbffc8806e75458a922494 -U drh -Z 26015d8f2da64898ae34fc3a47735d30 +P f9c6426de3b413ff8fcf04a00931ca5f123f996c572b35181af114afa8d811d7 +R 4a4b4d7f4609ee7ad98f970aafca21aa +U mistachkin +Z d79e981ec4950b9bac6d5abcb02f1221 diff --git a/manifest.uuid b/manifest.uuid index bfd7a78e8b..7fc59ca525 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f9c6426de3b413ff8fcf04a00931ca5f123f996c572b35181af114afa8d811d7 \ No newline at end of file +b5ede6a68891820bd5b6d051b1b641bc1cd49104cad2466db184134d14f58f5b \ No newline at end of file diff --git a/test/threadtest3.c b/test/threadtest3.c index f427324a23..3a12c5889b 100644 --- a/test/threadtest3.c +++ b/test/threadtest3.c @@ -830,7 +830,9 @@ static void join_all_threads_x( Thread *p; Thread *pNext; for(p=pThreads->pThread; p; p=pNext){ +#ifndef _WIN32 void *ret; +#endif int rc; pNext = p->pNext; diff --git a/test/tt3_vacuum.c b/test/tt3_vacuum.c index 023fdfd74d..c41a6b487d 100644 --- a/test/tt3_vacuum.c +++ b/test/tt3_vacuum.c @@ -23,9 +23,9 @@ static char *vacuum1_thread_writer(int iTid, void *pArg){ Error err = {0}; /* Error code and message */ Sqlite db = {0}; /* SQLite database connection */ - opendb(&err, &db, "test.db", 0); i64 i = 0; + opendb(&err, &db, "test.db", 0); while( !timetostop(&err) ){ i++; From 53fa02507b2025db7b74a155c8df4a8a2e4db4d8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 20 Jul 2021 02:02:24 +0000 Subject: [PATCH 074/100] It does not work to deserialized into TEMP, so do not allow it. The sqlite3_deserialize() routine now returns SQLITE_ERROR if you try. FossilOrigin-Name: 18068cc60698d4944a9d682cdf34b14b4d4b32f043f8d584dbf41c2bb5ac6220 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/memdb.c | 5 +++-- src/sqlite.h.in | 4 ++++ test/memdb1.test | 16 ++++++++++++++++ 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 7a8f5db481..fed613db3a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompilation\sof\s'threadtest3'\sfor\ssome\solder\sversions\sof\sMSVC. -D 2021-07-20T00:18:22.983 +C It\sdoes\snot\swork\sto\sdeserialized\sinto\sTEMP,\sso\sdo\snot\sallow\sit.\s\sThe\nsqlite3_deserialize()\sroutine\snow\sreturns\sSQLITE_ERROR\sif\syou\stry. +D 2021-07-20T02:02:24.771 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -515,7 +515,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c b93b8762ab999a29ae7751532dadf0a1ac78040308a5fb1d17fcc365171d67eb F src/mem3.c 30301196cace2a085cbedee1326a49f4b26deff0af68774ca82c1f7c06fda4f6 F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 2f2e8efc6e531c59cf8255f0bf4ad81f2e88e0a394581244154c8cf5141757ce +F src/memdb.c 73622017aa03a3cabd1c4d6fca97eedada2155817dd0d74d6c1aeb42573b515d F src/memjournal.c a85f0dc5c02a42453d0bc3819ecfb5666cb6433e5deefcd93ccbe05c9f088b83 F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 @@ -546,7 +546,7 @@ F src/resolve.c ea205123fba6bb254666f50b6c220270913eae54eb03d263abaa432c703f5857 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 0c783511b5f35b37d971dcd653c554d21f74d7cb63a4979991a61d068480c40f F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 -F src/sqlite.h.in f716b8a9fb30c6928752fd75b3f824e8ac4d225d31494029dee8454aeb9aa01a +F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h b3762f49d8b6b4bf7bf30d154f007d6f9421c86343042d7a246a79988d1fec1a @@ -1191,7 +1191,7 @@ F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0f F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 -F test/memdb1.test 7b76c3262d63c46dd6b408d18f5721071776f2df4ffeb11e668824e427127594 +F test/memdb1.test 1705e850e32969b61e19cbbc9d8a3ba3ba310092812d10948b8303394bf00f40 F test/memjournal.test 70f3a00c7f84ee2978ad14e831231caa1e7f23915a2c54b4f775a021d5740c6c F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e @@ -1920,7 +1920,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 f9c6426de3b413ff8fcf04a00931ca5f123f996c572b35181af114afa8d811d7 -R 4a4b4d7f4609ee7ad98f970aafca21aa -U mistachkin -Z d79e981ec4950b9bac6d5abcb02f1221 +P b5ede6a68891820bd5b6d051b1b641bc1cd49104cad2466db184134d14f58f5b +R e22cd931ae144bced3e3587611f0e114 +U drh +Z b4c2ab277c13106aeed921dd3a580a07 diff --git a/manifest.uuid b/manifest.uuid index 7fc59ca525..dd0503215c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b5ede6a68891820bd5b6d051b1b641bc1cd49104cad2466db184134d14f58f5b \ No newline at end of file +18068cc60698d4944a9d682cdf34b14b4d4b32f043f8d584dbf41c2bb5ac6220 \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index 4e5751f931..dc29a2db7f 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -809,10 +809,11 @@ int sqlite3_deserialize( sqlite3_mutex_enter(db->mutex); if( zSchema==0 ) zSchema = db->aDb[0].zDbSName; iDb = sqlite3FindDbName(db, zSchema); - if( iDb<0 ){ + testcase( iDb==1 ); + if( iDb<2 && iDb!=0 ){ rc = SQLITE_ERROR; goto end_deserialize; - } + } zSql = sqlite3_mprintf("ATTACH x AS %Q", zSchema); if( zSql==0 ){ rc = SQLITE_NOMEM; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 3ac46fb55a..e4ea66a725 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -9923,6 +9923,10 @@ unsigned char *sqlite3_serialize( ** database is currently in a read transaction or is involved in a backup ** operation. ** +** It is not possible to deserialized into the TEMP database. If the +** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the +** function returns SQLITE_ERROR. +** ** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the ** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then ** [sqlite3_free()] is invoked on argument P prior to returning. diff --git a/test/memdb1.test b/test/memdb1.test index ae2f5d50d1..93b638feaa 100644 --- a/test/memdb1.test +++ b/test/memdb1.test @@ -195,6 +195,22 @@ do_test 620 { lappend rc $msg } {1 {wrong # args: should be "db serialize ?DATABASE?"}} +# 2021-07-19 https://sqlite.org/forum/forumpost/e1cbb5f450b98aa6 +# The TEMP database cannot participate in serialization or +# deserialization. +# +reset_db +do_test 650 { + db eval { + CREATE TEMP TABLE t0(a); + CREATE TABLE t1(x); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<1000) + INSERT INTO t1(x) SELECT random() FROM c; + } + set rc [catch {db deserialize temp [db serialize main]} err] + lappend rc err +} {1 err} + #------------------------------------------------------------------------- ifcapable vtab { reset_db From b4d9b2b5376e6c6605933a7b9904c795235ff3ff Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 20 Jul 2021 07:35:07 +0000 Subject: [PATCH 075/100] Demonstration code to show how NOT NULL and CHECK constraints can be verified after an ALTER TABLE ADD COLUMN. FossilOrigin-Name: 039f540373b03af9e0c87499e5e0423eb093d1d343829282a5ac1de2d600b881 --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/alter.c | 29 ++++++++++++++++++++++------- src/build.c | 1 + src/pragma.h | 4 ++-- src/sqliteInt.h | 3 ++- tool/mkpragmatab.tcl | 4 ++-- 7 files changed, 43 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index fed613db3a..e3d642bf01 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C It\sdoes\snot\swork\sto\sdeserialized\sinto\sTEMP,\sso\sdo\snot\sallow\sit.\s\sThe\nsqlite3_deserialize()\sroutine\snow\sreturns\sSQLITE_ERROR\sif\syou\stry. -D 2021-07-20T02:02:24.771 +C Demonstration\scode\sto\sshow\show\sNOT\sNULL\sand\sCHECK\sconstraints\scan\sbe\nverified\safter\san\sALTER\sTABLE\sADD\sCOLUMN. +D 2021-07-20T07:35:07.295 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 774a2a175ec747b55046ec62f5c1208d730ee22b10bdad5f182591fa247946a8 +F src/alter.c 1589ea8a5dcef74e12b49182928062cbd2958cc223004bb6d534e44521c59d0a F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c a27511863001ba088afd5e19efc9c37ea660983bd6ddf012def10f6cc4456a01 +F src/build.c 602ab2f5b49df357a70ac4ff64bc6cc23effd97a6ae16b60e947f5ab25866f44 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -538,7 +538,7 @@ F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f F src/pragma.c 9fe75aa29e8706a2cf6b9c1600ac05a2efc55c44ce719b65aa45d10ff58acc9d -F src/pragma.h 8dc78ab7e9ec6ce3ded8332810a2066f1ef6267e2e03cd7356ee00276125c6cf +F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c @@ -549,7 +549,7 @@ F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b5 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h b3762f49d8b6b4bf7bf30d154f007d6f9421c86343042d7a246a79988d1fec1a +F src/sqliteInt.h 0982664df2e04968d9588535efa0f3987a7f23fb6d6872f0a7a0c5fa97e53933 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1853,7 +1853,7 @@ F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a89 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 130b88697da6ec5b89b41844d955d08fb62c2552e889dec8c7bcecb28d8f50bd F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl ae5585ae76ca26e4d6ccd5ea9cdebaf5efefb318bf989497a0e846cd711d9ab1 +F tool/mkpragmatab.tcl 7f6db47d1995bc08247255622524567b2ab8962d98063f8aef97e35c3c54e3b8 F tool/mkshellc.tcl 5fe7e518112b262e25726f248c0f33dd153192867453984b6af0a76a88e97cb2 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1920,7 +1920,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 b5ede6a68891820bd5b6d051b1b641bc1cd49104cad2466db184134d14f58f5b -R e22cd931ae144bced3e3587611f0e114 +P 18068cc60698d4944a9d682cdf34b14b4d4b32f043f8d584dbf41c2bb5ac6220 +R 32477a4a8d73756ec29530de57bdffab +T *branch * add-column-constraint-check +T *sym-add-column-constraint-check * +T -sym-trunk * U drh -Z b4c2ab277c13106aeed921dd3a580a07 +Z 445808b8851b3290a628722ea679d598 diff --git a/manifest.uuid b/manifest.uuid index dd0503215c..e3d6c1ab6a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -18068cc60698d4944a9d682cdf34b14b4d4b32f043f8d584dbf41c2bb5ac6220 \ No newline at end of file +039f540373b03af9e0c87499e5e0423eb093d1d343829282a5ac1de2d600b881 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index f998b893c2..7b313dae46 100644 --- a/src/alter.c +++ b/src/alter.c @@ -427,12 +427,12 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ db->mDbFlags = savedDbFlags; } - /* Make sure the schema version is at least 3. But do not upgrade - ** from less than 3 to 4, as that will corrupt any preexisting DESC - ** index. - */ v = sqlite3GetVdbe(pParse); if( v ){ + /* Make sure the schema version is at least 3. But do not upgrade + ** from less than 3 to 4, as that will corrupt any preexisting DESC + ** index. + */ r1 = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); sqlite3VdbeUsesBtree(v, iDb); @@ -441,10 +441,25 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, 3); sqlite3ReleaseTempReg(pParse, r1); - } - /* Reload the table definition */ - renameReloadSchema(pParse, iDb, INITFLAG_AlterRename); + /* Reload the table definition */ + renameReloadSchema(pParse, iDb, INITFLAG_AlterRename); + + /* Verify that constraints are still satisfied */ + if( pParse->bDiscardCheck + || (pCol->notNull && (pCol->colFlags & COLFLAG_GENERATED)!=0) + ){ + sqlite3NestedParse(pParse, + "SELECT CASE WHEN quick_check GLOB 'CHECK*'" + " THEN raise(ABORT,'CHECK constraint failed')" + " WHEN quick_check GLOB 'NULL*'" + " THEN raise(ABORT,'NOT NULL constraint failed')" + " END" + " FROM pragma_quick_check(\"%w\",\"%w\")", + zTab, zDb + ); + } + } } /* diff --git a/src/build.c b/src/build.c index 4eca21a3f7..c1dea15aaf 100644 --- a/src/build.c +++ b/src/build.c @@ -1769,6 +1769,7 @@ void sqlite3AddCheckConstraint( }else #endif { + pParse->bDiscardCheck = 1; sqlite3ExprDelete(pParse->db, pCheckExpr); } } diff --git a/src/pragma.h b/src/pragma.h index be99befb2a..fe3cdf1e32 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -370,7 +370,7 @@ static const PragmaName aPragmaName[] = { #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) {/* zName: */ "integrity_check", /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, - /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif @@ -478,7 +478,7 @@ static const PragmaName aPragmaName[] = { #if !defined(SQLITE_OMIT_INTEGRITY_CHECK) {/* zName: */ "quick_check", /* ePragTyp: */ PragTyp_INTEGRITY_CHECK, - /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1, + /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0|PragFlg_Result1|PragFlg_SchemaOpt, /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 651116aa9e..420698830b 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3437,7 +3437,8 @@ struct Parse { Vdbe *pVdbe; /* An engine for executing database bytecode */ int rc; /* Return code from execution */ u8 colNamesSet; /* TRUE after OP_ColumnName has been issued to pVdbe */ - u8 checkSchema; /* Causes schema cookie check after an error */ + u8 checkSchema : 1; /* Causes schema cookie check after an error */ + u8 bDiscardCheck :1; /* A CHECK constraint was discarded by the parser */ u8 nested; /* Number of nested calls to the parser/code generator */ u8 nTempReg; /* Number of temporary registers in aTempReg[] */ u8 isMultiWrite; /* True if statement may modify/insert multiple rows */ diff --git a/tool/mkpragmatab.tcl b/tool/mkpragmatab.tcl index 7c15765631..b24706ab95 100644 --- a/tool/mkpragmatab.tcl +++ b/tool/mkpragmatab.tcl @@ -304,12 +304,12 @@ set pragma_def { IF: !defined(SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA) NAME: integrity_check - FLAG: NeedSchema Result0 Result1 + FLAG: NeedSchema Result0 Result1 SchemaOpt IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK) NAME: quick_check TYPE: INTEGRITY_CHECK - FLAG: NeedSchema Result0 Result1 + FLAG: NeedSchema Result0 Result1 SchemaOpt IF: !defined(SQLITE_OMIT_INTEGRITY_CHECK) NAME: encoding From 0f91a5352b7bb81beb27306d44ad630f3fd9d3cc Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 20 Jul 2021 08:23:54 +0000 Subject: [PATCH 076/100] Fix issues in the new ADD COLUMN constraint checking. Add preliminary test cases. FossilOrigin-Name: 48434ad3fa9504c063d812d119bc8f622548fd02b3d478ff247b11474c4ce5db --- manifest | 21 +++++++++------------ manifest.uuid | 2 +- src/alter.c | 8 ++++---- src/build.c | 1 - src/sqliteInt.h | 3 +-- test/alter3.test | 49 ++++++++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 62 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index e3d642bf01..9886467871 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Demonstration\scode\sto\sshow\show\sNOT\sNULL\sand\sCHECK\sconstraints\scan\sbe\nverified\safter\san\sALTER\sTABLE\sADD\sCOLUMN. -D 2021-07-20T07:35:07.295 +C Fix\sissues\sin\sthe\snew\sADD\sCOLUMN\sconstraint\schecking.\s\sAdd\spreliminary\ntest\scases. +D 2021-07-20T08:23:54.879 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 1589ea8a5dcef74e12b49182928062cbd2958cc223004bb6d534e44521c59d0a +F src/alter.c 8b6d394cca07e1aa0bd9364111098017dee578e2edad6ce6eb6a0cf78738413c F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 602ab2f5b49df357a70ac4ff64bc6cc23effd97a6ae16b60e947f5ab25866f44 +F src/build.c a27511863001ba088afd5e19efc9c37ea660983bd6ddf012def10f6cc4456a01 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -549,7 +549,7 @@ F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b5 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 0982664df2e04968d9588535efa0f3987a7f23fb6d6872f0a7a0c5fa97e53933 +F src/sqliteInt.h b3762f49d8b6b4bf7bf30d154f007d6f9421c86343042d7a246a79988d1fec1a F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -645,7 +645,7 @@ F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 F test/alter.test f53d8a4ecd35f051c07e54a36beec5d0a30d30a9d98bc723f6cde6afbfb3c5ca F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 -F test/alter3.test e487958dec7932453e0b83baf21d6b1e71d5e7d9a55bc20eadfa62a51ddffc29 +F test/alter3.test ffc4ab29ce78a3517a66afd69b2730667e3471622509c283b2bd4c46f680fba3 F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test 381b1ab603c9ef96314a3158528ea17f7964449385a28eeaf8191120b2e24a8d @@ -1920,10 +1920,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 18068cc60698d4944a9d682cdf34b14b4d4b32f043f8d584dbf41c2bb5ac6220 -R 32477a4a8d73756ec29530de57bdffab -T *branch * add-column-constraint-check -T *sym-add-column-constraint-check * -T -sym-trunk * +P 039f540373b03af9e0c87499e5e0423eb093d1d343829282a5ac1de2d600b881 +R a9df6797ac98d60db9408d8a0375d0a2 U drh -Z 445808b8851b3290a628722ea679d598 +Z 8c3fc1d16a03a8cd3196e7a282e45db6 diff --git a/manifest.uuid b/manifest.uuid index e3d6c1ab6a..b1aa9536fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -039f540373b03af9e0c87499e5e0423eb093d1d343829282a5ac1de2d600b881 \ No newline at end of file +48434ad3fa9504c063d812d119bc8f622548fd02b3d478ff247b11474c4ce5db \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 7b313dae46..9c5b46261a 100644 --- a/src/alter.c +++ b/src/alter.c @@ -446,16 +446,16 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ renameReloadSchema(pParse, iDb, INITFLAG_AlterRename); /* Verify that constraints are still satisfied */ - if( pParse->bDiscardCheck + if( pNew->pCheck!=0 || (pCol->notNull && (pCol->colFlags & COLFLAG_GENERATED)!=0) ){ sqlite3NestedParse(pParse, "SELECT CASE WHEN quick_check GLOB 'CHECK*'" " THEN raise(ABORT,'CHECK constraint failed')" - " WHEN quick_check GLOB 'NULL*'" - " THEN raise(ABORT,'NOT NULL constraint failed')" + " ELSE raise(ABORT,'NOT NULL constraint failed')" " END" - " FROM pragma_quick_check(\"%w\",\"%w\")", + " FROM pragma_quick_check(\"%w\",\"%w\")" + " WHERE quick_check GLOB 'CHECK*' OR quick_check GLOB 'NULL*'", zTab, zDb ); } diff --git a/src/build.c b/src/build.c index c1dea15aaf..4eca21a3f7 100644 --- a/src/build.c +++ b/src/build.c @@ -1769,7 +1769,6 @@ void sqlite3AddCheckConstraint( }else #endif { - pParse->bDiscardCheck = 1; sqlite3ExprDelete(pParse->db, pCheckExpr); } } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 420698830b..651116aa9e 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3437,8 +3437,7 @@ struct Parse { Vdbe *pVdbe; /* An engine for executing database bytecode */ int rc; /* Return code from execution */ u8 colNamesSet; /* TRUE after OP_ColumnName has been issued to pVdbe */ - u8 checkSchema : 1; /* Causes schema cookie check after an error */ - u8 bDiscardCheck :1; /* A CHECK constraint was discarded by the parser */ + u8 checkSchema; /* Causes schema cookie check after an error */ u8 nested; /* Number of nested calls to the parser/code generator */ u8 nTempReg; /* Number of temporary registers in aTempReg[] */ u8 isMultiWrite; /* True if statement may modify/insert multiple rows */ diff --git a/test/alter3.test b/test/alter3.test index 30bc1cbba2..c6f26b0c50 100644 --- a/test/alter3.test +++ b/test/alter3.test @@ -13,8 +13,6 @@ # file format change that may be used in the future to implement # "ALTER TABLE ... ADD COLUMN". # -# $Id: alter3.test,v 1.11 2008/03/19 00:21:31 drh Exp $ -# set testdir [file dirname $argv0] @@ -395,4 +393,51 @@ do_test alter3-8.2 { } } [list $::sql] +# 2021-07-20: Add support for detecting CHECK and NOT NULL constraint +# violations in ALTER TABLE ADD COLUMN +# +reset_db +do_execsql_test alter3-9.1 { + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1, 2), ('null!',NULL), (3,4); +} {} +do_catchsql_test alter3-9.2 { + ALTER TABLE t1 ADD COLUMN c CHECK(a!=1); +} {1 {CHECK constraint failed}} +do_catchsql_test alter3-9.3 { + ALTER TABLE t1 ADD COLUMN c CHECK(a!=3); +} {1 {CHECK constraint failed}} +do_catchsql_test alter3-9.4 { + ALTER TABLE t1 ADD COLUMN c CHECK(a!=2); +} {0 {}} +do_catchsql_test alter3-9.5 { + ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL; +} {1 {NOT NULL constraint failed}} +do_catchsql_test alter3-9.6 { + ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL CHECK(a!=1); +} {1 {CHECK constraint failed}} +do_catchsql_test alter3-9.7 { + ALTER TABLE t1 ADD COLUMN d AS (b+1) NOT NULL CHECK(a!=3); +} {1 {NOT NULL constraint failed}} + +do_execsql_test alter3-9.10 { + CREATE TEMP TABLE t0(m,n); + INSERT INTO t0 VALUES(1, 2), ('null!',NULL), (3,4); + ATTACH ':memory:' AS aux1; + CREATE TABLE aux1.t2(x,y); + INSERT INTO t2 VALUES(1, 2), ('null!',NULL), (3,4); +} {} +do_catchsql_test alter3-9.11 { + ALTER TABLE t0 ADD COLUMN xtra1 AS (n+1) NOT NULL CHECK(m!=1); +} {1 {CHECK constraint failed}} +do_catchsql_test alter3-9.12 { + ALTER TABLE t0 ADD COLUMN xtra1 AS (n+1) NOT NULL CHECK(m!=3); +} {1 {NOT NULL constraint failed}} +do_catchsql_test alter3-9.13 { + ALTER TABLE t2 ADD COLUMN xtra1 AS (y+1) NOT NULL CHECK(x!=1); +} {1 {CHECK constraint failed}} +do_catchsql_test alter3-9.14 { + ALTER TABLE t2 ADD COLUMN xtra1 AS (y+1) NOT NULL CHECK(x!=3); +} {1 {NOT NULL constraint failed}} + finish_test From d59f98350199898f9448b994766902c7cf0a219c Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 20 Jul 2021 14:57:49 +0000 Subject: [PATCH 077/100] Avoid a malfunction that could occur if the same correlated column reference appears in both the GROUP BY and the HAVING clause of a sub-select. dbsqlfuzz a779227f721a834df95f4f42d0c31550a1f8b8a2. FossilOrigin-Name: 1e35cc6d5c2f563c6bb163bb150d7bc6ede4c993efa828af1face3261bf65a2c --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 8 ++++++++ test/aggnested.test | 42 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index fed613db3a..d324909d0d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C It\sdoes\snot\swork\sto\sdeserialized\sinto\sTEMP,\sso\sdo\snot\sallow\sit.\s\sThe\nsqlite3_deserialize()\sroutine\snow\sreturns\sSQLITE_ERROR\sif\syou\stry. -D 2021-07-20T02:02:24.771 +C Avoid\sa\smalfunction\sthat\scould\soccur\sif\sthe\ssame\scorrelated\scolumn\sreference\sappears\sin\sboth\sthe\sGROUP\sBY\sand\sthe\sHAVING\sclause\sof\sa\ssub-select.\sdbsqlfuzz\sa779227f721a834df95f4f42d0c31550a1f8b8a2. +D 2021-07-20T14:57:49.212 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea205123fba6bb254666f50b6c220270913eae54eb03d263abaa432c703f5857 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 0c783511b5f35b37d971dcd653c554d21f74d7cb63a4979991a61d068480c40f +F src/select.c bc9767ab4972c63ca6def53d7b5c8cc8e4df78b63bf51981ae14a82084089a5b F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -640,7 +640,7 @@ F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test eecb0dabee4b7765a8465439d5e99429279ffba23ca74a7eae270a452799f9e7 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/aggnested.test 2f65ec8132e0ca896de550b9908094d49ad65a99116a9d79deeb6017604ad4f6 +F test/aggnested.test cc47afa5e11e0d6771a85a4993fa6ff721480ddb53ea538ec3fdbafb720bd505 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 F test/alter.test f53d8a4ecd35f051c07e54a36beec5d0a30d30a9d98bc723f6cde6afbfb3c5ca @@ -1920,7 +1920,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 b5ede6a68891820bd5b6d051b1b641bc1cd49104cad2466db184134d14f58f5b -R e22cd931ae144bced3e3587611f0e114 -U drh -Z b4c2ab277c13106aeed921dd3a580a07 +P 18068cc60698d4944a9d682cdf34b14b4d4b32f043f8d584dbf41c2bb5ac6220 +R facd06e35d967824eff05936c4ae18f7 +U dan +Z 1eb6cf39f57a9c2d1d0141c8c9e6030e diff --git a/manifest.uuid b/manifest.uuid index dd0503215c..8d6dce630e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -18068cc60698d4944a9d682cdf34b14b4d4b32f043f8d584dbf41c2bb5ac6220 \ No newline at end of file +1e35cc6d5c2f563c6bb163bb150d7bc6ede4c993efa828af1face3261bf65a2c \ No newline at end of file diff --git a/src/select.c b/src/select.c index e0ac9db97b..b74999a8f2 100644 --- a/src/select.c +++ b/src/select.c @@ -6019,8 +6019,16 @@ static void explainSimpleCount( static int havingToWhereExprCb(Walker *pWalker, Expr *pExpr){ if( pExpr->op!=TK_AND ){ Select *pS = pWalker->u.pSelect; + /* This routine is called before the HAVING clause of the current + ** SELECT is analyzed for aggregates. So if pExpr->pAggInfo is set + ** here, it indicates that the expression is a correlated reference to a + ** column from an outer aggregate query, or an aggregate function that + ** belongs to an outer query. Do not move the expression to the WHERE + ** clause in this obscure case, as doing so may corrupt the outer Select + ** statements AggInfo structure. */ if( sqlite3ExprIsConstantOrGroupBy(pWalker->pParse, pExpr, pS->pGroupBy) && ExprAlwaysFalse(pExpr)==0 + && pExpr->pAggInfo==0 ){ sqlite3 *db = pWalker->pParse->db; Expr *pNew = sqlite3Expr(db, TK_INTEGER, "1"); diff --git a/test/aggnested.test b/test/aggnested.test index dcb1f95c99..35d5f1e3a6 100644 --- a/test/aggnested.test +++ b/test/aggnested.test @@ -306,6 +306,48 @@ do_execsql_test 5.5 { b, b; } +#------------------------------------------------------------------------- +# dbsqlfuzz a779227f721a834df95f4f42d0c31550a1f8b8a2 +# +reset_db +do_execsql_test 6.0 { + CREATE TABLE t1(a); + CREATE TABLE t2(b); + + INSERT INTO t1 VALUES('x'); + INSERT INTO t2 VALUES(1); +} + +do_execsql_test 6.1.1 { + SELECT ( + SELECT t2.b FROM (SELECT t2.b AS c FROM t1) GROUP BY 1 HAVING t2.b + ) + FROM t2 GROUP BY 'constant_string'; +} {1} +do_execsql_test 6.1.2 { + SELECT ( + SELECT c FROM (SELECT t2.b AS c FROM t1) GROUP BY c HAVING t2.b + ) + FROM t2 GROUP BY 'constant_string'; +} {1} + +do_execsql_test 6.2.0 { + UPDATE t2 SET b=0 +} +do_execsql_test 6.2.1 { + SELECT ( + SELECT t2.b FROM (SELECT t2.b AS c FROM t1) GROUP BY 1 HAVING t2.b + ) + FROM t2 GROUP BY 'constant_string'; +} {{}} +do_execsql_test 6.2.2 { + SELECT ( + SELECT c FROM (SELECT t2.b AS c FROM t1) GROUP BY c HAVING t2.b + ) + FROM t2 GROUP BY 'constant_string'; +} {{}} + + From c8d214711f39045a079c7ee9aa33b933e3a037a7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 21 Jul 2021 15:42:05 +0000 Subject: [PATCH 078/100] Improved robustness of cursor renumbering in the UNION ALL flattener when operating on vector assignments of an UPDATE FROM. dbsqlfuzz 417d2b053b9b3c9edaf22dd515564f06999e029c FossilOrigin-Name: 60695359dc5d3bcba68a68e1842c40f4a01650eb5af408e02fb856fd8245e16d --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/select.c | 34 +++++++++++++++++++++++----------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 7567fa9ecc..af32e732b7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Run\sa\s"PRAGMA\squick_check",\sif\snecessary,\son\sthe\smodified\stable\safter\s\nan\sALTER\sTABLE\sADD\sCOLUMN\sto\sverify\sthat\sadded\sNOT\sNULL\sor\sCHECK\sconstraints\nare\ssatisfied\sby\sexisting\srows.\s\sAbort\sthe\sADD\sCOLUMN\sif\snot.\n[forum:/forumpost/c04814903d6ec4f7|Forum\spost\sc04814903d6ec4f7]. -D 2021-07-20T16:07:15.775 +C Improved\srobustness\sof\scursor\srenumbering\sin\sthe\sUNION\sALL\sflattener\nwhen\soperating\son\svector\sassignments\sof\san\sUPDATE\sFROM.\ndbsqlfuzz\s417d2b053b9b3c9edaf22dd515564f06999e029c +D 2021-07-21T15:42:05.099 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c ea205123fba6bb254666f50b6c220270913eae54eb03d263abaa432c703f5857 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c bc9767ab4972c63ca6def53d7b5c8cc8e4df78b63bf51981ae14a82084089a5b +F src/select.c 3896009f30352985b28511a0c4d7dbb77ba418e91db80ab7745a7f6dcbe1031f F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1920,8 +1920,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 1e35cc6d5c2f563c6bb163bb150d7bc6ede4c993efa828af1face3261bf65a2c 48434ad3fa9504c063d812d119bc8f622548fd02b3d478ff247b11474c4ce5db -R 6d35c00da4d952e8a1f7a6cbfeee134e -T +closed 48434ad3fa9504c063d812d119bc8f622548fd02b3d478ff247b11474c4ce5db +P e3794997c34f03db2a4ac0ca5b76727d0e031778d92b08eaaf9631689ec3e56d +R 1d0984f765e8e6292164e6d1f063ec4e U drh -Z 90f3914d2224c6dcb594ff0c1dfca96d +Z a6d780ffb6dd6089f7ed6e79e41c67b8 diff --git a/manifest.uuid b/manifest.uuid index 6c3497ea9b..e5cb1f1da4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e3794997c34f03db2a4ac0ca5b76727d0e031778d92b08eaaf9631689ec3e56d \ No newline at end of file +60695359dc5d3bcba68a68e1842c40f4a01650eb5af408e02fb856fd8245e16d \ No newline at end of file diff --git a/src/select.c b/src/select.c index b74999a8f2..a50595413a 100644 --- a/src/select.c +++ b/src/select.c @@ -3754,10 +3754,10 @@ static void recomputeColumnsUsed( ** new cursor number assigned, set an entry in the aCsrMap[] array ** to map the old cursor number to the new: ** -** aCsrMap[iOld] = iNew; +** aCsrMap[iOld+1] = iNew; ** ** The array is guaranteed by the caller to be large enough for all -** existing cursor numbers in pSrc. +** existing cursor numbers in pSrc. aCsrMap[0] is the array size. ** ** If pSrc contains any sub-selects, call this routine recursively ** on the FROM clause of each such sub-select, with iExcept set to -1. @@ -3773,10 +3773,11 @@ static void srclistRenumberCursors( for(i=0, pItem=pSrc->a; inSrc; i++, pItem++){ if( i!=iExcept ){ Select *p; - if( !pItem->fg.isRecursive || aCsrMap[pItem->iCursor]==0 ){ - aCsrMap[pItem->iCursor] = pParse->nTab++; + assert( pItem->iCursor < aCsrMap[0] ); + if( !pItem->fg.isRecursive || aCsrMap[pItem->iCursor+1]==0 ){ + aCsrMap[pItem->iCursor+1] = pParse->nTab++; } - pItem->iCursor = aCsrMap[pItem->iCursor]; + pItem->iCursor = aCsrMap[pItem->iCursor+1]; for(p=pItem->pSelect; p; p=p->pPrior){ srclistRenumberCursors(pParse, aCsrMap, p->pSrc, -1); } @@ -3784,18 +3785,28 @@ static void srclistRenumberCursors( } } +/* +** *piCursor is a cursor number. Change it if it needs to be mapped. +*/ +static void renumberCursorDoMapping(Walker *pWalker, int *piCursor){ + int *aCsrMap = pWalker->u.aiCol; + int iCsr = *piCursor; + if( iCsr < aCsrMap[0] && aCsrMap[iCsr+1]>0 ){ + *piCursor = aCsrMap[iCsr+1]; + } +} + /* ** Expression walker callback used by renumberCursors() to update ** Expr objects to match newly assigned cursor numbers. */ static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){ - int *aCsrMap = pWalker->u.aiCol; int op = pExpr->op; - if( (op==TK_COLUMN || op==TK_IF_NULL_ROW) && aCsrMap[pExpr->iTable] ){ - pExpr->iTable = aCsrMap[pExpr->iTable]; + if( op==TK_COLUMN || op==TK_IF_NULL_ROW ){ + renumberCursorDoMapping(pWalker, &pExpr->iTable); } - if( ExprHasProperty(pExpr, EP_FromJoin) && aCsrMap[pExpr->iRightJoinTable] ){ - pExpr->iRightJoinTable = aCsrMap[pExpr->iRightJoinTable]; + if( ExprHasProperty(pExpr, EP_FromJoin) ){ + renumberCursorDoMapping(pWalker, &pExpr->iRightJoinTable); } return WRC_Continue; } @@ -4139,7 +4150,8 @@ static int flattenSubquery( if( pSrc->nSrc>1 ){ if( pParse->nSelect>500 ) return 0; - aCsrMap = sqlite3DbMallocZero(db, pParse->nTab*sizeof(int)); + aCsrMap = sqlite3DbMallocZero(db, (pParse->nTab+1)*sizeof(int)); + if( aCsrMap ) aCsrMap[0] = pParse->nTab; } } From 348e002ec90494809e8151e3738157edf5483ff6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 22 Jul 2021 16:07:01 +0000 Subject: [PATCH 079/100] One of the optimizations of check-in [de9c86c9e4cdb34f] does not work for terms originating in the ON/USING clause, as demonstrated by [forum:/forumpost/6cf3bb457c3f4685|forum post 6cf3bb457c3f4685]. This check-in disables that optimization for ON/USING terms. Also improve the TreeView display for the resulting "true"/"false" nodes to show that they originate from the ON/USING clause. Add a testcase() to the other optimization to show that it can still be used for ON/USING terms. FossilOrigin-Name: 1f6796044008e6f3a61bcf390c0c7eb31947e971f0edada74e7a3a211f8ae76a --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/resolve.c | 1 + src/treeview.c | 4 ++-- src/whereexpr.c | 6 +++++- test/notnull2.test | 20 ++++++++++++++++++++ 6 files changed, 38 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index af32e732b7..37ce94583a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\srobustness\sof\scursor\srenumbering\sin\sthe\sUNION\sALL\sflattener\nwhen\soperating\son\svector\sassignments\sof\san\sUPDATE\sFROM.\ndbsqlfuzz\s417d2b053b9b3c9edaf22dd515564f06999e029c -D 2021-07-21T15:42:05.099 +C One\sof\sthe\soptimizations\sof\scheck-in\s[de9c86c9e4cdb34f]\sdoes\snot\swork\sfor\nterms\soriginating\sin\sthe\sON/USING\sclause,\sas\sdemonstrated\sby\n[forum:/forumpost/6cf3bb457c3f4685|forum\spost\s6cf3bb457c3f4685].\s\sThis\ncheck-in\sdisables\sthat\soptimization\sfor\sON/USING\sterms.\s\sAlso\simprove\sthe\nTreeView\sdisplay\sfor\sthe\sresulting\s"true"/"false"\snodes\sto\sshow\sthat\sthey\noriginate\sfrom\sthe\sON/USING\sclause.\s\sAdd\sa\stestcase()\sto\sthe\sother\soptimization\nto\sshow\sthat\sit\scan\sstill\sbe\sused\sfor\sON/USING\sterms. +D 2021-07-22T16:07:01.039 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c ea205123fba6bb254666f50b6c220270913eae54eb03d263abaa432c703f5857 +F src/resolve.c 047a822844cea769f6fdd8418a335dd4bcd8b75ab5e264f2506a0804f869b562 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3896009f30352985b28511a0c4d7dbb77ba418e91db80ab7745a7f6dcbe1031f F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 @@ -609,7 +609,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e -F src/treeview.c ce7a3da38caba094c78d888d2366f749ea33dc8cbafb04218b57768fb8669a6c +F src/treeview.c 43f88d0fd19976a60aee6867959213b438593276f1e8179048df85f416a1ab19 F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 F src/update.c 30465f9accc854e8a7932b413578027fbb68186132abbb36e01d2022473fc83d F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 @@ -634,7 +634,7 @@ F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 07a4097fe42a01b1f99d2a136598654051f0bdcd6c17cbef7fa285a9cf21e4d2 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f -F src/whereexpr.c 2bfb1cd24b9b63fc5e32b9b85f2b3f88765bdac2aab51102d94d1fb56ec2917b +F src/whereexpr.c 3a9144a9d52e110efdc012a73b1574e7b2b4df4bf98949387cb620295eba0975 F src/window.c 420167512050a0dfc0f0115b9f0c7d299da9759c9bb2ae83a61fb8d730a5707f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1230,7 +1230,7 @@ F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 -F test/notnull2.test 131365171d973c57fe694fcc46c1e645f6e24ceb43b230ad5011a0ea2182f215 +F test/notnull2.test 8e1aa4f311df37f9d2cd4f5563eea955b8028c692151404e9cc896420a01a3dc F test/notnullfault.test fc4bb7845582a2b3db376001ef49118393b1b11abe0d24adb03db057ee2b73d5 F test/null.test b7ff206a1c60fe01aa2abd33ef9ea83c93727d993ca8a613de86e925c9f2bc6f F test/nulls1.test 7a5e4346ee4285034100b4cd20e6784f16a9d6c927e44ecdf10034086bbee9c9 @@ -1920,7 +1920,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 e3794997c34f03db2a4ac0ca5b76727d0e031778d92b08eaaf9631689ec3e56d -R 1d0984f765e8e6292164e6d1f063ec4e +P 60695359dc5d3bcba68a68e1842c40f4a01650eb5af408e02fb856fd8245e16d +R eca5325aa2c3da54beb61a6b6add5177 U drh -Z a6d780ffb6dd6089f7ed6e79e41c67b8 +Z 1ef4dd4c6275cc3be5203d6443662cc5 diff --git a/manifest.uuid b/manifest.uuid index e5cb1f1da4..0a5529aea5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -60695359dc5d3bcba68a68e1842c40f4a01650eb5af408e02fb856fd8245e16d \ No newline at end of file +1f6796044008e6f3a61bcf390c0c7eb31947e971f0edada74e7a3a211f8ae76a \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index ae5a574056..d509de7953 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -818,6 +818,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } sqlite3WalkExpr(pWalker, pExpr->pLeft); if( 0==sqlite3ExprCanBeNull(pExpr->pLeft) && !IN_RENAME_OBJECT ){ + testcase( ExprHasProperty(pExpr, EP_FromJoin) ); if( pExpr->op==TK_NOTNULL ){ pExpr->u.zToken = "true"; ExprSetProperty(pExpr, EP_IsTrue); diff --git a/src/treeview.c b/src/treeview.c index 165ceb537a..654e01a3ea 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -474,8 +474,8 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ break; } case TK_TRUEFALSE: { - sqlite3TreeViewLine(pView, - sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE"); + sqlite3TreeViewLine(pView,"%s%s", + sqlite3ExprTruthValue(pExpr) ? "TRUE" : "FALSE", zFlgs); break; } #ifndef SQLITE_OMIT_BLOB_LITERAL diff --git a/src/whereexpr.c b/src/whereexpr.c index b9aa702e22..3492769db9 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1144,7 +1144,11 @@ static void exprAnalyze( pNew->prereqRight = prereqLeft | extraRight; pNew->prereqAll = prereqAll; pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask; - }else if( op==TK_ISNULL && 0==sqlite3ExprCanBeNull(pLeft) ){ + }else + if( op==TK_ISNULL + && !ExprHasProperty(pExpr,EP_FromJoin) + && 0==sqlite3ExprCanBeNull(pLeft) + ){ pExpr->op = TK_TRUEFALSE; pExpr->u.zToken = "false"; ExprSetProperty(pExpr, EP_IsFalse); diff --git a/test/notnull2.test b/test/notnull2.test index 75a519e9a3..12fffe28ce 100644 --- a/test/notnull2.test +++ b/test/notnull2.test @@ -109,4 +109,24 @@ do_execsql_test 3.1 { SELECT * FROM t0 WHERE ((c0 NOT NULL) AND 1) OR (c0 == NULL); } {0} +# 2021-07-22 https://sqlite.org/forum/forumpost/2078b7edd2 +# +reset_db +do_execsql_test 4.0 { + SELECT *, '/' + FROM ( + SELECT NULL val FROM (SELECT 1) + UNION ALL + SELECT 'missing' FROM (SELECT 1) + ) a + LEFT JOIN (SELECT 1) + ON a.val IS NULL; +} {{} 1 / missing {} /} +do_execsql_test 4.1 { + CREATE TABLE t1(a INT); + INSERT INTO t1(a) VALUES(1); + CREATE TABLE t2(b INT); + SELECT * FROM (SELECT 3 AS c FROM t1) AS t3 LEFT JOIN t2 ON c IS NULL; +} {3 {}} + finish_test From 55b8b73e749aa1dca43febaa9c546ca23e3bc0a7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 22 Jul 2021 18:22:51 +0000 Subject: [PATCH 080/100] Fix ALTER TABLE DROP COLUMN so that it generates valid bytecode even when operating on a corrupt database and using PRAGMA writable_schema=ON. dbsqlfuzz 5f09e7bcc78b4954d06bf9f2400d7715f48d1fef FossilOrigin-Name: b65f4f763979ee9e0b943c787609ea22d6f7e01d41dfc1e084ec50a085a3550c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/alter.c | 6 ++++++ test/fuzzdata8.db | Bin 2503680 -> 2504704 bytes 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 37ce94583a..2bedfaa2cd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C One\sof\sthe\soptimizations\sof\scheck-in\s[de9c86c9e4cdb34f]\sdoes\snot\swork\sfor\nterms\soriginating\sin\sthe\sON/USING\sclause,\sas\sdemonstrated\sby\n[forum:/forumpost/6cf3bb457c3f4685|forum\spost\s6cf3bb457c3f4685].\s\sThis\ncheck-in\sdisables\sthat\soptimization\sfor\sON/USING\sterms.\s\sAlso\simprove\sthe\nTreeView\sdisplay\sfor\sthe\sresulting\s"true"/"false"\snodes\sto\sshow\sthat\sthey\noriginate\sfrom\sthe\sON/USING\sclause.\s\sAdd\sa\stestcase()\sto\sthe\sother\soptimization\nto\sshow\sthat\sit\scan\sstill\sbe\sused\sfor\sON/USING\sterms. -D 2021-07-22T16:07:01.039 +C Fix\sALTER\sTABLE\sDROP\sCOLUMN\sso\sthat\sit\sgenerates\svalid\sbytecode\seven\swhen\noperating\son\sa\scorrupt\sdatabase\sand\susing\sPRAGMA\swritable_schema=ON.\ndbsqlfuzz\s5f09e7bcc78b4954d06bf9f2400d7715f48d1fef +D 2021-07-22T18:22:51.707 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 8b6d394cca07e1aa0bd9364111098017dee578e2edad6ce6eb6a0cf78738413c +F src/alter.c a54e0a5ae778271a0bc67bdb590c1b3bba0ee59669474f976afb862ccee0026e F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -1057,7 +1057,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db da92a0e336bf34ae89e407b375aaa57581b73b5f8f99b4de5e2557f64a3ca33c +F test/fuzzdata8.db 4581978d13472885cf33c0bbebb236a69f73f1b7316678d266422f4b96cfdf2c F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -1920,7 +1920,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 60695359dc5d3bcba68a68e1842c40f4a01650eb5af408e02fb856fd8245e16d -R eca5325aa2c3da54beb61a6b6add5177 +P 1f6796044008e6f3a61bcf390c0c7eb31947e971f0edada74e7a3a211f8ae76a +R 7315df7a3ffb1a7d3694104258ba6a80 U drh -Z 1ef4dd4c6275cc3be5203d6443662cc5 +Z 1036f3ec1711682b3c2317c34f22e66c diff --git a/manifest.uuid b/manifest.uuid index 0a5529aea5..15c0f5c0d8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1f6796044008e6f3a61bcf390c0c7eb31947e971f0edada74e7a3a211f8ae76a \ No newline at end of file +b65f4f763979ee9e0b943c787609ea22d6f7e01d41dfc1e084ec50a085a3550c \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 9c5b46261a..c29be3f6e0 100644 --- a/src/alter.c +++ b/src/alter.c @@ -2174,6 +2174,12 @@ void sqlite3AlterDropColumn(Parse *pParse, SrcList *pSrc, Token *pName){ nField++; } } + if( nField==0 ){ + /* dbsqlfuzz 5f09e7bcc78b4954d06bf9f2400d7715f48d1fef */ + pParse->nMem++; + sqlite3VdbeAddOp2(v, OP_Null, 0, reg+1); + nField = 1; + } sqlite3VdbeAddOp3(v, OP_MakeRecord, reg+1, nField, regRec); if( pPk ){ sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iCur, regRec, reg+1, pPk->nKeyCol); diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index f3a67bc7048bd937145827b4645940bd52ec2404..5273e5883c28846a9f5935e5e385964f1d17c43f 100644 GIT binary patch delta 40064 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 O4?(ode?_|jivJHu6?-oL delta 39602 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 Date: Thu, 22 Jul 2021 21:11:06 +0000 Subject: [PATCH 081/100] Set the checkSchema flag if a CREATE TABLE parse fails because the table already exists, to ensure that the table was not previously deleted by some other connection. FossilOrigin-Name: 91bcb9621529b58d28e91a2763eb9eef3951400d5eaef105073258f3dd331872 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 2bedfaa2cd..5883a6aee2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sALTER\sTABLE\sDROP\sCOLUMN\sso\sthat\sit\sgenerates\svalid\sbytecode\seven\swhen\noperating\son\sa\scorrupt\sdatabase\sand\susing\sPRAGMA\swritable_schema=ON.\ndbsqlfuzz\s5f09e7bcc78b4954d06bf9f2400d7715f48d1fef -D 2021-07-22T18:22:51.707 +C Set\sthe\scheckSchema\sflag\sif\sa\sCREATE\sTABLE\sparse\sfails\sbecause\sthe\stable\nalready\sexists,\sto\sensure\sthat\sthe\stable\swas\snot\spreviously\sdeleted\sby\nsome\sother\sconnection. +D 2021-07-22T21:11:06.648 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c a27511863001ba088afd5e19efc9c37ea660983bd6ddf012def10f6cc4456a01 +F src/build.c 9978caf1e5c6c82d04d85e290d46979abc2219fb79bcd970258d1ebe368d184e F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -1920,7 +1920,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 1f6796044008e6f3a61bcf390c0c7eb31947e971f0edada74e7a3a211f8ae76a -R 7315df7a3ffb1a7d3694104258ba6a80 +P b65f4f763979ee9e0b943c787609ea22d6f7e01d41dfc1e084ec50a085a3550c +R ed9a1584f4d75ade417ceb251baf5a51 U drh -Z 1036f3ec1711682b3c2317c34f22e66c +Z f439f5ab1be78d6d001ae417ae6fc683 diff --git a/manifest.uuid b/manifest.uuid index 15c0f5c0d8..2645917039 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b65f4f763979ee9e0b943c787609ea22d6f7e01d41dfc1e084ec50a085a3550c \ No newline at end of file +91bcb9621529b58d28e91a2763eb9eef3951400d5eaef105073258f3dd331872 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 4eca21a3f7..824c104743 100644 --- a/src/build.c +++ b/src/build.c @@ -1272,6 +1272,7 @@ void sqlite3StartTable( /* If an error occurs, we jump here */ begin_table_error: + pParse->checkSchema = 1; sqlite3DbFree(db, zName); return; } From 37407126777ade303ed954cbb2243a15fe26f1a0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 23 Jul 2021 18:43:58 +0000 Subject: [PATCH 082/100] Enhance the CLI with the ".connection" command that can switch between up to five different database connections. Used for manual testing of multiple database connections in the same process. FossilOrigin-Name: 54eaf076c05887157179459ab39c2556953f6fef9c1b14f17a8aa74087da3023 --- manifest | 12 +-- manifest.uuid | 2 +- src/shell.c.in | 202 ++++++++++++++++++++++++++++++++----------------- 3 files changed, 138 insertions(+), 78 deletions(-) diff --git a/manifest b/manifest index 5883a6aee2..99fe0fda6a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Set\sthe\scheckSchema\sflag\sif\sa\sCREATE\sTABLE\sparse\sfails\sbecause\sthe\stable\nalready\sexists,\sto\sensure\sthat\sthe\stable\swas\snot\spreviously\sdeleted\sby\nsome\sother\sconnection. -D 2021-07-22T21:11:06.648 +C Enhance\sthe\sCLI\swith\sthe\s".connection"\scommand\sthat\scan\sswitch\sbetween\nup\sto\sfive\sdifferent\sdatabase\sconnections.\s\sUsed\sfor\smanual\stesting\sof\smultiple\ndatabase\sconnections\sin\sthe\ssame\sprocess. +D 2021-07-23T18:43:58.652 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 047a822844cea769f6fdd8418a335dd4bcd8b75ab5e264f2506a0804f869b562 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 3896009f30352985b28511a0c4d7dbb77ba418e91db80ab7745a7f6dcbe1031f -F src/shell.c.in 856de2945bb7fdfdeebe7136cf1b59d24618845aa5e5f3937fda7ff37c623b51 +F src/shell.c.in dc889872292ce143ab43080e7eb48b95f9b13beabf85ae729388a6b9ee08bab7 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1920,7 +1920,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 b65f4f763979ee9e0b943c787609ea22d6f7e01d41dfc1e084ec50a085a3550c -R ed9a1584f4d75ade417ceb251baf5a51 +P 91bcb9621529b58d28e91a2763eb9eef3951400d5eaef105073258f3dd331872 +R 0cfa2cb9dd20ef662e91de1cc8d85fce U drh -Z f439f5ab1be78d6d001ae417ae6fc683 +Z 13547b3fed83ea2295e7d5c9afd10815 diff --git a/manifest.uuid b/manifest.uuid index 2645917039..a66844c71c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -91bcb9621529b58d28e91a2763eb9eef3951400d5eaef105073258f3dd331872 \ No newline at end of file +54eaf076c05887157179459ab39c2556953f6fef9c1b14f17a8aa74087da3023 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 248bc0dc0e..713050555c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -983,7 +983,7 @@ static void shellAddSchemaName( sqlite3 *db = sqlite3_context_db_handle(pCtx); UNUSED_PARAMETER(nVal); if( zIn!=0 && strncmp(zIn, "CREATE ", 7)==0 ){ - for(i=0; i<(int)(sizeof(aPrefix)/sizeof(aPrefix[0])); i++){ + for(i=0; inSession; i++){ - session_close(&p->aSession[i]); +static void session_close_all(ShellState *p, int i){ + int j; + struct AuxDb *pAuxDb = i<0 ? p->pAuxDb : &p->aAuxDb[i]; + for(j=0; jnSession; j++){ + session_close(&pAuxDb->aSession[j]); } - p->nSession = 0; + pAuxDb->nSession = 0; } #else -# define session_close_all(X) +# define session_close_all(X,Y) #endif /* @@ -4317,8 +4322,8 @@ int deduceDatabaseType(const char *zName, int dfltZip){ #ifndef SQLITE_OMIT_DESERIALIZE /* ** Reconstruct an in-memory database using the output from the "dbtotxt" -** program. Read content from the file in p->zDbFilename. If p->zDbFilename -** is 0, then read from standard input. +** program. Read content from the file in p->aAuxDb[].zDbFilename. +** If p->aAuxDb[].zDbFilename is 0, then read from standard input. */ static unsigned char *readHexDb(ShellState *p, int *pnData){ unsigned char *a = 0; @@ -4329,12 +4334,13 @@ static unsigned char *readHexDb(ShellState *p, int *pnData){ int j, k; int rc; FILE *in; + const char *zDbFilename = p->pAuxDb->zDbFilename; unsigned int x[16]; char zLine[1000]; - if( p->zDbFilename ){ - in = fopen(p->zDbFilename, "r"); + if( zDbFilename ){ + in = fopen(zDbFilename, "r"); if( in==0 ){ - utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename); + utf8_printf(stderr, "cannot open \"%s\" for reading\n", zDbFilename); return 0; } nLine = 0; @@ -4576,17 +4582,18 @@ static void shellEscapeCrnl( */ static void open_db(ShellState *p, int openFlags){ if( p->db==0 ){ + const char *zDbFilename = p->pAuxDb->zDbFilename; if( p->openMode==SHELL_OPEN_UNSPEC ){ - if( p->zDbFilename==0 || p->zDbFilename[0]==0 ){ + if( zDbFilename==0 || zDbFilename[0]==0 ){ p->openMode = SHELL_OPEN_NORMAL; }else{ - p->openMode = (u8)deduceDatabaseType(p->zDbFilename, + p->openMode = (u8)deduceDatabaseType(zDbFilename, (openFlags & OPEN_DB_ZIPFILE)!=0); } } switch( p->openMode ){ case SHELL_OPEN_APPENDVFS: { - sqlite3_open_v2(p->zDbFilename, &p->db, + sqlite3_open_v2(zDbFilename, &p->db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, "apndvfs"); break; } @@ -4600,13 +4607,13 @@ static void open_db(ShellState *p, int openFlags){ break; } case SHELL_OPEN_READONLY: { - sqlite3_open_v2(p->zDbFilename, &p->db, + sqlite3_open_v2(zDbFilename, &p->db, SQLITE_OPEN_READONLY|p->openFlags, 0); break; } case SHELL_OPEN_UNSPEC: case SHELL_OPEN_NORMAL: { - sqlite3_open_v2(p->zDbFilename, &p->db, + sqlite3_open_v2(zDbFilename, &p->db, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|p->openFlags, 0); break; } @@ -4614,7 +4621,7 @@ static void open_db(ShellState *p, int openFlags){ globalDb = p->db; if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", - p->zDbFilename, sqlite3_errmsg(p->db)); + zDbFilename, sqlite3_errmsg(p->db)); if( openFlags & OPEN_DB_KEEPALIVE ){ sqlite3_open(":memory:", &p->db); return; @@ -4661,7 +4668,7 @@ static void open_db(ShellState *p, int openFlags){ #endif if( p->openMode==SHELL_OPEN_ZIPFILE ){ char *zSql = sqlite3_mprintf( - "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", p->zDbFilename); + "CREATE VIRTUAL TABLE zip USING zipfile(%Q);", zDbFilename); sqlite3_exec(p->db, zSql, 0, 0, 0); sqlite3_free(zSql); } @@ -4672,7 +4679,7 @@ static void open_db(ShellState *p, int openFlags){ int nData = 0; unsigned char *aData; if( p->openMode==SHELL_OPEN_DESERIALIZE ){ - aData = (unsigned char*)readFile(p->zDbFilename, &nData); + aData = (unsigned char*)readFile(zDbFilename, &nData); }else{ aData = readHexDb(p, &nData); if( aData==0 ){ @@ -7393,7 +7400,6 @@ static int recoverDatabaseCmd(ShellState *pState, int nArg, char **azArg){ } #endif /* !(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB) */ - /* ** If an input line begins with "." then invoke this routine to ** process that line. @@ -7558,6 +7564,13 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else + /* The undocumented ".breakpoint" command causes a call to the no-op + ** routine named test_breakpoint(). + */ + if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ + test_breakpoint(); + }else + if( c=='c' && strcmp(azArg[0],"cd")==0 ){ if( nArg==2 ){ #if defined(_WIN32) || defined(WIN32) @@ -7577,13 +7590,6 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else - /* The undocumented ".breakpoint" command causes a call to the no-op - ** routine named test_breakpoint(). - */ - if( c=='b' && n>=3 && strncmp(azArg[0], "breakpoint", n)==0 ){ - test_breakpoint(); - }else - if( c=='c' && n>=3 && strncmp(azArg[0], "changes", n)==0 ){ if( nArg==2 ){ setOrClearFlag(p, SHFLG_CountChanges, azArg[1]); @@ -7627,6 +7633,52 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else + if( c=='c' && strncmp(azArg[0], "connection", n)==0 ){ + if( nArg==1 ){ + /* List available connections */ + int i; + for(i=0; iaAuxDb); i++){ + const char *zFile = p->aAuxDb[i].zDbFilename; + if( p->aAuxDb[i].db==0 && p->pAuxDb!=&p->aAuxDb[i] ){ + zFile = "(not open)"; + }else if( zFile==0 ){ + zFile = "(memory)"; + }else if( zFile[0]==0 ){ + zFile = "(temporary-file)"; + } + if( p->pAuxDb == &p->aAuxDb[i] ){ + utf8_printf(stdout, "ACTIVE %d: %s\n", i, zFile); + }else if( p->aAuxDb[i].db!=0 ){ + utf8_printf(stdout, " %d: %s\n", i, zFile); + } + } + }else if( nArg==2 && IsDigit(azArg[1][0]) && azArg[1][1]==0 ){ + int i = azArg[1][0] - '0'; + if( p->pAuxDb != &p->aAuxDb[i] && i>=0 && iaAuxDb) ){ + p->pAuxDb->db = p->db; + p->pAuxDb = &p->aAuxDb[i]; + globalDb = p->db = p->pAuxDb->db; + p->pAuxDb->db = 0; + } + }else if( nArg==3 && strcmp(azArg[1], "close")==0 + && IsDigit(azArg[2][0]) && azArg[2][1]==0 ){ + int i = azArg[2][0] - '0'; + if( i<0 || i>=ArraySize(p->aAuxDb) ){ + /* No-op */ + }else if( p->pAuxDb == &p->aAuxDb[i] ){ + raw_printf(stderr, "cannot close the active database connection\n"); + rc = 1; + }else if( p->aAuxDb[i].db ){ + session_close_all(p, i); + close_db(p->aAuxDb[i].db); + p->aAuxDb[i].db = 0; + } + }else{ + raw_printf(stderr, "Usage: .connection [close] [CONNECTION-NUMBER]\n"); + rc = 1; + } + }else + if( c=='d' && n>1 && strncmp(azArg[0], "databases", n)==0 ){ char **azName = 0; int nName = 0; @@ -8716,12 +8768,12 @@ static int do_meta_command(char *zLine, ShellState *p){ int iName = 1; /* Index in azArg[] of the filename */ int newFlag = 0; /* True to delete file before opening */ /* Close the existing database */ - session_close_all(p); + session_close_all(p, -1); close_db(p->db); p->db = 0; - p->zDbFilename = 0; - sqlite3_free(p->zFreeOnClose); - p->zFreeOnClose = 0; + p->pAuxDb->zDbFilename = 0; + sqlite3_free(p->pAuxDb->zFreeOnClose); + p->pAuxDb->zFreeOnClose = 0; p->openMode = SHELL_OPEN_UNSPEC; p->openFlags = 0; p->szMax = 0; @@ -8765,18 +8817,18 @@ static int do_meta_command(char *zLine, ShellState *p){ /* If a filename is specified, try to open it first */ if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ if( newFlag ) shellDeleteFile(zNewFilename); - p->zDbFilename = zNewFilename; + p->pAuxDb->zDbFilename = zNewFilename; open_db(p, OPEN_DB_KEEPALIVE); if( p->db==0 ){ utf8_printf(stderr, "Error: cannot open '%s'\n", zNewFilename); sqlite3_free(zNewFilename); }else{ - p->zFreeOnClose = zNewFilename; + p->pAuxDb->zFreeOnClose = zNewFilename; } } if( p->db==0 ){ /* As a fall-back open a TEMP database */ - p->zDbFilename = 0; + p->pAuxDb->zDbFilename = 0; open_db(p, 0); } }else @@ -9305,7 +9357,8 @@ static int do_meta_command(char *zLine, ShellState *p){ #if defined(SQLITE_ENABLE_SESSION) if( c=='s' && strncmp(azArg[0],"session",n)==0 && n>=3 ){ - OpenSession *pSession = &p->aSession[0]; + struct AuxDb *pAuxDb = p->pAuxDb; + OpenSession *pSession = &pAuxDb->aSession[0]; char **azCmd = &azArg[1]; int iSes = 0; int nCmd = nArg - 1; @@ -9313,15 +9366,15 @@ static int do_meta_command(char *zLine, ShellState *p){ if( nArg<=1 ) goto session_syntax_error; open_db(p, 0); if( nArg>=3 ){ - for(iSes=0; iSesnSession; iSes++){ - if( strcmp(p->aSession[iSes].zName, azArg[1])==0 ) break; + for(iSes=0; iSesnSession; iSes++){ + if( strcmp(pAuxDb->aSession[iSes].zName, azArg[1])==0 ) break; } - if( iSesnSession ){ - pSession = &p->aSession[iSes]; + if( iSesnSession ){ + pSession = &pAuxDb->aSession[iSes]; azCmd++; nCmd--; }else{ - pSession = &p->aSession[0]; + pSession = &pAuxDb->aSession[0]; iSes = 0; } } @@ -9383,9 +9436,9 @@ static int do_meta_command(char *zLine, ShellState *p){ */ if( strcmp(azCmd[0], "close")==0 ){ if( nCmd!=1 ) goto session_syntax_error; - if( p->nSession ){ + if( pAuxDb->nSession ){ session_close(pSession); - p->aSession[iSes] = p->aSession[--p->nSession]; + pAuxDb->aSession[iSes] = pAuxDb->aSession[--pAuxDb->nSession]; } }else @@ -9396,7 +9449,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int ii; if( nCmd>2 ) goto session_syntax_error; ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); - if( p->nSession ){ + if( pAuxDb->nSession ){ ii = sqlite3session_enable(pSession->p, ii); utf8_printf(p->out, "session %s enable flag = %d\n", pSession->zName, ii); @@ -9409,7 +9462,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( strcmp(azCmd[0], "filter")==0 ){ int ii, nByte; if( nCmd<2 ) goto session_syntax_error; - if( p->nSession ){ + if( pAuxDb->nSession ){ for(ii=0; iinFilter; ii++){ sqlite3_free(pSession->azFilter[ii]); } @@ -9434,7 +9487,7 @@ static int do_meta_command(char *zLine, ShellState *p){ int ii; if( nCmd>2 ) goto session_syntax_error; ii = nCmd==1 ? -1 : booleanValue(azCmd[1]); - if( p->nSession ){ + if( pAuxDb->nSession ){ ii = sqlite3session_indirect(pSession->p, ii); utf8_printf(p->out, "session %s indirect flag = %d\n", pSession->zName, ii); @@ -9447,7 +9500,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( strcmp(azCmd[0], "isempty")==0 ){ int ii; if( nCmd!=1 ) goto session_syntax_error; - if( p->nSession ){ + if( pAuxDb->nSession ){ ii = sqlite3session_isempty(pSession->p); utf8_printf(p->out, "session %s isempty flag = %d\n", pSession->zName, ii); @@ -9458,8 +9511,8 @@ static int do_meta_command(char *zLine, ShellState *p){ ** List all currently open sessions */ if( strcmp(azCmd[0],"list")==0 ){ - for(i=0; inSession; i++){ - utf8_printf(p->out, "%d %s\n", i, p->aSession[i].zName); + for(i=0; inSession; i++){ + utf8_printf(p->out, "%d %s\n", i, pAuxDb->aSession[i].zName); } }else @@ -9472,17 +9525,17 @@ static int do_meta_command(char *zLine, ShellState *p){ if( nCmd!=3 ) goto session_syntax_error; zName = azCmd[2]; if( zName[0]==0 ) goto session_syntax_error; - for(i=0; inSession; i++){ - if( strcmp(p->aSession[i].zName,zName)==0 ){ + for(i=0; inSession; i++){ + if( strcmp(pAuxDb->aSession[i].zName,zName)==0 ){ utf8_printf(stderr, "Session \"%s\" already exists\n", zName); goto meta_command_exit; } } - if( p->nSession>=ArraySize(p->aSession) ){ - raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(p->aSession)); + if( pAuxDb->nSession>=ArraySize(pAuxDb->aSession) ){ + raw_printf(stderr, "Maximum of %d sessions\n", ArraySize(pAuxDb->aSession)); goto meta_command_exit; } - pSession = &p->aSession[p->nSession]; + pSession = &pAuxDb->aSession[pAuxDb->nSession]; rc = sqlite3session_create(p->db, azCmd[1], &pSession->p); if( rc ){ raw_printf(stderr, "Cannot open session: error code=%d\n", rc); @@ -9491,7 +9544,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } pSession->nFilter = 0; sqlite3session_table_filter(pSession->p, session_filter, pSession); - p->nSession++; + pAuxDb->nSession++; pSession->zName = sqlite3_mprintf("%s", zName); }else /* If no command name matches, show a syntax error */ @@ -9820,7 +9873,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } raw_printf(p->out, "\n"); utf8_printf(p->out, "%12.12s: %s\n", "filename", - p->zDbFilename ? p->zDbFilename : ""); + p->pAuxDb->zDbFilename ? p->pAuxDb->zDbFilename : ""); }else if( c=='s' && strncmp(azArg[0], "stats", n)==0 ){ @@ -10841,6 +10894,7 @@ static void main_init(ShellState *data) { memset(data, 0, sizeof(*data)); data->normalMode = data->cMode = data->mode = MODE_List; data->autoExplain = 1; + data->pAuxDb = &data->aAuxDb[0]; memcpy(data->colSeparator,SEP_Column, 2); memcpy(data->rowSeparator,SEP_Row, 2); data->showHeader = 0; @@ -11004,7 +11058,7 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ ** this compile-time option to embed this shell program in larger ** applications. */ extern void SQLITE_SHELL_DBNAME_PROC(const char**); - SQLITE_SHELL_DBNAME_PROC(&data.zDbFilename); + SQLITE_SHELL_DBNAME_PROC(&data.pAuxDb->zDbFilename); warnInmemoryDb = 0; } #endif @@ -11019,8 +11073,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ char *z; z = argv[i]; if( z[0]!='-' ){ - if( data.zDbFilename==0 ){ - data.zDbFilename = z; + if( data.aAuxDb->zDbFilename==0 ){ + data.aAuxDb->zDbFilename = z; }else{ /* Excesss arguments are interpreted as SQL (or dot-commands) and ** mean that nothing is read from stdin */ @@ -11160,9 +11214,9 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ } } - if( data.zDbFilename==0 ){ + if( data.pAuxDb->zDbFilename==0 ){ #ifndef SQLITE_OMIT_MEMORYDB - data.zDbFilename = ":memory:"; + data.pAuxDb->zDbFilename = ":memory:"; warnInmemoryDb = argc==1; #else utf8_printf(stderr,"%s: Error: no database filename specified\n", Argv0); @@ -11177,7 +11231,7 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ ** files from being created if a user mistypes the database name argument ** to the sqlite command-line tool. */ - if( access(data.zDbFilename, 0)==0 ){ + if( access(data.pAuxDb->zDbFilename, 0)==0 ){ open_db(&data, 0); } @@ -11431,10 +11485,16 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ free(azCmd); set_table_name(&data, 0); if( data.db ){ - session_close_all(&data); + session_close_all(&data, -1); close_db(data.db); } - sqlite3_free(data.zFreeOnClose); + for(i=0; i Date: Mon, 26 Jul 2021 18:28:24 +0000 Subject: [PATCH 083/100] Give sqldiff --visible-controls option to deal with non-graphic text content robustly across platforms FossilOrigin-Name: 68d2373f5d578cf3aff9d1ac4b1ab3ac00b466e94e1eb516523fc7660dfc0549 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/sqldiff.c | 45 ++++++++++++++++++++++++++++++++++++++------- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 99fe0fda6a..c4f06a0d91 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sCLI\swith\sthe\s".connection"\scommand\sthat\scan\sswitch\sbetween\nup\sto\sfive\sdifferent\sdatabase\sconnections.\s\sUsed\sfor\smanual\stesting\sof\smultiple\ndatabase\sconnections\sin\sthe\ssame\sprocess. -D 2021-07-23T18:43:58.652 +C Give\ssqldiff\s--visible-controls\soption\sto\sdeal\swith\snon-graphic\stext\scontent\srobustly\sacross\splatforms +D 2021-07-26T18:28:24.001 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1885,7 +1885,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c 21226ef092ec1e543b237c5d3d2d32d344a60f2437eadfea04f65b348fbd00e4 +F tool/sqldiff.c b4906b8a88252c94a77f2080f10c2624ba9b11f2577f25c1b29c3324a7a76c83 F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 @@ -1920,7 +1920,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 91bcb9621529b58d28e91a2763eb9eef3951400d5eaef105073258f3dd331872 -R 0cfa2cb9dd20ef662e91de1cc8d85fce -U drh -Z 13547b3fed83ea2295e7d5c9afd10815 +P 54eaf076c05887157179459ab39c2556953f6fef9c1b14f17a8aa74087da3023 +R a514ddb4ecddc8a67fe058834fe110d9 +U larrybr +Z 948d1027dff68e9d9c973736292e2ed9 diff --git a/manifest.uuid b/manifest.uuid index a66844c71c..f8be94e571 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -54eaf076c05887157179459ab39c2556953f6fef9c1b14f17a8aa74087da3023 \ No newline at end of file +68d2373f5d578cf3aff9d1ac4b1ab3ac00b466e94e1eb516523fc7660dfc0549 \ No newline at end of file diff --git a/tool/sqldiff.c b/tool/sqldiff.c index 9844cbadf0..fea40b9fe0 100644 --- a/tool/sqldiff.c +++ b/tool/sqldiff.c @@ -34,6 +34,7 @@ struct GlobalVars { int bSchemaOnly; /* Only show schema differences */ int bSchemaPK; /* Use the schema-defined PK, not the true PK */ int bHandleVtab; /* Handle fts3, fts4, fts5 and rtree vtabs */ + int bDarkCtl; /* Render controls in text as blob literals */ unsigned fDebug; /* Debug flags */ sqlite3 *db; /* The database connection */ } g; @@ -386,13 +387,39 @@ static void printQuoted(FILE *out, sqlite3_value *X){ fprintf(out, "NULL"); }else{ fprintf(out, "'"); - for(i=j=0; zArg[i]; i++){ - if( zArg[i]=='\'' ){ - fprintf(out, "%.*s'", i-j+1, &zArg[j]); - j = i+1; - } - } - fprintf(out, "%s'", &zArg[j]); + if( !g.bDarkCtl ){ + for(i=j=0; zArg[i]; i++){ + if( zArg[i]=='\'' ){ + fprintf(out, "%.*s'", i-j+1, &zArg[j]); + j = i+1; + } + } + fprintf(out, "%s'", &zArg[j]); + }else{ + int inctl = 0; + for(i=j=0; zArg[i]; i++){ + char c = zArg[i]; + int ctl = iscntrl(c); + if( ctl>inctl ){ + inctl = ctl; + fprintf(out, "%.*s'||X'%02x", i-j, &zArg[j], c); + j = i+1; + }else if( ctl ){ + fprintf(out, "%02x", c); + j = i+1; + }else{ + if( inctl ){ + inctl = 0; + fprintf(out, "'\n||'"); + } + if( c=='\'' ){ + fprintf(out, "%.*s'", i-j+1, &zArg[j]); + j = i+1; + } + } + } + fprintf(out, "%s'", &zArg[j]); + } } break; } @@ -1875,6 +1902,7 @@ static void showHelp(void){ " --table TAB Show only differences in table TAB\n" " --transaction Show SQL output inside a transaction\n" " --vtab Handle fts3, fts4, fts5 and rtree tables\n" +" --visible-controls Render controls in text as blob literals\n" ); } @@ -1948,6 +1976,9 @@ int main(int argc, char **argv){ if( strcmp(z,"vtab")==0 ){ g.bHandleVtab = 1; }else + if( strcmp(z, "visible-controls")==0 ){ + g.bDarkCtl = 1; + }else { cmdlineError("unknown option: %s", argv[i]); } From 1ae057d8735b85bc97346c0b6a83b8f86c4d949b Mon Sep 17 00:00:00 2001 From: larrybr Date: Mon, 26 Jul 2021 19:49:01 +0000 Subject: [PATCH 084/100] Remove sqldiff --visible-controls option, make it always happen. Add test cases for controls made visible FossilOrigin-Name: ff74c0cc4cefa5271b12ecfff3f2fd4749852d9d1d01f4ae64a07a26decc001b --- manifest | 14 ++++++------ manifest.uuid | 2 +- test/sqldiff1.test | 9 ++++++++ tool/sqldiff.c | 53 +++++++++++++++++----------------------------- 4 files changed, 36 insertions(+), 42 deletions(-) diff --git a/manifest b/manifest index c4f06a0d91..516e0cdb39 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Give\ssqldiff\s--visible-controls\soption\sto\sdeal\swith\snon-graphic\stext\scontent\srobustly\sacross\splatforms -D 2021-07-26T18:28:24.001 +C Remove\ssqldiff\s--visible-controls\soption,\smake\sit\salways\shappen.\sAdd\stest\scases\sfor\scontrols\smade\svisible +D 2021-07-26T19:49:01.920 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1417,7 +1417,7 @@ F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4 F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae6a41fb -F test/sqldiff1.test 28cd737cf1b0078b1ec1bbf425e674c47785835e +F test/sqldiff1.test 182058e09c7082de5c6a470ff9c291337bbeb650052c2cc68fbb3d7e25861d91 F test/sqllimits1.test 3f9030e5d35375ad3b912b4908094aa806335c8e9d804b8ffff70c5e9c664ab2 F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a F test/startup.c 1beb5ca66fcc0fce95c3444db9d1674f90fc605499a574ae2434dcfc10d22805 @@ -1885,7 +1885,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/split-sqlite3c.tcl 3efcd4240b738f6bb2b5af0aea7e1e0ef9bc1c61654f645076cec883030b710c -F tool/sqldiff.c b4906b8a88252c94a77f2080f10c2624ba9b11f2577f25c1b29c3324a7a76c83 +F tool/sqldiff.c a94207d8a8b8ae20973012756362a850ba1f95bb4ed02cf950fd469eb556717c F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 @@ -1920,7 +1920,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 54eaf076c05887157179459ab39c2556953f6fef9c1b14f17a8aa74087da3023 -R a514ddb4ecddc8a67fe058834fe110d9 +P 68d2373f5d578cf3aff9d1ac4b1ab3ac00b466e94e1eb516523fc7660dfc0549 +R b342ee6ef1ac53ce3fb2ee3a5429a66d U larrybr -Z 948d1027dff68e9d9c973736292e2ed9 +Z 6a37992a46fe8182f8f9e189a49d79b9 diff --git a/manifest.uuid b/manifest.uuid index f8be94e571..a27edc6b0a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -68d2373f5d578cf3aff9d1ac4b1ab3ac00b466e94e1eb516523fc7660dfc0549 \ No newline at end of file +ff74c0cc4cefa5271b12ecfff3f2fd4749852d9d1d01f4ae64a07a26decc001b \ No newline at end of file diff --git a/test/sqldiff1.test b/test/sqldiff1.test index ea4e1f9993..4ea5efbbfa 100644 --- a/test/sqldiff1.test +++ b/test/sqldiff1.test @@ -35,6 +35,10 @@ do_test sqldiff-1.0 { DELETE FROM x2.t2 WHERE a=48; INSERT INTO x2.t1(a,b) VALUES(1234,'hello'); INSERT INTO x2.t2(a,b) VALUES(50.5,'xyzzy'); + INSERT INTO x2.t2(a,b) VALUES(51.5,''); + INSERT INTO x2.t2(a,b) VALUES(52.5,''||X'0d0a'); + INSERT INTO x2.t2(a,b) VALUES(53.5,'one'||X'0a0d'); + INSERT INTO x2.t2(a,b) VALUES(54.5,'one'||X'0a'||'two'); CREATE TABLE x2.t3(a,b,c); INSERT INTO x2.t3 VALUES(111,222,333); CREATE TABLE main.t4(x,y,z); @@ -50,6 +54,11 @@ do_test sqldiff-1.1 { INSERT INTO t1(a,b) VALUES(1234,'hello'); DELETE FROM t2 WHERE a=48; INSERT INTO t2(a,b) VALUES(50.5,'xyzzy'); +INSERT INTO t2(a,b) VALUES(51.5,''); +INSERT INTO t2(a,b) VALUES(52.5,''||X'0d0a'); +INSERT INTO t2(a,b) VALUES(53.5,'one'||X'0a0d'); +INSERT INTO t2(a,b) VALUES(54.5,'one'||X'0a' +||'two'); CREATE TABLE t3(a,b,c); INSERT INTO t3(rowid,a,b,c) VALUES(1,111,222,333); DROP TABLE t4;} diff --git a/tool/sqldiff.c b/tool/sqldiff.c index fea40b9fe0..b8b9e005b9 100644 --- a/tool/sqldiff.c +++ b/tool/sqldiff.c @@ -34,7 +34,6 @@ struct GlobalVars { int bSchemaOnly; /* Only show schema differences */ int bSchemaPK; /* Use the schema-defined PK, not the true PK */ int bHandleVtab; /* Handle fts3, fts4, fts5 and rtree vtabs */ - int bDarkCtl; /* Render controls in text as blob literals */ unsigned fDebug; /* Debug flags */ sqlite3 *db; /* The database connection */ } g; @@ -381,45 +380,35 @@ static void printQuoted(FILE *out, sqlite3_value *X){ } case SQLITE_TEXT: { const unsigned char *zArg = sqlite3_value_text(X); - int i, j; if( zArg==0 ){ fprintf(out, "NULL"); }else{ + int inctl = 0; + int i, j; fprintf(out, "'"); - if( !g.bDarkCtl ){ - for(i=j=0; zArg[i]; i++){ - if( zArg[i]=='\'' ){ + for(i=j=0; zArg[i]; i++){ + char c = zArg[i]; + int ctl = iscntrl(c); + if( ctl>inctl ){ + inctl = ctl; + fprintf(out, "%.*s'||X'%02x", i-j, &zArg[j], c); + j = i+1; + }else if( ctl ){ + fprintf(out, "%02x", c); + j = i+1; + }else{ + if( inctl ){ + inctl = 0; + fprintf(out, "'\n||'"); + } + if( c=='\'' ){ fprintf(out, "%.*s'", i-j+1, &zArg[j]); j = i+1; } } - fprintf(out, "%s'", &zArg[j]); - }else{ - int inctl = 0; - for(i=j=0; zArg[i]; i++){ - char c = zArg[i]; - int ctl = iscntrl(c); - if( ctl>inctl ){ - inctl = ctl; - fprintf(out, "%.*s'||X'%02x", i-j, &zArg[j], c); - j = i+1; - }else if( ctl ){ - fprintf(out, "%02x", c); - j = i+1; - }else{ - if( inctl ){ - inctl = 0; - fprintf(out, "'\n||'"); - } - if( c=='\'' ){ - fprintf(out, "%.*s'", i-j+1, &zArg[j]); - j = i+1; - } - } - } - fprintf(out, "%s'", &zArg[j]); } + fprintf(out, "%s'", &zArg[j]); } break; } @@ -1902,7 +1891,6 @@ static void showHelp(void){ " --table TAB Show only differences in table TAB\n" " --transaction Show SQL output inside a transaction\n" " --vtab Handle fts3, fts4, fts5 and rtree tables\n" -" --visible-controls Render controls in text as blob literals\n" ); } @@ -1976,9 +1964,6 @@ int main(int argc, char **argv){ if( strcmp(z,"vtab")==0 ){ g.bHandleVtab = 1; }else - if( strcmp(z, "visible-controls")==0 ){ - g.bDarkCtl = 1; - }else { cmdlineError("unknown option: %s", argv[i]); } From 9045e7d69680dba14ea6ac9d93fbb421abc568e0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 28 Jul 2021 01:22:23 +0000 Subject: [PATCH 085/100] Reduce the scope of a variable in order to fix a harmless compiler warning that occurs under -DSQLITE_OMIT_AUTOMATIC_INDEX. FossilOrigin-Name: 36d5dbbe13562f4ea6435e620d102f8515bd0e6b8e66fd1841062a4e4621e330 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 516e0cdb39..2e1e23359b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\ssqldiff\s--visible-controls\soption,\smake\sit\salways\shappen.\sAdd\stest\scases\sfor\scontrols\smade\svisible -D 2021-07-26T19:49:01.920 +C Reduce\sthe\sscope\sof\sa\svariable\sin\sorder\sto\sfix\sa\sharmless\scompiler\swarning\nthat\soccurs\sunder\s-DSQLITE_OMIT_AUTOMATIC_INDEX. +D 2021-07-28T01:22:23.386 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -631,7 +631,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c c8ec20a1ca161d5635a4f19c2a4efec2e006e19a8a61f272bf6bce1c80ab7436 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c 07a4097fe42a01b1f99d2a136598654051f0bdcd6c17cbef7fa285a9cf21e4d2 +F src/where.c 07c63dde6ab72477b964f4c81bee61ef78a246ca149bb9a560784f2e85cd78d7 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 3a9144a9d52e110efdc012a73b1574e7b2b4df4bf98949387cb620295eba0975 @@ -1920,7 +1920,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 68d2373f5d578cf3aff9d1ac4b1ab3ac00b466e94e1eb516523fc7660dfc0549 -R b342ee6ef1ac53ce3fb2ee3a5429a66d -U larrybr -Z 6a37992a46fe8182f8f9e189a49d79b9 +P ff74c0cc4cefa5271b12ecfff3f2fd4749852d9d1d01f4ae64a07a26decc001b +R 0b9907c89e298e6ec44e54b431c85ab9 +U drh +Z bd3d716a77b8cb99bd8719b71b186559 diff --git a/manifest.uuid b/manifest.uuid index a27edc6b0a..97f636a899 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ff74c0cc4cefa5271b12ecfff3f2fd4749852d9d1d01f4ae64a07a26decc001b \ No newline at end of file +36d5dbbe13562f4ea6435e620d102f8515bd0e6b8e66fd1841062a4e4621e330 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 467963fda5..4ea04e5c8e 100644 --- a/src/where.c +++ b/src/where.c @@ -2984,7 +2984,6 @@ static int whereLoopAddBtree( int iSortIdx = 1; /* Index number */ int b; /* A boolean value */ LogEst rSize; /* number of rows in the table */ - LogEst rLogSize; /* Logarithm of the number of rows in the table */ WhereClause *pWC; /* The parsed WHERE clause */ Table *pTab; /* Table being queried */ @@ -3027,7 +3026,6 @@ static int whereLoopAddBtree( pProbe = &sPk; } rSize = pTab->nRowLogEst; - rLogSize = estLog(rSize); #ifndef SQLITE_OMIT_AUTOMATIC_INDEX /* Automatic indexes */ @@ -3041,8 +3039,10 @@ static int whereLoopAddBtree( && !pSrc->fg.isRecursive /* Not a recursive common table expression. */ ){ /* Generate auto-index WhereLoops */ + LogEst rLogSize; /* Logarithm of the number of rows in the table */ WhereTerm *pTerm; WhereTerm *pWCEnd = pWC->a + pWC->nTerm; + rLogSize = estLog(rSize); for(pTerm=pWC->a; rc==SQLITE_OK && pTermprereqRight & pNew->maskSelf ) continue; if( termCanDriveIndex(pTerm, pSrc, 0) ){ From c6da6dba691736f2eb156b419d63eb42b5a55cfa Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 28 Jul 2021 02:04:58 +0000 Subject: [PATCH 086/100] Fix a harmless uninitialized variable read that occurs after an error associated with a subquery that uses DISTINCT. Found by a fuzzer. FossilOrigin-Name: e9719f975f61c4c9f40ea077b049eed97d0957b925a4b6149d9ee21ce827b6a1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2e1e23359b..6d4f0ee275 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reduce\sthe\sscope\sof\sa\svariable\sin\sorder\sto\sfix\sa\sharmless\scompiler\swarning\nthat\soccurs\sunder\s-DSQLITE_OMIT_AUTOMATIC_INDEX. -D 2021-07-28T01:22:23.386 +C Fix\sa\sharmless\suninitialized\svariable\sread\sthat\soccurs\safter\san\serror\nassociated\swith\sa\ssubquery\sthat\suses\sDISTINCT.\s\sFound\sby\sa\sfuzzer. +D 2021-07-28T02:04:58.814 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -544,7 +544,7 @@ F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 047a822844cea769f6fdd8418a335dd4bcd8b75ab5e264f2506a0804f869b562 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 3896009f30352985b28511a0c4d7dbb77ba418e91db80ab7745a7f6dcbe1031f +F src/select.c 99c36dd4e7c2207ebdfd8c30986ab5aaeae74d0cdbbc471420807d50c417c241 F src/shell.c.in dc889872292ce143ab43080e7eb48b95f9b13beabf85ae729388a6b9ee08bab7 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1920,7 +1920,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 ff74c0cc4cefa5271b12ecfff3f2fd4749852d9d1d01f4ae64a07a26decc001b -R 0b9907c89e298e6ec44e54b431c85ab9 +P 36d5dbbe13562f4ea6435e620d102f8515bd0e6b8e66fd1841062a4e4621e330 +R f3f844f66ceec878dd9e2f813d0ea286 U drh -Z bd3d716a77b8cb99bd8719b71b186559 +Z 2e0111a600397f530b0a2c274b105089 diff --git a/manifest.uuid b/manifest.uuid index 97f636a899..badb8c266c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36d5dbbe13562f4ea6435e620d102f8515bd0e6b8e66fd1841062a4e4621e330 \ No newline at end of file +e9719f975f61c4c9f40ea077b049eed97d0957b925a4b6149d9ee21ce827b6a1 \ No newline at end of file diff --git a/src/select.c b/src/select.c index a50595413a..66e1434a31 100644 --- a/src/select.c +++ b/src/select.c @@ -873,7 +873,9 @@ static void fixDistinctOpenEph( int iVal, /* Value returned by codeDistinct() */ int iOpenEphAddr /* Address of OP_OpenEphemeral instruction for iTab */ ){ - if( eTnctType==WHERE_DISTINCT_UNIQUE || eTnctType==WHERE_DISTINCT_ORDERED ){ + if( pParse->nErr==0 + && (eTnctType==WHERE_DISTINCT_UNIQUE || eTnctType==WHERE_DISTINCT_ORDERED) + ){ Vdbe *v = pParse->pVdbe; sqlite3VdbeChangeToNoop(v, iOpenEphAddr); if( sqlite3VdbeGetOp(v, iOpenEphAddr+1)->opcode==OP_Explain ){ From 779e9906292c635ed4de646f05312fbf421c467d Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 28 Jul 2021 18:13:28 +0000 Subject: [PATCH 087/100] Add test case to ensure that sessions works with DELETE statements that use the truncate optimization (i.e. a DELETE without a WHERE clause). FossilOrigin-Name: a2fc531177c3a061f2881198bb711d502db7cd831351b6a5dd415936845b6625 --- ext/session/session1.test | 20 ++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 8 ++++++++ 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/ext/session/session1.test b/ext/session/session1.test index 0eb850a795..bcd7b03d5c 100644 --- a/ext/session/session1.test +++ b/ext/session/session1.test @@ -152,6 +152,26 @@ do_changeset_test $tn.2.4.2 S {} do_changeset_invert_test $tn.2.4.3 S {} do_test $tn.2.4.4 { S delete } {} +do_execsql_test $tn.2.5.0 { + SELECT * FROM t1 ORDER BY x +} { + 2 Surin + 10 Sukhothai + 20 Thapae +} + +do_test $tn.2.5.1 { + sqlite3session S db main + S attach t1 + execsql { DELETE FROM t1 } +} {} +do_changeset_test $tn.2.5.2 S { + {DELETE t1 0 X. {i 10 t Sukhothai} {}} + {DELETE t1 0 X. {i 2 t Surin} {}} + {DELETE t1 0 X. {i 20 t Thapae} {}} +} +do_test $tn.2.5.3 { S delete } {} + #------------------------------------------------------------------------- # Test the application of simple changesets. These tests also test that # the conflict callback is invoked correctly. For these tests, the diff --git a/manifest b/manifest index 6d4f0ee275..0f6db671a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\suninitialized\svariable\sread\sthat\soccurs\safter\san\serror\nassociated\swith\sa\ssubquery\sthat\suses\sDISTINCT.\s\sFound\sby\sa\sfuzzer. -D 2021-07-28T02:04:58.814 +C Add\stest\scase\sto\sensure\sthat\ssessions\sworks\swith\sDELETE\sstatements\sthat\suse\sthe\struncate\soptimization\s(i.e.\sa\sDELETE\swithout\sa\sWHERE\sclause). +D 2021-07-28T18:13:28.074 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -427,7 +427,7 @@ F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1 F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a -F ext/session/session1.test 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e +F ext/session/session1.test e94f764fbfb672147c0ef7026b195988133b371dc8cf9e52423eba6cad69717e F ext/session/session2.test 7f53d755d921e0baf815c4258348e0ed460dfd8a772351bca5ad3ccbb1dc786e F ext/session/session3.test ce9ce3dfa489473987f899e9f6a0f2db9bde3479 F ext/session/session4.test 6778997065b44d99c51ff9cece047ff9244a32856b328735ae27ddef68979c40 @@ -545,7 +545,7 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 047a822844cea769f6fdd8418a335dd4bcd8b75ab5e264f2506a0804f869b562 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 99c36dd4e7c2207ebdfd8c30986ab5aaeae74d0cdbbc471420807d50c417c241 -F src/shell.c.in dc889872292ce143ab43080e7eb48b95f9b13beabf85ae729388a6b9ee08bab7 +F src/shell.c.in 24b99dae8818d1a234732d73f4d5b49f12b510bc62735a41c04e314fafae09e3 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 @@ -1920,7 +1920,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 36d5dbbe13562f4ea6435e620d102f8515bd0e6b8e66fd1841062a4e4621e330 -R f3f844f66ceec878dd9e2f813d0ea286 -U drh -Z 2e0111a600397f530b0a2c274b105089 +P e9719f975f61c4c9f40ea077b049eed97d0957b925a4b6149d9ee21ce827b6a1 +R 965bb65399cafcbf059e35da2cd76d6c +U dan +Z 2c36fca53731dd91ccb072aba7586086 diff --git a/manifest.uuid b/manifest.uuid index badb8c266c..49a4fbbb8f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e9719f975f61c4c9f40ea077b049eed97d0957b925a4b6149d9ee21ce827b6a1 \ No newline at end of file +a2fc531177c3a061f2881198bb711d502db7cd831351b6a5dd415936845b6625 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 713050555c..7e610fdeef 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10040,6 +10040,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { "prng_save", SQLITE_TESTCTRL_PRNG_SAVE, "" }, { "prng_seed", SQLITE_TESTCTRL_PRNG_SEED, "SEED ?db?" }, { "seek_count", SQLITE_TESTCTRL_SEEK_COUNT, "" }, + { "sorter_mmap", SQLITE_TESTCTRL_SORTER_MMAP, "NMAX" }, { "tune", SQLITE_TESTCTRL_TUNE, "ID VALUE" }, }; int testctrl = -1; @@ -10220,6 +10221,13 @@ static int do_meta_command(char *zLine, ShellState *p){ break; } #endif + case SQLITE_TESTCTRL_SORTER_MMAP: + if( nArg==3 ){ + int opt = (unsigned int)integerValue(azArg[2]); + rc2 = sqlite3_test_control(testctrl, p->db, opt); + isOk = 3; + } + break; } } if( isOk==0 && iCtrl>=0 ){ From 02a9996e40dd60a11b614f797550abe2449a7ff9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 29 Jul 2021 00:33:20 +0000 Subject: [PATCH 088/100] Remove ALWAYS() macros that can be true if the internal test function implies_nonnull_row() is used in the result set of a query and contains comparison operator against a computed column. dbsqlfuzz 4c34db5bff6247f33ee49e341a1f3018e72be0a0. FossilOrigin-Name: 4d1dbfa35c7dc0f09321b2e274a00e506f4ca65322454652d5891d815a6966d3 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 0f6db671a1..9a4cb795d9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scase\sto\sensure\sthat\ssessions\sworks\swith\sDELETE\sstatements\sthat\suse\sthe\struncate\soptimization\s(i.e.\sa\sDELETE\swithout\sa\sWHERE\sclause). -D 2021-07-28T18:13:28.074 +C Remove\sALWAYS()\smacros\sthat\scan\sbe\strue\sif\sthe\sinternal\stest\sfunction\nimplies_nonnull_row()\sis\sused\sin\sthe\sresult\sset\sof\sa\squery\sand\scontains\ncomparison\soperator\sagainst\sa\scomputed\scolumn.\ndbsqlfuzz\s4c34db5bff6247f33ee49e341a1f3018e72be0a0. +D 2021-07-29T00:33:20.860 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -496,7 +496,7 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c 62b6d0ac8ee30a4749b78b7b75ae951a911a5d49321af5fe41c05af4df9e7537 +F src/expr.c b1bcf90afb7dcc0fae4d81116177e3d02e0803f81fd543c10fcd0691390b6adf F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c @@ -1920,7 +1920,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 e9719f975f61c4c9f40ea077b049eed97d0957b925a4b6149d9ee21ce827b6a1 -R 965bb65399cafcbf059e35da2cd76d6c -U dan -Z 2c36fca53731dd91ccb072aba7586086 +P a2fc531177c3a061f2881198bb711d502db7cd831351b6a5dd415936845b6625 +R 302893be0ad635d55b2ba074ef459057 +U drh +Z 214bc8f469ab254a07e1605231d14a09 diff --git a/manifest.uuid b/manifest.uuid index 49a4fbbb8f..7ce3f9f163 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a2fc531177c3a061f2881198bb711d502db7cd831351b6a5dd415936845b6625 \ No newline at end of file +4d1dbfa35c7dc0f09321b2e274a00e506f4ca65322454652d5891d815a6966d3 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 4ad1902d25..dea2695461 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5681,9 +5681,9 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_GE ); /* The y.pTab=0 assignment in wherecode.c always happens after the ** impliesNotNullRow() test */ - if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0) + if( (pLeft->op==TK_COLUMN && pLeft->y.pTab!=0 && IsVirtual(pLeft->y.pTab)) - || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0) + || (pRight->op==TK_COLUMN && pRight->y.pTab!=0 && IsVirtual(pRight->y.pTab)) ){ return WRC_Prune; From fd4c7862eeb7eddb9989f5fa8a495e1504ac9cd8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 29 Jul 2021 16:48:21 +0000 Subject: [PATCH 089/100] Improve comments and add new assert() statements in WAL to help document how everything works. FossilOrigin-Name: 23b08fe9db24a953cc231b093cf74d140c9965d22964d0401ff8ab3d4ecba443 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wal.c | 37 ++++++++++++++++++++++++++++++++++--- 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 9a4cb795d9..02d491aeb1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sALWAYS()\smacros\sthat\scan\sbe\strue\sif\sthe\sinternal\stest\sfunction\nimplies_nonnull_row()\sis\sused\sin\sthe\sresult\sset\sof\sa\squery\sand\scontains\ncomparison\soperator\sagainst\sa\scomputed\scolumn.\ndbsqlfuzz\s4c34db5bff6247f33ee49e341a1f3018e72be0a0. -D 2021-07-29T00:33:20.860 +C Improve\scomments\sand\sadd\snew\sassert()\sstatements\sin\sWAL\sto\shelp\sdocument\nhow\severything\sworks. +D 2021-07-29T16:48:21.089 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -628,7 +628,7 @@ F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb7 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c 3a9a6ae1fd14f7c00af184233cb9f3bced89ae277a75a312f85fb77297a3cdfa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c c8ec20a1ca161d5635a4f19c2a4efec2e006e19a8a61f272bf6bce1c80ab7436 +F src/wal.c 1b1e7311d3f12ab60c012734e49ebf048d6eeb4485b6f077bd79f340e9c36731 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 07c63dde6ab72477b964f4c81bee61ef78a246ca149bb9a560784f2e85cd78d7 @@ -1920,7 +1920,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 a2fc531177c3a061f2881198bb711d502db7cd831351b6a5dd415936845b6625 -R 302893be0ad635d55b2ba074ef459057 +P 4d1dbfa35c7dc0f09321b2e274a00e506f4ca65322454652d5891d815a6966d3 +R 7a7643ec86e1f4d8e14a77c61b23a38c U drh -Z 214bc8f469ab254a07e1605231d14a09 +Z faf097f1ce1cc5bd6964b75ff7d837f7 diff --git a/manifest.uuid b/manifest.uuid index 7ce3f9f163..7ff76c7e5c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d1dbfa35c7dc0f09321b2e274a00e506f4ca65322454652d5891d815a6966d3 \ No newline at end of file +23b08fe9db24a953cc231b093cf74d140c9965d22964d0401ff8ab3d4ecba443 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index c3f84dd2ef..4b1d63e8d0 100644 --- a/src/wal.c +++ b/src/wal.c @@ -161,7 +161,10 @@ ** HASHTABLE_NPAGE_ONE frames. The values of HASHTABLE_NPAGE_ONE and ** HASHTABLE_NPAGE are selected so that together the wal-index header and ** first index block are the same size as all other index blocks in the -** wal-index. +** wal-index. The values are: +** +** HASHTABLE_NPAGE 4096 +** HASHTABLE_NPAGE_ONE 4062 ** ** Each index block contains two sections, a page-mapping that contains the ** database page number associated with each wal frame, and a hash-table @@ -1410,14 +1413,42 @@ int sqlite3WalOpen( assert( zWalName && zWalName[0] ); assert( pDbFd ); + /* Verify the values of various constants. Any changes to the values + ** of these constants would result in an incompatible on-disk format + ** for the -shm file. Any change that causes one of these asserts to + ** fail is a backward compatibility problem, even if the change otherwise + ** works. + ** + ** This table also serves as a helpful cross-reference when trying to + ** interpret hex dumps of the -shm file. + */ + assert( 48 == sizeof(WalIndexHdr) ); + assert( 40 == sizeof(WalCkptInfo) ); + assert( 120 == WALINDEX_LOCK_OFFSET ); + assert( 136 == WALINDEX_HDR_SIZE ); + assert( 4096 == HASHTABLE_NPAGE ); + assert( 4062 == HASHTABLE_NPAGE_ONE ); + assert( 8192 == HASHTABLE_NSLOT ); + assert( 383 == HASHTABLE_HASH_1 ); + assert( 32768 == WALINDEX_PGSZ ); + assert( 8 == SQLITE_SHM_NLOCK ); + assert( 5 == WAL_NREADER ); + assert( 24 == WAL_HDRSIZE ); + assert( 120 == WALINDEX_LOCK_OFFSET + WAL_WRITE_LOCK ); + assert( 121 == WALINDEX_LOCK_OFFSET + WAL_CKPT_LOCK ); + assert( 122 == WALINDEX_LOCK_OFFSET + WAL_RECOVER_LOCK ); + assert( 123 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(0) ); + assert( 124 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(1) ); + assert( 125 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(2) ); + assert( 126 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(3) ); + assert( 127 == WALINDEX_LOCK_OFFSET + WAL_READ_LOCK(4) ); + /* In the amalgamation, the os_unix.c and os_win.c source files come before ** this source file. Verify that the #defines of the locking byte offsets ** in os_unix.c and os_win.c agree with the WALINDEX_LOCK_OFFSET value. ** For that matter, if the lock offset ever changes from its initial design ** value of 120, we need to know that so there is an assert() to check it. */ - assert( 120==WALINDEX_LOCK_OFFSET ); - assert( 136==WALINDEX_HDR_SIZE ); #ifdef WIN_SHM_BASE assert( WIN_SHM_BASE==WALINDEX_LOCK_OFFSET ); #endif From 20de9f6cb11276ed8f6b53915d5d6d999230039b Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 29 Jul 2021 16:49:28 +0000 Subject: [PATCH 090/100] Minor tweaks to various TCL build scripts so that they work even for TCL 8.4, which is obsolete, but is also all that is available for some legacy platforms. FossilOrigin-Name: 2269ce64f707c4a198fcb9a72933648ea61a80b4251024b8058ff28ad81b4917 --- ext/fts5/tool/mkfts5c.tcl | 3 ++- manifest | 16 ++++++++-------- manifest.uuid | 2 +- tool/mkopcodec.tcl | 3 ++- tool/mkshellc.tcl | 6 ++++-- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/ext/fts5/tool/mkfts5c.tcl b/ext/fts5/tool/mkfts5c.tcl index 797811d46e..b1a55fa4ae 100644 --- a/ext/fts5/tool/mkfts5c.tcl +++ b/ext/fts5/tool/mkfts5c.tcl @@ -60,7 +60,8 @@ proc fts5_source_id {zDir} { set L [split [readfile [file join $top manifest]]] set date [lindex $L [expr [lsearch -exact $L D]+1]] - set date [string range $date 0 [string last . $date]-1] + set idx [expr {[string last . $date]-1}] + set date [string range $date 0 $idx] set date [string map {T { }} $date] return "fts5: $date $uuid" diff --git a/manifest b/manifest index 02d491aeb1..120bb226b7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\scomments\sand\sadd\snew\sassert()\sstatements\sin\sWAL\sto\shelp\sdocument\nhow\severything\sworks. -D 2021-07-29T16:48:21.089 +C Minor\stweaks\sto\svarious\sTCL\sbuild\sscripts\sso\sthat\sthey\swork\seven\sfor\sTCL\s8.4,\nwhich\sis\sobsolete,\sbut\sis\salso\sall\sthat\sis\savailable\sfor\ssome\slegacy\splatforms. +D 2021-07-29T16:49:28.900 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -233,7 +233,7 @@ F ext/fts5/test/fts5vocab2.test c0a8397523561eb780b4f439e75d4969fade0ac40bc73e0c F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl c0d43c8590656f8240e622b00957b3a0facc49482411a9fdc2870b45c0c82f9f F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 -F ext/fts5/tool/mkfts5c.tcl d1c2a9ab8e0ec690a52316f33dd9b1d379942f45 +F ext/fts5/tool/mkfts5c.tcl 3eba8e9bee4221ed165f3304b51b2a74a705f4ec5df3d044573a2be539534af8 F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c F ext/icu/README.txt 1c48ffaf7f255bd73d00a35f68f6de357c2a6594f16cb00506a151be23694706 F ext/icu/icu.c 91c021c7e3e8bbba286960810fa303295c622e323567b2e6def4ce58e4466e60 @@ -1850,11 +1850,11 @@ F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650 F tool/mkctimec.tcl 5ef1891ed3d0e8143ff39bad7c01ed60c2817a2fb2d9a09487f7ccad2df621e4 F tool/mkkeywordhash.c 08b6e4d7a482a7f37a9a0032e7ba968e26624a027b6b2e9ba589be6f5e3d8c2c F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 -F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c +F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef F tool/mkopcodeh.tcl 130b88697da6ec5b89b41844d955d08fb62c2552e889dec8c7bcecb28d8f50bd F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa F tool/mkpragmatab.tcl 7f6db47d1995bc08247255622524567b2ab8962d98063f8aef97e35c3c54e3b8 -F tool/mkshellc.tcl 5fe7e518112b262e25726f248c0f33dd153192867453984b6af0a76a88e97cb2 +F tool/mkshellc.tcl df5d249617f9cc94d5c48eb0401673eb3f31f383ecbc54e8a13ca3dd97e89450 F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f @@ -1920,7 +1920,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 4d1dbfa35c7dc0f09321b2e274a00e506f4ca65322454652d5891d815a6966d3 -R 7a7643ec86e1f4d8e14a77c61b23a38c +P 23b08fe9db24a953cc231b093cf74d140c9965d22964d0401ff8ab3d4ecba443 +R 7cc2835397664c86246e99abe4a64984 U drh -Z faf097f1ce1cc5bd6964b75ff7d837f7 +Z 6820ddb47fc7506cf54e2e30c650a734 diff --git a/manifest.uuid b/manifest.uuid index 7ff76c7e5c..dd5cdfac06 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23b08fe9db24a953cc231b093cf74d140c9965d22964d0401ff8ab3d4ecba443 \ No newline at end of file +2269ce64f707c4a198fcb9a72933648ea61a80b4251024b8058ff28ad81b4917 \ No newline at end of file diff --git a/tool/mkopcodec.tcl b/tool/mkopcodec.tcl index abdeaaeb32..5eac05fc02 100644 --- a/tool/mkopcodec.tcl +++ b/tool/mkopcodec.tcl @@ -22,7 +22,8 @@ puts "const char *sqlite3OpcodeName(int i)\173" puts " static const char *const azName\[\] = \173" set mx 0 -set in [open [lindex $argv 0] rb] +set in [open [lindex $argv 0]] +fconfigure $in -translation binary while {![eof $in]} { set line [gets $in] if {[regexp {^#define OP_} $line]} { diff --git a/tool/mkshellc.tcl b/tool/mkshellc.tcl index 46c2a528fe..82ecd2f61a 100644 --- a/tool/mkshellc.tcl +++ b/tool/mkshellc.tcl @@ -30,7 +30,8 @@ puts $out {/* DO NOT EDIT! ** edit the src/shell.c.in" and/or some of the other files that are included ** by "src/shell.c.in", then rerun the tool/mkshellc.tcl script. */} -set in [open $topdir/src/shell.c.in rb] +set in [open $topdir/src/shell.c.in] +fconfigure $in -translation binary proc omit_redundant_typedefs {line} { global typedef_seen if {[regexp {^typedef .*;} $line]} { @@ -50,7 +51,8 @@ while {1} { set cfile [lindex $lx 1] puts $out "/************************* Begin $cfile ******************/" # puts $out "#line 1 \"$cfile\"" - set in2 [open $topdir/src/$cfile rb] + set in2 [open $topdir/src/$cfile] + fconfigure $in2 -translation binary while {![eof $in2]} { set lx [omit_redundant_typedefs [gets $in2]] if {[regexp {^#include "sqlite} $lx]} { From 944d85dfe23b12d7055c0e4452f8b5d99c1906a9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 29 Jul 2021 17:01:44 +0000 Subject: [PATCH 091/100] Fix an error in one of the assert() statements added by [23b08fe9db24a953]. FossilOrigin-Name: ad24334bc06dc9ae52825a1873a1eab6c258d77fcc00dec55884ddddecd9932e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wal.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 120bb226b7..8846c82ec0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\stweaks\sto\svarious\sTCL\sbuild\sscripts\sso\sthat\sthey\swork\seven\sfor\sTCL\s8.4,\nwhich\sis\sobsolete,\sbut\sis\salso\sall\sthat\sis\savailable\sfor\ssome\slegacy\splatforms. -D 2021-07-29T16:49:28.900 +C Fix\san\serror\sin\sone\sof\sthe\sassert()\sstatements\sadded\sby\s[23b08fe9db24a953]. +D 2021-07-29T17:01:44.518 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -628,7 +628,7 @@ F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb7 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c 3a9a6ae1fd14f7c00af184233cb9f3bced89ae277a75a312f85fb77297a3cdfa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 1b1e7311d3f12ab60c012734e49ebf048d6eeb4485b6f077bd79f340e9c36731 +F src/wal.c ce589eddfba84f9f89e789d08ea5ffe9e85454cbbfaba8fd42a258e3e08cf5e5 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 07c63dde6ab72477b964f4c81bee61ef78a246ca149bb9a560784f2e85cd78d7 @@ -1920,7 +1920,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 23b08fe9db24a953cc231b093cf74d140c9965d22964d0401ff8ab3d4ecba443 -R 7cc2835397664c86246e99abe4a64984 +P 2269ce64f707c4a198fcb9a72933648ea61a80b4251024b8058ff28ad81b4917 +R d8e804ce8738bf098491021b76160220 U drh -Z 6820ddb47fc7506cf54e2e30c650a734 +Z 804b14c8c136144aca6d8b2088fe3d7f diff --git a/manifest.uuid b/manifest.uuid index dd5cdfac06..81ebe7246f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2269ce64f707c4a198fcb9a72933648ea61a80b4251024b8058ff28ad81b4917 \ No newline at end of file +ad24334bc06dc9ae52825a1873a1eab6c258d77fcc00dec55884ddddecd9932e \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 4b1d63e8d0..ce9394d156 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1433,7 +1433,8 @@ int sqlite3WalOpen( assert( 32768 == WALINDEX_PGSZ ); assert( 8 == SQLITE_SHM_NLOCK ); assert( 5 == WAL_NREADER ); - assert( 24 == WAL_HDRSIZE ); + assert( 24 == WAL_FRAME_HDRSIZE ); + assert( 32 == WAL_HDRSIZE ); assert( 120 == WALINDEX_LOCK_OFFSET + WAL_WRITE_LOCK ); assert( 121 == WALINDEX_LOCK_OFFSET + WAL_CKPT_LOCK ); assert( 122 == WALINDEX_LOCK_OFFSET + WAL_RECOVER_LOCK ); From 5025cb581f4c1949342b491ec8ce4d9dab749b0b Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 29 Jul 2021 17:23:23 +0000 Subject: [PATCH 092/100] Complete warning-free build on old PPC iBook. FossilOrigin-Name: ef2a0850394b1c6c1fc84b26694a3712ae1e50d52bb78fea2ec40148a7d833de --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 1 + src/vdbeaux.c | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 8846c82ec0..08aa89e51f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\serror\sin\sone\sof\sthe\sassert()\sstatements\sadded\sby\s[23b08fe9db24a953]. -D 2021-07-29T17:01:44.518 +C Complete\swarning-free\sbuild\son\sold\sPPC\siBook. +D 2021-07-29T17:23:23.932 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -549,7 +549,7 @@ F src/shell.c.in 24b99dae8818d1a234732d73f4d5b49f12b510bc62735a41c04e314fafae09e F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h b3762f49d8b6b4bf7bf30d154f007d6f9421c86343042d7a246a79988d1fec1a +F src/sqliteInt.h 441f226f8e5de526fcbddc092d6fa7f99df12985bf29411399219e79196caf82 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -620,7 +620,7 @@ F src/vdbe.c b73a5ec9940185eb001ff8cff2cfd429bb438c7e89f2885e0bfdb56c3ff13386 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 -F src/vdbeaux.c 564622045316eb2eed1370714426e81ab96d86e7894a368e80a83e0baff23346 +F src/vdbeaux.c 202dbaf7d1570cd53678f6b0bcad7b0642e88bc5d77abc1d5b8b9a202a6a19fd F src/vdbeblob.c c6b8db50b227f66fb404215732068df76485b5b433e5f9d4d9ac27410b218193 F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 @@ -1920,7 +1920,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 2269ce64f707c4a198fcb9a72933648ea61a80b4251024b8058ff28ad81b4917 -R d8e804ce8738bf098491021b76160220 +P ad24334bc06dc9ae52825a1873a1eab6c258d77fcc00dec55884ddddecd9932e +R 0cc81a8b442d38496113a96ee86b0452 U drh -Z 804b14c8c136144aca6d8b2088fe3d7f +Z fb51ecf5d08ca6d7c7f076fcbd12aa41 diff --git a/manifest.uuid b/manifest.uuid index 81ebe7246f..843b94000a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ad24334bc06dc9ae52825a1873a1eab6c258d77fcc00dec55884ddddecd9932e \ No newline at end of file +ef2a0850394b1c6c1fc84b26694a3712ae1e50d52bb78fea2ec40148a7d833de \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 651116aa9e..25eb9f1089 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -861,6 +861,7 @@ typedef INT16_TYPE LogEst; # define SQLITE_PTRSIZE __SIZEOF_POINTER__ # elif defined(i386) || defined(__i386__) || defined(_M_IX86) || \ defined(_M_ARM) || defined(__arm__) || defined(__x86) || \ + (defined(__APPLE__) && defined(__POWERPC__)) || \ (defined(__TOS_AIX__) && !defined(__64BIT__)) # define SQLITE_PTRSIZE 4 # else diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 5c9ab11c7d..a6bb915e1c 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1660,7 +1660,7 @@ char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ case P4_COLLSEQ: { static const char *const encnames[] = {"?", "8", "16LE", "16BE"}; CollSeq *pColl = pOp->p4.pColl; - assert( pColl->enc>=0 && pColl->enc<4 ); + assert( pColl->enc<4 ); sqlite3_str_appendf(&x, "%.18s-%s", pColl->zName, encnames[pColl->enc]); break; From f873392dde80f3628c1582d6b026778b07e1e3cf Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 29 Jul 2021 18:34:35 +0000 Subject: [PATCH 093/100] Enhance the wal.c source file with an ASCII-art schematic of the -shm file header. FossilOrigin-Name: a6c160e08a61d105f8aab959440ac5ec4f1aaca8f0d393e08e7c2c67815b5bb2 --- manifest | 13 +++++------ manifest.uuid | 2 +- src/wal.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2adaf55f14..43773f70d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sasserts\sto\senforce\smagic\snumbers\sin\sthe\swal-index\sformat.\nAlso\simprove\sautomatic\sconfigure\sand\smake\sbuilds\son\slegacy\sPPC\siBooks. -D 2021-07-29T17:31:40.386 +C Enhance\sthe\swal.c\ssource\sfile\swith\san\sASCII-art\sschematic\sof\sthe\s-shm\sfile\nheader. +D 2021-07-29T18:34:35.597 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -628,7 +628,7 @@ F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb7 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c 3a9a6ae1fd14f7c00af184233cb9f3bced89ae277a75a312f85fb77297a3cdfa F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c ce589eddfba84f9f89e789d08ea5ffe9e85454cbbfaba8fd42a258e3e08cf5e5 +F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac F src/where.c 07c63dde6ab72477b964f4c81bee61ef78a246ca149bb9a560784f2e85cd78d7 @@ -1920,8 +1920,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 4d1dbfa35c7dc0f09321b2e274a00e506f4ca65322454652d5891d815a6966d3 ef2a0850394b1c6c1fc84b26694a3712ae1e50d52bb78fea2ec40148a7d833de -R 0cc81a8b442d38496113a96ee86b0452 -T +closed ef2a0850394b1c6c1fc84b26694a3712ae1e50d52bb78fea2ec40148a7d833de +P 87b8d47889f1990442aa90398614656658207085d064381074f72bda9bdcbfa5 +R d8c25bc87f149d13a2a70b86ca69893f U drh -Z 98161da94e50e1df5812fdb04f331f1a +Z 666b852ed7a04d1347b165527afd3943 diff --git a/manifest.uuid b/manifest.uuid index 3b5473b5ca..0e2535e1ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -87b8d47889f1990442aa90398614656658207085d064381074f72bda9bdcbfa5 \ No newline at end of file +a6c160e08a61d105f8aab959440ac5ec4f1aaca8f0d393e08e7c2c67815b5bb2 \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index ce9394d156..83929ea467 100644 --- a/src/wal.c +++ b/src/wal.c @@ -400,6 +400,70 @@ struct WalCkptInfo { }; #define READMARK_NOT_USED 0xffffffff +/* +** This is a schematic view of the complete 136-byte header of the +** wal-index file (also known as the -shm file): +** +** +-----------------------------+ +** 0: | iVersion | \ +** +-----------------------------+ | +** 4: | (unused padding) | | +** +-----------------------------+ | +** 8: | iChange | | +** +-------+-------+-------------+ | +** 12: | bInit | bBig | szPage | | +** +-------+-------+-------------+ | +** 16: | mxFrame | | First copy of the +** +-----------------------------+ | WalIndexHdr object +** 20: | nPage | | +** +-----------------------------+ | +** 24: | aFrameCksum | | +** | | | +** +-----------------------------+ | +** 32: | aSalt | | +** | | | +** +-----------------------------+ | +** 40: | aCksum | | +** | | / +** +-----------------------------+ +** 48: | iVersion | \ +** +-----------------------------+ | +** 52: | (unused padding) | | +** +-----------------------------+ | +** 56: | iChange | | +** +-------+-------+-------------+ | +** 60: | bInit | bBig | szPage | | +** +-------+-------+-------------+ | Second copy of the +** 64: | mxFrame | | WalIndexHdr +** +-----------------------------+ | +** 68: | nPage | | +** +-----------------------------+ | +** 72: | aFrameCksum | | +** | | | +** +-----------------------------+ | +** 80: | aSalt | | +** | | | +** +-----------------------------+ | +** 88: | aCksum | | +** | | / +** +-----------------------------+ +** 96: | nBackfill | +** +-----------------------------+ +** 100: | 5 read marks | +** | | +** | | +** | | +** | | +** +-------+-------+------+------+ +** 120: | Write | Ckpt | Rcvr | Rd0 | \ +** +-------+-------+------+------+ ) 8 lock bytes +** | Read1 | Read2 | Rd3 | Rd4 | / +** +-------+-------+------+------+ +** 128: | nBackfillAttempted | +** +-----------------------------+ +** 132: | (unused padding) | +** +-----------------------------+ +*/ /* A block of WALINDEX_LOCK_RESERVED bytes beginning at ** WALINDEX_LOCK_OFFSET is reserved for locks. Since some systems From 7b3c514b5324156c8ba4c9fbb0548f374ccdb629 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 30 Jul 2021 12:47:35 +0000 Subject: [PATCH 094/100] Reduce clownfooting in the allocation of the Table.aCol array. This reduces the amount of heap space required to hold large schemas by about 11%. FossilOrigin-Name: 2941ded0acbdcf914567bf7451cfd9b770269545c20d3fa7107c40492689afad --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/build.c | 14 ++++++-------- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 43773f70d7..edf0ee35b2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\swal.c\ssource\sfile\swith\san\sASCII-art\sschematic\sof\sthe\s-shm\sfile\nheader. -D 2021-07-29T18:34:35.597 +C Reduce\sclownfooting\sin\sthe\sallocation\sof\sthe\sTable.aCol\sarray.\s\sThis\sreduces\nthe\samount\sof\sheap\sspace\srequired\sto\shold\slarge\sschemas\sby\sabout\s11%. +D 2021-07-30T12:47:35.850 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 9978caf1e5c6c82d04d85e290d46979abc2219fb79bcd970258d1ebe368d184e +F src/build.c 218628f5743e2329959f66269928ac9521cc5e7f69d8bcc0e90a57f2715fe0ae F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -1920,7 +1920,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 87b8d47889f1990442aa90398614656658207085d064381074f72bda9bdcbfa5 -R d8c25bc87f149d13a2a70b86ca69893f +P a6c160e08a61d105f8aab959440ac5ec4f1aaca8f0d393e08e7c2c67815b5bb2 +R 05be268cc1d65b192983539c10fe9664 U drh -Z 666b852ed7a04d1347b165527afd3943 +Z 293e50cb88f37ee66f4747a547b7dd6f diff --git a/manifest.uuid b/manifest.uuid index 0e2535e1ad..bfefc3402b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a6c160e08a61d105f8aab959440ac5ec4f1aaca8f0d393e08e7c2c67815b5bb2 \ No newline at end of file +2941ded0acbdcf914567bf7451cfd9b770269545c20d3fa7107c40492689afad \ No newline at end of file diff --git a/src/build.c b/src/build.c index 824c104743..4f6f50a20c 100644 --- a/src/build.c +++ b/src/build.c @@ -1381,6 +1381,7 @@ void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ Column *pCol; sqlite3 *db = pParse->db; u8 hName; + Column *aNew; if( (p = pParse->pNewTable)==0 ) return; if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){ @@ -1401,15 +1402,12 @@ void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ return; } } - if( (p->nCol & 0x7)==0 ){ - Column *aNew; - aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+8)*sizeof(p->aCol[0])); - if( aNew==0 ){ - sqlite3DbFree(db, z); - return; - } - p->aCol = aNew; + aNew = sqlite3DbRealloc(db,p->aCol,(p->nCol+1)*sizeof(p->aCol[0])); + if( aNew==0 ){ + sqlite3DbFree(db, z); + return; } + p->aCol = aNew; pCol = &p->aCol[p->nCol]; memset(pCol, 0, sizeof(p->aCol[0])); pCol->zName = z; From 77441faff5f4d5cee08c747116fae97b48eeb9b0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 30 Jul 2021 18:39:59 +0000 Subject: [PATCH 095/100] Avoid clownfeet in the names columns when the column names are quoted in the original CREATE TABLE statement. FossilOrigin-Name: 980f7292afd45a8e73272e2139b55b99ab86167febec9fd0bf0356e8167b2ee9 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/build.c | 17 +++++++++-------- src/parse.y | 2 +- src/sqliteInt.h | 3 ++- src/util.c | 29 +++++++++++++++++++++++++++-- 6 files changed, 49 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index edf0ee35b2..4346c12927 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reduce\sclownfooting\sin\sthe\sallocation\sof\sthe\sTable.aCol\sarray.\s\sThis\sreduces\nthe\samount\sof\sheap\sspace\srequired\sto\shold\slarge\sschemas\sby\sabout\s11%. -D 2021-07-30T12:47:35.850 +C Avoid\sclownfeet\sin\sthe\snames\scolumns\swhen\sthe\scolumn\snames\sare\squoted\nin\sthe\soriginal\sCREATE\sTABLE\sstatement. +D 2021-07-30T18:39:59.675 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 218628f5743e2329959f66269928ac9521cc5e7f69d8bcc0e90a57f2715fe0ae +F src/build.c 8b0a6aa7dbce272c66f282f7aeec6e37ee1c7ded21e8f5a6e3864b0ab6ccdb29 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -533,7 +533,7 @@ F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 6d90c816edf65e99fb978c3b5486df5e661c3534347efac2842b80eb02263e68 +F src/parse.y 0ba0baec5de6921ec8ba8bbcf1018969144ef29d26112e17539d8fbb1662e3eb F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f @@ -549,7 +549,7 @@ F src/shell.c.in 24b99dae8818d1a234732d73f4d5b49f12b510bc62735a41c04e314fafae09e F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 441f226f8e5de526fcbddc092d6fa7f99df12985bf29411399219e79196caf82 +F src/sqliteInt.h 1041c70f63687392665dde29f87f8af27d27bc1e18d29c8b804360fc915c2fde F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -614,7 +614,7 @@ F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 F src/update.c 30465f9accc854e8a7932b413578027fbb68186132abbb36e01d2022473fc83d F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c 41c7a72da1df47864faa378a1c720b38adb288c6838cb6be5594511b6287a048 +F src/util.c b2cb568393144b05df06871b2c61b0f0240f1835aee2843c736391507fac2780 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vdbe.c b73a5ec9940185eb001ff8cff2cfd429bb438c7e89f2885e0bfdb56c3ff13386 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe @@ -1920,7 +1920,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 a6c160e08a61d105f8aab959440ac5ec4f1aaca8f0d393e08e7c2c67815b5bb2 -R 05be268cc1d65b192983539c10fe9664 +P 2941ded0acbdcf914567bf7451cfd9b770269545c20d3fa7107c40492689afad +R 34387fa0540aea58caf42bd33cbb64b5 U drh -Z 293e50cb88f37ee66f4747a547b7dd6f +Z a43263f36582e13af1a30f741180b3be diff --git a/manifest.uuid b/manifest.uuid index bfefc3402b..50ed690d5f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2941ded0acbdcf914567bf7451cfd9b770269545c20d3fa7107c40492689afad \ No newline at end of file +980f7292afd45a8e73272e2139b55b99ab86167febec9fd0bf0356e8167b2ee9 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 4f6f50a20c..5d2936f5b9 100644 --- a/src/build.c +++ b/src/build.c @@ -1373,7 +1373,7 @@ void sqlite3AddReturning(Parse *pParse, ExprList *pList){ ** first to get things going. Then this routine is called for each ** column. */ -void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ +void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ Table *p; int i; char *z; @@ -1388,11 +1388,12 @@ void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ sqlite3ErrorMsg(pParse, "too many columns on %s", p->zName); return; } - z = sqlite3DbMallocRaw(db, pName->n + pType->n + 2); + if( !IN_RENAME_OBJECT ) sqlite3DequoteToken(&sName); + z = sqlite3DbMallocRaw(db, sName.n + sType.n + 2); if( z==0 ) return; - if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, pName); - memcpy(z, pName->z, pName->n); - z[pName->n] = 0; + if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, &sName); + memcpy(z, sName.z, sName.n); + z[sName.n] = 0; sqlite3Dequote(z); hName = sqlite3StrIHash(z); for(i=0; inCol; i++){ @@ -1414,7 +1415,7 @@ void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ pCol->hName = hName; sqlite3ColumnPropertiesFromName(p, pCol); - if( pType->n==0 ){ + if( sType.n==0 ){ /* If there is no type specified, columns have the default affinity ** 'BLOB' with a default size of 4 bytes. */ pCol->affinity = SQLITE_AFF_BLOB; @@ -1426,8 +1427,8 @@ void sqlite3AddColumn(Parse *pParse, Token *pName, Token *pType){ #endif }else{ zType = z + sqlite3Strlen30(z) + 1; - memcpy(zType, pType->z, pType->n); - zType[pType->n] = 0; + memcpy(zType, sType.z, sType.n); + zType[sType.n] = 0; sqlite3Dequote(zType); pCol->affinity = sqlite3AffinityType(zType, pCol); pCol->colFlags |= COLFLAG_HASTYPE; diff --git a/src/parse.y b/src/parse.y index 1e07825589..24c539bdb3 100644 --- a/src/parse.y +++ b/src/parse.y @@ -215,7 +215,7 @@ table_options(A) ::= WITHOUT nm(X). { } columnlist ::= columnlist COMMA columnname carglist. columnlist ::= columnname carglist. -columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,&A,&Y);} +columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,A,Y);} // Declare some tokens early in order to influence their values, to // improve performance and reduce the executable size. The goal here is diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 25eb9f1089..7d6fda4c66 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4317,6 +4317,7 @@ void sqlite3ErrorMsg(Parse*, const char*, ...); int sqlite3ErrorToParser(sqlite3*,int); void sqlite3Dequote(char*); void sqlite3DequoteExpr(Expr*); +void sqlite3DequoteToken(Token*); void sqlite3TokenInit(Token*,char*); int sqlite3KeywordCode(const unsigned char*, int); int sqlite3RunParser(Parse*, const char*, char **); @@ -4383,7 +4384,7 @@ void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); #else # define sqlite3ColumnPropertiesFromName(T,C) /* no-op */ #endif -void sqlite3AddColumn(Parse*,Token*,Token*); +void sqlite3AddColumn(Parse*,Token,Token); void sqlite3AddNotNull(Parse*, int); void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); void sqlite3AddCheckConstraint(Parse*, Expr*, const char*, const char*); diff --git a/src/util.c b/src/util.c index fc0c2042bd..8bcf1d261a 100644 --- a/src/util.c +++ b/src/util.c @@ -89,8 +89,11 @@ int sqlite3Strlen30(const char *z){ ** the column name if and only if the COLFLAG_HASTYPE flag is set. */ char *sqlite3ColumnType(Column *pCol, char *zDflt){ - if( (pCol->colFlags & COLFLAG_HASTYPE)==0 ) return zDflt; - return pCol->zName + strlen(pCol->zName) + 1; + if( pCol->colFlags & COLFLAG_HASTYPE ){ + return pCol->zName + strlen(pCol->zName) + 1; + }else{ + return zDflt; + } } /* @@ -266,6 +269,28 @@ void sqlite3DequoteExpr(Expr *p){ sqlite3Dequote(p->u.zToken); } +/* +** If the input token p is quoted, try to adjust the token to remove +** the quotes. This is not always possible: +** +** "abc" -> abc +** "ab""cd" -> (not possible because of the interior "") +** +** Remove the quotes if possible. This is a optimization. The overall +** system should still return the correct answer even if this routine +** is always a no-op. +*/ +void sqlite3DequoteToken(Token *p){ + int i; + if( p->n<2 ) return; + if( !sqlite3Isquote(p->z[0]) ) return; + for(i=1; in-1; i++){ + if( sqlite3Isquote(p->z[i]) ) return; + } + p->n -= 2; + p->z++; +} + /* ** Generate a Token object from a string */ From e48f261ebfd36b4935c2d700269790239dac37e5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 30 Jul 2021 20:09:08 +0000 Subject: [PATCH 096/100] If a generated column uses the optional keywords GENERATE ALWAYS, try to avoid putting those keywords in the typename of the column. [forum:/forumpost/ff3ffe09251c105b|Forum post ff3ffe09251c105b] FossilOrigin-Name: 3c954863f45271a3518acf51fd685a641878811fb5cfcbdbad85154aeccdc902 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 18 ++++++++++++++++++ test/gencol1.test | 16 ++++++++++++++++ 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 4346c12927..f62c0433cf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sclownfeet\sin\sthe\snames\scolumns\swhen\sthe\scolumn\snames\sare\squoted\nin\sthe\soriginal\sCREATE\sTABLE\sstatement. -D 2021-07-30T18:39:59.675 +C If\sa\sgenerated\scolumn\suses\sthe\soptional\skeywords\sGENERATE\sALWAYS,\stry\sto\savoid\nputting\sthose\skeywords\sin\sthe\stypename\sof\sthe\scolumn.\n[forum:/forumpost/ff3ffe09251c105b|Forum\spost\sff3ffe09251c105b] +D 2021-07-30T20:09:08.819 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 8b0a6aa7dbce272c66f282f7aeec6e37ee1c7ded21e8f5a6e3864b0ab6ccdb29 +F src/build.c fedaf923ea61eed3496f5ef6fca6e3162344faf109e8d0228f61c7a24b92fe6a F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -1062,7 +1062,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test b05e6c5edb9b10d48efb634ed07342441bddc89d225043e17095c36e567521a0 +F test/gencol1.test 26c55577b15f78069bacf8afee994b74b9d69aa690577db9cff926b10e4e6be2 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test a89236dd8d55aa50c4805f82ac9daf64d477a44d712d8209c118978d0ca21ec9 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1920,7 +1920,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 2941ded0acbdcf914567bf7451cfd9b770269545c20d3fa7107c40492689afad -R 34387fa0540aea58caf42bd33cbb64b5 +P 980f7292afd45a8e73272e2139b55b99ab86167febec9fd0bf0356e8167b2ee9 +R 5e0d17f3eda249159c66a4dab795bade U drh -Z a43263f36582e13af1a30f741180b3be +Z b92983df8210770e5aba5b5d6965da26 diff --git a/manifest.uuid b/manifest.uuid index 50ed690d5f..b98c86df86 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -980f7292afd45a8e73272e2139b55b99ab86167febec9fd0bf0356e8167b2ee9 \ No newline at end of file +3c954863f45271a3518acf51fd685a641878811fb5cfcbdbad85154aeccdc902 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 5d2936f5b9..43112a4cd0 100644 --- a/src/build.c +++ b/src/build.c @@ -1389,6 +1389,24 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ return; } if( !IN_RENAME_OBJECT ) sqlite3DequoteToken(&sName); + + /* Because keywords GENERATE ALWAYS can be converted into indentifiers + ** by the parser, we can sometimes end up with a typename that ends + ** with "generated always". Check for this case and omit the surplus + ** text. */ + if( sType.n>=16 + && sqlite3_strnicmp(sType.z+(sType.n-6),"always",6)==0 + ){ + sType.n -= 6; + while( ALWAYS(sType.n>0) && sqlite3Isspace(sType.z[sType.n-1]) ) sType.n--; + if( sType.n>=9 + && sqlite3_strnicmp(sType.z+(sType.n-9),"generated",9)==0 + ){ + sType.n -= 9; + while( sType.n>0 && sqlite3Isspace(sType.z[sType.n-1]) ) sType.n--; + } + } + z = sqlite3DbMallocRaw(db, sName.n + sType.n + 2); if( z==0 ) return; if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, &sName); diff --git a/test/gencol1.test b/test/gencol1.test index 43f48dff78..c0bb52361e 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -585,5 +585,21 @@ do_execsql_test gencol1-20.2 { SELECT * FROM tab; } {2001-01-01 0 0 5 {}} +# 2021-07-30 forum https://sqlite.org/forum/forumpost/ff3ffe09251c105b?t=h +# +reset_db +do_execsql_test gencol1-21.1 { + CREATE TABLE t1( + a integer primary key, + b int generated always as (a+5), + c text GENERATED ALWAYS as (printf('%08x',a)), + d Generated + Always + AS ('xyzzy'), + e int Always default(5) + ); + INSERT INTO t1(a) VALUES(5); + SELECT name, type FROM pragma_table_xinfo('t1'); +} {a integer b int c text d {} e {int}} finish_test From c2df4d6adb44e5f9587bf962c917c46c603825c9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 30 Jul 2021 23:30:30 +0000 Subject: [PATCH 097/100] Recognize certain standard datatypes ("INT", "INTEGER", "REAL", "TEXT", and "BLOB") and if a column has one of those datatypes, store the type part of the bit-field information in the Column structure to save space. FossilOrigin-Name: d2da62a9df63036b02dadca3798de9e623c2680b3ef0c37d2b18bb88693afd7f --- manifest | 28 ++++++++++++++-------------- manifest.uuid | 2 +- src/build.c | 36 ++++++++++++++++++++++++++++++------ src/global.c | 20 ++++++++++++++++++++ src/sqliteInt.h | 19 +++++++++++++++++++ src/util.c | 3 +++ test/capi2.test | 12 ++++++------ test/gencol1.test | 2 +- test/pragma.test | 2 +- test/tclsqlite.test | 2 +- test/vtabA.test | 2 +- 11 files changed, 97 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index f62c0433cf..e3ec8ecc4f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sa\sgenerated\scolumn\suses\sthe\soptional\skeywords\sGENERATE\sALWAYS,\stry\sto\savoid\nputting\sthose\skeywords\sin\sthe\stypename\sof\sthe\scolumn.\n[forum:/forumpost/ff3ffe09251c105b|Forum\spost\sff3ffe09251c105b] -D 2021-07-30T20:09:08.819 +C Recognize\scertain\sstandard\sdatatypes\s("INT",\s"INTEGER",\s"REAL",\s"TEXT",\sand\n"BLOB")\sand\sif\sa\scolumn\shas\sone\sof\sthose\sdatatypes,\sstore\sthe\stype\spart\sof\nthe\sbit-field\sinformation\sin\sthe\sColumn\sstructure\sto\ssave\sspace. +D 2021-07-30T23:30:30.921 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c fedaf923ea61eed3496f5ef6fca6e3162344faf109e8d0228f61c7a24b92fe6a +F src/build.c e9ff9104d6d64dd2a000ca9cc7d25c80a5b1a3fd2422b4e0d84afee8c8bef78b F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -500,7 +500,7 @@ F src/expr.c b1bcf90afb7dcc0fae4d81116177e3d02e0803f81fd543c10fcd0691390b6adf F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c -F src/global.c 25ba4d58476f6be29bba9d9d14f7f146b78476d3a4d75ebb8c3b736328afe0f9 +F src/global.c 5eba017ebbd887e2365e6e6e815e1619e41406b8946d17594e94116174787df5 F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h cb1d7e3e1ed94b7aa6fde95ae2c2daccc3df826be26fc9ed7fd90d1750ae6144 @@ -549,7 +549,7 @@ F src/shell.c.in 24b99dae8818d1a234732d73f4d5b49f12b510bc62735a41c04e314fafae09e F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 1041c70f63687392665dde29f87f8af27d27bc1e18d29c8b804360fc915c2fde +F src/sqliteInt.h e2fbf849a7e0ee1842a4775952a61c966f9eb25075297dd2f3aff5b5e4418415 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -614,7 +614,7 @@ F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 F src/update.c 30465f9accc854e8a7932b413578027fbb68186132abbb36e01d2022473fc83d F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c b2cb568393144b05df06871b2c61b0f0240f1835aee2843c736391507fac2780 +F src/util.c 6ca9cf268dfaf2393866990788c0797240e20e7ba7e3a22cd076e6a3c7b1a132 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vdbe.c b73a5ec9940185eb001ff8cff2cfd429bb438c7e89f2885e0bfdb56c3ff13386 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe @@ -747,7 +747,7 @@ F test/busy2.test dbfb61b3265e7a962d3bcd32cd542bbe3d7801edbda6438d35af5aa707cae9 F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61 F test/cachespill.test 895997f84a25b323b166aecb69baab2d6380ea98f9e0bcc688c4493c535cfab9 -F test/capi2.test 34a1a9a96d543a2ec2c209696b11b164444f57253b1f2cba1c2e53fadede6c7b +F test/capi2.test 4ee545824adc3eb33bf57ef89f77440b28188ec3da72e5425ff0fcdba32e8d5a F test/capi3.test 3910a73c38ac76d69778dd9eb481ab7cd6ed59117fc047b4f6056a5c72529de1 F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b @@ -1062,7 +1062,7 @@ F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test 26c55577b15f78069bacf8afee994b74b9d69aa690577db9cff926b10e4e6be2 +F test/gencol1.test 6912c4280d0ad26d6e3d133a93c5abd6db0e00bc5c95d6159131a62ab4e6f586 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 F test/having.test a89236dd8d55aa50c4805f82ac9daf64d477a44d712d8209c118978d0ca21ec9 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 @@ -1270,7 +1270,7 @@ F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff F test/permutations.test 63da39a4234eed2ccd10bf7872de58e24d53a50d11014dc8a8ab9f252368e880 F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f -F test/pragma.test 50b91bedea9324d3ab48e793f908ee7d2c7dcf84bfa2281e792838be59641ec8 +F test/pragma.test 30d5bbebd5e9cb5383155cf3f3c81297b98f6642d152e9d4100cf6888630da2c F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 F test/pragma4.test ca5e4dfc46adfe490f75d73734f70349d95a199e6510973899e502eef2c8b1f8 @@ -1446,7 +1446,7 @@ F test/tabfunc01.test d6821e7042e5653104dac0c63d75eff24a2415ab1889fc68b5db7fde59 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 79a473f5797e317c08f2c4f8192edb3eea6a67329b1087453328b66a7cb31070 +F test/tclsqlite.test 316c96f974f0e6d7480186e3f5bb53413e5ee5480596544a97484888912a365c F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 @@ -1695,7 +1695,7 @@ F test/vtab6.test 8e789f526e6594cf7ae933d1adee0caa87dc9f78 F test/vtab7.test 70c6f4a1d6177144a8236e4172d5fba92e683440374664ad1f04851fbb335d3c F test/vtab8.test e19fa4a538fcd1bb66c22825fa8f71618fb13583 F test/vtab9.test ea58d2b95d61955f87226381716b2d0b1d4e4f9b -F test/vtabA.test 1317f06a03597eee29f40a49b6c21e1aaba4285f +F test/vtabA.test 325a77e7f0f80aa78ab388875c0ad6fb853acc6ac54d85514650b0ae15da24ff F test/vtabB.test 04df5dc531b9f44d9ca65b9c1b79f12b5922a796 F test/vtabC.test 4528f459a13136f982e75614d120aef165f17292 F test/vtabD.test 05b3f1d77117271671089e48719524b676842e96 @@ -1920,7 +1920,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 980f7292afd45a8e73272e2139b55b99ab86167febec9fd0bf0356e8167b2ee9 -R 5e0d17f3eda249159c66a4dab795bade +P 3c954863f45271a3518acf51fd685a641878811fb5cfcbdbad85154aeccdc902 +R 6b5f2c664834813a7df89f39b77ebda9 U drh -Z b92983df8210770e5aba5b5d6965da26 +Z 12d963d3ccf8007e48d95666e4982a9e diff --git a/manifest.uuid b/manifest.uuid index b98c86df86..639f1a3b26 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c954863f45271a3518acf51fd685a641878811fb5cfcbdbad85154aeccdc902 \ No newline at end of file +d2da62a9df63036b02dadca3798de9e623c2680b3ef0c37d2b18bb88693afd7f \ No newline at end of file diff --git a/src/build.c b/src/build.c index 43112a4cd0..8b45df3cad 100644 --- a/src/build.c +++ b/src/build.c @@ -1382,6 +1382,9 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ sqlite3 *db = pParse->db; u8 hName; Column *aNew; + u8 eType = COLTYPE_CUSTOM; + u8 szEst = 1; + char affinity = SQLITE_AFF_BLOB; if( (p = pParse->pNewTable)==0 ) return; if( p->nCol+1>db->aLimit[SQLITE_LIMIT_COLUMN] ){ @@ -1407,7 +1410,25 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ } } - z = sqlite3DbMallocRaw(db, sName.n + sType.n + 2); + /* Check for standard typenames. For standard typenames we will + ** set the Column.eType field rather than storing the typename after + ** the column name, in order to save space. */ + if( sType.n>=3 ){ + sqlite3DequoteToken(&sType); + for(i=0; i0) ); if( z==0 ) return; if( IN_RENAME_OBJECT ) sqlite3RenameTokenMap(pParse, (void*)z, &sName); memcpy(z, sName.z, sName.n); @@ -1436,11 +1457,14 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ if( sType.n==0 ){ /* If there is no type specified, columns have the default affinity ** 'BLOB' with a default size of 4 bytes. */ - pCol->affinity = SQLITE_AFF_BLOB; - pCol->szEst = 1; + pCol->affinity = affinity; + pCol->eType = eType; + pCol->szEst = szEst; #ifdef SQLITE_ENABLE_SORTER_REFERENCES - if( 4>=sqlite3GlobalConfig.szSorterRef ){ - pCol->colFlags |= COLFLAG_SORTERREF; + if( affinity==SQLITE_AFF_BLOB ){ + if( 4>=sqlite3GlobalConfig.szSorterRef ){ + pCol->colFlags |= COLFLAG_SORTERREF; + } } #endif }else{ @@ -1729,7 +1753,7 @@ void sqlite3AddPrimaryKey( } if( nTerm==1 && pCol - && sqlite3StrICmp(sqlite3ColumnType(pCol,""), "INTEGER")==0 + && pCol->eType==COLTYPE_INTEGER && sortOrder!=SQLITE_SO_DESC ){ if( IN_RENAME_OBJECT && pList ){ diff --git a/src/global.c b/src/global.c index 4648c26d95..a1398fef5d 100644 --- a/src/global.c +++ b/src/global.c @@ -347,3 +347,23 @@ const unsigned char sqlite3OpcodeProperty[] = OPFLG_INITIALIZER; ** Name of the default collating sequence */ const char sqlite3StrBINARY[] = "BINARY"; + +/* +** Standard typenames. These names must match the COLTYPE_* definitions. +** Adjust the SQLITE_N_STDTYPE value if adding or removing entries. +*/ +const unsigned char sqlite3StdTypeLen[] = { 4, 3, 7, 4, 4 }; +const char sqlite3StdTypeAffinity[] = { + SQLITE_AFF_BLOB, + SQLITE_AFF_INTEGER, + SQLITE_AFF_INTEGER, + SQLITE_AFF_REAL, + SQLITE_AFF_TEXT +}; +const char *sqlite3StdType[] = { + "BLOB", + "INT", + "INTEGER", + "REAL", + "TEXT" +}; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 7d6fda4c66..8f63d777ab 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2037,9 +2037,25 @@ struct Column { char affinity; /* One of the SQLITE_AFF_... values */ u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ u8 hName; /* Column name hash for faster lookup */ + u8 eType; /* One of the standard types */ u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ }; +/* Allowed values for Column.eType. +** +** Values must match entries in the global constant arrays +** sqlite3StdTypeLen[] and sqlite3StdType[]. Each value is one more +** than the offset into these arrays for the corresponding name. +** Adjust the SQLITE_N_STDTYPE value if adding or removing entries. +*/ +#define COLTYPE_CUSTOM 0 /* Type appended to zName */ +#define COLTYPE_BLOB 1 +#define COLTYPE_INT 2 +#define COLTYPE_INTEGER 3 +#define COLTYPE_REAL 4 +#define COLTYPE_TEXT 5 +#define SQLITE_N_STDTYPE 5 /* Number of standard types */ + /* Allowed values for Column.colFlags. ** ** Constraints: @@ -4794,6 +4810,9 @@ void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8); #ifndef SQLITE_AMALGAMATION extern const unsigned char sqlite3OpcodeProperty[]; extern const char sqlite3StrBINARY[]; +extern const unsigned char sqlite3StdTypeLen[]; +extern const char sqlite3StdTypeAffinity[]; +extern const char *sqlite3StdType[]; extern const unsigned char sqlite3UpperToLower[]; extern const unsigned char *sqlite3aLTb; extern const unsigned char *sqlite3aEQb; diff --git a/src/util.c b/src/util.c index 8bcf1d261a..d513d8f79b 100644 --- a/src/util.c +++ b/src/util.c @@ -91,6 +91,9 @@ int sqlite3Strlen30(const char *z){ char *sqlite3ColumnType(Column *pCol, char *zDflt){ if( pCol->colFlags & COLFLAG_HASTYPE ){ return pCol->zName + strlen(pCol->zName) + 1; + }else if( pCol->eType ){ + assert( pCol->eType<=SQLITE_N_STDTYPE ); + return (char*)sqlite3StdType[pCol->eType-1]; }else{ return zDflt; } diff --git a/test/capi2.test b/test/capi2.test index 0680cf530c..de47ab3d4f 100644 --- a/test/capi2.test +++ b/test/capi2.test @@ -64,13 +64,13 @@ do_test capi2-1.4 { } {t1 1} do_test capi2-1.5 { get_column_names $VM -} {name rowid text INTEGER} +} {name rowid TEXT INTEGER} do_test capi2-1.6 { sqlite3_step $VM } {SQLITE_DONE} do_test capi2-1.7 { list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] -} {2 {} {name rowid text INTEGER}} +} {2 {} {name rowid TEXT INTEGER}} # This used to be SQLITE_MISUSE. But now we automatically reset prepared # statements. @@ -91,7 +91,7 @@ ifcapable autoreset { do_test capi2-1.9 { sqlite3_reset $VM list [sqlite3_column_count $VM] [get_row_values $VM] [get_column_names $VM] -} {2 {} {name rowid text INTEGER}} +} {2 {} {name rowid TEXT INTEGER}} do_test capi2-1.10 { sqlite3_data_count $VM } {0} @@ -120,13 +120,13 @@ do_test capi2-2.2 { lappend r [sqlite3_column_count $VM] \ [get_row_values $VM] \ [get_column_names $VM] -} {SQLITE_ROW 2 {t1 1} {name rowid text INTEGER}} +} {SQLITE_ROW 2 {t1 1} {name rowid TEXT INTEGER}} do_test capi2-2.3 { set r [sqlite3_step $VM] lappend r [sqlite3_column_count $VM] \ [get_row_values $VM] \ [get_column_names $VM] -} {SQLITE_DONE 2 {} {name rowid text INTEGER}} +} {SQLITE_DONE 2 {} {name rowid TEXT INTEGER}} do_test capi2-2.4 { sqlite3_finalize $VM } {SQLITE_OK} @@ -141,7 +141,7 @@ do_test capi2-2.6 { lappend r [sqlite3_column_count $VM] \ [get_row_values $VM] \ [get_column_names $VM] -} {SQLITE_DONE 2 {} {name rowid text INTEGER}} +} {SQLITE_DONE 2 {} {name rowid TEXT INTEGER}} do_test capi2-2.7 { sqlite3_finalize $VM } {SQLITE_OK} diff --git a/test/gencol1.test b/test/gencol1.test index c0bb52361e..f09b880d67 100644 --- a/test/gencol1.test +++ b/test/gencol1.test @@ -600,6 +600,6 @@ do_execsql_test gencol1-21.1 { ); INSERT INTO t1(a) VALUES(5); SELECT name, type FROM pragma_table_xinfo('t1'); -} {a integer b int c text d {} e {int}} +} {a INTEGER b INT c TEXT d {} e INT} finish_test diff --git a/test/pragma.test b/test/pragma.test index 04f5bd0fbe..c4b9d334ae 100644 --- a/test/pragma.test +++ b/test/pragma.test @@ -815,7 +815,7 @@ do_test pragma-6.7 { ORDER BY cid} } [concat \ {0 one INT 1 -1 0} \ - {1 two text 0 {} 0} \ + {1 two TEXT 0 {} 0} \ {2 three {VARCHAR(45, 65)} 0 'abcde' 0} \ {3 four REAL 0 X'abcdef' 0} \ {4 five {} 0 CURRENT_TIME 0} \ diff --git a/test/tclsqlite.test b/test/tclsqlite.test index c111325bcb..b7e160e07e 100644 --- a/test/tclsqlite.test +++ b/test/tclsqlite.test @@ -166,7 +166,7 @@ do_test tcl-2.1 { ifcapable schema_pragmas { do_test tcl-2.2 { execsql "PRAGMA table_info(t\u0123x)" - } "0 a int 0 {} 0 1 b\u1235 float 0 {} 0" + } "0 a INT 0 {} 0 1 b\u1235 float 0 {} 0" } do_test tcl-2.3 { execsql "INSERT INTO t\u0123x VALUES(1,2.3)" diff --git a/test/vtabA.test b/test/vtabA.test index eddaa70d1f..4c9beae026 100644 --- a/test/vtabA.test +++ b/test/vtabA.test @@ -128,7 +128,7 @@ proc analyse_parse {columns decltype_list} { do_test vtabA-2.1 { analyse_parse {(a text, b integer hidden, c hidden)} {a b c} -} {a text integer {}} +} {a TEXT integer {}} do_test vtabA-2.2 { analyse_parse {(a hidden , b integerhidden, c hidden1)} {a b c} From 79cf2b7120ea382a2649698656860d09740e6205 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 31 Jul 2021 20:30:41 +0000 Subject: [PATCH 098/100] Refactor the way that DEFAULT expressions are stored on columns, in order to save memory in the common case where the column has no DEFAULT clause. FossilOrigin-Name: 8646547e54211d44c415663c33775c4268550f8332949c4731a4bb6ec9cc663a --- manifest | 28 +++++++++++----------- manifest.uuid | 2 +- src/alter.c | 12 ++++++---- src/build.c | 63 +++++++++++++++++++++++++++++++++++++++---------- src/expr.c | 13 +++++----- src/fkey.c | 2 +- src/insert.c | 39 +++++++++++++++++++----------- src/pragma.c | 7 ++++-- src/sqliteInt.h | 11 +++++---- src/update.c | 9 ++++--- src/vtab.c | 2 ++ 11 files changed, 126 insertions(+), 62 deletions(-) diff --git a/manifest b/manifest index e3ec8ecc4f..e1878e788b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Recognize\scertain\sstandard\sdatatypes\s("INT",\s"INTEGER",\s"REAL",\s"TEXT",\sand\n"BLOB")\sand\sif\sa\scolumn\shas\sone\sof\sthose\sdatatypes,\sstore\sthe\stype\spart\sof\nthe\sbit-field\sinformation\sin\sthe\sColumn\sstructure\sto\ssave\sspace. -D 2021-07-30T23:30:30.921 +C Refactor\sthe\sway\sthat\sDEFAULT\sexpressions\sare\sstored\son\scolumns,\sin\sorder\nto\ssave\smemory\sin\sthe\scommon\scase\swhere\sthe\scolumn\shas\sno\sDEFAULT\sclause. +D 2021-07-31T20:30:41.189 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c a54e0a5ae778271a0bc67bdb590c1b3bba0ee59669474f976afb862ccee0026e +F src/alter.c 87c9b91d15826cbb2d289f4cff3bc5671935ec3b238e307407087e615220788a F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -488,7 +488,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c e9ff9104d6d64dd2a000ca9cc7d25c80a5b1a3fd2422b4e0d84afee8c8bef78b +F src/build.c 19d9283feae27045cfd5712ae4cabcac91a9b7bf619e651f1571e9637bd7f65d F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -496,16 +496,16 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c b1bcf90afb7dcc0fae4d81116177e3d02e0803f81fd543c10fcd0691390b6adf +F src/expr.c 84691a9d63baddcc6c735080a9b347e7f6feedb04c293730284999c92af95371 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c e9063648396c58778f77583a678342fe4a9bc82436bf23c5f9f444f2df0fdaa4 +F src/fkey.c 1df6ad21908d84adb6d1297d7657ccd239c8ef0836e3a457d1fe15318393933b F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c F src/global.c 5eba017ebbd887e2365e6e6e815e1619e41406b8946d17594e94116174787df5 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 d560dc585c50e01b015cbf924c173de88f61c8c85b3d1adb9d4865b92fff2d72 +F src/insert.c 6f10127cc5c8bb3631f25bad89f6d2f9c53606df789449f6af7b8647d8f97b4f F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e F src/main.c 5d024b9b96d9c6809e66b7f4864c3745bc8caf2a6af3b27dc0f05328f4439dfd @@ -537,7 +537,7 @@ F src/parse.y 0ba0baec5de6921ec8ba8bbcf1018969144ef29d26112e17539d8fbb1662e3eb F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f -F src/pragma.c 9fe75aa29e8706a2cf6b9c1600ac05a2efc55c44ce719b65aa45d10ff58acc9d +F src/pragma.c e8efa185aaaa4c4036fc40572b74ff9bb5317520c3a1886567093b5ac8b15381 F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b @@ -549,7 +549,7 @@ F src/shell.c.in 24b99dae8818d1a234732d73f4d5b49f12b510bc62735a41c04e314fafae09e F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h e2fbf849a7e0ee1842a4775952a61c966f9eb25075297dd2f3aff5b5e4418415 +F src/sqliteInt.h ea94bc5f087522abe62550bb73ef1d7f78d28337fc3834cd676ef39d143ef2c2 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -611,7 +611,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e F src/treeview.c 43f88d0fd19976a60aee6867959213b438593276f1e8179048df85f416a1ab19 F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 -F src/update.c 30465f9accc854e8a7932b413578027fbb68186132abbb36e01d2022473fc83d +F src/update.c d2648c47202cf54104c94b427209be0350e667fbf4b825a61cae54ef86aaf1d9 F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 6ca9cf268dfaf2393866990788c0797240e20e7ba7e3a22cd076e6a3c7b1a132 @@ -626,7 +626,7 @@ F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb724 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c -F src/vtab.c 3a9a6ae1fd14f7c00af184233cb9f3bced89ae277a75a312f85fb77297a3cdfa +F src/vtab.c 516cb50e2a57359155db7f71d98f1690dc9cae84d359a1c6801b2615dc3cf362 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a @@ -1920,7 +1920,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 3c954863f45271a3518acf51fd685a641878811fb5cfcbdbad85154aeccdc902 -R 6b5f2c664834813a7df89f39b77ebda9 +P d2da62a9df63036b02dadca3798de9e623c2680b3ef0c37d2b18bb88693afd7f +R 2bd36d7d73ef054d58c2b5fa1473f7b9 U drh -Z 12d963d3ccf8007e48d95666e4982a9e +Z d1f622cc8631b67a8482f1c93905c30a diff --git a/manifest.uuid b/manifest.uuid index 639f1a3b26..c4363aa39e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2da62a9df63036b02dadca3798de9e623c2680b3ef0c37d2b18bb88693afd7f \ No newline at end of file +8646547e54211d44c415663c33775c4268550f8332949c4731a4bb6ec9cc663a \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index c29be3f6e0..1d1e2d811b 100644 --- a/src/alter.c +++ b/src/alter.c @@ -337,7 +337,7 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ zDb = db->aDb[iDb].zDbSName; zTab = &pNew->zName[16]; /* Skip the "sqlite_altertab_" prefix on the name */ pCol = &pNew->aCol[pNew->nCol-1]; - pDflt = pCol->pDflt; + pDflt = sqlite3ColumnExpr(pNew, pCol); pTab = sqlite3FindTable(db, zTab, zDb); assert( pTab ); @@ -539,8 +539,8 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ pCol->zName = sqlite3DbStrDup(db, pCol->zName); pCol->hName = sqlite3StrIHash(pCol->zName); pCol->zColl = 0; - pCol->pDflt = 0; } + pNew->pDfltList = sqlite3ExprListDup(db, pTab->pDfltList, 0); pNew->pSchema = db->aDb[iDb].pSchema; pNew->addColOffset = pTab->addColOffset; pNew->nTabRef = 1; @@ -1528,7 +1528,9 @@ static void renameColumnFunc( } #ifndef SQLITE_OMIT_GENERATED_COLUMNS for(i=0; inCol; i++){ - sqlite3WalkExpr(&sWalker, sParse.pNewTable->aCol[i].pDflt); + Expr *pExpr = sqlite3ColumnExpr(sParse.pNewTable, + &sParse.pNewTable->aCol[i]); + sqlite3WalkExpr(&sWalker, pExpr); } #endif } @@ -1874,7 +1876,9 @@ static void renameQuotefixFunc( sqlite3WalkExprList(&sWalker, sParse.pNewTable->pCheck); #ifndef SQLITE_OMIT_GENERATED_COLUMNS for(i=0; inCol; i++){ - sqlite3WalkExpr(&sWalker, sParse.pNewTable->aCol[i].pDflt); + sqlite3WalkExpr(&sWalker, + sqlite3ColumnExpr(sParse.pNewTable, + &sParse.pNewTable->aCol[i])); } #endif /* SQLITE_OMIT_GENERATED_COLUMNS */ } diff --git a/src/build.c b/src/build.c index 8b45df3cad..33f0015fd7 100644 --- a/src/build.c +++ b/src/build.c @@ -667,6 +667,42 @@ void sqlite3CommitInternalChanges(sqlite3 *db){ db->mDbFlags &= ~DBFLAG_SchemaChange; } +/* +** Set the expression associated with a column. This is usually +** the DEFAULT value, but might also be the expression that computes +** the value for a generated column. +*/ +void sqlite3ColumnSetExpr( + Parse *pParse, /* Parsing context */ + Table *pTab, /* The table containing the column */ + Column *pCol, /* The column to receive the new DEFAULT expression */ + Expr *pExpr /* The new default expression */ +){ + ExprList *pList = pTab->pDfltList; + if( pCol->iDflt==0 + || pList==0 + || pList->nExpriDflt + ){ + pCol->iDflt = pList==0 ? 1 : pList->nExpr+1; + pTab->pDfltList = sqlite3ExprListAppend(pParse, pList, pExpr); + }else{ + sqlite3ExprDelete(pParse->db, pList->a[pCol->iDflt-1].pExpr); + pList->a[pCol->iDflt-1].pExpr = pExpr; + } +} + +/* +** Return the expression associated with a column. The expression might be +** the DEFAULT clause or the AS clause of a generated column. +** Return NULL if the column has no associated expression. +*/ +Expr *sqlite3ColumnExpr(Table *pTab, Column *pCol){ + if( pCol->iDflt==0 ) return 0; + if( pTab->pDfltList==0 ) return 0; + if( pTab->pDfltList->nExpriDflt ) return 0; + return pTab->pDfltList->a[pCol->iDflt-1].pExpr; +} + /* ** Delete memory allocated for the column names of a table or view (the ** Table.aCol[] array). @@ -679,10 +715,15 @@ void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ for(i=0; inCol; i++, pCol++){ assert( pCol->zName==0 || pCol->hName==sqlite3StrIHash(pCol->zName) ); sqlite3DbFree(db, pCol->zName); - sqlite3ExprDelete(db, pCol->pDflt); sqlite3DbFree(db, pCol->zColl); } sqlite3DbFree(db, pTable->aCol); + sqlite3ExprListDelete(db, pTable->pDfltList); + if( db==0 || db->pnBytesFreed==0 ){ + pTable->aCol = 0; + pTable->nCol = 0; + pTable->pDfltList = 0; + } } } @@ -1636,15 +1677,15 @@ void sqlite3AddDefaultValue( /* A copy of pExpr is used instead of the original, as pExpr contains ** tokens that point to volatile memory. */ - Expr x; - sqlite3ExprDelete(db, pCol->pDflt); + Expr x, *pDfltExpr; memset(&x, 0, sizeof(x)); x.op = TK_SPAN; x.u.zToken = sqlite3DbSpanDup(db, zStart, zEnd); x.pLeft = pExpr; x.flags = EP_Skip; - pCol->pDflt = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE); + pDfltExpr = sqlite3ExprDup(db, &x, EXPRDUP_REDUCE); sqlite3DbFree(db, x.u.zToken); + sqlite3ColumnSetExpr(pParse, p, pCol, pDfltExpr); } } if( IN_RENAME_OBJECT ){ @@ -1868,7 +1909,7 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ sqlite3ErrorMsg(pParse, "virtual tables cannot use computed columns"); goto generated_done; } - if( pCol->pDflt ) goto generated_error; + if( pCol->iDflt>0 ) goto generated_error; if( pType ){ if( pType->n==7 && sqlite3StrNICmp("virtual",pType->z,7)==0 ){ /* no-op */ @@ -1886,7 +1927,7 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ if( pCol->colFlags & COLFLAG_PRIMKEY ){ makeColumnPartOfPrimaryKey(pParse, pCol); /* For the error message */ } - pCol->pDflt = pExpr; + sqlite3ColumnSetExpr(pParse, pTab, pCol, pExpr); pExpr = 0; goto generated_done; @@ -2540,7 +2581,7 @@ void sqlite3EndTable( for(ii=0; iinCol; ii++){ u32 colFlags = p->aCol[ii].colFlags; if( (colFlags & COLFLAG_GENERATED)!=0 ){ - Expr *pX = p->aCol[ii].pDflt; + Expr *pX = sqlite3ColumnExpr(p, &p->aCol[ii]); testcase( colFlags & COLFLAG_VIRTUAL ); testcase( colFlags & COLFLAG_STORED ); if( sqlite3ResolveSelfReference(pParse, p, NC_GenCol, pX, 0) ){ @@ -2550,8 +2591,8 @@ void sqlite3EndTable( ** tree that have been allocated from lookaside memory, which is ** illegal in a schema and will lead to errors or heap corruption ** when the database connection closes. */ - sqlite3ExprDelete(db, pX); - p->aCol[ii].pDflt = sqlite3ExprAlloc(db, TK_NULL, 0, 0); + sqlite3ColumnSetExpr(pParse, p, &p->aCol[ii], + sqlite3ExprAlloc(db, TK_NULL, 0, 0)); } }else{ nNG++; @@ -2965,8 +3006,6 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pTable->pSchema->schemaFlags |= DB_UnresetViews; if( db->mallocFailed ){ sqlite3DeleteColumnNames(db, pTable); - pTable->aCol = 0; - pTable->nCol = 0; } #endif /* SQLITE_OMIT_VIEW */ return nErr; @@ -2985,8 +3024,6 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){ Table *pTab = sqliteHashData(i); if( pTab->pSelect ){ sqlite3DeleteColumnNames(db, pTab); - pTab->aCol = 0; - pTab->nCol = 0; } } DbClearProperty(db, idx, DB_UnresetViews); diff --git a/src/expr.c b/src/expr.c index dea2695461..04881be8ca 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3643,9 +3643,10 @@ void sqlite3ExprCodeLoadIndexColumn( ** and store the result in register regOut */ void sqlite3ExprCodeGeneratedColumn( - Parse *pParse, - Column *pCol, - int regOut + Parse *pParse, /* Parsing context */ + Table *pTab, /* Table containing the generated column */ + Column *pCol, /* The generated column */ + int regOut /* Put the result in this register */ ){ int iAddr; Vdbe *v = pParse->pVdbe; @@ -3656,7 +3657,7 @@ void sqlite3ExprCodeGeneratedColumn( }else{ iAddr = 0; } - sqlite3ExprCodeCopy(pParse, pCol->pDflt, regOut); + sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(pTab,pCol), regOut); if( pCol->affinity>=SQLITE_AFF_TEXT ){ sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1); } @@ -3697,7 +3698,7 @@ void sqlite3ExprCodeGetColumnOfTable( int savedSelfTab = pParse->iSelfTab; pCol->colFlags |= COLFLAG_BUSY; pParse->iSelfTab = iTabCur+1; - sqlite3ExprCodeGeneratedColumn(pParse, pCol, regOut); + sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, regOut); pParse->iSelfTab = savedSelfTab; pCol->colFlags &= ~COLFLAG_BUSY; } @@ -4031,7 +4032,7 @@ expr_code_doover: } pCol->colFlags |= COLFLAG_BUSY; if( pCol->colFlags & COLFLAG_NOTAVAIL ){ - sqlite3ExprCodeGeneratedColumn(pParse, pCol, iSrc); + sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, iSrc); } pCol->colFlags &= ~(COLFLAG_BUSY|COLFLAG_NOTAVAIL); return iSrc; diff --git a/src/fkey.c b/src/fkey.c index 9f622f40c6..2e743c7022 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -1279,7 +1279,7 @@ static Trigger *fkActionTrigger( testcase( pCol->colFlags & COLFLAG_STORED ); pDflt = 0; }else{ - pDflt = pCol->pDflt; + pDflt = sqlite3ColumnExpr(pFKey->pFrom, pCol); } if( pDflt ){ pNew = sqlite3ExprDup(db, pDflt, 0); diff --git a/src/insert.c b/src/insert.c index 63ffa5edd0..867ab76fd1 100644 --- a/src/insert.c +++ b/src/insert.c @@ -293,7 +293,7 @@ void sqlite3ComputeGeneratedColumns( int x; pCol->colFlags |= COLFLAG_BUSY; w.eCode = 0; - sqlite3WalkExpr(&w, pCol->pDflt); + sqlite3WalkExpr(&w, sqlite3ColumnExpr(pTab, pCol)); pCol->colFlags &= ~COLFLAG_BUSY; if( w.eCode & COLFLAG_NOTAVAIL ){ pRedo = pCol; @@ -302,7 +302,7 @@ void sqlite3ComputeGeneratedColumns( eProgress = 1; assert( pCol->colFlags & COLFLAG_GENERATED ); x = sqlite3TableColumnToStorage(pTab, i) + iRegStore; - sqlite3ExprCodeGeneratedColumn(pParse, pCol, x); + sqlite3ExprCodeGeneratedColumn(pParse, pTab, pCol, x); pCol->colFlags &= ~COLFLAG_NOTAVAIL; } } @@ -1088,7 +1088,9 @@ void sqlite3Insert( }else if( pColumn==0 ){ /* Hidden columns that are not explicitly named in the INSERT ** get there default value */ - sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + sqlite3ExprCodeFactorable(pParse, + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), + iRegStore); continue; } } @@ -1097,13 +1099,17 @@ void sqlite3Insert( if( j>=pColumn->nId ){ /* A column not named in the insert column list gets its ** default value */ - sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + sqlite3ExprCodeFactorable(pParse, + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), + iRegStore); continue; } k = j; }else if( nColumn==0 ){ /* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */ - sqlite3ExprCodeFactorable(pParse, pTab->aCol[i].pDflt, iRegStore); + sqlite3ExprCodeFactorable(pParse, + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), + iRegStore); continue; }else{ k = i - nHidden; @@ -1669,7 +1675,7 @@ void sqlite3GenerateConstraintChecks( } if( onError==OE_Replace ){ if( b2ndPass /* REPLACE becomes ABORT on the 2nd pass */ - || pCol->pDflt==0 /* REPLACE is ABORT if no DEFAULT value */ + || pCol->iDflt==0 /* REPLACE is ABORT if no DEFAULT value */ ){ testcase( pCol->colFlags & COLFLAG_VIRTUAL ); testcase( pCol->colFlags & COLFLAG_STORED ); @@ -1691,7 +1697,8 @@ void sqlite3GenerateConstraintChecks( VdbeCoverage(v); assert( (pCol->colFlags & COLFLAG_GENERATED)==0 ); nSeenReplace++; - sqlite3ExprCodeCopy(pParse, pCol->pDflt, iReg); + sqlite3ExprCodeCopy(pParse, + sqlite3ColumnExpr(pTab, pCol), iReg); sqlite3VdbeJumpHere(v, addr1); break; } @@ -2412,7 +2419,7 @@ void sqlite3SetMakeRecordP5(Vdbe *v, Table *pTab){ if( pTab->pSchema->file_format<2 ) return; for(i=pTab->nCol-1; i>0; i--){ - if( pTab->aCol[i].pDflt!=0 ) break; + if( pTab->aCol[i].iDflt!=0 ) break; if( pTab->aCol[i].colFlags & COLFLAG_PRIMKEY ) break; } sqlite3VdbeChangeP5(v, i+1); @@ -2829,7 +2836,9 @@ static int xferOptimization( ** This requirement could be relaxed for VIRTUAL columns, I suppose. */ if( (pDestCol->colFlags & COLFLAG_GENERATED)!=0 ){ - if( sqlite3ExprCompare(0, pSrcCol->pDflt, pDestCol->pDflt, -1)!=0 ){ + if( sqlite3ExprCompare(0, + sqlite3ColumnExpr(pSrc, pSrcCol), + sqlite3ColumnExpr(pDest, pDestCol), -1)!=0 ){ testcase( pDestCol->colFlags & COLFLAG_VIRTUAL ); testcase( pDestCol->colFlags & COLFLAG_STORED ); return 0; /* Different generator expressions */ @@ -2847,11 +2856,13 @@ static int xferOptimization( } /* Default values for second and subsequent columns need to match. */ if( (pDestCol->colFlags & COLFLAG_GENERATED)==0 && i>0 ){ - assert( pDestCol->pDflt==0 || pDestCol->pDflt->op==TK_SPAN ); - assert( pSrcCol->pDflt==0 || pSrcCol->pDflt->op==TK_SPAN ); - if( (pDestCol->pDflt==0)!=(pSrcCol->pDflt==0) - || (pDestCol->pDflt && strcmp(pDestCol->pDflt->u.zToken, - pSrcCol->pDflt->u.zToken)!=0) + Expr *pDestExpr = sqlite3ColumnExpr(pDest, pDestCol); + Expr *pSrcExpr = sqlite3ColumnExpr(pSrc, pSrcCol); + assert( pDestExpr==0 || pDestExpr->op==TK_SPAN ); + assert( pSrcExpr==0 || pSrcExpr->op==TK_SPAN ); + if( (pDestExpr==0)!=(pSrcExpr==0) + || (pDestExpr!=0 && strcmp(pDestExpr->u.zToken, + pSrcExpr->u.zToken)!=0) ){ return 0; /* Default values must be the same for all columns */ } diff --git a/src/pragma.c b/src/pragma.c index e0cf5ced50..0427bb972f 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1177,13 +1177,16 @@ void sqlite3Pragma( }else{ for(k=1; k<=pTab->nCol && pPk->aiColumn[k-1]!=i; k++){} } - assert( pCol->pDflt==0 || pCol->pDflt->op==TK_SPAN || isHidden>=2 ); + assert( sqlite3ColumnExpr(pTab,pCol)==0 + || sqlite3ColumnExpr(pTab,pCol)->op==TK_SPAN + || isHidden>=2 ); sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", i-nHidden, pCol->zName, sqlite3ColumnType(pCol,""), pCol->notNull ? 1 : 0, - pCol->pDflt && isHidden<2 ? pCol->pDflt->u.zToken : 0, + isHidden>=2 || sqlite3ColumnExpr(pTab,pCol)==0 ? 0 : + sqlite3ColumnExpr(pTab,pCol)->u.zToken, k, isHidden); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 8f63d777ab..3fbb148d40 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2031,13 +2031,13 @@ struct Module { */ struct Column { char *zName; /* Name of this column, \000, then the type */ - Expr *pDflt; /* Default value or GENERATED ALWAYS AS value */ char *zColl; /* Collating sequence. If NULL, use the default */ - u8 notNull; /* An OE_ code for handling a NOT NULL constraint */ + u8 notNull : 4; /* An OE_ code for handling a NOT NULL constraint */ + u8 eType : 4; /* One of the standard types */ char affinity; /* One of the SQLITE_AFF_... values */ u8 szEst; /* Estimated size of value in this column. sizeof(INT)==1 */ u8 hName; /* Column name hash for faster lookup */ - u8 eType; /* One of the standard types */ + u16 iDflt; /* 1-based index of DEFAULT. 0 means "none" */ u16 colFlags; /* Boolean properties. See COLFLAG_ defines below */ }; @@ -2213,6 +2213,7 @@ struct Table { char *zColAff; /* String defining the affinity of each column */ ExprList *pCheck; /* All CHECK constraints */ /* ... also used as column name list in a VIEW */ + ExprList *pDfltList; /* DEFAULT clauses on various columns */ Pgno tnum; /* Root BTree page for this table */ u32 nTabRef; /* Number of pointers to this Table */ u32 tabFlags; /* Mask of TF_* values */ @@ -4379,6 +4380,8 @@ void sqlite3ResetAllSchemasOfConnection(sqlite3*); void sqlite3ResetOneSchema(sqlite3*,int); void sqlite3CollapseDatabaseArray(sqlite3*); void sqlite3CommitInternalChanges(sqlite3*); +void sqlite3ColumnSetExpr(Parse*,Table*,Column*,Expr*); +Expr *sqlite3ColumnExpr(Table*,Column*); void sqlite3DeleteColumnNames(sqlite3*,Table*); void sqlite3GenerateColumnNames(Parse *pParse, Select *pSelect); int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); @@ -4517,7 +4520,7 @@ void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int); void sqlite3ExprCodeMove(Parse*, int, int, int); void sqlite3ExprCode(Parse*, Expr*, int); #ifndef SQLITE_OMIT_GENERATED_COLUMNS -void sqlite3ExprCodeGeneratedColumn(Parse*, Column*, int); +void sqlite3ExprCodeGeneratedColumn(Parse*, Table*, Column*, int); #endif void sqlite3ExprCodeCopy(Parse*, Expr*, int); void sqlite3ExprCodeFactorable(Parse*, Expr*, int); diff --git a/src/update.c b/src/update.c index c5a01f8969..f93d85bd5e 100644 --- a/src/update.c +++ b/src/update.c @@ -66,7 +66,8 @@ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ Column *pCol = &pTab->aCol[i]; VdbeComment((v, "%s.%s", pTab->zName, pCol->zName)); assert( inCol ); - sqlite3ValueFromExpr(sqlite3VdbeDb(v), pCol->pDflt, enc, + sqlite3ValueFromExpr(sqlite3VdbeDb(v), + sqlite3ColumnExpr(pTab,pCol), enc, pCol->affinity, &pValue); if( pValue ){ sqlite3VdbeAppendP4(v, pValue, P4_MEM); @@ -526,8 +527,10 @@ void sqlite3Update( for(i=0; inCol; i++){ if( aXRef[i]>=0 ) continue; if( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ) continue; - if( sqlite3ExprReferencesUpdatedColumn(pTab->aCol[i].pDflt, - aXRef, chngRowid) ){ + if( sqlite3ExprReferencesUpdatedColumn( + sqlite3ColumnExpr(pTab, &pTab->aCol[i]), + aXRef, chngRowid) + ){ aXRef[i] = 99999; bProgress = 1; } diff --git a/src/vtab.c b/src/vtab.c index 1a9457c24d..25672bcce0 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -829,10 +829,12 @@ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ Table *pNew = sParse.pNewTable; Index *pIdx; pTab->aCol = pNew->aCol; + pTab->pDfltList = pNew->pDfltList; pTab->nNVCol = pTab->nCol = pNew->nCol; pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); pNew->nCol = 0; pNew->aCol = 0; + pNew->pDfltList = 0; assert( pTab->pIndex==0 ); assert( HasRowid(pNew) || sqlite3PrimaryKeyIndex(pNew)!=0 ); if( !HasRowid(pNew) From f38524d20db165c94dc94e06b62f0aad5942a03b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 2 Aug 2021 16:41:57 +0000 Subject: [PATCH 099/100] Refactor the Table object to reduce its memory footprint. FossilOrigin-Name: bbb6759bcf6e01d36dfc787a82a610d359f50aaeac8104b73883a84906d54e1f --- manifest | 40 ++++++++++++------------ manifest.uuid | 2 +- src/alter.c | 54 +++++++++++++++++--------------- src/build.c | 73 ++++++++++++++++++++++++++----------------- src/delete.c | 8 ++--- src/expr.c | 2 +- src/fkey.c | 23 ++++++++------ src/insert.c | 21 +++++-------- src/main.c | 2 +- src/pragma.c | 12 +++++--- src/select.c | 29 ++++++++--------- src/sqliteInt.h | 82 +++++++++++++++++++++++++++++-------------------- src/trigger.c | 4 +-- src/update.c | 6 ++-- src/vdbeblob.c | 5 +-- src/vtab.c | 82 ++++++++++++++++++++++++------------------------- src/where.c | 6 ++-- 17 files changed, 246 insertions(+), 205 deletions(-) diff --git a/manifest b/manifest index e1878e788b..1a7d194773 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactor\sthe\sway\sthat\sDEFAULT\sexpressions\sare\sstored\son\scolumns,\sin\sorder\nto\ssave\smemory\sin\sthe\scommon\scase\swhere\sthe\scolumn\shas\sno\sDEFAULT\sclause. -D 2021-07-31T20:30:41.189 +C Refactor\sthe\sTable\sobject\sto\sreduce\sits\smemory\sfootprint. +D 2021-08-02T16:41:57.123 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,7 +478,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 87c9b91d15826cbb2d289f4cff3bc5671935ec3b238e307407087e615220788a +F src/alter.c e73e2dad9338274b53c04ba5fdcb8653fef898e4709b65d7f6f3197573e4d992 F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 @@ -488,27 +488,27 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c 19d9283feae27045cfd5712ae4cabcac91a9b7bf619e651f1571e9637bd7f65d +F src/build.c d13fc40575b08422ddb44286537b0d3d80b03f063e0c3b6577d4bf84258f1f5e F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c -F src/delete.c 62451bba9fe641159e9c0b7d9d2bab1c48d0cff11e16de2d14000603d2af1fcf -F src/expr.c 84691a9d63baddcc6c735080a9b347e7f6feedb04c293730284999c92af95371 +F src/delete.c b43f0f4db586acf0b4078e3982485c26fbec984674df513d5ade48a08a323c5a +F src/expr.c 4e2878324f6be88a766f4e83bc3132106a9913f2bd029a4b92447626501996ce F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 1df6ad21908d84adb6d1297d7657ccd239c8ef0836e3a457d1fe15318393933b +F src/fkey.c bcd5006ce061ef7b331154d176a0869440b1049c67c14c92f0233a14a701f2cc F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c F src/global.c 5eba017ebbd887e2365e6e6e815e1619e41406b8946d17594e94116174787df5 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 6f10127cc5c8bb3631f25bad89f6d2f9c53606df789449f6af7b8647d8f97b4f +F src/insert.c 167b286e3e289dbd1dad8f5a90858e9a6221bd83902985adf110e9db9fc2db67 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c 5d024b9b96d9c6809e66b7f4864c3745bc8caf2a6af3b27dc0f05328f4439dfd +F src/main.c 6921ce667627d0d38e67f8508d5903e074134386427688e6b4588bfe57ce06a4 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -537,19 +537,19 @@ F src/parse.y 0ba0baec5de6921ec8ba8bbcf1018969144ef29d26112e17539d8fbb1662e3eb F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f -F src/pragma.c e8efa185aaaa4c4036fc40572b74ff9bb5317520c3a1886567093b5ac8b15381 +F src/pragma.c 4a510b24e5b2321fd6bb509cd0dc8003514cb574b872dd535f49870b84ee54b1 F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 047a822844cea769f6fdd8418a335dd4bcd8b75ab5e264f2506a0804f869b562 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 99c36dd4e7c2207ebdfd8c30986ab5aaeae74d0cdbbc471420807d50c417c241 +F src/select.c 2b25a79706c8a71e40f5fbc8705073c54f6a3d25f556dac9d6d91676026a0413 F src/shell.c.in 24b99dae8818d1a234732d73f4d5b49f12b510bc62735a41c04e314fafae09e3 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h ea94bc5f087522abe62550bb73ef1d7f78d28337fc3834cd676ef39d143ef2c2 +F src/sqliteInt.h 8601c620280dcb514e6e9dfb1fa7ee005ccc56c244ac82cb48a1045ed2e7003c F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -610,8 +610,8 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e F src/treeview.c 43f88d0fd19976a60aee6867959213b438593276f1e8179048df85f416a1ab19 -F src/trigger.c 7d16aa09e63226b6d8b3f0fc60b21cbfa596fc406288b2ebcf4266633d1ba222 -F src/update.c d2648c47202cf54104c94b427209be0350e667fbf4b825a61cae54ef86aaf1d9 +F src/trigger.c 43d76cf913e65a5d06ed0768d8ded7259a5d6e284641a18acb355a302792cd05 +F src/update.c 985a8a45b4ff86a0231fedd584e2bd87fd6fac5168286935195ad006d032d555 F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 6ca9cf268dfaf2393866990788c0797240e20e7ba7e3a22cd076e6a3c7b1a132 @@ -621,17 +621,17 @@ F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 F src/vdbeaux.c 202dbaf7d1570cd53678f6b0bcad7b0642e88bc5d77abc1d5b8b9a202a6a19fd -F src/vdbeblob.c c6b8db50b227f66fb404215732068df76485b5b433e5f9d4d9ac27410b218193 +F src/vdbeblob.c 2f3c2ada0429045c54e5ebd48f45281c52addf4648e0d234a2718dbdeab01c80 F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb724 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c -F src/vtab.c 516cb50e2a57359155db7f71d98f1690dc9cae84d359a1c6801b2615dc3cf362 +F src/vtab.c 75bdaec808be883b8bb69a1f0a479c3a359823c5a85a26497cd5d90d3c30b74b F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c 07c63dde6ab72477b964f4c81bee61ef78a246ca149bb9a560784f2e85cd78d7 +F src/where.c 6e27c9f9438ddbb8aebbb83d24574a75398942b5e73b3f8cc572a39dc00f7482 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f F src/whereexpr.c 3a9144a9d52e110efdc012a73b1574e7b2b4df4bf98949387cb620295eba0975 @@ -1920,7 +1920,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 d2da62a9df63036b02dadca3798de9e623c2680b3ef0c37d2b18bb88693afd7f -R 2bd36d7d73ef054d58c2b5fa1473f7b9 +P 8646547e54211d44c415663c33775c4268550f8332949c4731a4bb6ec9cc663a +R 8143bc84e57e339634d6338dda56d190 U drh -Z d1f622cc8631b67a8482f1c93905c30a +Z 0d31e4d81e774d8d4cc71b3c0a3d1311 diff --git a/manifest.uuid b/manifest.uuid index c4363aa39e..aecc9c1e1c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8646547e54211d44c415663c33775c4268550f8332949c4731a4bb6ec9cc663a \ No newline at end of file +bbb6759bcf6e01d36dfc787a82a610d359f50aaeac8104b73883a84906d54e1f \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 1d1e2d811b..75220a1de3 100644 --- a/src/alter.c +++ b/src/alter.c @@ -175,7 +175,7 @@ void sqlite3AlterRenameTable( } #ifndef SQLITE_OMIT_VIEW - if( pTab->pSelect ){ + if( IsView(pTab) ){ sqlite3ErrorMsg(pParse, "view %s may not be altered", pTab->zName); goto exit_rename_table; } @@ -371,7 +371,7 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ if( pDflt && pDflt->pLeft->op==TK_NULL ){ pDflt = 0; } - if( (db->flags&SQLITE_ForeignKeys) && pNew->pFKey && pDflt ){ + if( (db->flags&SQLITE_ForeignKeys) && pNew->u.tab.pFKey && pDflt ){ sqlite3ErrorIfNotEmpty(pParse, zDb, zTab, "Cannot add a REFERENCES column with non-NULL default value"); } @@ -415,12 +415,13 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ db->mDbFlags |= DBFLAG_PreferBuiltin; /* substr() operations on characters, but addColOffset is in bytes. So we ** have to use printf() to translate between these units: */ + assert( !IsVirtual(pTab) ); sqlite3NestedParse(pParse, "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = printf('%%.%ds, ',sql) || %Q" " || substr(sql,1+length(printf('%%.%ds',sql))) " "WHERE type = 'table' AND name = %Q", - zDb, pNew->addColOffset, zCol, pNew->addColOffset, + zDb, pNew->u.tab.addColOffset, zCol, pNew->u.tab.addColOffset, zTab ); sqlite3DbFree(db, zCol); @@ -500,7 +501,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ #endif /* Make sure this is not an attempt to ALTER a view. */ - if( pTab->pSelect ){ + if( IsView(pTab) ){ sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); goto exit_begin_add_column; } @@ -509,7 +510,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ } sqlite3MayAbort(pParse); - assert( pTab->addColOffset>0 ); + assert( pTab->u.tab.addColOffset>0 ); iDb = sqlite3SchemaToIndex(db, pTab->pSchema); /* Put a copy of the Table struct in Parse.pNewTable for the @@ -540,9 +541,10 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ pCol->hName = sqlite3StrIHash(pCol->zName); pCol->zColl = 0; } - pNew->pDfltList = sqlite3ExprListDup(db, pTab->pDfltList, 0); + assert( !IsVirtual(pNew) ); + pNew->u.tab.pDfltList = sqlite3ExprListDup(db, pTab->u.tab.pDfltList, 0); pNew->pSchema = db->aDb[iDb].pSchema; - pNew->addColOffset = pTab->addColOffset; + pNew->u.tab.addColOffset = pTab->u.tab.addColOffset; pNew->nTabRef = 1; exit_begin_add_column: @@ -562,7 +564,7 @@ exit_begin_add_column: static int isRealTable(Parse *pParse, Table *pTab, int bDrop){ const char *zType = 0; #ifndef SQLITE_OMIT_VIEW - if( pTab->pSelect ){ + if( IsView(pTab) ){ zType = "view"; } #endif @@ -1494,8 +1496,8 @@ static void renameColumnFunc( sCtx.pTab = pTab; if( rc!=SQLITE_OK ) goto renameColumnFunc_done; if( sParse.pNewTable ){ - Select *pSelect = sParse.pNewTable->pSelect; - if( pSelect ){ + if( IsView(sParse.pNewTable) ){ + Select *pSelect = sParse.pNewTable->u.view.pSelect; pSelect->selFlags &= ~SF_View; sParse.rc = SQLITE_OK; sqlite3SelectPrep(&sParse, pSelect, 0); @@ -1504,11 +1506,10 @@ static void renameColumnFunc( sqlite3WalkSelect(&sWalker, pSelect); } if( rc!=SQLITE_OK ) goto renameColumnFunc_done; - }else{ + }else if( IsOrdinaryTable(sParse.pNewTable) ){ /* A regular table */ int bFKOnly = sqlite3_stricmp(zTable, sParse.pNewTable->zName); FKey *pFKey; - assert( sParse.pNewTable->pSelect==0 ); sCtx.pTab = sParse.pNewTable; if( bFKOnly==0 ){ if( iColnCol ){ @@ -1535,7 +1536,8 @@ static void renameColumnFunc( #endif } - for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + assert( !IsVirtual(sParse.pNewTable) ); + for(pFKey=sParse.pNewTable->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ for(i=0; inCol; i++){ if( bFKOnly==0 && pFKey->aCol[i].iFrom==iCol ){ renameTokenFind(&sParse, &sCtx, (void*)&pFKey->aCol[i]); @@ -1701,28 +1703,31 @@ static void renameTableFunc( if( sParse.pNewTable ){ Table *pTab = sParse.pNewTable; - if( pTab->pSelect ){ + if( IsView(pTab) ){ if( isLegacy==0 ){ - Select *pSelect = pTab->pSelect; + Select *pSelect = pTab->u.view.pSelect; NameContext sNC; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = &sParse; assert( pSelect->selFlags & SF_View ); pSelect->selFlags &= ~SF_View; - sqlite3SelectPrep(&sParse, pTab->pSelect, &sNC); + sqlite3SelectPrep(&sParse, pTab->u.view.pSelect, &sNC); if( sParse.nErr ){ rc = sParse.rc; }else{ - sqlite3WalkSelect(&sWalker, pTab->pSelect); + sqlite3WalkSelect(&sWalker, pTab->u.view.pSelect); } } }else{ /* Modify any FK definitions to point to the new table. */ #ifndef SQLITE_OMIT_FOREIGN_KEY - if( isLegacy==0 || (db->flags & SQLITE_ForeignKeys) ){ + if( (isLegacy==0 || (db->flags & SQLITE_ForeignKeys)) + && !IsVirtual(pTab) + ){ FKey *pFKey; - for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + assert( !IsVirtual(pTab) ); + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ if( sqlite3_stricmp(pFKey->zTo, zOld)==0 ){ renameTokenFind(&sParse, &sCtx, (void*)pFKey->zTo); } @@ -1862,8 +1867,8 @@ static void renameQuotefixFunc( sWalker.u.pRename = &sCtx; if( sParse.pNewTable ){ - Select *pSelect = sParse.pNewTable->pSelect; - if( pSelect ){ + if( IsView(sParse.pNewTable) ){ + Select *pSelect = sParse.pNewTable->u.view.pSelect; pSelect->selFlags &= ~SF_View; sParse.rc = SQLITE_OK; sqlite3SelectPrep(&sParse, pSelect, 0); @@ -1961,11 +1966,11 @@ static void renameTableTest( rc = renameParseSql(&sParse, zDb, db, zInput, bTemp); db->flags |= (flags & (SQLITE_DqsDML|SQLITE_DqsDDL)); if( rc==SQLITE_OK ){ - if( isLegacy==0 && sParse.pNewTable && sParse.pNewTable->pSelect ){ + if( isLegacy==0 && sParse.pNewTable && IsView(sParse.pNewTable) ){ NameContext sNC; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = &sParse; - sqlite3SelectPrep(&sParse, sParse.pNewTable->pSelect, &sNC); + sqlite3SelectPrep(&sParse, sParse.pNewTable->u.view.pSelect, &sNC); if( sParse.nErr ) rc = sParse.rc; } @@ -2042,7 +2047,8 @@ static void dropColumnFunc( pEnd = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol+1].zName); zEnd = (const char*)pEnd->t.z; }else{ - zEnd = (const char*)&zSql[pTab->addColOffset]; + assert( !IsVirtual(pTab) ); + zEnd = (const char*)&zSql[pTab->u.tab.addColOffset]; while( ALWAYS(pCol->t.z[0]!=0) && pCol->t.z[0]!=',' ) pCol->t.z--; } diff --git a/src/build.c b/src/build.c index 33f0015fd7..09222acf81 100644 --- a/src/build.c +++ b/src/build.c @@ -678,13 +678,15 @@ void sqlite3ColumnSetExpr( Column *pCol, /* The column to receive the new DEFAULT expression */ Expr *pExpr /* The new default expression */ ){ - ExprList *pList = pTab->pDfltList; + ExprList *pList; + assert( !IsVirtual(pTab) ); + pList = pTab->u.tab.pDfltList; if( pCol->iDflt==0 || pList==0 || pList->nExpriDflt ){ pCol->iDflt = pList==0 ? 1 : pList->nExpr+1; - pTab->pDfltList = sqlite3ExprListAppend(pParse, pList, pExpr); + pTab->u.tab.pDfltList = sqlite3ExprListAppend(pParse, pList, pExpr); }else{ sqlite3ExprDelete(pParse->db, pList->a[pCol->iDflt-1].pExpr); pList->a[pCol->iDflt-1].pExpr = pExpr; @@ -698,9 +700,10 @@ void sqlite3ColumnSetExpr( */ Expr *sqlite3ColumnExpr(Table *pTab, Column *pCol){ if( pCol->iDflt==0 ) return 0; - if( pTab->pDfltList==0 ) return 0; - if( pTab->pDfltList->nExpriDflt ) return 0; - return pTab->pDfltList->a[pCol->iDflt-1].pExpr; + if( IsVirtual(pTab) ) return 0; + if( pTab->u.tab.pDfltList==0 ) return 0; + if( pTab->u.tab.pDfltList->nExpriDflt ) return 0; + return pTab->u.tab.pDfltList->a[pCol->iDflt-1].pExpr; } /* @@ -718,11 +721,15 @@ void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ sqlite3DbFree(db, pCol->zColl); } sqlite3DbFree(db, pTable->aCol); - sqlite3ExprListDelete(db, pTable->pDfltList); + if( !IsVirtual(pTable) ){ + sqlite3ExprListDelete(db, pTable->u.tab.pDfltList); + } if( db==0 || db->pnBytesFreed==0 ){ pTable->aCol = 0; pTable->nCol = 0; - pTable->pDfltList = 0; + if( !IsVirtual(pTable) ){ + pTable->u.tab.pDfltList = 0; + } } } } @@ -775,19 +782,25 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ sqlite3FreeIndex(db, pIndex); } - /* Delete any foreign keys attached to this table. */ - sqlite3FkDelete(db, pTable); + if( IsOrdinaryTable(pTable) ){ + sqlite3FkDelete(db, pTable); + } +#ifndef SQLITE_OMIT_VIRTUAL_TABLE + else if( IsVirtual(pTable) ){ + sqlite3VtabClear(db, pTable); + } +#endif + else{ + assert( IsView(pTable) ); + sqlite3SelectDelete(db, pTable->u.view.pSelect); + } /* Delete the Table structure itself. */ sqlite3DeleteColumnNames(db, pTable); sqlite3DbFree(db, pTable->zName); sqlite3DbFree(db, pTable->zColAff); - sqlite3SelectDelete(db, pTable->pSelect); sqlite3ExprListDelete(db, pTable->pCheck); -#ifndef SQLITE_OMIT_VIRTUALTABLE - sqlite3VtabClear(db, pTable); -#endif sqlite3DbFree(db, pTable); /* Verify that no lookaside memory was used by schema tables */ @@ -2420,7 +2433,7 @@ int sqlite3IsShadowTableOf(sqlite3 *db, Table *pTab, const char *zName){ nName = sqlite3Strlen30(pTab->zName); if( sqlite3_strnicmp(zName, pTab->zName, nName)!=0 ) return 0; if( zName[nName]!='_' ) return 0; - pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->azModuleArg[0]); + pMod = (Module*)sqlite3HashFind(&db->aModule, pTab->u.vtab.azArg[0]); if( pMod==0 ) return 0; if( pMod->pModule->iVersion<3 ) return 0; if( pMod->pModule->xShadowName==0 ) return 0; @@ -2632,7 +2645,7 @@ void sqlite3EndTable( /* ** Initialize zType for the new view or table. */ - if( p->pSelect==0 ){ + if( IsOrdinaryTable(p) ){ /* A regular table */ zType = "table"; zType2 = "TABLE"; @@ -2782,12 +2795,12 @@ void sqlite3EndTable( } #ifndef SQLITE_OMIT_ALTERTABLE - if( !pSelect && !p->pSelect ){ + if( !pSelect && IsOrdinaryTable(p) ){ assert( pCons && pEnd ); if( pCons->z==0 ){ pCons = pEnd; } - p->addColOffset = 13 + (int)(pCons->z - pParse->sNameToken.z); + p->u.tab.addColOffset = 13 + (int)(pCons->z - pParse->sNameToken.z); } #endif } @@ -2844,12 +2857,13 @@ void sqlite3CreateView( */ pSelect->selFlags |= SF_View; if( IN_RENAME_OBJECT ){ - p->pSelect = pSelect; + p->u.view.pSelect = pSelect; pSelect = 0; }else{ - p->pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); + p->u.view.pSelect = sqlite3SelectDup(db, pSelect, EXPRDUP_REDUCE); } p->pCheck = sqlite3ExprListDup(db, pCNames, EXPRDUP_REDUCE); + p->eTabType = TABTYP_VIEW; if( db->mallocFailed ) goto create_view_fail; /* Locate the end of the CREATE VIEW statement. Make sEnd point to @@ -2946,8 +2960,8 @@ int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ ** to be permanent. So the computation is done on a copy of the SELECT ** statement that defines the view. */ - assert( pTable->pSelect ); - pSel = sqlite3SelectDup(db, pTable->pSelect, 0); + assert( IsView(pTable) ); + pSel = sqlite3SelectDup(db, pTable->u.view.pSelect, 0); if( pSel ){ u8 eParseMode = pParse->eParseMode; pParse->eParseMode = PARSE_MODE_NORMAL; @@ -3022,7 +3036,7 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){ if( !DbHasProperty(db, idx, DB_UnresetViews) ) return; for(i=sqliteHashFirst(&db->aDb[idx].pSchema->tblHash); i;i=sqliteHashNext(i)){ Table *pTab = sqliteHashData(i); - if( pTab->pSelect ){ + if( IsView(pTab) ){ sqlite3DeleteColumnNames(db, pTab); } } @@ -3364,11 +3378,11 @@ void sqlite3DropTable(Parse *pParse, SrcList *pName, int isView, int noErr){ /* Ensure DROP TABLE is not used on a view, and DROP VIEW is not used ** on a table. */ - if( isView && pTab->pSelect==0 ){ + if( isView && !IsView(pTab) ){ sqlite3ErrorMsg(pParse, "use DROP TABLE to delete table %s", pTab->zName); goto exit_drop_table; } - if( !isView && pTab->pSelect ){ + if( !isView && IsView(pTab) ){ sqlite3ErrorMsg(pParse, "use DROP VIEW to delete view %s", pTab->zName); goto exit_drop_table; } @@ -3455,7 +3469,7 @@ void sqlite3CreateForeignKey( goto fk_end; } pFKey->pFrom = p; - pFKey->pNextFrom = p->pFKey; + pFKey->pNextFrom = p->u.tab.pFKey; z = (char*)&pFKey->aCol[nCol]; pFKey->zTo = z; if( IN_RENAME_OBJECT ){ @@ -3520,7 +3534,8 @@ void sqlite3CreateForeignKey( /* Link the foreign key to the table as the last step. */ - p->pFKey = pFKey; + assert( !IsVirtual(p) ); + p->u.tab.pFKey = pFKey; pFKey = 0; fk_end: @@ -3541,7 +3556,9 @@ void sqlite3DeferForeignKey(Parse *pParse, int isDeferred){ #ifndef SQLITE_OMIT_FOREIGN_KEY Table *pTab; FKey *pFKey; - if( (pTab = pParse->pNewTable)==0 || (pFKey = pTab->pFKey)==0 ) return; + if( (pTab = pParse->pNewTable)==0 ) return; + if( IsVirtual(pTab) ) return; + if( (pFKey = pTab->u.tab.pFKey)==0 ) return; assert( isDeferred==0 || isDeferred==1 ); /* EV: R-30323-21917 */ pFKey->isDeferred = (u8)isDeferred; #endif @@ -3833,7 +3850,7 @@ void sqlite3CreateIndex( goto exit_create_index; } #ifndef SQLITE_OMIT_VIEW - if( pTab->pSelect ){ + if( IsView(pTab) ){ sqlite3ErrorMsg(pParse, "views may not be indexed"); goto exit_create_index; } diff --git a/src/delete.c b/src/delete.c index dd074bb352..459e932b5e 100644 --- a/src/delete.c +++ b/src/delete.c @@ -84,7 +84,7 @@ int sqlite3IsReadOnly(Parse *pParse, Table *pTab, int viewOk){ return 1; } #ifndef SQLITE_OMIT_VIEW - if( !viewOk && pTab->pSelect ){ + if( !viewOk && IsView(pTab) ){ sqlite3ErrorMsg(pParse,"cannot modify %s because it is a view",pTab->zName); return 1; } @@ -301,7 +301,7 @@ void sqlite3DeleteFrom( */ #ifndef SQLITE_OMIT_TRIGGER pTrigger = sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0); - isView = pTab->pSelect!=0; + isView = IsView(pTab); #else # define pTrigger 0 # define isView 0 @@ -551,7 +551,7 @@ void sqlite3DeleteFrom( if( eOnePass!=ONEPASS_OFF ){ assert( nKey==nPk ); /* OP_Found will use an unpacked key */ if( !IsVirtual(pTab) && aToOpen[iDataCur-iTabCur] ){ - assert( pPk!=0 || pTab->pSelect!=0 ); + assert( pPk!=0 || IsView(pTab) ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey); VdbeCoverage(v); } @@ -785,7 +785,7 @@ void sqlite3GenerateRowDelete( ** the update-hook is not invoked for rows removed by REPLACE, but the ** pre-update-hook is. */ - if( pTab->pSelect==0 ){ + if( !IsView(pTab) ){ u8 p5 = 0; sqlite3GenerateRowIndexDelete(pParse, pTab, iDataCur, iIdxCur,0,iIdxNoSeek); sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, (count?OPFLAG_NCHANGE:0)); diff --git a/src/expr.c b/src/expr.c index 04881be8ca..ca0c00a14d 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2513,7 +2513,7 @@ static Select *isCandidateForInOpt(Expr *pX){ if( pSrc->a[0].pSelect ) return 0; /* FROM is not a subquery or view */ pTab = pSrc->a[0].pTab; assert( pTab!=0 ); - assert( pTab->pSelect==0 ); /* FROM clause is not a view */ + assert( !IsView(pTab) ); /* FROM clause is not a view */ if( IsVirtual(pTab) ) return 0; /* FROM clause not a virtual table */ pEList = p->pEList; assert( pEList!=0 ); diff --git a/src/fkey.c b/src/fkey.c index 2e743c7022..ffb3a732eb 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -723,7 +723,8 @@ void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){ Vdbe *v = sqlite3GetVdbe(pParse); assert( v ); /* VDBE has already been allocated */ - assert( pTab->pSelect==0 ); /* Not a view */ + assert( !IsView(pTab) ); /* Not a view */ + assert( !IsVirtual(pTab) ); if( sqlite3FkReferences(pTab)==0 ){ /* Search for a deferred foreign key constraint for which this table ** is the child table. If one cannot be found, return without @@ -731,7 +732,7 @@ void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){ ** the entire DELETE if there are no outstanding deferred constraints ** when this statement is run. */ FKey *p; - for(p=pTab->pFKey; p; p=p->pNextFrom){ + for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){ if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break; } if( !p ) return; @@ -893,7 +894,8 @@ void sqlite3FkCheck( /* Loop through all the foreign key constraints for which pTab is the ** child table (the table that the foreign key definition is part of). */ - for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + assert( !IsVirtual(pTab) ); + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ Table *pTo; /* Parent table of foreign key pFKey */ Index *pIdx = 0; /* Index on key columns in pTo */ int *aiFree = 0; @@ -1078,7 +1080,8 @@ u32 sqlite3FkOldmask( if( pParse->db->flags&SQLITE_ForeignKeys ){ FKey *p; int i; - for(p=pTab->pFKey; p; p=p->pNextFrom){ + assert( !IsVirtual(pTab) ); + for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){ for(i=0; inCol; i++) mask |= COLUMN_MASK(p->aCol[i].iFrom); } for(p=sqlite3FkReferences(pTab); p; p=p->pNextTo){ @@ -1128,19 +1131,19 @@ int sqlite3FkRequired( ){ int eRet = 1; /* Value to return if bHaveFK is true */ int bHaveFK = 0; /* If FK processing is required */ - if( pParse->db->flags&SQLITE_ForeignKeys ){ + if( pParse->db->flags&SQLITE_ForeignKeys && !IsVirtual(pTab) ){ if( !aChange ){ /* A DELETE operation. Foreign key processing is required if the ** table in question is either the child or parent table for any ** foreign key constraint. */ - bHaveFK = (sqlite3FkReferences(pTab) || pTab->pFKey); + bHaveFK = (sqlite3FkReferences(pTab) || pTab->u.tab.pFKey); }else{ /* This is an UPDATE. Foreign key processing is only required if the ** operation modifies one or more child or parent key columns. */ FKey *p; /* Check if any child key columns are being modified. */ - for(p=pTab->pFKey; p; p=p->pNextFrom){ + for(p=pTab->u.tab.pFKey; p; p=p->pNextFrom){ if( fkChildIsModified(pTab, p, aChange, chngRowid) ){ if( 0==sqlite3_stricmp(pTab->zName, p->zTo) ) eRet = 2; bHaveFK = 1; @@ -1416,9 +1419,9 @@ void sqlite3FkDelete(sqlite3 *db, Table *pTab){ FKey *pFKey; /* Iterator variable */ FKey *pNext; /* Copy of pFKey->pNextFrom */ - assert( db==0 || IsVirtual(pTab) - || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); - for(pFKey=pTab->pFKey; pFKey; pFKey=pNext){ + assert( !IsVirtual(pTab) ); + assert( db==0 || sqlite3SchemaMutexHeld(db, 0, pTab->pSchema) ); + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pNext){ /* Remove the FK from the fkeyHash hash table. */ if( !db || db->pnBytesFreed==0 ){ diff --git a/src/insert.c b/src/insert.c index 867ab76fd1..bff75a0a69 100644 --- a/src/insert.c +++ b/src/insert.c @@ -703,7 +703,7 @@ void sqlite3Insert( */ #ifndef SQLITE_OMIT_TRIGGER pTrigger = sqlite3TriggersExist(pParse, pTab, TK_INSERT, 0, &tmask); - isView = pTab->pSelect!=0; + isView = IsView(pTab); #else # define pTrigger 0 # define tmask 0 @@ -989,7 +989,7 @@ void sqlite3Insert( pTab->zName); goto insert_cleanup; } - if( pTab->pSelect ){ + if( IsView(pTab) ){ sqlite3ErrorMsg(pParse, "cannot UPSERT a view"); goto insert_cleanup; } @@ -1624,7 +1624,7 @@ void sqlite3GenerateConstraintChecks( db = pParse->db; v = pParse->pVdbe; assert( v!=0 ); - assert( pTab->pSelect==0 ); /* This table is not a VIEW */ + assert( !IsView(pTab) ); /* This table is not a VIEW */ nCol = pTab->nCol; /* pPk is the PRIMARY KEY index for WITHOUT ROWID tables and NULL for @@ -2185,7 +2185,7 @@ void sqlite3GenerateConstraintChecks( && ( 0==(db->flags&SQLITE_RecTriggers) || /* Condition 4 */ 0==sqlite3TriggersExist(pParse, pTab, TK_DELETE, 0, 0)) && ( 0==(db->flags&SQLITE_ForeignKeys) || /* Condition 5 */ - (0==pTab->pFKey && 0==sqlite3FkReferences(pTab))) + (0==pTab->u.tab.pFKey && 0==sqlite3FkReferences(pTab))) ){ sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; @@ -2484,7 +2484,7 @@ void sqlite3CompleteInsertion( v = pParse->pVdbe; assert( v!=0 ); - assert( pTab->pSelect==0 ); /* This table is not a VIEW */ + assert( !IsView(pTab) ); /* This table is not a VIEW */ for(i=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, i++){ /* All REPLACE indexes are at the end of the list */ assert( pIdx->onError!=OE_Replace @@ -2786,13 +2786,8 @@ static int xferOptimization( if( HasRowid(pDest)!=HasRowid(pSrc) ){ return 0; /* source and destination must both be WITHOUT ROWID or not */ } -#ifndef SQLITE_OMIT_VIRTUALTABLE - if( IsVirtual(pSrc) ){ - return 0; /* tab2 must not be a virtual table */ - } -#endif - if( pSrc->pSelect ){ - return 0; /* tab2 may not be a view */ + if( !IsOrdinaryTable(pSrc) ){ + return 0; /* tab2 may not be a view or virtual table */ } if( pDest->nCol!=pSrc->nCol ){ return 0; /* Number of columns must be the same in tab1 and tab2 */ @@ -2899,7 +2894,7 @@ static int xferOptimization( ** the extra complication to make this rule less restrictive is probably ** not worth the effort. Ticket [6284df89debdfa61db8073e062908af0c9b6118e] */ - if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->pFKey!=0 ){ + if( (db->flags & SQLITE_ForeignKeys)!=0 && pDest->u.tab.pFKey!=0 ){ return 0; } #endif diff --git a/src/main.c b/src/main.c index fc0fa6ad16..2dc29593dc 100644 --- a/src/main.c +++ b/src/main.c @@ -3731,7 +3731,7 @@ int sqlite3_table_column_metadata( /* Locate the table in question */ pTab = sqlite3FindTable(db, zTableName, zDbName); - if( !pTab || pTab->pSelect ){ + if( !pTab || IsView(pTab) ){ pTab = 0; goto error_out; } diff --git a/src/pragma.c b/src/pragma.c index 0427bb972f..2606e85506 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1360,8 +1360,8 @@ void sqlite3Pragma( FKey *pFK; Table *pTab; pTab = sqlite3FindTable(db, zRight, zDb); - if( pTab ){ - pFK = pTab->pFKey; + if( pTab && !IsVirtual(pTab) ){ + pFK = pTab->u.tab.pFKey; if( pFK ){ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema); int i = 0; @@ -1420,7 +1420,7 @@ void sqlite3Pragma( pTab = (Table*)sqliteHashData(k); k = sqliteHashNext(k); } - if( pTab==0 || pTab->pFKey==0 ) continue; + if( pTab==0 || IsVirtual(pTab) || pTab->u.tab.pFKey==0 ) continue; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); zDb = db->aDb[iDb].zDbSName; sqlite3CodeVerifySchema(pParse, iDb); @@ -1428,7 +1428,8 @@ void sqlite3Pragma( if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow; sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead); sqlite3VdbeLoadString(v, regResult, pTab->zName); - for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ + assert( !IsVirtual(pTab) ); + for(i=1, pFK=pTab->u.tab.pFKey; pFK; i++, pFK=pFK->pNextFrom){ pParent = sqlite3FindTable(db, pFK->zTo, zDb); if( pParent==0 ) continue; pIdx = 0; @@ -1450,7 +1451,8 @@ void sqlite3Pragma( if( pFK ) break; if( pParse->nTabnTab = i; addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, 0); VdbeCoverage(v); - for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){ + assert( !IsVirtual(pTab) ); + for(i=1, pFK=pTab->u.tab.pFKey; pFK; i++, pFK=pFK->pNextFrom){ pParent = sqlite3FindTable(db, pFK->zTo, zDb); pIdx = 0; aiCols = 0; diff --git a/src/select.c b/src/select.c index 66e1434a31..d6708c231f 100644 --- a/src/select.c +++ b/src/select.c @@ -4933,7 +4933,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ } pTab = p->pSrc->a[0].pTab; pExpr = p->pEList->a[0].pExpr; - assert( pTab && !pTab->pSelect && pExpr ); + assert( pTab && !IsView(pTab) && pExpr ); if( IsVirtual(pTab) ) return 0; if( pExpr->op!=TK_AGG_FUNCTION ) return 0; @@ -5478,30 +5478,31 @@ static int selectExpander(Walker *pWalker, Select *p){ return WRC_Abort; } #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_VIRTUALTABLE) - if( IsVirtual(pTab) || pTab->pSelect ){ + if( !IsOrdinaryTable(pTab) ){ i16 nCol; u8 eCodeOrig = pWalker->eCode; if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; assert( pFrom->pSelect==0 ); - if( pTab->pSelect - && (db->flags & SQLITE_EnableView)==0 - && pTab->pSchema!=db->aDb[1].pSchema - ){ - sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited", - pTab->zName); - } + if( IsView(pTab) ){ + if( (db->flags & SQLITE_EnableView)==0 + && pTab->pSchema!=db->aDb[1].pSchema + ){ + sqlite3ErrorMsg(pParse, "access to view \"%s\" prohibited", + pTab->zName); + } + pFrom->pSelect = sqlite3SelectDup(db, pTab->u.view.pSelect, 0); + }else #ifndef SQLITE_OMIT_VIRTUALTABLE - assert( SQLITE_VTABRISK_Normal==1 && SQLITE_VTABRISK_High==2 ); - if( IsVirtual(pTab) + if( ALWAYS(IsVirtual(pTab)) && pFrom->fg.fromDDL - && ALWAYS(pTab->pVTable!=0) - && pTab->pVTable->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0) + && ALWAYS(pTab->u.vtab.p!=0) + && pTab->u.vtab.p->eVtabRisk > ((db->flags & SQLITE_TrustedSchema)!=0) ){ sqlite3ErrorMsg(pParse, "unsafe use of virtual table \"%s\"", pTab->zName); } + assert( SQLITE_VTABRISK_Normal==1 && SQLITE_VTABRISK_High==2 ); #endif - pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); nCol = pTab->nCol; pTab->nCol = -1; pWalker->eCode = 1; /* Turn on Select.selId renumbering */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 3fbb148d40..9a2c49e526 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2201,19 +2201,16 @@ struct VTable { #define SQLITE_VTABRISK_High 2 /* -** The schema for each SQL table and view is represented in memory -** by an instance of the following structure. +** The schema for each SQL table, virtual table, and view is represented +** in memory by an instance of the following structure. */ struct Table { char *zName; /* Name of the table or view */ Column *aCol; /* Information about each column */ Index *pIndex; /* List of SQL indexes on this table. */ - Select *pSelect; /* NULL for tables. Points to definition if a view. */ - FKey *pFKey; /* Linked list of all foreign keys in this table */ char *zColAff; /* String defining the affinity of each column */ ExprList *pCheck; /* All CHECK constraints */ /* ... also used as column name list in a VIEW */ - ExprList *pDfltList; /* DEFAULT clauses on various columns */ Pgno tnum; /* Root BTree page for this table */ u32 nTabRef; /* Number of pointers to this Table */ u32 tabFlags; /* Mask of TF_* values */ @@ -2226,15 +2223,24 @@ struct Table { LogEst costMult; /* Cost multiplier for using this table */ #endif u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */ -#ifndef SQLITE_OMIT_ALTERTABLE - int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ -#endif -#ifndef SQLITE_OMIT_VIRTUALTABLE - int nModuleArg; /* Number of arguments to the module */ - char **azModuleArg; /* 0: module 1: schema 2: vtab name 3...: args */ - VTable *pVTable; /* List of VTable objects. */ -#endif - Trigger *pTrigger; /* List of triggers stored in pSchema */ + u8 eTabType; /* 0: normal, 1: virtual, 2: view */ + union { + struct { /* Used by ordinary tables: */ + int addColOffset; /* Offset in CREATE TABLE stmt to add a new column */ + FKey *pFKey; /* Linked list of all foreign keys in this table */ + ExprList *pDfltList; /* DEFAULT clauses on various columns. + ** Or the AS clause for generated columns. */ + } tab; + struct { /* Used by views: */ + Select *pSelect; /* View definition */ + } view; + struct { /* Used by virtual tables only: */ + int nArg; /* Number of arguments to the module */ + char **azArg; /* 0: module 1: schema 2: vtab name 3...: args */ + VTable *p; /* List of VTable objects. */ + } vtab; + } u; + Trigger *pTrigger; /* List of triggers on this object */ Schema *pSchema; /* Schema that contains this table */ }; @@ -2253,24 +2259,34 @@ struct Table { ** TF_HasStored == COLFLAG_STORED ** TF_HasHidden == COLFLAG_HIDDEN */ -#define TF_Readonly 0x0001 /* Read-only system table */ -#define TF_HasHidden 0x0002 /* Has one or more hidden columns */ -#define TF_HasPrimaryKey 0x0004 /* Table has a primary key */ -#define TF_Autoincrement 0x0008 /* Integer primary key is autoincrement */ -#define TF_HasStat1 0x0010 /* nRowLogEst set from sqlite_stat1 */ -#define TF_HasVirtual 0x0020 /* Has one or more VIRTUAL columns */ -#define TF_HasStored 0x0040 /* Has one or more STORED columns */ -#define TF_HasGenerated 0x0060 /* Combo: HasVirtual + HasStored */ -#define TF_WithoutRowid 0x0080 /* No rowid. PRIMARY KEY is the key */ -#define TF_StatsUsed 0x0100 /* Query planner decisions affected by +#define TF_Readonly 0x00000001 /* Read-only system table */ +#define TF_HasHidden 0x00000002 /* Has one or more hidden columns */ +#define TF_HasPrimaryKey 0x00000004 /* Table has a primary key */ +#define TF_Autoincrement 0x00000008 /* Integer primary key is autoincrement */ +#define TF_HasStat1 0x00000010 /* nRowLogEst set from sqlite_stat1 */ +#define TF_HasVirtual 0x00000020 /* Has one or more VIRTUAL columns */ +#define TF_HasStored 0x00000040 /* Has one or more STORED columns */ +#define TF_HasGenerated 0x00000060 /* Combo: HasVirtual + HasStored */ +#define TF_WithoutRowid 0x00000080 /* No rowid. PRIMARY KEY is the key */ +#define TF_StatsUsed 0x00000100 /* Query planner decisions affected by ** Index.aiRowLogEst[] values */ -#define TF_NoVisibleRowid 0x0200 /* No user-visible "rowid" column */ -#define TF_OOOHidden 0x0400 /* Out-of-Order hidden columns */ -#define TF_HasNotNull 0x0800 /* Contains NOT NULL constraints */ -#define TF_Shadow 0x1000 /* True for a shadow table */ -#define TF_HasStat4 0x2000 /* STAT4 info available for this table */ -#define TF_Ephemeral 0x4000 /* An ephemeral table */ -#define TF_Eponymous 0x8000 /* An eponymous virtual table */ +#define TF_NoVisibleRowid 0x00000200 /* No user-visible "rowid" column */ +#define TF_OOOHidden 0x00000400 /* Out-of-Order hidden columns */ +#define TF_HasNotNull 0x00000800 /* Contains NOT NULL constraints */ +#define TF_Shadow 0x00001000 /* True for a shadow table */ +#define TF_HasStat4 0x00002000 /* STAT4 info available for this table */ +#define TF_Ephemeral 0x00004000 /* An ephemeral table */ +#define TF_Eponymous 0x00008000 /* An eponymous virtual table */ + +/* +** Allowed values for Table.eTabType +*/ +#define TABTYP_NORM 0 /* Ordinary table */ +#define TABTYP_VTAB 1 /* Virtual table */ +#define TABTYP_VIEW 2 /* A view */ + +#define IsView(X) ((X)->eTabType==TABTYP_VIEW) +#define IsOrdinaryTable(X) ((X)->eTabType==TABTYP_NORM) /* ** Test to see whether or not a table is a virtual table. This is @@ -2278,9 +2294,9 @@ struct Table { ** table support is omitted from the build. */ #ifndef SQLITE_OMIT_VIRTUALTABLE -# define IsVirtual(X) ((X)->nModuleArg) +# define IsVirtual(X) ((X)->eTabType==TABTYP_VTAB) # define ExprIsVtab(X) \ - ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->nModuleArg) + ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->eTabType==TABTYP_VTAB) #else # define IsVirtual(X) 0 # define ExprIsVtab(X) 0 diff --git a/src/trigger.c b/src/trigger.c index c5beeb9844..4db697c655 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -219,12 +219,12 @@ void sqlite3BeginTrigger( /* INSTEAD of triggers are only for views and views only support INSTEAD ** of triggers. */ - if( pTab->pSelect && tr_tm!=TK_INSTEAD ){ + if( IsView(pTab) && tr_tm!=TK_INSTEAD ){ sqlite3ErrorMsg(pParse, "cannot create %s trigger on view: %S", (tr_tm == TK_BEFORE)?"BEFORE":"AFTER", pTableName->a); goto trigger_orphan_error; } - if( !pTab->pSelect && tr_tm==TK_INSTEAD ){ + if( !IsView(pTab) && tr_tm==TK_INSTEAD ){ sqlite3ErrorMsg(pParse, "cannot create INSTEAD OF" " trigger on table: %S", pTableName->a); goto trigger_orphan_error; diff --git a/src/update.c b/src/update.c index f93d85bd5e..6f503c32f8 100644 --- a/src/update.c +++ b/src/update.c @@ -60,7 +60,7 @@ static void updateVirtualTable( */ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ assert( pTab!=0 ); - if( !pTab->pSelect ){ + if( !IsView(pTab) ){ sqlite3_value *pValue = 0; u8 enc = ENC(sqlite3VdbeDb(v)); Column *pCol = &pTab->aCol[i]; @@ -237,7 +237,7 @@ static void updateFromSelect( pList = sqlite3ExprListAppend(pParse, pList, pNew); } eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom; - }else if( pTab->pSelect ){ + }else if( IsView(pTab) ){ for(i=0; inCol; i++){ pList = sqlite3ExprListAppend(pParse, pList, exprRowColumn(pParse, i)); } @@ -362,7 +362,7 @@ void sqlite3Update( */ #ifndef SQLITE_OMIT_TRIGGER pTrigger = sqlite3TriggersExist(pParse, pTab, TK_UPDATE, pChanges, &tmask); - isView = pTab->pSelect!=0; + isView = IsView(pTab); assert( pTrigger || tmask==0 ); #else # define pTrigger 0 diff --git a/src/vdbeblob.c b/src/vdbeblob.c index a4e79bf89b..34cf880eca 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -167,7 +167,7 @@ int sqlite3_blob_open( sqlite3ErrorMsg(&sParse, "cannot open table without rowid: %s", zTable); } #ifndef SQLITE_OMIT_VIEW - if( pTab && pTab->pSelect ){ + if( pTab && IsView(pTab) ){ pTab = 0; sqlite3ErrorMsg(&sParse, "cannot open view: %s", zTable); } @@ -212,7 +212,8 @@ int sqlite3_blob_open( ** key columns must be indexed. The check below will pick up this ** case. */ FKey *pFKey; - for(pFKey=pTab->pFKey; pFKey; pFKey=pFKey->pNextFrom){ + assert( !IsVirtual(pTab) ); + for(pFKey=pTab->u.tab.pFKey; pFKey; pFKey=pFKey->pNextFrom){ int j; for(j=0; jnCol; j++){ if( pFKey->aCol[j].iFrom==iCol ){ diff --git a/src/vtab.c b/src/vtab.c index 25672bcce0..c66a154678 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -192,7 +192,7 @@ void sqlite3VtabLock(VTable *pVTab){ VTable *sqlite3GetVTable(sqlite3 *db, Table *pTab){ VTable *pVtab; assert( IsVirtual(pTab) ); - for(pVtab=pTab->pVTable; pVtab && pVtab->db!=db; pVtab=pVtab->pNext); + for(pVtab=pTab->u.vtab.p; pVtab && pVtab->db!=db; pVtab=pVtab->pNext); return pVtab; } @@ -220,21 +220,21 @@ void sqlite3VtabUnlock(VTable *pVTab){ /* ** Table p is a virtual table. This function moves all elements in the -** p->pVTable list to the sqlite3.pDisconnect lists of their associated +** p->u.vtab.p list to the sqlite3.pDisconnect lists of their associated ** database connections to be disconnected at the next opportunity. ** Except, if argument db is not NULL, then the entry associated with -** connection db is left in the p->pVTable list. +** connection db is left in the p->u.vtab.p list. */ static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ VTable *pRet = 0; - VTable *pVTable = p->pVTable; - p->pVTable = 0; + VTable *pVTable = p->u.vtab.p; + p->u.vtab.p = 0; /* Assert that the mutex (if any) associated with the BtShared database ** that contains table p is held by the caller. See header comments ** above function sqlite3VtabUnlockList() for an explanation of why ** this makes it safe to access the sqlite3.pDisconnect list of any - ** database connection that may have an entry in the p->pVTable list. + ** database connection that may have an entry in the p->u.vtab.p list. */ assert( db==0 || sqlite3SchemaMutexHeld(db, 0, p->pSchema) ); @@ -244,7 +244,7 @@ static VTable *vtabDisconnectAll(sqlite3 *db, Table *p){ assert( db2 ); if( db2==db ){ pRet = pVTable; - p->pVTable = pRet; + p->u.vtab.p = pRet; pRet->pNext = 0; }else{ pVTable->pNext = db2->pDisconnect; @@ -272,7 +272,7 @@ void sqlite3VtabDisconnect(sqlite3 *db, Table *p){ assert( sqlite3BtreeHoldsAllMutexes(db) ); assert( sqlite3_mutex_held(db->mutex) ); - for(ppVTab=&p->pVTable; *ppVTab; ppVTab=&(*ppVTab)->pNext){ + for(ppVTab=&p->u.vtab.p; *ppVTab; ppVTab=&(*ppVTab)->pNext){ if( (*ppVTab)->db==db ){ VTable *pVTab = *ppVTab; *ppVTab = pVTab->pNext; @@ -336,36 +336,36 @@ void sqlite3VtabUnlockList(sqlite3 *db){ */ void sqlite3VtabClear(sqlite3 *db, Table *p){ if( !db || db->pnBytesFreed==0 ) vtabDisconnectAll(0, p); - if( p->azModuleArg ){ + if( p->u.vtab.azArg ){ int i; - for(i=0; inModuleArg; i++){ - if( i!=1 ) sqlite3DbFree(db, p->azModuleArg[i]); + for(i=0; iu.vtab.nArg; i++){ + if( i!=1 ) sqlite3DbFree(db, p->u.vtab.azArg[i]); } - sqlite3DbFree(db, p->azModuleArg); + sqlite3DbFree(db, p->u.vtab.azArg); } } /* -** Add a new module argument to pTable->azModuleArg[]. +** Add a new module argument to pTable->u.vtab.azArg[]. ** The string is not copied - the pointer is stored. The ** string will be freed automatically when the table is ** deleted. */ static void addModuleArgument(Parse *pParse, Table *pTable, char *zArg){ - sqlite3_int64 nBytes = sizeof(char *)*(2+pTable->nModuleArg); + sqlite3_int64 nBytes = sizeof(char *)*(2+pTable->u.vtab.nArg); char **azModuleArg; sqlite3 *db = pParse->db; - if( pTable->nModuleArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){ + if( pTable->u.vtab.nArg+3>=db->aLimit[SQLITE_LIMIT_COLUMN] ){ sqlite3ErrorMsg(pParse, "too many columns on %s", pTable->zName); } - azModuleArg = sqlite3DbRealloc(db, pTable->azModuleArg, nBytes); + azModuleArg = sqlite3DbRealloc(db, pTable->u.vtab.azArg, nBytes); if( azModuleArg==0 ){ sqlite3DbFree(db, zArg); }else{ - int i = pTable->nModuleArg++; + int i = pTable->u.vtab.nArg++; azModuleArg[i] = zArg; azModuleArg[i+1] = 0; - pTable->azModuleArg = azModuleArg; + pTable->u.vtab.azArg = azModuleArg; } } @@ -388,10 +388,11 @@ void sqlite3VtabBeginParse( pTable = pParse->pNewTable; if( pTable==0 ) return; assert( 0==pTable->pIndex ); + pTable->eTabType = TABTYP_VTAB; db = pParse->db; - assert( pTable->nModuleArg==0 ); + assert( pTable->u.vtab.nArg==0 ); addModuleArgument(pParse, pTable, sqlite3NameFromToken(db, pModuleName)); addModuleArgument(pParse, pTable, 0); addModuleArgument(pParse, pTable, sqlite3DbStrDup(db, pTable->zName)); @@ -408,11 +409,11 @@ void sqlite3VtabBeginParse( ** sqlite_schema table, has already been made by sqlite3StartTable(). ** The second call, to obtain permission to create the table, is made now. */ - if( pTable->azModuleArg ){ + if( pTable->u.vtab.azArg ){ int iDb = sqlite3SchemaToIndex(db, pTable->pSchema); assert( iDb>=0 ); /* The database the table is being created in */ sqlite3AuthCheck(pParse, SQLITE_CREATE_VTABLE, pTable->zName, - pTable->azModuleArg[0], pParse->db->aDb[iDb].zDbSName); + pTable->u.vtab.azArg[0], pParse->db->aDb[iDb].zDbSName); } #endif } @@ -442,7 +443,7 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ if( pTab==0 ) return; addArgumentToVtab(pParse); pParse->sArg.z = 0; - if( pTab->nModuleArg<1 ) return; + if( pTab->u.vtab.nArg<1 ) return; /* If the CREATE VIRTUAL TABLE statement is being entered for the ** first time (in other words if the virtual table is actually being @@ -557,8 +558,8 @@ static int vtabCallConstructor( VtabCtx sCtx; VTable *pVTable; int rc; - const char *const*azArg = (const char *const*)pTab->azModuleArg; - int nArg = pTab->nModuleArg; + const char *const*azArg = (const char *const*)pTab->u.vtab.azArg; + int nArg = pTab->u.vtab.nArg; char *zErr = 0; char *zModuleName; int iDb; @@ -590,7 +591,7 @@ static int vtabCallConstructor( pVTable->eVtabRisk = SQLITE_VTABRISK_Normal; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); - pTab->azModuleArg[1] = db->aDb[iDb].zDbSName; + pTab->u.vtab.azArg[1] = db->aDb[iDb].zDbSName; /* Invoke the virtual table constructor */ assert( &db->pVtabCtx ); @@ -629,12 +630,12 @@ static int vtabCallConstructor( int iCol; u16 oooHidden = 0; /* If everything went according to plan, link the new VTable structure - ** into the linked list headed by pTab->pVTable. Then loop through the + ** into the linked list headed by pTab->u.vtab.p. Then loop through the ** columns of the table to see if any of them contain the token "hidden". ** If so, set the Column COLFLAG_HIDDEN flag and remove the token from ** the type string. */ - pVTable->pNext = pTab->pVTable; - pTab->pVTable = pVTable; + pVTable->pNext = pTab->u.vtab.p; + pTab->u.vtab.p = pVTable; for(iCol=0; iColnCol; iCol++){ char *zType = sqlite3ColumnType(&pTab->aCol[iCol], ""); @@ -692,11 +693,11 @@ int sqlite3VtabCallConnect(Parse *pParse, Table *pTab){ } /* Locate the required virtual table module */ - zMod = pTab->azModuleArg[0]; + zMod = pTab->u.vtab.azArg[0]; pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); if( !pMod ){ - const char *zModule = pTab->azModuleArg[0]; + const char *zModule = pTab->u.vtab.azArg[0]; sqlite3ErrorMsg(pParse, "no such module: %s", zModule); rc = SQLITE_ERROR; }else{ @@ -759,10 +760,10 @@ int sqlite3VtabCallCreate(sqlite3 *db, int iDb, const char *zTab, char **pzErr){ const char *zMod; pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); - assert( pTab && IsVirtual(pTab) && !pTab->pVTable ); + assert( pTab && IsVirtual(pTab) && !pTab->u.vtab.p ); /* Locate the required virtual table module */ - zMod = pTab->azModuleArg[0]; + zMod = pTab->u.vtab.azArg[0]; pMod = (Module*)sqlite3HashFind(&db->aModule, zMod); /* If the module has been registered and includes a Create method, @@ -822,19 +823,17 @@ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ if( SQLITE_OK==sqlite3RunParser(&sParse, zCreateTable, &zErr) && sParse.pNewTable && !db->mallocFailed - && !sParse.pNewTable->pSelect - && !IsVirtual(sParse.pNewTable) + && IsOrdinaryTable(sParse.pNewTable) ){ if( !pTab->aCol ){ Table *pNew = sParse.pNewTable; Index *pIdx; pTab->aCol = pNew->aCol; - pTab->pDfltList = pNew->pDfltList; + sqlite3ExprListDelete(db, pNew->u.tab.pDfltList); pTab->nNVCol = pTab->nCol = pNew->nCol; pTab->tabFlags |= pNew->tabFlags & (TF_WithoutRowid|TF_NoVisibleRowid); pNew->nCol = 0; pNew->aCol = 0; - pNew->pDfltList = 0; assert( pTab->pIndex==0 ); assert( HasRowid(pNew) || sqlite3PrimaryKeyIndex(pNew)!=0 ); if( !HasRowid(pNew) @@ -885,10 +884,10 @@ int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){ Table *pTab; pTab = sqlite3FindTable(db, zTab, db->aDb[iDb].zDbSName); - if( pTab!=0 && ALWAYS(pTab->pVTable!=0) ){ + if( pTab!=0 && ALWAYS(pTab->u.vtab.p!=0) ){ VTable *p; int (*xDestroy)(sqlite3_vtab *); - for(p=pTab->pVTable; p; p=p->pNext){ + for(p=pTab->u.vtab.p; p; p=p->pNext){ assert( p->pVtab ); if( p->pVtab->nRef>0 ){ return SQLITE_LOCKED; @@ -902,9 +901,9 @@ int sqlite3VtabCallDestroy(sqlite3 *db, int iDb, const char *zTab){ rc = xDestroy(p->pVtab); /* Remove the sqlite3_vtab* from the aVTrans[] array, if applicable */ if( rc==SQLITE_OK ){ - assert( pTab->pVTable==p && p->pNext==0 ); + assert( pTab->u.vtab.p==p && p->pNext==0 ); p->pVtab = 0; - pTab->pVTable = 0; + pTab->u.vtab.p = 0; sqlite3VtabUnlock(p); } sqlite3DeleteTable(db, pTab); @@ -1221,8 +1220,9 @@ int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ } pMod->pEpoTab = pTab; pTab->nTabRef = 1; + pTab->eTabType = TABTYP_VTAB; pTab->pSchema = db->aDb[0].pSchema; - assert( pTab->nModuleArg==0 ); + assert( pTab->u.vtab.nArg==0 ); pTab->iPKey = -1; pTab->tabFlags |= TF_Eponymous; addModuleArgument(pParse, pTab, sqlite3DbStrDup(db, pTab->zName)); diff --git a/src/where.c b/src/where.c index 4ea04e5c8e..d7ef319b57 100644 --- a/src/where.c +++ b/src/where.c @@ -3060,7 +3060,7 @@ static int whereLoopAddBtree( ** those objects, since there is no opportunity to add schema ** indexes on subqueries and views. */ pNew->rSetup = rLogSize + rSize; - if( pTab->pSelect==0 && (pTab->tabFlags & TF_Ephemeral)==0 ){ + if( !IsView(pTab) && (pTab->tabFlags & TF_Ephemeral)==0 ){ pNew->rSetup += 28; }else{ pNew->rSetup -= 10; @@ -5211,7 +5211,7 @@ WhereInfo *sqlite3WhereBegin( pTab = pTabItem->pTab; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); pLoop = pLevel->pWLoop; - if( (pTab->tabFlags & TF_Ephemeral)!=0 || pTab->pSelect ){ + if( (pTab->tabFlags & TF_Ephemeral)!=0 || IsView(pTab) ){ /* Do nothing */ }else #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -5580,7 +5580,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ ** created for the ONEPASS optimization. */ if( (pTab->tabFlags & TF_Ephemeral)==0 - && pTab->pSelect==0 + && !IsView(pTab) && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ int ws = pLoop->wsFlags; From cf9d36d1b3a84fb68d2e13acb790c449bff51c15 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 2 Aug 2021 18:03:43 +0000 Subject: [PATCH 100/100] Refactor field names in the Column object, zCnName and zCnColl, to make them unique and thus easier to find amid all the other code. FossilOrigin-Name: 8b781dcaf68e0cf12a844708c82eee00193e340195cbca915d077e4846983bf3 --- manifest | 48 ++++++++++++++++++++++++------------------------ manifest.uuid | 2 +- src/alter.c | 16 ++++++++-------- src/analyze.c | 2 +- src/auth.c | 4 ++-- src/build.c | 42 +++++++++++++++++++++--------------------- src/expr.c | 12 +++++++----- src/fkey.c | 22 ++++++++++++---------- src/insert.c | 14 +++++++------- src/main.c | 4 ++-- src/pragma.c | 8 ++++---- src/resolve.c | 8 ++++++-- src/select.c | 28 ++++++++++++++-------------- src/sqliteInt.h | 4 ++-- src/trigger.c | 4 ++-- src/update.c | 11 +++++++---- src/upsert.c | 2 +- src/util.c | 2 +- src/vdbeblob.c | 2 +- src/where.c | 2 +- src/wherecode.c | 6 +++--- 21 files changed, 127 insertions(+), 116 deletions(-) diff --git a/manifest b/manifest index 1a7d194773..837fef528d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactor\sthe\sTable\sobject\sto\sreduce\sits\smemory\sfootprint. -D 2021-08-02T16:41:57.123 +C Refactor\sfield\snames\sin\sthe\sColumn\sobject,\szCnName\sand\szCnColl,\sto\smake\sthem\nunique\sand\sthus\seasier\sto\sfind\samid\sall\sthe\sother\scode. +D 2021-08-02T18:03:43.555 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -478,17 +478,17 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c e73e2dad9338274b53c04ba5fdcb8653fef898e4709b65d7f6f3197573e4d992 -F src/analyze.c 01c6c6765cb4d40b473b71d85535093730770bb186f2f473abac25f07fcdee5c +F src/alter.c 3ce23a6f06a789de05e0bfd581f9dd6367a50135def2688cfd0af78675cae676 +F src/analyze.c abbaaf7dca79d1c31c713500324fc0b55bf3eeac5b7b07001452a3d0f210de4f F src/attach.c a514e81758ba7b3a3a0501faf70af6cfc509de8810235db726cfc9f25165e929 -F src/auth.c 08954fdc4cc2da5264ba5b75cfd90b67a6fc7d1710a02ccf917c38eadec77853 +F src/auth.c f4fa91b6a90bbc8e0d0f738aa284551739c9543a367071f55574681e0f24f8cf F src/backup.c 3014889fa06e20e6adfa0d07b60097eec1f6e5b06671625f476a714d2356513d F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c e204a9c8fb4fe5dbb910a863ba487f4af9b5c501254ec4ccbfcdd6b1f65b7fb4 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22 F src/btreeInt.h 7bc15a24a02662409ebcd6aeaa1065522d14b7fda71573a2b0568b458f514ae0 -F src/build.c d13fc40575b08422ddb44286537b0d3d80b03f063e0c3b6577d4bf84258f1f5e +F src/build.c 8b1f2a80155a1e140030848fdc951ceb31c055212768d992d62d3bca1c588942 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 8159d5f706551861c18ec6c8f6bdf105e15ea00367f05d9ab65d31a1077facc1 @@ -496,19 +496,19 @@ F src/date.c e0632f335952b32401482d099321bbf12716b29d6e72836b53ae49683ebae4bf F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 3aa79fc3aed7ce906e4ea6c10e85d657299e304f6049861fe300053ac57de36c F src/delete.c b43f0f4db586acf0b4078e3982485c26fbec984674df513d5ade48a08a323c5a -F src/expr.c 4e2878324f6be88a766f4e83bc3132106a9913f2bd029a4b92447626501996ce +F src/expr.c 0d541b9f9ecddf9d6d310f31922006f03509d7264ef53ac39c391b82a62383f9 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c bcd5006ce061ef7b331154d176a0869440b1049c67c14c92f0233a14a701f2cc +F src/fkey.c 7713a4e87755afbe85d1cb3e3e36b6a9989dc24a210a4e99bf2af9a9ae2851c2 F src/func.c c224240cbc97fa5e9c4fe9acb128716cb835ca045532bca6951b7c45b020c56c F src/global.c 5eba017ebbd887e2365e6e6e815e1619e41406b8946d17594e94116174787df5 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 167b286e3e289dbd1dad8f5a90858e9a6221bd83902985adf110e9db9fc2db67 +F src/insert.c c6419bc4b447f3d4cdb7b1167690baaea3b796a80cea48e7cf26da65487d430d F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c 6921ce667627d0d38e67f8508d5903e074134386427688e6b4588bfe57ce06a4 +F src/main.c 2c17a667133d2d1666319cfef975a48aa640a3de0c57d68b362372a12ad5557b F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -537,19 +537,19 @@ F src/parse.y 0ba0baec5de6921ec8ba8bbcf1018969144ef29d26112e17539d8fbb1662e3eb F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 388304fd2d91c39591080b5e0f3c62cfba87db20370e7e0554062bfb29740e9f -F src/pragma.c 4a510b24e5b2321fd6bb509cd0dc8003514cb574b872dd535f49870b84ee54b1 +F src/pragma.c af0f43789545622fd5377d71f6d4c0e7c9b9295a3f5d5b1242e4032d38ca12b5 F src/pragma.h a11b4798f9c49f156f130e1f7041a9fcc9d316a64f3501b6013acdd2e4c6f549 F src/prepare.c 0d53d20532aada295c1690792a125adbd6435f5ce703ff0adf1b9b3605238b67 F src/printf.c 78fabb49b9ac9a12dd1c89d744abdc9b67fd3205e62967e158f78b965a29ec4b F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c -F src/resolve.c 047a822844cea769f6fdd8418a335dd4bcd8b75ab5e264f2506a0804f869b562 +F src/resolve.c 42b94d37a54200707a95566eff4f7e8a380e32d080016b699f23bd79a73a5028 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 2b25a79706c8a71e40f5fbc8705073c54f6a3d25f556dac9d6d91676026a0413 +F src/select.c 52041124629704feb24b1bc7dabf8ec03a0857c69d23f2dd0c33c9ed3d074adb F src/shell.c.in 24b99dae8818d1a234732d73f4d5b49f12b510bc62735a41c04e314fafae09e3 F src/sqlite.h.in 43fcf0fe2af04081f420a906fc020bde1243851ba44b0aa567a27f94bf8c3145 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 -F src/sqliteInt.h 8601c620280dcb514e6e9dfb1fa7ee005ccc56c244ac82cb48a1045ed2e7003c +F src/sqliteInt.h 6f02ceb8d6b8784faf7218bd58b59580837c9e95e54a5b34d48ae93504ba67ce F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -610,18 +610,18 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c bae853ad129d1129c063de8630a3e99e306283bc40146f359b1bb91be2c08f1e F src/treeview.c 43f88d0fd19976a60aee6867959213b438593276f1e8179048df85f416a1ab19 -F src/trigger.c 43d76cf913e65a5d06ed0768d8ded7259a5d6e284641a18acb355a302792cd05 -F src/update.c 985a8a45b4ff86a0231fedd584e2bd87fd6fac5168286935195ad006d032d555 -F src/upsert.c df8f1727d62b5987c4fd302cd4d7c0c84ae57cd65683c5a34a740dfe24039235 +F src/trigger.c 3f612ce5f0858b6c23460a3c799d01f408b49b0b29d931d8b8e6fc224a8667de +F src/update.c 69c4c10bc6873a80c0a77cb578f9fc60ee90003d03f9530bc3370fa24615772d +F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c 6ca9cf268dfaf2393866990788c0797240e20e7ba7e3a22cd076e6a3c7b1a132 +F src/util.c b18a971c8936e9299fecc00474269a11135989d6fe9bd91b1e52137d6f27bd8c F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vdbe.c b73a5ec9940185eb001ff8cff2cfd429bb438c7e89f2885e0bfdb56c3ff13386 F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 F src/vdbeaux.c 202dbaf7d1570cd53678f6b0bcad7b0642e88bc5d77abc1d5b8b9a202a6a19fd -F src/vdbeblob.c 2f3c2ada0429045c54e5ebd48f45281c52addf4648e0d234a2718dbdeab01c80 +F src/vdbeblob.c 60a7694760e35b2bba166cf49eb6a1eb0b31581102b49de78008ca3032406065 F src/vdbemem.c 53881aa0a7845922a075b3f375695588618098871a7a4120af4c297b80fa3e64 F src/vdbesort.c cd5130f683706c1a43e165a74187745fb3351cb56052cf9dc91de820634bbde2 F src/vdbetrace.c 666c6fd9f1b62be6999e072a45b913e3c2c3518bc60dfd4d54fe304130acb724 @@ -631,9 +631,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 2be08331d798237ad5d7ae0b252700ffb2b63189cb18d993496d009a93e2f81c F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 7342becedf3f8a26f9817f08436bdf8b56ad69af83705f6b9320a0ad3092c2ac -F src/where.c 6e27c9f9438ddbb8aebbb83d24574a75398942b5e73b3f8cc572a39dc00f7482 +F src/where.c 99b6e13664a7bd9a553c554978d0e253066995dade621f44cffa8928c8b493b5 F src/whereInt.h 9248161dd004f625ce5d3841ca9b99fed3fc8d61522cf76340fc5217dbe1375b -F src/wherecode.c 9f1f65d11437b25cd0a1497a170514c785f19ce6ad9d3e6fc73719cb5a49012f +F src/wherecode.c ef36790a797fa679f58dbd51930e3ee7ef7cb6c906ae412032e4d319a36a2eef F src/whereexpr.c 3a9144a9d52e110efdc012a73b1574e7b2b4df4bf98949387cb620295eba0975 F src/window.c 420167512050a0dfc0f0115b9f0c7d299da9759c9bb2ae83a61fb8d730a5707f F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1920,7 +1920,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 8646547e54211d44c415663c33775c4268550f8332949c4731a4bb6ec9cc663a -R 8143bc84e57e339634d6338dda56d190 +P bbb6759bcf6e01d36dfc787a82a610d359f50aaeac8104b73883a84906d54e1f +R 7046be8b76bab8142bfe76e50eb88e2a U drh -Z 0d31e4d81e774d8d4cc71b3c0a3d1311 +Z 5e85f685bd644cac3700fa74d443a453 diff --git a/manifest.uuid b/manifest.uuid index aecc9c1e1c..2028f8b686 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bbb6759bcf6e01d36dfc787a82a610d359f50aaeac8104b73883a84906d54e1f \ No newline at end of file +8b781dcaf68e0cf12a844708c82eee00193e340195cbca915d077e4846983bf3 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 75220a1de3..0ca68c04f5 100644 --- a/src/alter.c +++ b/src/alter.c @@ -537,9 +537,9 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ memcpy(pNew->aCol, pTab->aCol, sizeof(Column)*pNew->nCol); for(i=0; inCol; i++){ Column *pCol = &pNew->aCol[i]; - pCol->zName = sqlite3DbStrDup(db, pCol->zName); - pCol->hName = sqlite3StrIHash(pCol->zName); - pCol->zColl = 0; + pCol->zCnName = sqlite3DbStrDup(db, pCol->zCnName); + pCol->hName = sqlite3StrIHash(pCol->zCnName); + pCol->zCnColl = 0; } assert( !IsVirtual(pNew) ); pNew->u.tab.pDfltList = sqlite3ExprListDup(db, pTab->u.tab.pDfltList, 0); @@ -631,7 +631,7 @@ void sqlite3AlterRenameColumn( zOld = sqlite3NameFromToken(db, pOld); if( !zOld ) goto exit_rename_column; for(iCol=0; iColnCol; iCol++){ - if( 0==sqlite3StrICmp(pTab->aCol[iCol].zName, zOld) ) break; + if( 0==sqlite3StrICmp(pTab->aCol[iCol].zCnName, zOld) ) break; } if( iCol==pTab->nCol ){ sqlite3ErrorMsg(pParse, "no such column: \"%s\"", zOld); @@ -1477,7 +1477,7 @@ static void renameColumnFunc( sqlite3BtreeLeaveAll(db); return; } - zOld = pTab->aCol[iCol].zName; + zOld = pTab->aCol[iCol].zCnName; memset(&sCtx, 0, sizeof(sCtx)); sCtx.iCol = ((iCol==pTab->iPKey) ? -1 : iCol); @@ -1514,7 +1514,7 @@ static void renameColumnFunc( if( bFKOnly==0 ){ if( iColnCol ){ renameTokenFind( - &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zName + &sParse, &sCtx, (void*)sParse.pNewTable->aCol[iCol].zCnName ); } if( sCtx.iCol<0 ){ @@ -2041,10 +2041,10 @@ static void dropColumnFunc( goto drop_column_done; } - pCol = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol].zName); + pCol = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol].zCnName); if( iColnCol-1 ){ RenameToken *pEnd; - pEnd = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol+1].zName); + pEnd = renameTokenFind(&sParse, 0, (void*)pTab->aCol[iCol+1].zCnName); zEnd = (const char*)pEnd->t.z; }else{ assert( !IsVirtual(pTab) ); diff --git a/src/analyze.c b/src/analyze.c index dc77220a53..41b993fb3f 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -968,7 +968,7 @@ static void analyzeVdbeCommentIndexWithColumnName( }else if( i==XN_EXPR ){ VdbeComment((v,"%s.expr(%d)",pIdx->zName, k)); }else{ - VdbeComment((v,"%s.%s", pIdx->zName, pIdx->pTable->aCol[i].zName)); + VdbeComment((v,"%s.%s", pIdx->zName, pIdx->pTable->aCol[i].zCnName)); } } #else diff --git a/src/auth.c b/src/auth.c index 33420f5839..3a4f73a234 100644 --- a/src/auth.c +++ b/src/auth.c @@ -175,10 +175,10 @@ void sqlite3AuthRead( if( iCol>=0 ){ assert( iColnCol ); - zCol = pTab->aCol[iCol].zName; + zCol = pTab->aCol[iCol].zCnName; }else if( pTab->iPKey>=0 ){ assert( pTab->iPKeynCol ); - zCol = pTab->aCol[pTab->iPKey].zName; + zCol = pTab->aCol[pTab->iPKey].zCnName; }else{ zCol = "ROWID"; } diff --git a/src/build.c b/src/build.c index 09222acf81..10a15189b0 100644 --- a/src/build.c +++ b/src/build.c @@ -716,9 +716,9 @@ void sqlite3DeleteColumnNames(sqlite3 *db, Table *pTable){ assert( pTable!=0 ); if( (pCol = pTable->aCol)!=0 ){ for(i=0; inCol; i++, pCol++){ - assert( pCol->zName==0 || pCol->hName==sqlite3StrIHash(pCol->zName) ); - sqlite3DbFree(db, pCol->zName); - sqlite3DbFree(db, pCol->zColl); + assert( pCol->zCnName==0 || pCol->hName==sqlite3StrIHash(pCol->zCnName) ); + sqlite3DbFree(db, pCol->zCnName); + sqlite3DbFree(db, pCol->zCnColl); } sqlite3DbFree(db, pTable->aCol); if( !IsVirtual(pTable) ){ @@ -1336,7 +1336,7 @@ begin_table_error: */ #if SQLITE_ENABLE_HIDDEN_COLUMNS void sqlite3ColumnPropertiesFromName(Table *pTab, Column *pCol){ - if( sqlite3_strnicmp(pCol->zName, "__hidden__", 10)==0 ){ + if( sqlite3_strnicmp(pCol->zCnName, "__hidden__", 10)==0 ){ pCol->colFlags |= COLFLAG_HIDDEN; if( pTab ) pTab->tabFlags |= TF_HasHidden; }else if( pTab && pCol!=pTab->aCol && (pCol[-1].colFlags & COLFLAG_HIDDEN) ){ @@ -1490,7 +1490,7 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ sqlite3Dequote(z); hName = sqlite3StrIHash(z); for(i=0; inCol; i++){ - if( p->aCol[i].hName==hName && sqlite3StrICmp(z, p->aCol[i].zName)==0 ){ + if( p->aCol[i].hName==hName && sqlite3StrICmp(z, p->aCol[i].zCnName)==0 ){ sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); sqlite3DbFree(db, z); return; @@ -1504,7 +1504,7 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ p->aCol = aNew; pCol = &p->aCol[p->nCol]; memset(pCol, 0, sizeof(p->aCol[0])); - pCol->zName = z; + pCol->zCnName = z; pCol->hName = hName; sqlite3ColumnPropertiesFromName(p, pCol); @@ -1679,7 +1679,7 @@ void sqlite3AddDefaultValue( pCol = &(p->aCol[p->nCol-1]); if( !sqlite3ExprIsConstantOrFunction(pExpr, isInit) ){ sqlite3ErrorMsg(pParse, "default value of column [%s] is not constant", - pCol->zName); + pCol->zCnName); #ifndef SQLITE_OMIT_GENERATED_COLUMNS }else if( pCol->colFlags & COLFLAG_GENERATED ){ testcase( pCol->colFlags & COLFLAG_VIRTUAL ); @@ -1796,7 +1796,7 @@ void sqlite3AddPrimaryKey( if( pCExpr->op==TK_ID ){ const char *zCName = pCExpr->u.zToken; for(iCol=0; iColnCol; iCol++){ - if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zName)==0 ){ + if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zCnName)==0 ){ pCol = &pTab->aCol[iCol]; makeColumnPartOfPrimaryKey(pParse, pCol); break; @@ -1887,8 +1887,8 @@ void sqlite3AddCollateType(Parse *pParse, Token *pToken){ if( sqlite3LocateCollSeq(pParse, zColl) ){ Index *pIdx; - sqlite3DbFree(db, p->aCol[i].zColl); - p->aCol[i].zColl = zColl; + sqlite3DbFree(db, p->aCol[i].zCnColl); + p->aCol[i].zCnColl = zColl; /* If the column is declared as " PRIMARY KEY COLLATE ", ** then an index may have been created on this column before the @@ -1897,7 +1897,7 @@ void sqlite3AddCollateType(Parse *pParse, Token *pToken){ for(pIdx=p->pIndex; pIdx; pIdx=pIdx->pNext){ assert( pIdx->nKeyCol==1 ); if( pIdx->aiColumn[0]==i ){ - pIdx->azColl[0] = p->aCol[i].zColl; + pIdx->azColl[0] = p->aCol[i].zCnColl; } } }else{ @@ -1946,7 +1946,7 @@ void sqlite3AddGenerated(Parse *pParse, Expr *pExpr, Token *pType){ generated_error: sqlite3ErrorMsg(pParse, "error in generated column \"%s\"", - pCol->zName); + pCol->zCnName); generated_done: sqlite3ExprDelete(pParse->db, pExpr); #else @@ -2048,7 +2048,7 @@ static char *createTableStmt(sqlite3 *db, Table *p){ Column *pCol; n = 0; for(pCol = p->aCol, i=0; inCol; i++, pCol++){ - n += identLength(pCol->zName) + 5; + n += identLength(pCol->zCnName) + 5; } n += identLength(p->zName); if( n<50 ){ @@ -2084,7 +2084,7 @@ static char *createTableStmt(sqlite3 *db, Table *p){ sqlite3_snprintf(n-k, &zStmt[k], zSep); k += sqlite3Strlen30(&zStmt[k]); zSep = zSep2; - identPut(zStmt, &k, pCol->zName); + identPut(zStmt, &k, pCol->zCnName); assert( pCol->affinity-SQLITE_AFF_BLOB >= 0 ); assert( pCol->affinity-SQLITE_AFF_BLOB < ArraySize(azType) ); testcase( pCol->affinity==SQLITE_AFF_BLOB ); @@ -2303,7 +2303,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ if( pTab->iPKey>=0 ){ ExprList *pList; Token ipkToken; - sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zName); + sqlite3TokenInit(&ipkToken, pTab->aCol[pTab->iPKey].zCnName); pList = sqlite3ExprListAppend(pParse, 0, sqlite3ExprAlloc(db, TK_ID, &ipkToken, 0)); if( pList==0 ){ @@ -3446,7 +3446,7 @@ void sqlite3CreateForeignKey( if( pToCol && pToCol->nExpr!=1 ){ sqlite3ErrorMsg(pParse, "foreign key on %s" " should reference only one column of table %T", - p->aCol[iCol].zName, pTo); + p->aCol[iCol].zCnName, pTo); goto fk_end; } nCol = 1; @@ -3486,7 +3486,7 @@ void sqlite3CreateForeignKey( for(i=0; inCol; j++){ - if( sqlite3StrICmp(p->aCol[j].zName, pFromCol->a[i].zEName)==0 ){ + if( sqlite3StrICmp(p->aCol[j].zCnName, pFromCol->a[i].zEName)==0 ){ pFKey->aCol[i].iFrom = j; break; } @@ -3941,7 +3941,7 @@ void sqlite3CreateIndex( Token prevCol; Column *pCol = &pTab->aCol[pTab->nCol-1]; pCol->colFlags |= COLFLAG_UNIQUE; - sqlite3TokenInit(&prevCol, pCol->zName); + sqlite3TokenInit(&prevCol, pCol->zCnName); pList = sqlite3ExprListAppend(pParse, 0, sqlite3ExprAlloc(db, TK_ID, &prevCol, 0)); if( pList==0 ) goto exit_create_index; @@ -4062,7 +4062,7 @@ void sqlite3CreateIndex( zExtra += nColl; nExtra -= nColl; }else if( j>=0 ){ - zColl = pTab->aCol[j].zColl; + zColl = pTab->aCol[j].zCnColl; } if( !zColl ) zColl = sqlite3StrBINARY; if( !db->init.busy && !sqlite3LocateCollSeq(pParse, zColl) ){ @@ -5154,7 +5154,7 @@ void sqlite3UniqueConstraint( for(j=0; jnKeyCol; j++){ char *zCol; assert( pIdx->aiColumn[j]>=0 ); - zCol = pTab->aCol[pIdx->aiColumn[j]].zName; + zCol = pTab->aCol[pIdx->aiColumn[j]].zCnName; if( j ) sqlite3_str_append(&errMsg, ", ", 2); sqlite3_str_appendall(&errMsg, pTab->zName); sqlite3_str_append(&errMsg, ".", 1); @@ -5181,7 +5181,7 @@ void sqlite3RowidConstraint( int rc; if( pTab->iPKey>=0 ){ zMsg = sqlite3MPrintf(pParse->db, "%s.%s", pTab->zName, - pTab->aCol[pTab->iPKey].zName); + pTab->aCol[pTab->iPKey].zCnName); rc = SQLITE_CONSTRAINT_PRIMARYKEY; }else{ zMsg = sqlite3MPrintf(pParse->db, "%s.rowid", pTab->zName); diff --git a/src/expr.c b/src/expr.c index ca0c00a14d..0f900c0c6c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -173,7 +173,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, const Expr *pExpr){ ** a TK_COLUMN but was previously evaluated and cached in a register */ int j = p->iColumn; if( j>=0 ){ - const char *zColl = p->y.pTab->aCol[j].zColl; + const char *zColl = p->y.pTab->aCol[j].zCnColl; pColl = sqlite3FindCollSeq(db, ENC(db), zColl, 0); } break; @@ -3693,7 +3693,8 @@ void sqlite3ExprCodeGetColumnOfTable( }else if( (pCol = &pTab->aCol[iCol])->colFlags & COLFLAG_VIRTUAL ){ Parse *pParse = sqlite3VdbeParser(v); if( pCol->colFlags & COLFLAG_BUSY ){ - sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pCol->zName); + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", + pCol->zCnName); }else{ int savedSelfTab = pParse->iSelfTab; pCol->colFlags |= COLFLAG_BUSY; @@ -3966,7 +3967,8 @@ expr_code_doover: if( pCol->iColumn<0 ){ VdbeComment((v,"%s.rowid",pTab->zName)); }else{ - VdbeComment((v,"%s.%s",pTab->zName,pTab->aCol[pCol->iColumn].zName)); + VdbeComment((v,"%s.%s", + pTab->zName, pTab->aCol[pCol->iColumn].zCnName)); if( pTab->aCol[pCol->iColumn].affinity==SQLITE_AFF_REAL ){ sqlite3VdbeAddOp1(v, OP_RealAffinity, target); } @@ -4027,7 +4029,7 @@ expr_code_doover: if( pCol->colFlags & COLFLAG_GENERATED ){ if( pCol->colFlags & COLFLAG_BUSY ){ sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", - pCol->zName); + pCol->zCnName); return 0; } pCol->colFlags |= COLFLAG_BUSY; @@ -4510,7 +4512,7 @@ expr_code_doover: sqlite3VdbeAddOp2(v, OP_Param, p1, target); VdbeComment((v, "r[%d]=%s.%s", target, (pExpr->iTable ? "new" : "old"), - (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[iCol].zName) + (pExpr->iColumn<0 ? "rowid" : pExpr->y.pTab->aCol[iCol].zCnName) )); #ifndef SQLITE_OMIT_FLOATING_POINT diff --git a/src/fkey.c b/src/fkey.c index ffb3a732eb..ee5aa5d98f 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -215,7 +215,9 @@ int sqlite3FkLocateIndex( */ if( pParent->iPKey>=0 ){ if( !zKey ) return 0; - if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zName, zKey) ) return 0; + if( !sqlite3StrICmp(pParent->aCol[pParent->iPKey].zCnName, zKey) ){ + return 0; + } } }else if( paiCol ){ assert( nCol>1 ); @@ -257,11 +259,11 @@ int sqlite3FkLocateIndex( /* If the index uses a collation sequence that is different from ** the default collation sequence for the column, this index is ** unusable. Bail out early in this case. */ - zDfltColl = pParent->aCol[iCol].zColl; + zDfltColl = pParent->aCol[iCol].zCnColl; if( !zDfltColl ) zDfltColl = sqlite3StrBINARY; if( sqlite3StrICmp(pIdx->azColl[i], zDfltColl) ) break; - zIdxCol = pParent->aCol[iCol].zName; + zIdxCol = pParent->aCol[iCol].zCnName; for(j=0; jaCol[j].zCol, zIdxCol)==0 ){ if( aiCol ) aiCol[i] = pFKey->aCol[j].iFrom; @@ -485,7 +487,7 @@ static Expr *exprTableRegister( pCol = &pTab->aCol[iCol]; pExpr->iTable = regBase + sqlite3TableColumnToStorage(pTab,iCol) + 1; pExpr->affExpr = pCol->affinity; - zColl = pCol->zColl; + zColl = pCol->zCnColl; if( zColl==0 ) zColl = db->pDfltColl->zName; pExpr = sqlite3ExprAddCollateString(pParse, pExpr, zColl); }else{ @@ -594,7 +596,7 @@ static void fkScanChildren( pLeft = exprTableRegister(pParse, pTab, regData, iCol); iCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; assert( iCol>=0 ); - zCol = pFKey->pFrom->aCol[iCol].zName; + zCol = pFKey->pFrom->aCol[iCol].zCnName; pRight = sqlite3Expr(db, TK_ID, zCol); pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); pWhere = sqlite3ExprAnd(pParse, pWhere, pEq); @@ -629,7 +631,7 @@ static void fkScanChildren( i16 iCol = pIdx->aiColumn[i]; assert( iCol>=0 ); pLeft = exprTableRegister(pParse, pTab, regData, iCol); - pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zName); + pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zCnName); pEq = sqlite3PExpr(pParse, TK_IS, pLeft, pRight); pAll = sqlite3ExprAnd(pParse, pAll, pEq); } @@ -821,7 +823,7 @@ static int fkParentIsModified( if( aChange[iKey]>=0 || (iKey==pTab->iPKey && bChngRowid) ){ Column *pCol = &pTab->aCol[iKey]; if( zKey ){ - if( 0==sqlite3StrICmp(pCol->zName, zKey) ) return 1; + if( 0==sqlite3StrICmp(pCol->zCnName, zKey) ) return 1; }else if( pCol->colFlags & COLFLAG_PRIMKEY ){ return 1; } @@ -962,7 +964,7 @@ void sqlite3FkCheck( ** values read from the parent table are NULL. */ if( db->xAuth ){ int rcauth; - char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zName; + char *zCol = pTo->aCol[pIdx ? pIdx->aiColumn[i] : pTo->iPKey].zCnName; rcauth = sqlite3AuthReadCol(pParse, pTo->zName, zCol, iDb); bIgnore = (rcauth==SQLITE_IGNORE); } @@ -1236,8 +1238,8 @@ static Trigger *fkActionTrigger( assert( pIdx!=0 || (pTab->iPKey>=0 && pTab->iPKeynCol) ); assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); sqlite3TokenInit(&tToCol, - pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zName); - sqlite3TokenInit(&tFromCol, pFKey->pFrom->aCol[iFromCol].zName); + pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zCnName); + sqlite3TokenInit(&tFromCol, pFKey->pFrom->aCol[iFromCol].zCnName); /* Create the expression "OLD.zToCol = zFromCol". It is important ** that the "OLD.zToCol" term is on the LHS of the = operator, so diff --git a/src/insert.c b/src/insert.c index bff75a0a69..06952586b0 100644 --- a/src/insert.c +++ b/src/insert.c @@ -308,7 +308,7 @@ void sqlite3ComputeGeneratedColumns( } }while( pRedo && eProgress ); if( pRedo ){ - sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pRedo->zName); + sqlite3ErrorMsg(pParse, "generated column loop on \"%s\"", pRedo->zCnName); } pParse->iSelfTab = 0; } @@ -794,7 +794,7 @@ void sqlite3Insert( } for(i=0; inId; i++){ for(j=0; jnCol; j++){ - if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zName)==0 ){ + if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zCnName)==0 ){ pColumn->a[i].idx = j; if( i!=j ) bIdListInOrder = 0; if( j==pTab->iPKey ){ @@ -804,7 +804,7 @@ void sqlite3Insert( if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ sqlite3ErrorMsg(pParse, "cannot INSERT into generated column \"%s\"", - pTab->aCol[j].zName); + pTab->aCol[j].zCnName); goto insert_cleanup; } #endif @@ -1708,7 +1708,7 @@ void sqlite3GenerateConstraintChecks( case OE_Rollback: case OE_Fail: { char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName, - pCol->zName); + pCol->zCnName); sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError, iReg); sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); @@ -2126,7 +2126,7 @@ void sqlite3GenerateConstraintChecks( testcase( sqlite3TableColumnToStorage(pTab, iField)!=iField ); x = sqlite3TableColumnToStorage(pTab, iField) + regNewData + 1; sqlite3VdbeAddOp2(v, OP_SCopy, x, regIdx+i); - VdbeComment((v, "%s", pTab->aCol[iField].zName)); + VdbeComment((v, "%s", pTab->aCol[iField].zCnName)); } } sqlite3VdbeAddOp3(v, OP_MakeRecord, regIdx, pIdx->nColumn, aRegIdx[ix]); @@ -2220,7 +2220,7 @@ void sqlite3GenerateConstraintChecks( x = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); VdbeComment((v, "%s.%s", pTab->zName, - pTab->aCol[pPk->aiColumn[i]].zName)); + pTab->aCol[pPk->aiColumn[i]].zCnName)); } } if( isUpdate ){ @@ -2843,7 +2843,7 @@ static int xferOptimization( if( pDestCol->affinity!=pSrcCol->affinity ){ return 0; /* Affinity must be the same on all columns */ } - if( sqlite3_stricmp(pDestCol->zColl, pSrcCol->zColl)!=0 ){ + if( sqlite3_stricmp(pDestCol->zCnColl, pSrcCol->zCnColl)!=0 ){ return 0; /* Collating sequence must be the same on all columns */ } if( pDestCol->notNull && !pSrcCol->notNull ){ diff --git a/src/main.c b/src/main.c index 2dc29593dc..3c1191c368 100644 --- a/src/main.c +++ b/src/main.c @@ -3742,7 +3742,7 @@ int sqlite3_table_column_metadata( }else{ for(iCol=0; iColnCol; iCol++){ pCol = &pTab->aCol[iCol]; - if( 0==sqlite3StrICmp(pCol->zName, zColumnName) ){ + if( 0==sqlite3StrICmp(pCol->zCnName, zColumnName) ){ break; } } @@ -3769,7 +3769,7 @@ int sqlite3_table_column_metadata( */ if( pCol ){ zDataType = sqlite3ColumnType(pCol,0); - zCollSeq = pCol->zColl; + zCollSeq = pCol->zCnColl; notnull = pCol->notNull!=0; primarykey = (pCol->colFlags & COLFLAG_PRIMKEY)!=0; autoinc = pTab->iPKey==iCol && (pTab->tabFlags & TF_Autoincrement)!=0; diff --git a/src/pragma.c b/src/pragma.c index 2606e85506..c931dd2acb 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1182,7 +1182,7 @@ void sqlite3Pragma( || isHidden>=2 ); sqlite3VdbeMultiLoad(v, 1, pPragma->iArg ? "issisii" : "issisi", i-nHidden, - pCol->zName, + pCol->zCnName, sqlite3ColumnType(pCol,""), pCol->notNull ? 1 : 0, isHidden>=2 || sqlite3ColumnExpr(pTab,pCol)==0 ? 0 : @@ -1253,7 +1253,7 @@ void sqlite3Pragma( for(i=0; iaiColumn[i]; sqlite3VdbeMultiLoad(v, 1, "iisX", i, cnum, - cnum<0 ? 0 : pTab->aCol[cnum].zName); + cnum<0 ? 0 : pTab->aCol[cnum].zCnName); if( pPragma->iArg ){ sqlite3VdbeMultiLoad(v, 4, "isiX", pIdx->aSortOrder[i], @@ -1374,7 +1374,7 @@ void sqlite3Pragma( i, j, pFK->zTo, - pTab->aCol[pFK->aCol[j].iFrom].zName, + pTab->aCol[pFK->aCol[j].iFrom].zCnName, pFK->aCol[j].zCol, actionName(pFK->aAction[1]), /* ON UPDATE */ actionName(pFK->aAction[0]), /* ON DELETE */ @@ -1687,7 +1687,7 @@ void sqlite3Pragma( } jmp2 = sqlite3VdbeAddOp1(v, OP_NotNull, 3); VdbeCoverage(v); zErr = sqlite3MPrintf(db, "NULL value in %s.%s", pTab->zName, - pTab->aCol[j].zName); + pTab->aCol[j].zCnName); sqlite3VdbeAddOp4(v, OP_String8, 0, 3, 0, zErr, P4_DYNAMIC); integrityCheckResultRow(v); sqlite3VdbeJumpHere(v, jmp2); diff --git a/src/resolve.c b/src/resolve.c index d509de7953..3c1311417b 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -333,7 +333,9 @@ static int lookupName( } hCol = sqlite3StrIHash(zCol); for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ - if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){ + if( pCol->hName==hCol + && sqlite3StrICmp(pCol->zCnName, zCol)==0 + ){ /* If there has been exactly one prior match and this match ** is for the right-hand table of a NATURAL JOIN or is in a ** USING clause, then skip this match. @@ -410,7 +412,9 @@ static int lookupName( pSchema = pTab->pSchema; cntTab++; for(iCol=0, pCol=pTab->aCol; iColnCol; iCol++, pCol++){ - if( pCol->hName==hCol && sqlite3StrICmp(pCol->zName, zCol)==0 ){ + if( pCol->hName==hCol + && sqlite3StrICmp(pCol->zCnName, zCol)==0 + ){ if( iCol==pTab->iPKey ){ iCol = -1; } diff --git a/src/select.c b/src/select.c index d6708c231f..064ea758d8 100644 --- a/src/select.c +++ b/src/select.c @@ -271,7 +271,7 @@ int sqlite3ColumnIndex(Table *pTab, const char *zCol){ u8 h = sqlite3StrIHash(zCol); Column *pCol; for(pCol=pTab->aCol, i=0; inCol; pCol++, i++){ - if( pCol->hName==h && sqlite3StrICmp(pCol->zName, zCol)==0 ) return i; + if( pCol->hName==h && sqlite3StrICmp(pCol->zCnName, zCol)==0 ) return i; } return -1; } @@ -470,7 +470,7 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ int iLeftCol; /* Matching column in the left table */ if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue; - zName = pRightTab->aCol[j].zName; + zName = pRightTab->aCol[j].zCnName; if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 1) ){ addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j, isOuter, &p->pWhere); @@ -1837,7 +1837,7 @@ static const char *columnTypeImpl( zType = "INTEGER"; zOrigCol = "rowid"; }else{ - zOrigCol = pTab->aCol[iCol].zName; + zOrigCol = pTab->aCol[iCol].zCnName; zType = sqlite3ColumnType(&pTab->aCol[iCol],0); } zOrigTab = pTab->zName; @@ -2009,7 +2009,7 @@ void sqlite3GenerateColumnNames( if( iCol<0 ){ zCol = "rowid"; }else{ - zCol = pTab->aCol[iCol].zName; + zCol = pTab->aCol[iCol].zCnName; } if( fullName ){ char *zName = 0; @@ -2094,7 +2094,7 @@ int sqlite3ColumnsFromExprList( /* For columns use the column name name */ int iCol = pColExpr->iColumn; if( iCol<0 ) iCol = pTab->iPKey; - zName = iCol>=0 ? pTab->aCol[iCol].zName : "rowid"; + zName = iCol>=0 ? pTab->aCol[iCol].zCnName : "rowid"; }else if( pColExpr->op==TK_ID ){ assert( !ExprHasProperty(pColExpr, EP_IntValue) ); zName = pColExpr->u.zToken; @@ -2122,7 +2122,7 @@ int sqlite3ColumnsFromExprList( zName = sqlite3MPrintf(db, "%.*z:%u", nName, zName, ++cnt); if( cnt>3 ) sqlite3_randomness(sizeof(cnt), &cnt); } - pCol->zName = zName; + pCol->zCnName = zName; pCol->hName = sqlite3StrIHash(zName); sqlite3ColumnPropertiesFromName(0, pCol); if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ @@ -2132,7 +2132,7 @@ int sqlite3ColumnsFromExprList( sqlite3HashClear(&ht); if( db->mallocFailed ){ for(j=0; jaffinity = sqlite3ExprAffinity(p); if( zType ){ m = sqlite3Strlen30(zType); - n = sqlite3Strlen30(pCol->zName); - pCol->zName = sqlite3DbReallocOrFree(db, pCol->zName, n+m+2); - if( pCol->zName ){ - memcpy(&pCol->zName[n+1], zType, m+1); + n = sqlite3Strlen30(pCol->zCnName); + pCol->zCnName = sqlite3DbReallocOrFree(db, pCol->zCnName, n+m+2); + if( pCol->zCnName ){ + memcpy(&pCol->zCnName[n+1], zType, m+1); pCol->colFlags |= COLFLAG_HASTYPE; } } if( pCol->affinity<=SQLITE_AFF_NONE ) pCol->affinity = aff; pColl = sqlite3ExprCollSeq(pParse, p); - if( pColl && pCol->zColl==0 ){ - pCol->zColl = sqlite3DbStrDup(db, pColl->zName); + if( pColl && pCol->zCnColl==0 ){ + pCol->zCnColl = sqlite3DbStrDup(db, pColl->zName); } } pTab->szTabRow = 1; /* Any non-zero value works */ @@ -5602,7 +5602,7 @@ static int selectExpander(Walker *pWalker, Select *p){ zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; } for(j=0; jnCol; j++){ - char *zName = pTab->aCol[j].zName; + char *zName = pTab->aCol[j].zCnName; char *zColname; /* The computed column name */ char *zToFree; /* Malloced string that needs to be freed */ Token sColname; /* Computed column name as a token */ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 9a2c49e526..083ba5a335 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2030,8 +2030,8 @@ struct Module { ** columns to the left. */ struct Column { - char *zName; /* Name of this column, \000, then the type */ - char *zColl; /* Collating sequence. If NULL, use the default */ + char *zCnName; /* Name of this column */ + char *zCnColl; /* Collating sequence. If NULL, use the default */ u8 notNull : 4; /* An OE_ code for handling a NOT NULL constraint */ u8 eType : 4; /* One of the standard types */ char affinity; /* One of the SQLITE_AFF_... values */ diff --git a/src/trigger.c b/src/trigger.c index 4db697c655..d7a4507e80 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -877,11 +877,11 @@ static ExprList *sqlite3ExpandReturning( for(jj=0; jjnCol; jj++){ Expr *pNewExpr; if( IsHiddenColumn(pTab->aCol+jj) ) continue; - pNewExpr = sqlite3Expr(db, TK_ID, pTab->aCol[jj].zName); + pNewExpr = sqlite3Expr(db, TK_ID, pTab->aCol[jj].zCnName); pNew = sqlite3ExprListAppend(pParse, pNew, pNewExpr); if( !db->mallocFailed ){ struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; - pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zName); + pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName); pItem->eEName = ENAME_NAME; } } diff --git a/src/update.c b/src/update.c index 6f503c32f8..484bee47cd 100644 --- a/src/update.c +++ b/src/update.c @@ -64,7 +64,7 @@ void sqlite3ColumnDefault(Vdbe *v, Table *pTab, int i, int iReg){ sqlite3_value *pValue = 0; u8 enc = ENC(sqlite3VdbeDb(v)); Column *pCol = &pTab->aCol[i]; - VdbeComment((v, "%s.%s", pTab->zName, pCol->zName)); + VdbeComment((v, "%s.%s", pTab->zName, pCol->zCnName)); assert( inCol ); sqlite3ValueFromExpr(sqlite3VdbeDb(v), sqlite3ColumnExpr(pTab,pCol), enc, @@ -451,13 +451,16 @@ void sqlite3Update( */ chngRowid = chngPk = 0; for(i=0; inExpr; i++){ + u8 hCol = sqlite3StrIHash(pChanges->a[i].zEName); /* If this is an UPDATE with a FROM clause, do not resolve expressions ** here. The call to sqlite3Select() below will do that. */ if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){ goto update_cleanup; } for(j=0; jnCol; j++){ - if( sqlite3StrICmp(pTab->aCol[j].zName, pChanges->a[i].zEName)==0 ){ + if( pTab->aCol[j].hName==hCol + && sqlite3StrICmp(pTab->aCol[j].zCnName, pChanges->a[i].zEName)==0 + ){ if( j==pTab->iPKey ){ chngRowid = 1; pRowidExpr = pChanges->a[i].pExpr; @@ -471,7 +474,7 @@ void sqlite3Update( testcase( pTab->aCol[j].colFlags & COLFLAG_STORED ); sqlite3ErrorMsg(pParse, "cannot UPDATE generated column \"%s\"", - pTab->aCol[j].zName); + pTab->aCol[j].zCnName); goto update_cleanup; } #endif @@ -495,7 +498,7 @@ void sqlite3Update( { int rc; rc = sqlite3AuthCheck(pParse, SQLITE_UPDATE, pTab->zName, - j<0 ? "ROWID" : pTab->aCol[j].zName, + j<0 ? "ROWID" : pTab->aCol[j].zCnName, db->aDb[iDb].zDbSName); if( rc==SQLITE_DENY ){ goto update_cleanup; diff --git a/src/upsert.c b/src/upsert.c index 982dc7dbc1..fb6c7c0c07 100644 --- a/src/upsert.c +++ b/src/upsert.c @@ -287,7 +287,7 @@ void sqlite3UpsertDoUpdate( k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iCur, k, iPk+i); VdbeComment((v, "%s.%s", pIdx->zName, - pTab->aCol[pPk->aiColumn[i]].zName)); + pTab->aCol[pPk->aiColumn[i]].zCnName)); } sqlite3VdbeVerifyAbortable(v, OE_Abort); i = sqlite3VdbeAddOp4Int(v, OP_Found, iDataCur, 0, iPk, nPk); diff --git a/src/util.c b/src/util.c index d513d8f79b..08c2949b17 100644 --- a/src/util.c +++ b/src/util.c @@ -90,7 +90,7 @@ int sqlite3Strlen30(const char *z){ */ char *sqlite3ColumnType(Column *pCol, char *zDflt){ if( pCol->colFlags & COLFLAG_HASTYPE ){ - return pCol->zName + strlen(pCol->zName) + 1; + return pCol->zCnName + strlen(pCol->zCnName) + 1; }else if( pCol->eType ){ assert( pCol->eType<=SQLITE_N_STDTYPE ); return (char*)sqlite3StdType[pCol->eType-1]; diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 34cf880eca..cc427b9c34 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -187,7 +187,7 @@ int sqlite3_blob_open( /* Now search pTab for the exact column. */ for(iCol=0; iColnCol; iCol++) { - if( sqlite3StrICmp(pTab->aCol[iCol].zName, zColumn)==0 ){ + if( sqlite3StrICmp(pTab->aCol[iCol].zCnName, zColumn)==0 ){ break; } } diff --git a/src/where.c b/src/where.c index d7ef319b57..5073b6c82c 100644 --- a/src/where.c +++ b/src/where.c @@ -805,7 +805,7 @@ static void constructAutomaticIndex( if( !sentWarning ){ sqlite3_log(SQLITE_WARNING_AUTOINDEX, "automatic index on %s(%s)", pTable->zName, - pTable->aCol[iCol].zName); + pTable->aCol[iCol].zCnName); sentWarning = 1; } if( (idxCols & cMask)==0 ){ diff --git a/src/wherecode.c b/src/wherecode.c index 84fa1a1410..f3589bb0ac 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -29,7 +29,7 @@ static const char *explainIndexColumnName(Index *pIdx, int i){ i = pIdx->aiColumn[i]; if( i==XN_EXPR ) return ""; if( i==XN_ROWID ) return "rowid"; - return pIdx->pTable->aCol[i].zName; + return pIdx->pTable->aCol[i].zCnName; } /* @@ -1241,8 +1241,8 @@ static void whereIndexExprTrans( #ifndef SQLITE_OMIT_GENERATED_COLUMNS }else if( iRef>=0 && (pTab->aCol[iRef].colFlags & COLFLAG_VIRTUAL)!=0 - && (pTab->aCol[iRef].zColl==0 - || sqlite3StrICmp(pTab->aCol[iRef].zColl, sqlite3StrBINARY)==0) + && (pTab->aCol[iRef].zCnColl==0 + || sqlite3StrICmp(pTab->aCol[iRef].zCnColl, sqlite3StrBINARY)==0) ){ /* Check to see if there are direct references to generated columns ** that are contained in the index. Pulling the generated column